You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.6 KiB
79 lines
2.6 KiB
3 years ago
|
var RopeSequence = require("./index")
|
||
|
var assert = require("assert")
|
||
|
|
||
|
function describe(rope) {
|
||
|
if (rope.left) return "(" + describe(rope.left) + ", " + describe(rope.right) + ")"
|
||
|
else return rope.length
|
||
|
}
|
||
|
|
||
|
function appendBuild(n) {
|
||
|
var rope = RopeSequence.empty
|
||
|
for (var i = 0; i < n; i++)
|
||
|
rope = rope.append([i])
|
||
|
return rope
|
||
|
}
|
||
|
|
||
|
function dequeBuild(n) {
|
||
|
var mid = n >> 1, rope = RopeSequence.empty
|
||
|
for (var from = mid - 1, to = mid; to < n; from--, to++) {
|
||
|
rope = rope.append([to])
|
||
|
if (from >= 0) rope = RopeSequence.from([from]).append(rope)
|
||
|
}
|
||
|
return rope
|
||
|
}
|
||
|
|
||
|
function flatBuild(n) {
|
||
|
var arr = []
|
||
|
for (var i = 0; i < n; i++) arr.push(i)
|
||
|
return RopeSequence.from(arr)
|
||
|
}
|
||
|
|
||
|
var SIZE = 10000
|
||
|
|
||
|
function checkForEach(rope, name, start, end, offset) {
|
||
|
var cur = start
|
||
|
rope.forEach(function(elt, i) {
|
||
|
assert.equal(elt, cur + offset, "Proper element at " + cur + " in " + name)
|
||
|
assert.equal(cur, i, "Accurate index passed")
|
||
|
cur++
|
||
|
}, start, end)
|
||
|
assert.equal(cur, end, "Enough elements iterated in " + name)
|
||
|
rope.forEach(function(elt, i) {
|
||
|
cur--
|
||
|
assert.equal(elt, cur + offset, "Proper element during reverse iter at " + cur + " in " + name)
|
||
|
assert.equal(cur, i, "Accurate index passed by reverse iter")
|
||
|
}, end, start)
|
||
|
assert.equal(cur, start, "Enough elements reverse-iterated in " + name + " -- " + cur + " " + start)
|
||
|
}
|
||
|
|
||
|
function check(rope, size, name, offset) {
|
||
|
if (!offset) offset = 0
|
||
|
assert.equal(rope.length, size, "Size of " + name)
|
||
|
for (var i = 0; i < rope.length; i++)
|
||
|
assert.equal(rope.get(i), offset + i, "Field at " + i + " in " + name)
|
||
|
checkForEach(rope, name, 0, rope.length, offset)
|
||
|
for (var i = 0, e = Math.min(10, Math.floor(size / 100)); i < e; i++) {
|
||
|
var start = Math.floor(Math.random() * size), end = start + Math.ceil(Math.random() * (size - start))
|
||
|
checkForEach(rope, name + "-" + start + "-" + end, start, end, offset)
|
||
|
check(rope.slice(start, end), end - start, name + "-sliced-" + start + "-" + end, offset + start)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
check(appendBuild(SIZE), SIZE, "appended")
|
||
|
check(dequeBuild(SIZE), SIZE, "dequed")
|
||
|
check(flatBuild(SIZE), SIZE, "flat")
|
||
|
|
||
|
var small = RopeSequence.from([1, 2, 4]), empty = RopeSequence.empty
|
||
|
assert.equal(small.append(empty), small, "ID append")
|
||
|
assert.equal(small.prepend(empty), small, "ID prepend")
|
||
|
assert.equal(empty.append(empty), empty, "empty append")
|
||
|
assert.equal(small.slice(0, 0), empty, "empty slice")
|
||
|
|
||
|
var sum = 0
|
||
|
small.forEach(function(v) { if (v == 2) return false; sum += v })
|
||
|
assert.equal(sum, 1, "abort iteration")
|
||
|
|
||
|
assert.deepEqual(small.map(function(x) { return x + 1 }), [2, 3, 5], "mapping")
|
||
|
|
||
|
console.log("All passed")
|