refs #14353 Merge branch 'origin/14353-file-rename-fix'
[arvados-workbench2.git] / src / models / tree.test.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import * as Tree from './tree';
6 import { initTreeNode } from './tree';
7 import { pipe } from 'lodash/fp';
8
9 describe('Tree', () => {
10     let tree: Tree.Tree<string>;
11
12     beforeEach(() => {
13         tree = Tree.createTree();
14     });
15
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' }));
19     });
20
21     it('adds new node reference to parent children', () => {
22         const newTree = pipe(
23             Tree.setNode(initTreeNode({ id: 'Node 1', parent: '', value: 'Value 1' })),
24             Tree.setNode(initTreeNode({ id: 'Node 2', parent: 'Node 1', value: 'Value 2' })),
25         )(tree);
26
27         expect(Tree.getNode('Node 1')(newTree)).toEqual({
28             ...initTreeNode({ id: 'Node 1', parent: '', value: 'Value 1' }),
29             children: ['Node 2']
30         });
31     });
32
33     it('gets node ancestors', () => {
34         const newTree = [
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']);
40     });
41
42     it('gets node descendants', () => {
43         const newTree = [
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']);
51     });
52
53     it('gets root descendants', () => {
54         const newTree = [
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']);
62     });
63
64     it('gets node children', () => {
65         const newTree = [
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']);
73     });
74
75     it('gets root children', () => {
76         const newTree = [
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']);
84     });
85
86     it('maps tree', () => {
87         const newTree = [
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 }));
93     });
94 });