|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 'use strict'; |
|
5 |
|
6 module.metadata = { |
|
7 'engines': { |
|
8 'Firefox': '*' |
|
9 } |
|
10 }; |
|
11 |
|
12 const { defer, all } = require('sdk/core/promise'); |
|
13 const { setTimeout } = require('sdk/timers'); |
|
14 const { TreeNode } = require('sdk/places/utils'); |
|
15 |
|
16 exports['test construct tree'] = function (assert) { |
|
17 let tree = TreeNode(1); |
|
18 tree.add([2, 3, 4]); |
|
19 tree.get(2).add([2.1, 2.2, 2.3]); |
|
20 let newTreeNode = TreeNode(4.3); |
|
21 newTreeNode.add([4.31, 4.32]); |
|
22 tree.get(4).add([4.1, 4.2, newTreeNode]); |
|
23 |
|
24 assert.equal(tree.get(2).value, 2, 'get returns node with correct value'); |
|
25 assert.equal(tree.get(2.3).value, 2.3, 'get returns node with correct value'); |
|
26 assert.equal(tree.get(4.32).value, 4.32, 'get returns node even if created from nested node'); |
|
27 assert.equal(tree.get(4).children.length, 3, 'nodes have correct children length'); |
|
28 assert.equal(tree.get(3).children.length, 0, 'nodes have correct children length'); |
|
29 |
|
30 assert.equal(tree.get(4).get(4.32).value, 4.32, 'node.get descends from itself'); |
|
31 assert.equal(tree.get(4).get(2), null, 'node.get descends from itself fails if not descendant'); |
|
32 }; |
|
33 |
|
34 exports['test walk'] = function (assert, done) { |
|
35 let resultsAll = []; |
|
36 let resultsNode = []; |
|
37 let tree = TreeNode(1); |
|
38 tree.add([2, 3, 4]); |
|
39 tree.get(2).add([2.1, 2.2]); |
|
40 |
|
41 tree.walk(function (node) { |
|
42 resultsAll.push(node.value); |
|
43 }).then(() => { |
|
44 [1, 2, 2.1, 2.2, 3, 4].forEach(num => { |
|
45 assert.ok(~resultsAll.indexOf(num), 'function applied to each node from root'); |
|
46 }); |
|
47 return tree.get(2).walk(node => resultsNode.push(node.value)); |
|
48 }).then(() => { |
|
49 [2, 2.1, 2.2].forEach(function (num) { |
|
50 assert.ok(~resultsNode.indexOf(num), 'function applied to each node from node'); |
|
51 }); |
|
52 }).catch(assert.fail).then(done); |
|
53 }; |
|
54 |
|
55 exports['test async walk'] = function (assert, done) { |
|
56 let resultsAll = []; |
|
57 let tree = TreeNode(1); |
|
58 tree.add([2, 3, 4]); |
|
59 tree.get(2).add([2.1, 2.2]); |
|
60 |
|
61 tree.walk(function (node) { |
|
62 let deferred = defer(); |
|
63 setTimeout(function () { |
|
64 resultsAll.push(node.value); |
|
65 deferred.resolve(node.value); |
|
66 }, node.value === 2 ? 50 : 5); |
|
67 return deferred.promise; |
|
68 }).then(function () { |
|
69 [1, 2, 2.1, 2.2, 3, 4].forEach(function (num) { |
|
70 assert.ok(~resultsAll.indexOf(num), 'function applied to each node from root'); |
|
71 }); |
|
72 assert.ok(resultsAll.indexOf(2) < resultsAll.indexOf(2.1), |
|
73 'child should wait for parent to complete'); |
|
74 assert.ok(resultsAll.indexOf(2) < resultsAll.indexOf(2.2), |
|
75 'child should wait for parent to complete'); |
|
76 done(); |
|
77 }); |
|
78 }; |