michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: 'use strict'; michael@0: michael@0: module.metadata = { michael@0: 'engines': { michael@0: 'Firefox': '*' michael@0: } michael@0: }; michael@0: michael@0: const { defer, all } = require('sdk/core/promise'); michael@0: const { setTimeout } = require('sdk/timers'); michael@0: const { TreeNode } = require('sdk/places/utils'); michael@0: michael@0: exports['test construct tree'] = function (assert) { michael@0: let tree = TreeNode(1); michael@0: tree.add([2, 3, 4]); michael@0: tree.get(2).add([2.1, 2.2, 2.3]); michael@0: let newTreeNode = TreeNode(4.3); michael@0: newTreeNode.add([4.31, 4.32]); michael@0: tree.get(4).add([4.1, 4.2, newTreeNode]); michael@0: michael@0: assert.equal(tree.get(2).value, 2, 'get returns node with correct value'); michael@0: assert.equal(tree.get(2.3).value, 2.3, 'get returns node with correct value'); michael@0: assert.equal(tree.get(4.32).value, 4.32, 'get returns node even if created from nested node'); michael@0: assert.equal(tree.get(4).children.length, 3, 'nodes have correct children length'); michael@0: assert.equal(tree.get(3).children.length, 0, 'nodes have correct children length'); michael@0: michael@0: assert.equal(tree.get(4).get(4.32).value, 4.32, 'node.get descends from itself'); michael@0: assert.equal(tree.get(4).get(2), null, 'node.get descends from itself fails if not descendant'); michael@0: }; michael@0: michael@0: exports['test walk'] = function (assert, done) { michael@0: let resultsAll = []; michael@0: let resultsNode = []; michael@0: let tree = TreeNode(1); michael@0: tree.add([2, 3, 4]); michael@0: tree.get(2).add([2.1, 2.2]); michael@0: michael@0: tree.walk(function (node) { michael@0: resultsAll.push(node.value); michael@0: }).then(() => { michael@0: [1, 2, 2.1, 2.2, 3, 4].forEach(num => { michael@0: assert.ok(~resultsAll.indexOf(num), 'function applied to each node from root'); michael@0: }); michael@0: return tree.get(2).walk(node => resultsNode.push(node.value)); michael@0: }).then(() => { michael@0: [2, 2.1, 2.2].forEach(function (num) { michael@0: assert.ok(~resultsNode.indexOf(num), 'function applied to each node from node'); michael@0: }); michael@0: }).catch(assert.fail).then(done); michael@0: }; michael@0: michael@0: exports['test async walk'] = function (assert, done) { michael@0: let resultsAll = []; michael@0: let tree = TreeNode(1); michael@0: tree.add([2, 3, 4]); michael@0: tree.get(2).add([2.1, 2.2]); michael@0: michael@0: tree.walk(function (node) { michael@0: let deferred = defer(); michael@0: setTimeout(function () { michael@0: resultsAll.push(node.value); michael@0: deferred.resolve(node.value); michael@0: }, node.value === 2 ? 50 : 5); michael@0: return deferred.promise; michael@0: }).then(function () { michael@0: [1, 2, 2.1, 2.2, 3, 4].forEach(function (num) { michael@0: assert.ok(~resultsAll.indexOf(num), 'function applied to each node from root'); michael@0: }); michael@0: assert.ok(resultsAll.indexOf(2) < resultsAll.indexOf(2.1), michael@0: 'child should wait for parent to complete'); michael@0: assert.ok(resultsAll.indexOf(2) < resultsAll.indexOf(2.2), michael@0: 'child should wait for parent to complete'); michael@0: done(); michael@0: }); michael@0: };