blob: 0a8f28a9af1ffc5eac193ce7f44a657ce75da66e [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright (c) 2014 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<link rel="import" href="/base/interval_tree.html">
<script>
'use strict';
tr.b.unittest.testSuite(function() {
function SimpleIntervalTree() {
tr.b.IntervalTree.call(this,
function(s) { return s.start; },
function(s) { return s.end; });
return this;
}
SimpleIntervalTree.prototype = {
__proto__: tr.b.IntervalTree.prototype
};
function buildSimpleTree() {
var tree = new SimpleIntervalTree();
tree.v0 = tree.insert({start: 2, end: 6});
tree.v1 = tree.insert({start: 1, end: 3});
tree.v2 = tree.insert({start: 5, end: 7});
tree.v3 = tree.insert({start: 1, end: 5});
tree.v4 = tree.insert({start: 3, end: 5});
tree.v5 = tree.insert({start: 3, end: 5});
tree.v6 = tree.insert({start: 3, end: 6});
tree.v7 = tree.insert({start: 1, end: 1});
tree.v8 = tree.insert({start: 4, end: 8});
tree.v9 = tree.insert({start: 0, end: 2});
tree.updateHighValues();
return tree;
}
function sortSimpleResults(intersection) {
intersection.sort(function(a, b) {
if (a.start === b.start)
return a.end - b.end;
return a.start - b.start;
});
}
test('findIntersection', function() {
var tree = buildSimpleTree();
var intersection = tree.findIntersection(2, 4);
sortSimpleResults(intersection);
var expected = [tree.v1, tree.v3, tree.v0, tree.v4, tree.v5, tree.v6];
assert.equal(intersection.length, 6);
assert.deepEqual(intersection, expected);
});
test('findIntersection_zeroDuration', function() {
var tree = buildSimpleTree();
var intersection = tree.findIntersection(2, 2);
sortSimpleResults(intersection);
var expected = [tree.v1, tree.v3];
assert.equal(intersection.length, 2);
assert.deepEqual(intersection, expected);
});
test('findIntersection_noMatching', function() {
var tree = buildSimpleTree();
var intersection = tree.findIntersection(9, 10);
assert.deepEqual(intersection, []);
});
test('findIntersection_emptyTree', function() {
var tree = new tr.b.IntervalTree();
tree.updateHighValues();
var intersection = tree.findIntersection(2, 4);
assert.deepEqual(intersection, []);
});
test('findIntersection_emptyInterval', function() {
var tree = new tr.b.IntervalTree();
tree.updateHighValues();
assert.throws(function() {
tree.findIntersection();
});
assert.throws(function() {
tree.findIntersection(1);
});
assert.throws(function() {
tree.findIntersection('a', 'b');
});
});
test('insert', function() {
var tree = new tr.b.IntervalTree(
function(s) { return s.start; },
function(s) { return s.end; });
assert.equal(tree.size, 0);
tree.insert({start: 1, end: 4});
tree.insert({start: 3, end: 5});
tree.updateHighValues();
var outTree = {
'left': {
'data': [[1, 4]]
},
'data': [[3, 5]]
};
assert.equal(tree.size, 2);
assert.deepEqual(tree.dump_(), outTree);
});
test('insert_withoutEnd', function() {
var tree = new tr.b.IntervalTree(
function(s) { return s.start; },
function(s) { return s.end; });
assert.equal(tree.size, 0);
tree.insert({start: 3, end: 5});
tree.insert({start: 1, end: 4});
tree.updateHighValues();
var outTree = {
'left': {
'data': [[1, 4]]
},
'data': [[3, 5]]
};
assert.equal(tree.size, 2);
assert.deepEqual(tree.dump_(), outTree);
});
test('insert_balancesTree', function() {
var tree = new tr.b.IntervalTree(
function(s) { return s.start; },
function(s) { return s.end; });
assert.equal(tree.size, 0);
for (var i = 0; i < 10; ++i)
tree.insert({start: i, end: 5});
tree.updateHighValues();
var outTree = {
'left': {
'left': {
'data': [[0, 5]]
},
'data': [[1, 5]],
'right': {
'data': [[2, 5]]
}
},
'data': [[3, 5]],
'right': {
'left': {
'left': {
'data': [[4, 5]]
},
'data': [[5, 5]],
'right': {
'data': [[6, 5]]
}
},
'data': [[7, 5]],
'right': {
'left': {
'data': [[8, 5]]
},
'data': [[9, 5]]
}
}
};
assert.deepEqual(tree.dump_(), outTree);
});
test('insert_withDuplicateIntervals', function() {
var tree = new tr.b.IntervalTree(
function(s) { return s.start; },
function(s) { return s.end; });
assert.equal(tree.size, 0);
tree.insert({start: 1, end: 4});
tree.insert({start: 3, end: 5});
tree.insert({start: 3, end: 5});
tree.insert({start: 3, end: 6});
tree.updateHighValues();
var outTree = {
'left': {
'data': [[1, 4]]
},
'data': [[3, 5], [3, 5], [3, 6]]
};
assert.equal(tree.size, 4);
assert.deepEqual(tree.dump_(), outTree);
});
test('insert_updatesHighValues', function() {
var tree = buildSimpleTree();
var expected = [
[undefined, undefined],
[2, undefined],
[5, 8],
[undefined, undefined],
[6, 7],
[undefined, undefined]
];
var result = [];
function walk(node) {
if (node === undefined)
return;
walk(node.leftNode);
result.push([node.maxHighLeft, node.maxHighRight]);
walk(node.rightNode);
}
walk(tree.root);
assert.deepEqual(result, expected);
});
});
</script>