1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import * as Tree from './tree';
6 import { initTreeNode } from './tree';
7 import { pipe } from 'lodash/fp';
9 describe('Tree', () => {
10 let tree: Tree.Tree<string>;
13 tree = Tree.createTree();
16 it('sets new node', () => {
17 const newTree = Tree.setNode(initTreeNode({ id: 'Node 1', value: 'Value 1' }))(tree);
18 expect(Tree.getNode('Node 1')(newTree)).toEqual(initTreeNode({ id: 'Node 1', value: 'Value 1' }));
21 it('adds new node reference to parent children', () => {
23 Tree.setNode(initTreeNode({ id: 'Node 1', parent: '', value: 'Value 1' })),
24 Tree.setNode(initTreeNode({ id: 'Node 2', parent: 'Node 1', value: 'Value 2' })),
27 expect(Tree.getNode('Node 1')(newTree)).toEqual({
28 ...initTreeNode({ id: 'Node 1', parent: '', value: 'Value 1' }),
33 it('gets node ancestors', () => {
35 initTreeNode({ id: 'Node 1', parent: '', value: 'Value 1' }),
36 initTreeNode({ id: 'Node 2', parent: 'Node 1', value: 'Value 1' }),
37 initTreeNode({ id: 'Node 3', parent: 'Node 2', value: 'Value 1' }),
38 ].reduce((tree, node) => Tree.setNode(node)(tree), tree);
39 expect(Tree.getNodeAncestorsIds('Node 3')(newTree)).toEqual(['Node 1', 'Node 2']);
42 it('gets node descendants', () => {
44 initTreeNode({ id: 'Node 1', parent: '', value: 'Value 1' }),
45 initTreeNode({ id: 'Node 2', parent: 'Node 1', value: 'Value 1' }),
46 initTreeNode({ id: 'Node 2.1', parent: 'Node 2', value: 'Value 1' }),
47 initTreeNode({ id: 'Node 3', parent: 'Node 1', value: 'Value 1' }),
48 initTreeNode({ id: 'Node 3.1', parent: 'Node 3', value: 'Value 1' }),
49 ].reduce((tree, node) => Tree.setNode(node)(tree), tree);
50 expect(Tree.getNodeDescendantsIds('Node 1')(newTree)).toEqual(['Node 2', 'Node 3', 'Node 2.1', 'Node 3.1']);
53 it('gets root descendants', () => {
55 initTreeNode({ id: 'Node 1', parent: '', value: 'Value 1' }),
56 initTreeNode({ id: 'Node 2', parent: 'Node 1', value: 'Value 1' }),
57 initTreeNode({ id: 'Node 2.1', parent: 'Node 2', value: 'Value 1' }),
58 initTreeNode({ id: 'Node 3', parent: 'Node 1', value: 'Value 1' }),
59 initTreeNode({ id: 'Node 3.1', parent: 'Node 3', value: 'Value 1' }),
60 ].reduce((tree, node) => Tree.setNode(node)(tree), tree);
61 expect(Tree.getNodeDescendantsIds('')(newTree)).toEqual(['Node 1', 'Node 2', 'Node 3', 'Node 2.1', 'Node 3.1']);
64 it('gets node children', () => {
66 initTreeNode({ id: 'Node 1', parent: '', value: 'Value 1' }),
67 initTreeNode({ id: 'Node 2', parent: 'Node 1', value: 'Value 1' }),
68 initTreeNode({ id: 'Node 2.1', parent: 'Node 2', value: 'Value 1' }),
69 initTreeNode({ id: 'Node 3', parent: 'Node 1', value: 'Value 1' }),
70 initTreeNode({ id: 'Node 3.1', parent: 'Node 3', value: 'Value 1' }),
71 ].reduce((tree, node) => Tree.setNode(node)(tree), tree);
72 expect(Tree.getNodeChildrenIds('Node 1')(newTree)).toEqual(['Node 2', 'Node 3']);
75 it('gets root children', () => {
77 initTreeNode({ id: 'Node 1', parent: '', value: 'Value 1' }),
78 initTreeNode({ id: 'Node 2', parent: 'Node 1', value: 'Value 1' }),
79 initTreeNode({ id: 'Node 2.1', parent: 'Node 2', value: 'Value 1' }),
80 initTreeNode({ id: 'Node 3', parent: '', value: 'Value 1' }),
81 initTreeNode({ id: 'Node 3.1', parent: 'Node 3', value: 'Value 1' }),
82 ].reduce((tree, node) => Tree.setNode(node)(tree), tree);
83 expect(Tree.getNodeChildrenIds('')(newTree)).toEqual(['Node 1', 'Node 3']);
86 it('maps tree', () => {
88 initTreeNode({ id: 'Node 1', parent: '', value: 'Value 1' }),
89 initTreeNode({ id: 'Node 2', parent: 'Node 1', value: 'Value 2' }),
90 ].reduce((tree, node) => Tree.setNode(node)(tree), tree);
91 const mappedTree = Tree.mapTreeValues<string, number>(value => parseInt(value.split(' ')[1], 10))(newTree);
92 expect(Tree.getNode('Node 2')(mappedTree)).toEqual(initTreeNode({id: 'Node 2', parent: 'Node 1', value: 2 }));