neith
Version:
Javascript Zipper Library
323 lines (272 loc) • 8.14 kB
JavaScript
var zipper = require('../index').zipper;
var tree = require('../index').tree;
var binary = require('../examples/binary');
var nary = require('../examples/nary');
var $ = function(val, l, r) {
return new binary.Binary(val, l, r);
};
var $n = function(val, children) {
return new nary.Nary(val, Object.keys(children), children);
};
var binary1 = $(1,
$(2,
$(3, null, null),
$(4,
$(5, null, null))),
$(6,
null,
$(7,
$(8, null, null),
null)));
var nary1 = $n(1, {
2: $n(2, {
3: $n(3, {}),
4: $n(4, {
5: $n(5, {}),
}),
}),
6: $n(6, {
7: $n(7, {}),
}),
8: $n(8, {})
});
exports.simple = function(test) {
test.deepEqual(
binary.walk(tree.node(zipper.root(
tree.setNode(
$(10, null, $(11, null, null)),
zipper.down(binary.zipper(binary1)))))),
[1, 10, 11, 6, 7, 8]);
test.done();
};
exports.set_falsy = function(test) {
var n = tree.node(zipper.root(
tree.setNode(null,
zipper.down(binary.zipper(binary1)))));
test.equal(
n.value,
1);
test.equal(
n.left,
null);
test.equal(
n.right.value,
6);
test.done();
};
exports.editLeft = function(test) {
test.deepEqual(
binary.walk(
tree.node(zipper.root(
tree.setNode(
$(10, null, null),
zipper.left(zipper.right(zipper.down(binary.zipper(binary1)))))))),
[1, 10, 6, 7, 8]);
test.done();
};
exports.editRight = function(test) {
test.deepEqual(
binary.walk(
tree.node(zipper.root(
tree.setNode(
$(10, null, null),
zipper.right(zipper.down(binary.zipper(binary1))))))),
[1, 2, 3, 4, 5, 10]);
test.done();
};
exports.simpleRemove = function(test) {
test.deepEqual(
binary.walk(
tree.node(
zipper.root(
zipper.remove(zipper.down(binary.zipper(binary1)))))),
[1, 6, 7, 8]);
test.deepEqual(
binary.walk(
tree.node(
zipper.root(
zipper.remove(zipper.right(zipper.down(zipper.down(binary.zipper(binary1)))))))),
[1, 2, 3, 6, 7, 8]);
test.done();
};
exports.removeReturnsDFS = function(test) {
test.deepEqual(
binary.walk(
tree.node(
zipper.remove(zipper.right(zipper.down(binary.zipper(binary1)))))),
[2, 3, 4, 5]);
test.done();
};
exports.removeMovesToParentOnEmpty = function(test) {
test.deepEqual(
binary.walk(
tree.node(
zipper.root(
zipper.remove(zipper.down(zipper.down(binary.zipper(binary1))))))),
[1, 2, 4, 5, 6, 7, 8]);
test.done();
};
exports.set = function(test) {
test.deepEqual(
binary.walk(
tree.node(
zipper.root(
tree.setNode(
$(10,
$(11, null, null),
$(12, null, null)),
zipper.right(zipper.down(binary.zipper(binary1))))))),
[1, 2, 3, 4, 5, 10, 11, 12]);
test.done();
};
exports.setToEmpty = function(test) {
test.deepEqual(
binary.walk(
tree.node(
zipper.root(
tree.setNode(
null,
zipper.right(zipper.down(binary.zipper(binary1))))))),
[1, 2, 3, 4, 5]);
test.done();
};
exports.modify = function(test) {
test.deepEqual(
binary.walk(
tree.node(
zipper.root(
tree.modifyNode(
function(x) {
return $(x.value * 10, x.left, x.right)
},
zipper.right(zipper.down(binary.zipper(binary1))))))),
[1, 2, 3, 4, 5, 60, 7, 8]);
test.done();
};
exports.replaceNary = function(test) {
test.deepEqual(
nary.walk(
tree.node(
zipper.root(
tree.setNode(
$n(100, {}),
zipper.right(zipper.down(nary.zipper(nary1))))))),
[1, 2, 3, 4, 5, 100, 8]);
test.done();
};
exports.insertLeftNary = function(test) {
test.deepEqual(
nary.walk(
tree.node(
zipper.root(
tree.insertLeft(
100,
$n(100, {
101: $n(101, {})
}),
zipper.right(zipper.down(nary.zipper(nary1))))))),
[1, 2, 3, 4, 5, 100, 101, 6, 7, 8]);
test.done();
};
exports.insertLeftSaysOnCurrentNode = function(test) {
test.deepEqual(
nary.walk(
tree.node(
tree.insertLeft(
100,
$n(100, {
101: $n(101, {})
}),
zipper.right(zipper.down(nary.zipper(nary1)))))),
[6, 7]);
test.done();
};
exports.insertLeftAtLeftmost = function(test) {
test.deepEqual(
nary.walk(
tree.node(
zipper.root(
tree.insertLeft(
100,
$n(100, {
101: $n(101, {})
}),
zipper.down(nary.zipper(nary1)))))),
[1, 100, 101, 2, 3, 4, 5, 6, 7, 8]);
test.done();
};
exports.insertRightNary = function(test) {
test.deepEqual(
nary.walk(
tree.node(
zipper.root(
tree.insertRight(
100,
$n(100, {
101: $n(101, {})
}),
zipper.right(zipper.down(nary.zipper(nary1))))))),
[1, 2, 3, 4, 5, 6, 7, 100, 101, 8]);
test.done();
};
exports.insertChild = function(test) {
var z = zipper.down(nary.zipper(nary1));
test.deepEqual(
nary.walk(
tree.node(
zipper.root(
tree.insertChild(
100,
$n(100, {
101: $n(101, {})
}),
z)))),
[1, 2, 100, 101, 3, 4, 5, 6, 7, 8]);
test.done();
};
exports.insertChildOnLeaf = function(test) {
var z = zipper.down(zipper.down(nary.zipper(nary1)));
test.equal(
zipper.isLeaf(z),
true)
test.deepEqual(
nary.walk(
tree.node(
zipper.root(
tree.insertChild(
100,
$n(100, {
101: $n(101, {})
}),
z)))),
[1, 2, 3, 100, 101, 4, 5, 6, 7, 8]);
test.done();
};
exports.append = function(test) {
test.deepEqual(
nary.walk(
tree.node(
zipper.root(
tree.appendChild(
100,
$n(100, {
101: $n(101, {})
}),
zipper.right(zipper.down(nary.zipper(nary1))))))),
[1, 2, 3, 4, 5, 6, 7, 100, 101, 8]);
test.done();
};
exports.appendLeaf = function(test) {
test.deepEqual(
nary.walk(
tree.node(
zipper.root(
tree.appendChild(
100,
$n(100, {
101: $n(101, {})
}),
zipper.down(zipper.down(nary.zipper(nary1))))))),
[1, 2, 3, 100, 101, 4, 5, 6, 7, 8]);
test.done();
};