var util = require('util') var tape = require('tape') var createIntervalTree = require('../interval-tree.js') function cmpInterval(a, b) { var d = a[0] - b[0] if(d) { return d } return a[1] - b[1] } tape('fuzz test', function(t) { function verifyTree(tree, intervals) { function testInterval(x) { var expected = [] if(x[0] <= x[1]) for(var j=0; j= y[0] && y[1] >= x[0]) { expected.push(y) } } expected.sort(cmpInterval) var actual = [] tree.queryInterval(x[0], x[1], function(j) { actual.push(j) }) actual.sort(cmpInterval) t.same(actual, expected, 'query interval: ' + x) } for(var i=0; i 0) { t.ok(leftP[i][0] >= leftP[i-1][0], 'order ok') } var y = leftP[i] t.ok(y[0] <= midp && midp <= y[1], 'interval ok') } //Verify right end points in ascending order var rightP = node.rightPoints.slice() for(var i=0; i 0) { t.ok(rightP[i][1] >= rightP[i-1][1], 'order ok') } var y = rightP[i] t.ok(y[0] <= midp && midp <= y[1], 'interval ok') } leftP.sort(cmpInterval) rightP.sort(cmpInterval) t.same(leftP, rightP, 'intervals are consistent') var leftCount = verifyNode(node.left, left, node.mid) var rightCount = verifyNode(node.right, node.mid, right) var actualCount = leftCount + rightCount + leftP.length t.equals(node.count, actualCount, 'node count consistent') return actualCount } verifyNode(tree.root, -Infinity, Infinity) } //Check empty tree verifyTree(createIntervalTree(), []) //Try trees with uniformly distributed end points for(var count=0; count<10; ++count) { //Create empty tree and insert 100 intervals var intervals = [] var tree = createIntervalTree() for(var i=0; i<100; ++i) { var a = Math.random() var b = a + Math.random() var x = [a,b] intervals.push(x) tree.insert(x) } verifyTree(tree, intervals) //Remove half the intervals for(var i=99; i>=50; --i) { tree.remove(intervals.pop()) } verifyTree(tree, intervals) } //Trees with quantized end points for(var count=0; count<10; ++count) { //Create empty tree and insert 100 intervals var intervals = [] var tree = createIntervalTree() for(var i=0; i<100; ++i) { var a = Math.floor(8.0*Math.random())/8.0 var b = Math.max(a + Math.floor(8.0*Math.random())/8.0, 1.0) var x = [a,b] intervals.push(x) tree.insert(x) } verifyTree(tree, intervals) //Remove half the intervals for(var i=99; i>=50; --i) { tree.remove(intervals.pop()) } verifyTree(tree, intervals) } var stackIntervals = [] for(var i=0; i<100; ++i) { stackIntervals.push([i/200, 1.0-(i/200)]) } var tree = createIntervalTree(stackIntervals) verifyTree(tree, stackIntervals) t.end() }) tape('containment', function(t) { var tree = createIntervalTree([[0, 100]]) var count = 0 function incr() { count++ } tree.queryInterval(10, 20, incr) t.equals(count, 1) count = 0; tree.queryInterval(100, 100, incr) t.equals(count, 1) count = 0; tree.queryInterval(110, 111, incr) t.equals(count, 0) var tree = createIntervalTree([[0, 20], [30, 50]]) count = 0 tree.queryInterval(10, 15, incr) t.equals(count, 1) count = 0 tree.queryInterval(25, 26, incr) t.equals(count, 0) count = 0 tree.queryInterval(35, 40, incr) t.equals(count, 1) t.end() })