sku-pg
Version:
Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!
267 lines (234 loc) • 9.15 kB
HTML
<html>
<!--
Copyright 2010 The Closure Library Authors. All Rights Reserved.
Use of this source code is governed by an Apache 2.0 License.
See the COPYING file for details.
-->
<!--
Author: pallosp@google.com (Peter Pallos)
-->
<head>
<title>Closure Unit Tests - goog.structs.TreeNode</title>
<script src="../base.js"></script>
<script>
goog.require('goog.array');
goog.require('goog.structs.TreeNode');
goog.require('goog.testing.jsunit');
</script>
</head>
<body>
<script>
function testConstructor() {
var node = new goog.structs.TreeNode('key', 'value');
assertEquals('key', 'key', node.getKey());
assertEquals('value', 'value', node.getValue());
assertNull('parent', node.getParent());
assertArrayEquals('children', [], node.getChildren());
assertTrue('leaf', node.isLeaf());
}
function testClone() {
var node1 = new goog.structs.TreeNode(1, '1');
var node2 = new goog.structs.TreeNode(2, '2');
var node3 = new goog.structs.TreeNode(3, '3');
node1.addChild(node2);
node2.addChild(node3);
var clone = node2.clone();
assertEquals('key', 2, clone.getKey());
assertEquals('value', '2', clone.getValue());
assertNull('parent', clone.getParent());
assertArrayEquals('children', [], clone.getChildren());
}
function testDeepClone() {
var node1 = new goog.structs.TreeNode(1, '1');
var node2 = new goog.structs.TreeNode(2, '2');
var node3 = new goog.structs.TreeNode(3, '3');
node1.addChild(node2);
node2.addChild(node3);
var clone = node2.deepClone();
assertEquals('key', 2, clone.getKey());
assertEquals('value', '2', clone.getValue());
assertNull('parent', clone.getParent());
assertEquals('number of children', 1, clone.getChildren().length);
assertEquals('first child key', 3, clone.getChildAt(0).getKey());
assertNotEquals('first child has been cloned', node3, clone.getChildAt(0));
}
function testGetParent() {
var node1 = new goog.structs.TreeNode(1, null);
var node2 = new goog.structs.TreeNode(2, null);
node1.addChild(node2);
assertEquals('parent', node1, node2.getParent());
assertNull('orphan', node1.getParent());
}
function testIsLeaf() {
var node1 = new goog.structs.TreeNode(1, null);
var node2 = new goog.structs.TreeNode(2, null);
node1.addChild(node2);
assertFalse('not leaf', node1.isLeaf());
assertTrue('leaf', node2.isLeaf());
}
function testGetChildren() {
var node1 = new goog.structs.TreeNode(1, null);
var node2 = new goog.structs.TreeNode(2, null);
node1.addChild(node2);
assertArrayEquals('1 child', [node2], node1.getChildren());
assertArrayEquals('no children', [], node2.getChildren());
}
function testGetChildAt() {
var node1 = new goog.structs.TreeNode(1, null);
var node2 = new goog.structs.TreeNode(2, null);
node1.addChild(node2);
assertNull('index too low', node1.getChildAt(-1));
assertEquals('first child', node2, node1.getChildAt(0));
assertNull('index too high', node1.getChildAt(1));
assertNull('no children', node2.getChildAt(0));
}
function testGetDepth() {
var node1 = new goog.structs.TreeNode(1, null);
var node2 = new goog.structs.TreeNode(2, null);
var node3 = new goog.structs.TreeNode(3, null);
node1.addChild(node2);
node2.addChild(node3);
assertEquals('no parent', 0, node1.getDepth());
assertEquals('1 ancestor', 1, node2.getDepth());
assertEquals('2 ancestors', 2, node3.getDepth());
}
function testGetAncestors() {
var node1 = new goog.structs.TreeNode(1, null);
var node2 = new goog.structs.TreeNode(2, null);
var node3 = new goog.structs.TreeNode(3, null);
node1.addChild(node2);
node2.addChild(node3);
assertArrayEquals('no ancestors', [], node1.getAncestors());
assertArrayEquals('2 ancestors', [node2, node1], node3.getAncestors());
}
function testGetRoot() {
var node1 = new goog.structs.TreeNode(1, null);
var node2 = new goog.structs.TreeNode(2, null);
node1.addChild(node2);
assertEquals('no ancestors', node1, node1.getRoot());
assertEquals('has ancestors', node1, node2.getRoot());
}
function testContains() {
var node1 = new goog.structs.TreeNode(1, null);
var node2 = new goog.structs.TreeNode(2, null);
var node3 = new goog.structs.TreeNode(3, null);
var node4 = new goog.structs.TreeNode(4, null);
node1.addChild(node2);
node2.addChild(node3);
node2.addChild(node4);
assertTrue('parent', node1.contains(node2));
assertTrue('grandparent', node1.contains(node3));
assertFalse('child', node2.contains(node1));
assertFalse('grandchild', node3.contains(node1));
assertFalse('sibling', node3.contains(node4));
}
function testForEachChild() {
var node1 = new goog.structs.TreeNode(1, null);
var node2 = new goog.structs.TreeNode(2, null);
var node3 = new goog.structs.TreeNode(3, null);
node1.addChild(node2);
node1.addChild(node3);
var thisContext = {};
var visitedNodes = [];
var indices = [];
node1.forEachChild(function(node, index, children) {
assertEquals('value of this', thisContext, this);
visitedNodes.push(node);
indices.push(index);
assertArrayEquals('children argument', [node2, node3], children);
}, thisContext);
assertArrayEquals('visited nodes', [node2, node3], visitedNodes);
assertArrayEquals('index of visited nodes', [0, 1], indices);
}
function testForEachDescendant() {
var node1 = new goog.structs.TreeNode(1, null);
var node2 = new goog.structs.TreeNode(2, null);
var node3 = new goog.structs.TreeNode(3, null);
var node4 = new goog.structs.TreeNode(4, null);
node1.addChild(node2);
node2.addChild(node3);
node2.addChild(node4);
var thisContext = {};
var visitedNodes = [];
node1.forEachDescendant(function(node) {
assertEquals('value of this', thisContext, this);
visitedNodes.push(node);
}, thisContext);
assertArrayEquals('visited nodes', [node2, node3, node4], visitedNodes);
}
function testAddChild() {
var node1 = new goog.structs.TreeNode(1, null);
var node2 = new goog.structs.TreeNode(2, null);
var node3 = new goog.structs.TreeNode(3, null);
assertArrayEquals('0 children', [], node1.getChildren());
node1.addChild(node2);
assertArrayEquals('1 child', [node2], node1.getChildren());
assertEquals('parent is set', node1, node2.getParent());
node1.addChild(node3);
assertArrayEquals('2 children', [node2, node3], node1.getChildren());
}
function testAddChildAt() {
var node1 = new goog.structs.TreeNode(1, null);
var node2 = new goog.structs.TreeNode(2, null);
var node3 = new goog.structs.TreeNode(3, null);
var node4 = new goog.structs.TreeNode(4, null);
var node5 = new goog.structs.TreeNode(5, null);
node1.addChildAt(node2, 0);
assertArrayEquals('add first child', [node2], node1.getChildren());
assertEquals('parent is set', node1, node2.getParent());
node1.addChildAt(node3, 0);
assertArrayEquals('add to the front', [node3, node2],
node1.getChildren());
node1.addChildAt(node4, 1);
assertArrayEquals('add to the middle', [node3, node4, node2],
node1.getChildren());
node1.addChildAt(node5, 3);
assertArrayEquals('add to the end', [node3, node4, node2, node5],
node1.getChildren());
}
function testRemoveChildAt() {
var node1 = new goog.structs.TreeNode(1, null);
var node2 = new goog.structs.TreeNode(2, null);
var node3 = new goog.structs.TreeNode(3, null);
node1.addChild(node2);
node1.addChild(node3);
assertNull('index too low', node1.removeChildAt(-1));
assertNull('index too high', node1.removeChildAt(2));
assertArrayEquals('node1 is intact', [node2, node3], node1.getChildren());
assertEquals('remove first child', node2, node1.removeChildAt(0));
assertArrayEquals('remove from the front', [node3], node1.getChildren());
assertNull('parent is unset', node2.getParent());
assertEquals('remove last child', node3, node1.removeChildAt(0));
assertArrayEquals('remove last child', [], node1.getChildren());
assertTrue('node1 became leaf', node1.isLeaf());
}
function testRemoveChild() {
var node1 = new goog.structs.TreeNode(1, null);
var node2 = new goog.structs.TreeNode(2, null);
var node3 = new goog.structs.TreeNode(3, null);
node1.addChild(node2);
node1.addChild(node3);
assertNull('remove null', node1.removeChild(null));
assertNull('remove non-child', node1.removeChild(node1));
assertArrayEquals('node1 is intact', [node2, node3], node1.getChildren());
assertEquals('remove node3, return value', node3, node1.removeChild(node3));
assertArrayEquals('node is removed', [node2], node1.getChildren());
}
function testRemoveChildren() {
var node1 = new goog.structs.TreeNode(1, null);
var node2 = new goog.structs.TreeNode(2, null);
var node3 = new goog.structs.TreeNode(3, null);
node1.addChild(node2);
node1.addChild(node3);
node2.removeChildren();
assertArrayEquals('removing a leaf node\'s children has no effect', [],
node2.getChildren());
assertEquals('node still has parent', node1, node2.getParent());
node1.removeChildren();
assertArrayEquals('children have been removed', [], node1.getChildren());
assertNull('children\'s parents have been unset', node2.getParent());
}
</script>
</body>
</html>