blob: b99b23b55637caef107b46ac13ddb20b87f0dc13 [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/sorted_array_utils.html">
<script>
'use strict';
tr.b.unittest.testSuite(function() {
var ArrayOfIntervals = function(array) {
this.array = array;
}
ArrayOfIntervals.prototype = {
get: function(index) {
return this.array[index];
},
findLowElementIndex: function(ts) {
return tr.b.findLowIndexInSortedArray(
this.array,
function(x) { return x.lo; },
ts);
},
findIntervalIndex: function(ts) {
return tr.b.findIndexInSortedIntervals(
this.array,
function(x) { return x.lo; },
function(x) { return x.hi - x.lo; },
ts);
},
findIndexInClosedIntervals: function(ts) {
return tr.b.findIndexInSortedClosedIntervals(
this.array,
function(x) { return x.lo; },
function(x) { return x.hi; },
ts);
},
findIntersectingIntervals: function(tsA, tsB) {
var array = this.array;
var result = [];
tr.b.iterateOverIntersectingIntervals(
this.array,
function(x) { return x.lo; },
function(x) { return x.hi - x.lo; },
tsA,
tsB,
function(x) { result.push(array.indexOf(x)); });
return result;
},
findClosestElement: function(ts, tsDiff) {
return tr.b.findClosestElementInSortedArray(
this.array,
function(x) { return x.lo; },
ts,
tsDiff);
},
findClosestInterval: function(ts, tsDiff) {
return tr.b.findClosestIntervalInSortedIntervals(
this.array,
function(x) { return x.lo; },
function(x) { return x.hi; },
ts,
tsDiff);
}
};
test('findLowElementIndex', function() {
var array = new ArrayOfIntervals([
{lo: 10, hi: 15},
{lo: 20, hi: 30}
]);
assert.equal(array.findLowElementIndex(-100), 0);
assert.equal(array.findLowElementIndex(0), 0);
assert.equal(array.findLowElementIndex(10), 0);
assert.equal(array.findLowElementIndex(10.1), 1);
assert.equal(array.findLowElementIndex(15), 1);
assert.equal(array.findLowElementIndex(20), 1);
assert.equal(array.findLowElementIndex(20.1), 2);
assert.equal(array.findLowElementIndex(21), 2);
assert.equal(array.findLowElementIndex(100), 2);
});
test('findIntervalIndex', function() {
var array = new ArrayOfIntervals([
{lo: 10, hi: 15},
{lo: 20, hi: 30}
]);
assert.equal(array.findIntervalIndex(0), -1);
assert.equal(array.findIntervalIndex(9.9), -1);
assert.equal(array.findIntervalIndex(10), 0);
assert.equal(array.findIntervalIndex(12), 0);
assert.equal(array.findIntervalIndex(14.9), 0);
assert.equal(array.findIntervalIndex(20), 1);
assert.equal(array.findIntervalIndex(21), 1);
assert.equal(array.findIntervalIndex(29.99), 1);
assert.equal(array.findIntervalIndex(30), 2);
assert.equal(array.findIntervalIndex(40), 2);
// misses, in between the intervals, return array length
assert.equal(array.findIntervalIndex(15), 2);
assert.equal(array.findIntervalIndex(19.9), 2);
});
test('findClosedIntervalIndex', function() {
var array = new ArrayOfIntervals([
{lo: 10, hi: 15},
{lo: 15, hi: 20},
{lo: 21, hi: 25}
]);
assert.equal(array.findIndexInClosedIntervals(0), -1);
assert.equal(array.findIndexInClosedIntervals(9.999), -1);
assert.equal(array.findIndexInClosedIntervals(10), 0);
assert.equal(array.findIndexInClosedIntervals(14), 0);
assert.equal(array.findIndexInClosedIntervals(15), 0);
assert.equal(array.findIndexInClosedIntervals(15.00001), 1);
assert.equal(array.findIndexInClosedIntervals(20.5), 3);
assert.equal(array.findIndexInClosedIntervals(22), 2);
assert.equal(array.findIndexInClosedIntervals(25), 2);
assert.equal(array.findIndexInClosedIntervals(25.00001), 3);
});
test('findClosedInEmptyArray', function() {
var array = new ArrayOfIntervals([]);
assert.equal(array.findIndexInClosedIntervals(0), 0);
});
test('findIntersectingIntervals', function() {
var array = new ArrayOfIntervals([
{lo: 10, hi: 15},
{lo: 20, hi: 30}
]);
assert.deepEqual(array.findIntersectingIntervals(0, 0), []);
assert.deepEqual(array.findIntersectingIntervals(100, 0), []);
assert.deepEqual(array.findIntersectingIntervals(0, 10), []);
assert.deepEqual(array.findIntersectingIntervals(0, 10.1), [0]);
assert.deepEqual(array.findIntersectingIntervals(5, 15), [0]);
assert.deepEqual(array.findIntersectingIntervals(15, 20), [0]);
assert.deepEqual(array.findIntersectingIntervals(15.1, 20), []);
assert.deepEqual(array.findIntersectingIntervals(15.1, 20.1), [1]);
assert.deepEqual(array.findIntersectingIntervals(20, 30), [1]);
assert.deepEqual(array.findIntersectingIntervals(30, 100), [1]);
assert.deepEqual(array.findIntersectingIntervals(0, 100), [0, 1]);
assert.deepEqual(array.findIntersectingIntervals(15, 20.1), [0, 1]);
});
test('findClosestElement', function() {
var array = new ArrayOfIntervals([
{lo: 10, hi: 15},
{lo: 20, hi: 30}
]);
// Test the helper method first.
assert.isUndefined(array.get(-1));
assert.equal(array.get(0), array.array[0]);
assert.equal(array.get(1), array.array[1]);
assert.isUndefined(array.get(2));
assert.isNull(array.findClosestElement(0, 0));
assert.isNull(array.findClosestElement(0, 9.9));
assert.isNull(array.findClosestElement(10, -10));
assert.equal(array.get(0), array.findClosestElement(0, 10));
assert.equal(array.get(0), array.findClosestElement(8, 5));
assert.equal(array.get(0), array.findClosestElement(10, 0));
assert.equal(array.get(0), array.findClosestElement(12, 2));
assert.isNull(array.findClosestElement(15, 3));
assert.isNotNull(array.findClosestElement(15, 5));
assert.equal(array.get(1), array.findClosestElement(19, 1));
assert.equal(array.get(1), array.findClosestElement(20, 0));
assert.equal(array.get(1), array.findClosestElement(30, 15));
assert.isNull(array.findClosestElement(30, 9.9));
assert.isNull(array.findClosestElement(100, 50));
});
test('findClosestInterval', function() {
var array = new ArrayOfIntervals([
{lo: 10, hi: 15},
{lo: 20, hi: 30}
]);
assert.isNull(array.findClosestInterval(0, 0));
assert.isNull(array.findClosestInterval(0, 9.9));
assert.isNull(array.findClosestInterval(0, -100));
assert.equal(array.get(0), array.findClosestInterval(0, 10));
assert.equal(array.get(0), array.findClosestInterval(10, 0));
assert.equal(array.get(0), array.findClosestInterval(12, 3));
assert.equal(array.get(0), array.findClosestInterval(12, 100));
assert.equal(array.get(0), array.findClosestInterval(13, 3));
assert.equal(array.get(0), array.findClosestInterval(13, 20));
assert.equal(array.get(0), array.findClosestInterval(15, 0));
assert.isNull(array.findClosestInterval(17.5, 0));
assert.isNull(array.findClosestInterval(17.5, 2.4));
assert.isNotNull(array.findClosestInterval(17.5, 2.5));
assert.isNotNull(array.findClosestInterval(17.5, 10));
assert.equal(array.get(1), array.findClosestInterval(19, 2));
assert.equal(array.get(1), array.findClosestInterval(20, 0));
assert.equal(array.get(1), array.findClosestInterval(24, 100));
assert.equal(array.get(1), array.findClosestInterval(26, 100));
assert.equal(array.get(1), array.findClosestInterval(30, 0));
assert.equal(array.get(1), array.findClosestInterval(35, 10));
assert.equal(array.get(1), array.findClosestInterval(50, 100));
assert.isNull(array.findClosestInterval(50, 19));
assert.isNull(array.findClosestInterval(100, 50));
assert.isNull(array.findClosestInterval(50, -100));
});
});
</script>