1 var utils_for_test = require('./utils_for_test');
3 var example_data = utils_for_test.example_data;
4 var formatNodes = utils_for_test.formatNodes;
6 var tree_vars = utils_for_test.getTreeVariables();
8 var Node = tree_vars.Node;
9 var Position = tree_vars.Position;
11 var test = QUnit.test;
15 test('constructor', function(assert) {
16 // 1. Create node from string
17 var node = new Node('n1');
19 assert.equal(node.name, 'n1');
20 assert.equal(node.children.length, 0);
21 assert.equal(node.parent, null);
23 // 2. Create node from object
27 parent: 'abc', // parent must be ignored
28 children: ['c'], // children must be ignored
32 assert.equal(node.name, 'n2');
33 assert.equal(node.id, 123);
34 assert.equal(node.url, '/');
35 assert.equal(node.label, undefined);
36 assert.equal(node.children.length, 0);
37 assert.equal(node.parent, null);
40 test("create tree from data", function(assert) {
41 function checkData(tree) {
43 formatNodes(tree.children),
48 formatNodes(tree.children[0].children),
53 formatNodes(tree.children[1].children),
64 // - create tree from example data
65 var tree = new Node(null, true);
66 tree.loadFromData(example_data);
69 // - create tree from new data format
74 children: ['child1', 'child2'] // nodes are only defined by a string
82 var tree = new Node(null, true);
83 tree.loadFromData(data);
87 test("addChild", function(assert) {
88 var tree = new Node('tree1', true);
97 formatNodes(tree.children),
102 var node = tree.children[0];
110 test('addChildAtPosition', function(assert) {
111 var tree = new Node(null, true);
112 tree.addChildAtPosition(new Node('abc'), 0); // first
113 tree.addChildAtPosition(new Node('ghi'), 2); // index 2 does not exist
114 tree.addChildAtPosition(new Node('def'), 1);
115 tree.addChildAtPosition(new Node('123'), 0);
118 formatNodes(tree.children),
124 test('removeChild', function(assert) {
125 var tree = new Node(null, true);
127 var abc = new Node({'label': 'abc', 'id': 1});
128 var def = new Node({'label': 'def', 'id': 2});
129 var ghi = new Node({'label': 'ghi', 'id': 3});
135 var jkl = new Node({'label': 'jkl', 'id': 4});
139 formatNodes(tree.children),
144 assert.equal(tree.id_mapping[2].name, 'def');
145 assert.equal(tree.id_mapping[4].name, 'jkl');
148 tree.removeChild(def);
150 formatNodes(tree.children),
155 assert.equal(tree.id_mapping[2], null);
156 assert.equal(tree.id_mapping[4], null);
159 tree.removeChild(ghi);
161 formatNodes(tree.children),
167 tree.removeChild(abc);
169 formatNodes(tree.children),
175 test('getChildIndex', function(assert) {
177 var tree = new Node(null, true);
179 var abc = new Node('abc');
180 var def = new Node('def');
181 var ghi = new Node('ghi');
186 // 1. Get child index of 'def'
187 assert.equal(tree.getChildIndex(def), 1);
189 // 2. Get child index of non-existing node
190 assert.equal(tree.getChildIndex(new Node('xyz')), -1);
193 test('hasChildren', function(assert) {
194 var tree = new Node(null, true);
198 'tree without children'
201 tree.addChild(new Node('abc'));
209 test('iterate', function(assert) {
210 var tree = new Node(null, true);
211 tree.loadFromData(example_data);
213 // iterate over all the nodes
216 function(node, level) {
224 'node1 child1 child2 node2 child3',
228 // iterate over nodes on first level
231 function(node, level) {
240 'nodes on first level'
244 var node3 = tree.getNodeById(124).children[0];
249 // test level parameter
252 function(node, level) {
253 nodes.push(node.name + ' ' + level);
260 'node1 0,child1 1,child2 1,node2 0,child3 1,child4 2'
264 test('moveNode', function(assert) {
265 var tree = new Node(null, true);
266 tree.loadFromData(example_data);
276 var node1 = tree.children[0];
277 var node2 = tree.children[1];
278 var child1 = node1.children[0];
279 var child2 = node1.children[1];
280 assert.equal(node2.name, 'node2', 'node2 name');
281 assert.equal(child2.name, 'child2', 'child2 name');
283 // move child2 after node2
284 tree.moveNode(child2, node2, Position.AFTER);
294 formatNodes(tree.children),
295 'node1 node2 child2',
296 'tree nodes at first level'
299 formatNodes(node1.children),
304 // move child1 inside node2
305 // this means it's the first child
306 tree.moveNode(child1, node2, Position.INSIDE);
316 formatNodes(node2.children),
321 formatNodes(node1.children),
323 'node1 has no children'
326 // move child2 before child1
327 tree.moveNode(child2, child1, Position.BEFORE);
337 formatNodes(node2.children),
338 'child2 child1 child3',
342 formatNodes(tree.children),
344 'tree nodes at first level'
348 test('initFromData', function(assert) {
360 var node = new Node(null, true);
361 node.initFromData(data);
363 assert.equal(node.name, 'main')
365 formatNodes(node.children),
369 assert.equal(node.children[1].id, 201);
372 test('getData', function(assert) {
374 var node = new Node(null, true);
375 assert.deepEqual(node.getData(), []);
404 // 3. get data including parent
405 var n1 = node.getNodeByName('n1');
420 test('addAfter', function(assert) {
422 var tree = new Node(null, true);
423 tree.loadFromData(example_data);
433 assert.equal(formatNodes(tree.children), 'node1 node2');
435 // - Add 'node_b' after node2
436 var node2 = tree.getNodeByName('node2');
437 node2.addAfter('node_b');
439 assert.equal(formatNodes(tree.children), 'node1 node2 node_b');
441 var node_b = tree.getNodeByName('node_b');
442 assert.equal(node_b.name, 'node_b');
444 // - Add 'node_a' after node1
445 var node1 = tree.getNodeByName('node1');
446 node1.addAfter('node_a');
448 assert.equal(formatNodes(tree.children), 'node1 node_a node2 node_b');
450 // - Add 'node_c' after node_b; new node is an object
456 var node_c = tree.getNodeByName('node_c');
457 assert.equal(node_c.id, 789);
459 assert.equal(formatNodes(tree.children), 'node1 node_a node2 node_b node_c');
461 // - Add after root node; this is not possible
462 assert.equal(tree.addAfter('node_x'), null);
465 test('addBefore', function(assert) {
467 var tree = new Node(null, true);
468 tree.loadFromData(example_data);
470 // - Add 'node_0' before node1
471 var node1 = tree.getNodeByName('node1');
472 node1.addBefore('node0');
473 assert.equal(formatNodes(tree.children), 'node0 node1 node2');
475 // - Add before root node; this is not possile
476 assert.equal(tree.addBefore('x'), null);
479 test('addParent', function(assert) {
481 var tree = new Node(null, true);
482 tree.loadFromData(example_data);
484 // - Add node 'root' as parent of node1
485 // Note that node also becomes a child of 'root'
486 var node1 = tree.getNodeByName('node1');
487 node1.addParent('root');
489 var root = tree.getNodeByName('root');
490 assert.equal(formatNodes(root.children), 'node1 node2');
492 // - Add parent to root node; not possible
493 assert.equal(tree.addParent('x'), null);
496 test('remove', function(assert) {
498 var tree = new Node(null, true);
499 tree.loadFromData(example_data);
501 var child1 = tree.getNodeByName('child1');
502 var node1 = tree.getNodeByName('node1');
504 assert.equal(formatNodes(node1.children), 'child1 child2');
505 assert.equal(child1.parent, node1);
510 assert.equal(formatNodes(node1.children), 'child2');
511 assert.equal(child1.parent, null);
514 test('append', function(assert) {
516 var tree = new Node(null, true);
517 tree.loadFromData(example_data);
519 var node1 = tree.getNodeByName('node1');
521 // 1. Append child3 to node1
522 node1.append('child3');
524 assert.equal(formatNodes(node1.children), 'child1 child2 child3');
536 assert.equal(formatNodes(node1.children), 'child1 child2 child3 child4');
538 var child4 = node1.getNodeByName('child4');
539 assert.equal(formatNodes(child4.children), 'child5');
542 test('prepend', function(assert) {
544 var tree = new Node(null, true);
545 tree.loadFromData(example_data);
547 var node1 = tree.getNodeByName('node1');
549 // 1. Prepend child0 to node1
550 node1.prepend('child0');
552 assert.equal(formatNodes(node1.children), 'child0 child1 child2');
554 // 2. Prepend subtree
562 assert.equal(formatNodes(node1.children), 'child3 child0 child1 child2');
564 var child3 = node1.getNodeByName('child3');
565 assert.equal(formatNodes(child3.children), 'child4');
568 test('getNodeById', function(assert) {
570 var tree = new Node(null, true);
571 tree.loadFromData(example_data);
573 // 1. Get node with id 124
574 var node = tree.getNodeById(124);
575 assert.equal(node.name, 'node2');
577 // 2. Delete node with id 124 and search again
580 assert.equal(tree.getNodeById(124), null);
582 // 3. Add node with id 456 and search for it
583 var child3 = tree.getNodeByName('child2');
589 node = tree.getNodeById(456);
590 assert.equal(node.name, 'new node');
593 test('getLevel', function(assert) {
595 var tree = new Node(null, true);
596 tree.loadFromData(example_data);
598 // 1. get level for node1 and child1
599 assert.equal(tree.getNodeByName('node1').getLevel(), 1);
600 assert.equal(tree.getNodeByName('child1').getLevel(), 2);
603 test('loadFromData and id mapping', function(assert) {
604 // - get node from empty tree
605 var tree = new Node(null, true);
606 assert.equal(tree.getNodeById(999), null);
608 // - load example data in tree
609 tree.loadFromData(example_data);
610 assert.equal(tree.getNodeById(124).name, 'node2');
612 var child2 = tree.getNodeById(126);
614 new Node({label: 'child4', id: 128})
617 new Node({label: 'child5', id: 129})
620 // - load data in node child2
621 child2.loadFromData(['abc', 'def']);
623 assert.equal(tree.getNodeById(128), null);
624 assert.equal(child2.children.length, 2);
625 assert.equal(child2.children[0].name, 'abc');
628 test('removeChildren', function(assert) {
629 // - load example data
630 var tree = new Node(null, true);
631 tree.loadFromData(example_data);
633 // add child4 and child5
634 var child2 = tree.getNodeById(126);
635 assert.equal(child2.name, 'child2');
638 new Node({label: 'child4', id: 128})
641 new Node({label: 'child5', id: 129})
643 assert.equal(tree.getNodeById(128).name, 'child4');
645 // - remove children from child2
646 child2.removeChildren();
647 assert.equal(tree.getNodeById(128), null);
648 assert.equal(child2.children.length, 0);
651 test('node with id 0', function(assert) {
652 // - load node with id 0
653 var tree = new Node(null, true);
662 var node = tree.getNodeById(0);
663 assert.equal(node.name, 'mynode');
665 // -- remove the node
668 assert.equal(tree.getNodeById(0), undefined);
671 test('getPreviousSibling', function(assert) {
673 var tree = new Node(null, true);
674 tree.loadFromData(example_data);
676 // - getPreviousSibling
678 tree.getNodeByName('child2').getPreviousSibling().name,
681 assert.equal(tree.getPreviousSibling(), null);
683 tree.getNodeByName('child1').getPreviousSibling(),
688 test('getNextSibling', function(assert) {
690 var tree = new Node(null, true);
691 tree.loadFromData(example_data);
695 tree.getNodeByName('node1').getNextSibling().name,
699 tree.getNodeByName('node2').getNextSibling(),
702 assert.equal(tree.getNextSibling(), null);
705 test('getNodesByProperty', function(assert) {
706 var tree = new Node(null, true);
707 tree.loadFromData(example_data);
709 nodes = tree.getNodesByProperty('name', 'child1');
711 assert.equal(nodes.length, 1);
712 assert.equal(nodes[0].name, 'child1');
715 test('getNodeByCallback', function(assert) {
716 var tree = new Node(null, true);
717 tree.loadFromData(example_data);
719 node = tree.getNodeByCallback(
721 return node.name == 'child1';
725 assert.equal(node.name, 'child1');