You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
365 lines
9.6 KiB
JavaScript
365 lines
9.6 KiB
JavaScript
import { DoublyLinkedList } from "../../Source/Cesium.js";
|
|
|
|
describe("Core/DoublyLinkedList", function () {
|
|
it("constructs", function () {
|
|
var list = new DoublyLinkedList();
|
|
expect(list.head).not.toBeDefined();
|
|
expect(list.tail).not.toBeDefined();
|
|
expect(list.length).toEqual(0);
|
|
});
|
|
|
|
it("adds items", function () {
|
|
var list = new DoublyLinkedList();
|
|
var node = list.add(1);
|
|
|
|
// node
|
|
// ^ ^
|
|
// | |
|
|
// head tail
|
|
expect(list.head).toEqual(node);
|
|
expect(list.tail).toEqual(node);
|
|
expect(list.length).toEqual(1);
|
|
|
|
expect(node).toBeDefined();
|
|
expect(node.item).toEqual(1);
|
|
expect(node.previous).not.toBeDefined();
|
|
expect(node.next).not.toBeDefined();
|
|
|
|
var node2 = list.add(2);
|
|
|
|
// node <-> node2
|
|
// ^ ^
|
|
// | |
|
|
// head tail
|
|
expect(list.head).toEqual(node);
|
|
expect(list.tail).toEqual(node2);
|
|
expect(list.length).toEqual(2);
|
|
|
|
expect(node2).toBeDefined();
|
|
expect(node2.item).toEqual(2);
|
|
expect(node2.previous).toEqual(node);
|
|
expect(node2.next).not.toBeDefined();
|
|
|
|
expect(node.next).toEqual(node2);
|
|
|
|
var node3 = list.add(3);
|
|
|
|
// node <-> node2 <-> node3
|
|
// ^ ^
|
|
// | |
|
|
// head tail
|
|
expect(list.head).toEqual(node);
|
|
expect(list.tail).toEqual(node3);
|
|
expect(list.length).toEqual(3);
|
|
|
|
expect(node3).toBeDefined();
|
|
expect(node3.item).toEqual(3);
|
|
expect(node3.previous).toEqual(node2);
|
|
expect(node3.next).not.toBeDefined();
|
|
|
|
expect(node2.next).toEqual(node3);
|
|
});
|
|
|
|
it("removes from a list with one item", function () {
|
|
var list = new DoublyLinkedList();
|
|
var node = list.add(1);
|
|
|
|
list.remove(node);
|
|
|
|
expect(list.head).not.toBeDefined();
|
|
expect(list.tail).not.toBeDefined();
|
|
expect(list.length).toEqual(0);
|
|
});
|
|
|
|
it("removes head of list", function () {
|
|
var list = new DoublyLinkedList();
|
|
var node = list.add(1);
|
|
var node2 = list.add(2);
|
|
|
|
list.remove(node);
|
|
|
|
expect(list.head).toEqual(node2);
|
|
expect(list.tail).toEqual(node2);
|
|
expect(list.length).toEqual(1);
|
|
});
|
|
|
|
it("removes tail of list", function () {
|
|
var list = new DoublyLinkedList();
|
|
var node = list.add(1);
|
|
var node2 = list.add(2);
|
|
|
|
list.remove(node2);
|
|
|
|
expect(list.head).toEqual(node);
|
|
expect(list.tail).toEqual(node);
|
|
expect(list.length).toEqual(1);
|
|
});
|
|
|
|
it("removes middle of list", function () {
|
|
var list = new DoublyLinkedList();
|
|
var node = list.add(1);
|
|
var node2 = list.add(2);
|
|
var node3 = list.add(3);
|
|
|
|
list.remove(node2);
|
|
|
|
expect(list.head).toEqual(node);
|
|
expect(list.tail).toEqual(node3);
|
|
expect(list.length).toEqual(2);
|
|
});
|
|
|
|
it("removes nothing", function () {
|
|
var list = new DoublyLinkedList();
|
|
var node = list.add(1);
|
|
|
|
list.remove(undefined);
|
|
|
|
expect(list.head).toEqual(node);
|
|
expect(list.tail).toEqual(node);
|
|
expect(list.length).toEqual(1);
|
|
});
|
|
|
|
function expectOrder(list, nodes) {
|
|
// Assumes at least one node is in the list
|
|
var length = nodes.length;
|
|
|
|
expect(list.length).toEqual(length);
|
|
|
|
// Verify head and tail pointers
|
|
expect(list.head).toEqual(nodes[0]);
|
|
expect(list.tail).toEqual(nodes[length - 1]);
|
|
|
|
// Verify that linked list has nodes in the expected order
|
|
var node = list.head;
|
|
for (var i = 0; i < length; ++i) {
|
|
var nextNode = i === length - 1 ? undefined : nodes[i + 1];
|
|
var previousNode = i === 0 ? undefined : nodes[i - 1];
|
|
|
|
expect(node).toEqual(nodes[i]);
|
|
expect(node.next).toEqual(nextNode);
|
|
expect(node.previous).toEqual(previousNode);
|
|
|
|
node = node.next;
|
|
}
|
|
}
|
|
|
|
it("splices nextNode before node", function () {
|
|
var list = new DoublyLinkedList();
|
|
var node = list.add(1);
|
|
var node2 = list.add(2);
|
|
var node3 = list.add(3);
|
|
var node4 = list.add(4);
|
|
var node5 = list.add(5);
|
|
|
|
// Before:
|
|
//
|
|
// node <-> node2 <-> node3 <-> node4 <-> node5
|
|
// ^ ^ ^ ^
|
|
// | | | |
|
|
// head nextNode node tail
|
|
|
|
// After:
|
|
//
|
|
// node <-> node3 <-> node4 <-> node2 <-> node5
|
|
// ^ ^
|
|
// | |
|
|
// head tail
|
|
|
|
// Move node2 after node4
|
|
list.splice(node4, node2);
|
|
expectOrder(list, [node, node3, node4, node2, node5]);
|
|
});
|
|
|
|
it("splices nextNode after node", function () {
|
|
var list = new DoublyLinkedList();
|
|
var node = list.add(1);
|
|
var node2 = list.add(2);
|
|
var node3 = list.add(3);
|
|
var node4 = list.add(4);
|
|
var node5 = list.add(5);
|
|
|
|
// Before:
|
|
//
|
|
// node <-> node2 <-> node3 <-> node4 <-> node5
|
|
// ^ ^ ^ ^
|
|
// | | | |
|
|
// head node nextNode tail
|
|
|
|
// After:
|
|
//
|
|
// node <-> node2 <-> node4 <-> node3 <-> node5
|
|
// ^ ^
|
|
// | |
|
|
// head tail
|
|
|
|
// Move node4 after node2
|
|
list.splice(node2, node4);
|
|
expectOrder(list, [node, node2, node4, node3, node5]);
|
|
});
|
|
|
|
it("splices nextNode immediately before node", function () {
|
|
var list = new DoublyLinkedList();
|
|
var node = list.add(1);
|
|
var node2 = list.add(2);
|
|
var node3 = list.add(3);
|
|
var node4 = list.add(4);
|
|
|
|
// Before:
|
|
//
|
|
// node <-> node2 <-> node3 <-> node4
|
|
// ^ ^ ^ ^
|
|
// | | | |
|
|
// head nextNode node tail
|
|
|
|
// After:
|
|
//
|
|
// node <-> node3 <-> node2 <-> node4
|
|
// ^ ^
|
|
// | |
|
|
// head tail
|
|
|
|
// Move node2 after node4
|
|
list.splice(node3, node2);
|
|
expectOrder(list, [node, node3, node2, node4]);
|
|
});
|
|
|
|
it("splices nextNode immediately after node", function () {
|
|
var list = new DoublyLinkedList();
|
|
var node = list.add(1);
|
|
var node2 = list.add(2);
|
|
var node3 = list.add(3);
|
|
var node4 = list.add(4);
|
|
|
|
// Before:
|
|
//
|
|
// node <-> node2 <-> node3 <-> node4
|
|
// ^ ^ ^ ^
|
|
// | | | |
|
|
// head node nextNode tail
|
|
|
|
// After: does not change
|
|
|
|
list.splice(node2, node3);
|
|
expectOrder(list, [node, node2, node3, node4]);
|
|
});
|
|
|
|
it("splices node === nextNode", function () {
|
|
var list = new DoublyLinkedList();
|
|
var node = list.add(1);
|
|
var node2 = list.add(2);
|
|
var node3 = list.add(3);
|
|
|
|
// Before:
|
|
//
|
|
// node <-> node2 <-> node3
|
|
// ^ ^ ^
|
|
// | | |
|
|
// head node/nextNode tail
|
|
|
|
// After: does not change
|
|
|
|
list.splice(node2, node2);
|
|
expectOrder(list, [node, node2, node3]);
|
|
});
|
|
|
|
it("splices when nextNode was tail", function () {
|
|
var list = new DoublyLinkedList();
|
|
var node = list.add(1);
|
|
var node2 = list.add(2);
|
|
var node3 = list.add(3);
|
|
var node4 = list.add(4);
|
|
|
|
// Before:
|
|
//
|
|
// node <-> node2 <-> node3 <-> node4
|
|
// ^ ^ ^
|
|
// | | |
|
|
// head node tail/nextNode
|
|
|
|
// After:
|
|
//
|
|
// node <-> node2 <-> node4 <-> node3
|
|
// ^ ^
|
|
// | |
|
|
// head tail
|
|
|
|
list.splice(node2, node4);
|
|
expectOrder(list, [node, node2, node4, node3]);
|
|
});
|
|
|
|
it("splices when node was tail", function () {
|
|
var list = new DoublyLinkedList();
|
|
var node = list.add(1);
|
|
var node2 = list.add(2);
|
|
var node3 = list.add(3);
|
|
var node4 = list.add(4);
|
|
|
|
// Before:
|
|
//
|
|
// node <-> node2 <-> node3 <-> node4
|
|
// ^ ^ ^
|
|
// | | |
|
|
// head nextNode tail/node
|
|
|
|
// After:
|
|
//
|
|
// node <-> node3 <-> node4 <-> node2
|
|
// ^ ^
|
|
// | |
|
|
// head tail/node
|
|
|
|
list.splice(node4, node2);
|
|
expectOrder(list, [node, node3, node4, node2]);
|
|
});
|
|
|
|
it("splices when nextNode was head", function () {
|
|
var list = new DoublyLinkedList();
|
|
var node = list.add(1);
|
|
var node2 = list.add(2);
|
|
var node3 = list.add(3);
|
|
var node4 = list.add(4);
|
|
|
|
// Before:
|
|
//
|
|
// node <-> node2 <-> node3 <-> node4
|
|
// ^ ^ ^
|
|
// | | |
|
|
// head/nextNode node tail
|
|
|
|
// After:
|
|
//
|
|
// node2 <-> node3 <-> node <-> node4
|
|
// ^ ^
|
|
// | |
|
|
// head tail
|
|
|
|
list.splice(node3, node);
|
|
expectOrder(list, [node2, node3, node, node4]);
|
|
});
|
|
|
|
it("splices when node was head", function () {
|
|
var list = new DoublyLinkedList();
|
|
var node = list.add(1);
|
|
var node2 = list.add(2);
|
|
var node3 = list.add(3);
|
|
var node4 = list.add(4);
|
|
|
|
// Before:
|
|
//
|
|
// node <-> node2 <-> node3 <-> node4
|
|
// ^ ^ ^
|
|
// | | |
|
|
// head/node nextNode tail
|
|
|
|
// After:
|
|
//
|
|
// node <-> node3 <-> node2 <-> node4
|
|
// ^ ^
|
|
// | |
|
|
// head tail
|
|
|
|
list.splice(node, node3);
|
|
expectOrder(list, [node, node3, node2, node4]);
|
|
});
|
|
});
|