blob: 95fa15128d7823eaaba12193e3871606887c3787 [file] [log] [blame]
Chris Craikb122baf2015-03-05 13:58:42 -08001<!DOCTYPE html>
2<!--
3Copyright (c) 2014 The Chromium Authors. All rights reserved.
4Use of this source code is governed by a BSD-style license that can be
5found in the LICENSE file.
6-->
7<link rel="import" href="/base/sorted_array_utils.html">
8<script>
9'use strict';
10
11tv.b.unittest.testSuite(function() {
12 var ArrayOfIntervals = function(array) {
13 this.array = array;
14 }
15
16 ArrayOfIntervals.prototype = {
17
18 get: function(index) {
19 return this.array[index];
20 },
21
22 findLowElementIndex: function(ts) {
23 return tv.b.findLowIndexInSortedArray(
24 this.array,
25 function(x) { return x.lo; },
26 ts);
27 },
28
Chris Craik19832152015-04-16 15:43:38 -070029 findIntervalIndex: function(ts) {
30 return tv.b.findIndexInSortedIntervals(
Chris Craikb122baf2015-03-05 13:58:42 -080031 this.array,
32 function(x) { return x.lo; },
33 function(x) { return x.hi - x.lo; },
34 ts);
35 },
36
Chris Craik44c28202015-05-12 17:25:16 -070037 findIndexInClosedIntervals: function(ts) {
38 return tv.b.findIndexInSortedClosedIntervals(
39 this.array,
40 function(x) { return x.lo; },
41 function(x) { return x.hi; },
42 ts);
43 },
44
Chris Craikb122baf2015-03-05 13:58:42 -080045 findIntersectingIntervals: function(tsA, tsB) {
46 var array = this.array;
47 var result = [];
48 tv.b.iterateOverIntersectingIntervals(
49 this.array,
50 function(x) { return x.lo; },
51 function(x) { return x.hi - x.lo; },
52 tsA,
53 tsB,
54 function(x) { result.push(array.indexOf(x)); });
55 return result;
56 },
57
58 findClosestElement: function(ts, tsDiff) {
59 return tv.b.findClosestElementInSortedArray(
60 this.array,
61 function(x) { return x.lo; },
62 ts,
63 tsDiff);
64 },
65
66 findClosestInterval: function(ts, tsDiff) {
67 return tv.b.findClosestIntervalInSortedIntervals(
68 this.array,
69 function(x) { return x.lo; },
70 function(x) { return x.hi; },
71 ts,
72 tsDiff);
73 }
74 };
75
76 test('findLowElementIndex', function() {
77 var array = new ArrayOfIntervals([
78 {lo: 10, hi: 15},
79 {lo: 20, hi: 30}
80 ]);
81
82 assert.equal(array.findLowElementIndex(-100), 0);
83 assert.equal(array.findLowElementIndex(0), 0);
84 assert.equal(array.findLowElementIndex(10), 0);
85
86 assert.equal(array.findLowElementIndex(10.1), 1);
87 assert.equal(array.findLowElementIndex(15), 1);
88 assert.equal(array.findLowElementIndex(20), 1);
89
90 assert.equal(array.findLowElementIndex(20.1), 2);
91 assert.equal(array.findLowElementIndex(21), 2);
92 assert.equal(array.findLowElementIndex(100), 2);
93 });
94
Chris Craik19832152015-04-16 15:43:38 -070095 test('findIntervalIndex', function() {
Chris Craikb122baf2015-03-05 13:58:42 -080096 var array = new ArrayOfIntervals([
97 {lo: 10, hi: 15},
98 {lo: 20, hi: 30}
99 ]);
100
Chris Craik19832152015-04-16 15:43:38 -0700101 assert.equal(array.findIntervalIndex(0), -1);
102 assert.equal(array.findIntervalIndex(9.9), -1);
Chris Craikb122baf2015-03-05 13:58:42 -0800103
Chris Craik19832152015-04-16 15:43:38 -0700104 assert.equal(array.findIntervalIndex(10), 0);
105 assert.equal(array.findIntervalIndex(12), 0);
106 assert.equal(array.findIntervalIndex(14.9), 0);
Chris Craikb122baf2015-03-05 13:58:42 -0800107
Chris Craik19832152015-04-16 15:43:38 -0700108 assert.equal(array.findIntervalIndex(20), 1);
109 assert.equal(array.findIntervalIndex(21), 1);
110 assert.equal(array.findIntervalIndex(29.99), 1);
Chris Craikb122baf2015-03-05 13:58:42 -0800111
Chris Craik19832152015-04-16 15:43:38 -0700112 assert.equal(array.findIntervalIndex(30), 2);
113 assert.equal(array.findIntervalIndex(40), 2);
Chris Craikb122baf2015-03-05 13:58:42 -0800114
Chris Craik19832152015-04-16 15:43:38 -0700115
116 // misses, in between the intervals, return array length
117 assert.equal(array.findIntervalIndex(15), 2);
118 assert.equal(array.findIntervalIndex(19.9), 2);
Chris Craikb122baf2015-03-05 13:58:42 -0800119 });
120
Chris Craik44c28202015-05-12 17:25:16 -0700121 test('findClosedIntervalIndex', function() {
122 var array = new ArrayOfIntervals([
123 {lo: 10, hi: 15},
124 {lo: 15, hi: 20},
125 {lo: 21, hi: 25}
126 ]);
127
128 assert.equal(array.findIndexInClosedIntervals(0), -1);
129 assert.equal(array.findIndexInClosedIntervals(9.999), -1);
130 assert.equal(array.findIndexInClosedIntervals(10), 0);
131 assert.equal(array.findIndexInClosedIntervals(14), 0);
132 assert.equal(array.findIndexInClosedIntervals(15), 0);
133 assert.equal(array.findIndexInClosedIntervals(15.00001), 1);
134 assert.equal(array.findIndexInClosedIntervals(20.5), 3);
135 assert.equal(array.findIndexInClosedIntervals(22), 2);
136 assert.equal(array.findIndexInClosedIntervals(25), 2);
137 assert.equal(array.findIndexInClosedIntervals(25.00001), 3);
138 });
139
140 test('findClosedInEmptyArray', function() {
141 var array = new ArrayOfIntervals([]);
142 assert.equal(array.findIndexInClosedIntervals(0), 0);
143 });
144
Chris Craikb122baf2015-03-05 13:58:42 -0800145 test('findIntersectingIntervals', function() {
146 var array = new ArrayOfIntervals([
147 {lo: 10, hi: 15},
148 {lo: 20, hi: 30}
149 ]);
150
151 assert.deepEqual(array.findIntersectingIntervals(0, 0), []);
152 assert.deepEqual(array.findIntersectingIntervals(100, 0), []);
153 assert.deepEqual(array.findIntersectingIntervals(0, 10), []);
154
155 assert.deepEqual(array.findIntersectingIntervals(0, 10.1), [0]);
156 assert.deepEqual(array.findIntersectingIntervals(5, 15), [0]);
157 assert.deepEqual(array.findIntersectingIntervals(15, 20), [0]);
158
159 assert.deepEqual(array.findIntersectingIntervals(15.1, 20), []);
160
161 assert.deepEqual(array.findIntersectingIntervals(15.1, 20.1), [1]);
162 assert.deepEqual(array.findIntersectingIntervals(20, 30), [1]);
163 assert.deepEqual(array.findIntersectingIntervals(30, 100), [1]);
164
165 assert.deepEqual(array.findIntersectingIntervals(0, 100), [0, 1]);
166 assert.deepEqual(array.findIntersectingIntervals(15, 20.1), [0, 1]);
167 });
168
169 test('findClosestElement', function() {
170 var array = new ArrayOfIntervals([
171 {lo: 10, hi: 15},
172 {lo: 20, hi: 30}
173 ]);
174
175 // Test the helper method first.
176 assert.isUndefined(array.get(-1));
177 assert.equal(array.get(0), array.array[0]);
178 assert.equal(array.get(1), array.array[1]);
179 assert.isUndefined(array.get(2));
180
181 assert.isNull(array.findClosestElement(0, 0));
182 assert.isNull(array.findClosestElement(0, 9.9));
183 assert.isNull(array.findClosestElement(10, -10));
184
185 assert.equal(array.get(0), array.findClosestElement(0, 10));
186 assert.equal(array.get(0), array.findClosestElement(8, 5));
187 assert.equal(array.get(0), array.findClosestElement(10, 0));
188 assert.equal(array.get(0), array.findClosestElement(12, 2));
189
190 assert.isNull(array.findClosestElement(15, 3));
191 assert.isNotNull(array.findClosestElement(15, 5));
192
193 assert.equal(array.get(1), array.findClosestElement(19, 1));
194 assert.equal(array.get(1), array.findClosestElement(20, 0));
195 assert.equal(array.get(1), array.findClosestElement(30, 15));
196
197 assert.isNull(array.findClosestElement(30, 9.9));
198 assert.isNull(array.findClosestElement(100, 50));
199 });
200
201 test('findClosestInterval', function() {
202 var array = new ArrayOfIntervals([
203 {lo: 10, hi: 15},
204 {lo: 20, hi: 30}
205 ]);
206
207 assert.isNull(array.findClosestInterval(0, 0));
208 assert.isNull(array.findClosestInterval(0, 9.9));
209 assert.isNull(array.findClosestInterval(0, -100));
210
211 assert.equal(array.get(0), array.findClosestInterval(0, 10));
212 assert.equal(array.get(0), array.findClosestInterval(10, 0));
213 assert.equal(array.get(0), array.findClosestInterval(12, 3));
214 assert.equal(array.get(0), array.findClosestInterval(12, 100));
215
216 assert.equal(array.get(0), array.findClosestInterval(13, 3));
217 assert.equal(array.get(0), array.findClosestInterval(13, 20));
218 assert.equal(array.get(0), array.findClosestInterval(15, 0));
219
220 assert.isNull(array.findClosestInterval(17.5, 0));
221 assert.isNull(array.findClosestInterval(17.5, 2.4));
222 assert.isNotNull(array.findClosestInterval(17.5, 2.5));
223 assert.isNotNull(array.findClosestInterval(17.5, 10));
224
225 assert.equal(array.get(1), array.findClosestInterval(19, 2));
226 assert.equal(array.get(1), array.findClosestInterval(20, 0));
227 assert.equal(array.get(1), array.findClosestInterval(24, 100));
228 assert.equal(array.get(1), array.findClosestInterval(26, 100));
229
230 assert.equal(array.get(1), array.findClosestInterval(30, 0));
231 assert.equal(array.get(1), array.findClosestInterval(35, 10));
232 assert.equal(array.get(1), array.findClosestInterval(50, 100));
233
234 assert.isNull(array.findClosestInterval(50, 19));
235 assert.isNull(array.findClosestInterval(100, 50));
236 assert.isNull(array.findClosestInterval(50, -100));
237 });
238});
239</script>