]> git.proxmox.com Git - ceph.git/blob - ceph/src/test/common/test_interval_set.cc
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / test / common / test_interval_set.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 /*
4 * Ceph - scalable distributed file system
5 *
6 * Copyright (C) 2015 Mirantis, Inc.
7 *
8 * Author: Igor Fedotov <ifedotov@mirantis.com>
9 *
10 * This is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License version 2.1, as published by the Free Software
13 * Foundation. See file COPYING.
14 *
15 */
16
17 #include <gtest/gtest.h>
18 #include "include/interval_set.h"
19 #include "include/btree_interval_set.h"
20
21 using namespace ceph;
22
23 typedef uint64_t IntervalValueType;
24
25 template<typename T> // tuple<type to test on, test array size>
26 class IntervalSetTest : public ::testing::Test {
27
28 public:
29 typedef T ISet;
30 };
31
32 typedef ::testing::Types< interval_set<IntervalValueType> , btree_interval_set<IntervalValueType> > IntervalSetTypes;
33
34 TYPED_TEST_CASE(IntervalSetTest, IntervalSetTypes);
35
36 TYPED_TEST(IntervalSetTest, compare) {
37 typedef typename TestFixture::ISet ISet;
38 ISet iset1, iset2;
39 ASSERT_TRUE(iset1 == iset1);
40 ASSERT_TRUE(iset1 == iset2);
41
42 iset1.insert(1);
43 ASSERT_FALSE(iset1 == iset2);
44
45 iset2.insert(1);
46 ASSERT_TRUE(iset1 == iset2);
47
48 iset1.insert(2, 3);
49 iset2.insert(2, 4);
50 ASSERT_FALSE(iset1 == iset2);
51
52 iset2.erase(2, 4);
53 iset2.erase(1);
54 iset2.insert(2, 3);
55 iset2.insert(1);
56 ASSERT_TRUE(iset1 == iset2);
57
58 iset1.insert(100, 10);
59 iset2.insert(100, 5);
60 ASSERT_FALSE(iset1 == iset2);
61 iset2.insert(105, 5);
62 ASSERT_TRUE(iset1 == iset2);
63
64 iset1.insert(200, 10);
65 iset2.insert(205, 5);
66 ASSERT_FALSE(iset1 == iset2);
67 iset2.insert(200, 1);
68 iset2.insert(202, 3);
69 ASSERT_FALSE(iset1 == iset2);
70 iset2.insert(201, 1);
71 ASSERT_TRUE(iset1 == iset2);
72
73 iset1.clear();
74 ASSERT_FALSE(iset1 == iset2);
75 iset2.clear();
76 ASSERT_TRUE(iset1 == iset2);
77 }
78
79 TYPED_TEST(IntervalSetTest, contains) {
80 typedef typename TestFixture::ISet ISet;
81 ISet iset1;
82 ASSERT_FALSE(iset1.contains( 1 ));
83 ASSERT_FALSE(iset1.contains( 0, 1 ));
84
85 iset1.insert(1);
86 ASSERT_TRUE(iset1.contains( 1 ));
87 ASSERT_FALSE(iset1.contains( 0 ));
88 ASSERT_FALSE(iset1.contains( 2 ));
89 ASSERT_FALSE(iset1.contains( 0, 1 ));
90 ASSERT_FALSE(iset1.contains( 0, 2 ));
91 ASSERT_TRUE(iset1.contains( 1, 1 ));
92 ASSERT_FALSE(iset1.contains( 1, 2 ));
93
94 iset1.insert(2, 3);
95 ASSERT_TRUE(iset1.contains( 1 ));
96 ASSERT_FALSE(iset1.contains( 0 ));
97 ASSERT_TRUE(iset1.contains( 2 ));
98 ASSERT_FALSE(iset1.contains( 0, 1 ));
99 ASSERT_FALSE(iset1.contains( 0, 2 ));
100 ASSERT_TRUE(iset1.contains( 1, 1 ));
101 ASSERT_TRUE(iset1.contains( 1, 2 ));
102 ASSERT_TRUE(iset1.contains( 1, 3 ));
103 ASSERT_TRUE(iset1.contains( 1, 4 ));
104 ASSERT_FALSE(iset1.contains( 1, 5 ));
105 ASSERT_TRUE(iset1.contains( 2, 1 ));
106 ASSERT_TRUE(iset1.contains( 2, 2 ));
107 ASSERT_TRUE(iset1.contains( 2, 3 ));
108 ASSERT_FALSE(iset1.contains( 2, 4 ));
109 ASSERT_TRUE(iset1.contains( 3, 2 ));
110 ASSERT_TRUE(iset1.contains( 4, 1 ));
111 ASSERT_FALSE(iset1.contains( 4, 2 ));
112
113 iset1.insert(10, 10);
114 ASSERT_TRUE(iset1.contains( 1, 4 ));
115 ASSERT_FALSE(iset1.contains( 1, 5 ));
116 ASSERT_TRUE(iset1.contains( 2, 2 ));
117 ASSERT_FALSE(iset1.contains( 2, 4 ));
118
119 ASSERT_FALSE(iset1.contains( 1, 10 ));
120 ASSERT_FALSE(iset1.contains( 9, 1 ));
121 ASSERT_FALSE(iset1.contains( 9 ));
122 ASSERT_FALSE(iset1.contains( 9, 11 ));
123 ASSERT_TRUE(iset1.contains( 10, 1 ));
124 ASSERT_TRUE(iset1.contains( 11, 9 ));
125 ASSERT_TRUE(iset1.contains( 11, 2 ));
126 ASSERT_TRUE(iset1.contains( 18, 2 ));
127 ASSERT_TRUE(iset1.contains( 18, 2 ));
128 ASSERT_TRUE(iset1.contains( 10 ));
129 ASSERT_TRUE(iset1.contains( 19 ));
130 ASSERT_FALSE(iset1.contains( 20 ));
131 ASSERT_FALSE(iset1.contains( 21 ));
132
133 ASSERT_FALSE(iset1.contains( 11, 11 ));
134 ASSERT_FALSE(iset1.contains( 18, 9 ));
135
136 iset1.clear();
137 ASSERT_FALSE(iset1.contains( 1 ));
138 ASSERT_FALSE(iset1.contains( 0 ));
139 ASSERT_FALSE(iset1.contains( 2 ));
140 ASSERT_FALSE(iset1.contains( 0, 1 ));
141 ASSERT_FALSE(iset1.contains( 0, 2 ));
142 ASSERT_FALSE(iset1.contains( 1, 1 ));
143 ASSERT_FALSE(iset1.contains( 10, 2 ));
144 }
145
146 TYPED_TEST(IntervalSetTest, intersects) {
147 typedef typename TestFixture::ISet ISet;
148 ISet iset1;
149 ASSERT_FALSE(iset1.intersects( 1, 1 ));
150 ASSERT_FALSE(iset1.intersects( 0, 1 ));
151 ASSERT_FALSE(iset1.intersects( 0, 10 ));
152
153 iset1.insert(1);
154 ASSERT_TRUE(iset1.intersects( 1, 1 ));
155 ASSERT_FALSE(iset1.intersects( 0, 1 ));
156 ASSERT_FALSE(iset1.intersects( 2, 1 ));
157 ASSERT_TRUE(iset1.intersects( 0, 2 ));
158 ASSERT_TRUE(iset1.intersects( 0, 20 ));
159 ASSERT_TRUE(iset1.intersects( 1, 2 ));
160 ASSERT_TRUE(iset1.intersects( 1, 20 ));
161
162 iset1.insert(2, 3);
163 ASSERT_FALSE(iset1.intersects( 0, 1 ));
164 ASSERT_TRUE(iset1.intersects( 0, 2 ));
165 ASSERT_TRUE(iset1.intersects( 0, 200 ));
166 ASSERT_TRUE(iset1.intersects( 1, 1 ));
167 ASSERT_TRUE(iset1.intersects( 1, 4 ));
168 ASSERT_TRUE(iset1.intersects( 1, 5 ));
169 ASSERT_TRUE(iset1.intersects( 2, 1 ));
170 ASSERT_TRUE(iset1.intersects( 2, 2 ));
171 ASSERT_TRUE(iset1.intersects( 2, 3 ));
172 ASSERT_TRUE(iset1.intersects( 2, 4 ));
173 ASSERT_TRUE(iset1.intersects( 3, 2 ));
174 ASSERT_TRUE(iset1.intersects( 4, 1 ));
175 ASSERT_TRUE(iset1.intersects( 4, 2 ));
176 ASSERT_FALSE(iset1.intersects( 5, 2 ));
177
178 iset1.insert(10, 10);
179 ASSERT_TRUE(iset1.intersects( 1, 4 ));
180 ASSERT_TRUE(iset1.intersects( 1, 5 ));
181 ASSERT_TRUE(iset1.intersects( 1, 10 ));
182 ASSERT_TRUE(iset1.intersects( 2, 2 ));
183 ASSERT_TRUE(iset1.intersects( 2, 4 ));
184 ASSERT_FALSE(iset1.intersects( 5, 1 ));
185 ASSERT_FALSE(iset1.intersects( 5, 2 ));
186 ASSERT_FALSE(iset1.intersects( 5, 5 ));
187 ASSERT_TRUE(iset1.intersects( 5, 12 ));
188 ASSERT_TRUE(iset1.intersects( 5, 20 ));
189
190 ASSERT_FALSE(iset1.intersects( 9, 1 ));
191 ASSERT_TRUE(iset1.intersects( 9, 2 ));
192
193 ASSERT_TRUE(iset1.intersects( 9, 11 ));
194 ASSERT_TRUE(iset1.intersects( 10, 1 ));
195 ASSERT_TRUE(iset1.intersects( 11, 9 ));
196 ASSERT_TRUE(iset1.intersects( 11, 2 ));
197 ASSERT_TRUE(iset1.intersects( 11, 11 ));
198 ASSERT_TRUE(iset1.intersects( 18, 2 ));
199 ASSERT_TRUE(iset1.intersects( 18, 9 ));
200 ASSERT_FALSE(iset1.intersects( 20, 1 ));
201 ASSERT_FALSE(iset1.intersects( 21, 12 ));
202
203 iset1.clear();
204 ASSERT_FALSE(iset1.intersects( 0, 1 ));
205 ASSERT_FALSE(iset1.intersects( 0, 2 ));
206 ASSERT_FALSE(iset1.intersects( 1, 1 ));
207 ASSERT_FALSE(iset1.intersects( 5, 2 ));
208 ASSERT_FALSE(iset1.intersects( 10, 2 ));
209 }
210
211 TYPED_TEST(IntervalSetTest, insert_erase) {
212 typedef typename TestFixture::ISet ISet;
213 ISet iset1, iset2;
214 IntervalValueType start, len;
215
216 iset1.insert(3, 5, &start, &len);
217 ASSERT_TRUE( start == 3 );
218 ASSERT_TRUE( len == 5 );
219 ASSERT_TRUE( iset1.num_intervals() == 1 );
220 ASSERT_TRUE( iset1.size() == 5 );
221
222 //adding standalone interval
223 iset1.insert(15, 10, &start, &len);
224 ASSERT_TRUE( start == 15 );
225 ASSERT_TRUE( len == 10 );
226 ASSERT_TRUE( iset1.num_intervals() == 2 );
227 ASSERT_EQ( iset1.size(), 15 );
228
229 //adding leftmost standalone interval
230 iset1.insert(1, 1, &start, &len);
231 ASSERT_TRUE( start == 1 );
232 ASSERT_TRUE( len == 1 );
233 ASSERT_TRUE( iset1.num_intervals() == 3 );
234 ASSERT_EQ( iset1.size(), 16 );
235
236 //adding leftmost adjusent interval
237 iset1.insert(0, 1, &start, &len);
238 ASSERT_TRUE( start == 0 );
239 ASSERT_TRUE( len == 2 );
240 ASSERT_TRUE( iset1.num_intervals() == 3 );
241 ASSERT_EQ( iset1.size(), 17 );
242
243 //adding interim interval that merges leftmost and subseqent intervals
244 iset1.insert(2, 1, &start, &len);
245 ASSERT_TRUE( start == 0 );
246 ASSERT_TRUE( len == 8 );
247 ASSERT_TRUE( iset1.num_intervals() == 2);
248 ASSERT_EQ( iset1.size(), 18);
249
250 //adding rigtmost standalone interval
251 iset1.insert(30, 5, &start, &len);
252 ASSERT_TRUE( start == 30 );
253 ASSERT_TRUE( len == 5 );
254 ASSERT_TRUE( iset1.num_intervals() == 3);
255 ASSERT_EQ( iset1.size(), 23 );
256
257 //adding rigtmost adjusent interval
258 iset1.insert(35, 10, &start, &len);
259 ASSERT_TRUE( start == 30 );
260 ASSERT_TRUE( len == 15 );
261 ASSERT_TRUE( iset1.num_intervals() == 3);
262 ASSERT_EQ( iset1.size(), 33 );
263
264 //adding interim interval that merges with the interval preceeding the rightmost
265 iset1.insert(25, 1, &start, &len);
266 ASSERT_TRUE( start == 15 );
267 ASSERT_TRUE( len == 11 );
268 ASSERT_TRUE( iset1.num_intervals() == 3);
269 ASSERT_EQ( iset1.size(), 34);
270
271 //adding interim interval that merges with the rightmost and preceeding intervals
272 iset1.insert(26, 4, &start, &len);
273 ASSERT_TRUE( start == 15 );
274 ASSERT_TRUE( len == 30 );
275 ASSERT_TRUE( iset1.num_intervals() == 2);
276 ASSERT_EQ( iset1.size(), 38);
277
278 //and finally build single interval filling the gap at 8-15 using different interval set
279 iset2.insert( 8, 1 );
280 iset2.insert( 14, 1 );
281 iset2.insert( 9, 4 );
282 iset1.insert( iset2 );
283 iset1.insert(13, 1, &start, &len);
284 ASSERT_TRUE( start == 0 );
285 ASSERT_TRUE( len == 45 );
286 ASSERT_TRUE( iset1.num_intervals() == 1);
287 ASSERT_EQ( iset1.size(), 45);
288
289 //now reverses the process using subtract & erase
290 iset1.subtract( iset2 );
291 iset1.erase(13, 1);
292 ASSERT_TRUE( iset1.num_intervals() == 2);
293 ASSERT_EQ( iset1.size(), 38);
294 ASSERT_TRUE( iset1.contains( 7, 1 ));
295 ASSERT_FALSE( iset1.contains( 8, 7 ));
296 ASSERT_TRUE( iset1.contains( 15, 1 ));
297 ASSERT_TRUE( iset1.contains( 26, 4 ));
298
299 iset1.erase(26, 4);
300 ASSERT_TRUE( iset1.num_intervals() == 3);
301 ASSERT_EQ( iset1.size(), 34);
302 ASSERT_TRUE( iset1.contains( 7, 1 ));
303 ASSERT_FALSE( iset1.intersects( 8, 7 ));
304 ASSERT_TRUE( iset1.contains( 15, 1 ));
305 ASSERT_TRUE( iset1.contains( 25, 1 ));
306 ASSERT_FALSE( iset1.contains( 26, 4 ));
307 ASSERT_TRUE( iset1.contains( 30, 1 ));
308
309 iset1.erase(25, 1);
310 ASSERT_TRUE( iset1.num_intervals() == 3);
311 ASSERT_EQ( iset1.size(), 33 );
312 ASSERT_TRUE( iset1.contains( 24, 1 ));
313 ASSERT_FALSE( iset1.contains( 25, 1 ));
314 ASSERT_FALSE( iset1.intersects( 26, 4 ));
315 ASSERT_TRUE( iset1.contains( 30, 1 ));
316 ASSERT_TRUE( iset1.contains( 35, 10 ));
317
318 iset1.erase(35, 10);
319 ASSERT_TRUE( iset1.num_intervals() == 3);
320 ASSERT_EQ( iset1.size(), 23 );
321 ASSERT_TRUE( iset1.contains( 30, 5 ));
322 ASSERT_TRUE( iset1.contains( 34, 1 ));
323 ASSERT_FALSE( iset1.contains( 35, 10 ));
324 ASSERT_FALSE(iset1.contains( 45, 1 ));
325
326 iset1.erase(30, 5);
327 ASSERT_TRUE( iset1.num_intervals() == 2);
328 ASSERT_EQ( iset1.size(), 18);
329 ASSERT_TRUE( iset1.contains( 2, 1 ));
330 ASSERT_TRUE( iset1.contains( 24, 1 ));
331 ASSERT_FALSE( iset1.contains( 25, 1 ));
332 ASSERT_FALSE( iset1.contains( 29, 1 ));
333 ASSERT_FALSE( iset1.contains( 30, 5 ));
334 ASSERT_FALSE( iset1.contains( 35, 1 ));
335
336 iset1.erase(2, 1);
337 ASSERT_TRUE( iset1.num_intervals() == 3 );
338 ASSERT_EQ( iset1.size(), 17 );
339 ASSERT_TRUE( iset1.contains( 0, 1 ));
340 ASSERT_TRUE( iset1.contains( 1, 1 ));
341 ASSERT_FALSE( iset1.contains( 2, 1 ));
342 ASSERT_TRUE( iset1.contains( 3, 1 ));
343 ASSERT_TRUE( iset1.contains( 15, 1 ));
344 ASSERT_FALSE( iset1.contains( 25, 1 ));
345
346 iset1.erase( 0, 1);
347 ASSERT_TRUE( iset1.num_intervals() == 3 );
348 ASSERT_EQ( iset1.size(), 16 );
349 ASSERT_FALSE( iset1.contains( 0, 1 ));
350 ASSERT_TRUE( iset1.contains( 1, 1 ));
351 ASSERT_FALSE( iset1.contains( 2, 1 ));
352 ASSERT_TRUE( iset1.contains( 3, 1 ));
353 ASSERT_TRUE( iset1.contains( 15, 1 ));
354
355 iset1.erase(1, 1);
356 ASSERT_TRUE( iset1.num_intervals() == 2 );
357 ASSERT_EQ( iset1.size(), 15 );
358 ASSERT_FALSE( iset1.contains( 1, 1 ));
359 ASSERT_TRUE( iset1.contains( 15, 10 ));
360 ASSERT_TRUE( iset1.contains( 3, 5 ));
361
362 iset1.erase(15, 10);
363 ASSERT_TRUE( iset1.num_intervals() == 1 );
364 ASSERT_TRUE( iset1.size() == 5 );
365 ASSERT_FALSE( iset1.contains( 1, 1 ));
366 ASSERT_FALSE( iset1.contains( 15, 10 ));
367 ASSERT_FALSE( iset1.contains( 25, 1 ));
368 ASSERT_TRUE( iset1.contains( 3, 5 ));
369
370 iset1.erase( 3, 1);
371 ASSERT_TRUE( iset1.num_intervals() == 1 );
372 ASSERT_TRUE( iset1.size() == 4 );
373 ASSERT_FALSE( iset1.contains( 1, 1 ));
374 ASSERT_FALSE( iset1.contains( 15, 10 ));
375 ASSERT_FALSE( iset1.contains( 25, 1 ));
376 ASSERT_TRUE( iset1.contains( 4, 4 ));
377 ASSERT_FALSE( iset1.contains( 3, 5 ));
378
379 iset1.erase( 4, 4);
380 ASSERT_TRUE( iset1.num_intervals() == 0);
381 ASSERT_TRUE( iset1.size() == 0);
382 ASSERT_FALSE( iset1.contains( 1, 1 ));
383 ASSERT_FALSE( iset1.contains( 15, 10 ));
384 ASSERT_FALSE( iset1.contains( 25, 1 ));
385 ASSERT_FALSE( iset1.contains( 3, 4 ));
386 ASSERT_FALSE( iset1.contains( 3, 5 ));
387 ASSERT_FALSE( iset1.contains( 4, 4 ));
388
389
390 }
391
392 TYPED_TEST(IntervalSetTest, intersect_of) {
393 typedef typename TestFixture::ISet ISet;
394 ISet iset1, iset2, iset3;
395
396 iset1.intersection_of( iset2, iset3 );
397 ASSERT_TRUE( iset1.num_intervals() == 0);
398 ASSERT_TRUE( iset1.size() == 0);
399
400 iset2.insert( 0, 1 );
401 iset2.insert( 5, 10 );
402 iset2.insert( 30, 10 );
403
404 iset3.insert( 0, 2 );
405 iset3.insert( 15, 1 );
406 iset3.insert( 20, 5 );
407 iset3.insert( 29, 3 );
408 iset3.insert( 35, 3 );
409 iset3.insert( 39, 3 );
410
411 iset1.intersection_of( iset2, iset3 );
412 ASSERT_TRUE( iset1.num_intervals() == 4);
413 ASSERT_TRUE( iset1.size() == 7);
414
415 ASSERT_TRUE( iset1.contains( 0, 1 ));
416 ASSERT_FALSE( iset1.contains( 0, 2 ));
417
418 ASSERT_FALSE( iset1.contains( 5, 11 ));
419 ASSERT_FALSE( iset1.contains( 4, 1 ));
420 ASSERT_FALSE( iset1.contains( 16, 1 ));
421
422 ASSERT_FALSE( iset1.contains( 20, 5 ));
423
424 ASSERT_FALSE( iset1.contains( 29, 1 ));
425 ASSERT_FALSE( iset1.contains( 30, 10 ));
426
427 ASSERT_TRUE( iset1.contains( 30, 2 ));
428 ASSERT_TRUE( iset1.contains( 35, 3 ));
429 ASSERT_FALSE( iset1.contains( 35, 4 ));
430
431 ASSERT_TRUE( iset1.contains( 39, 1 ));
432 ASSERT_FALSE( iset1.contains( 38, 2 ));
433 ASSERT_FALSE( iset1.contains( 39, 2 ));
434
435 iset3=iset1;
436 iset1.intersection_of(iset2);
437 ASSERT_TRUE( iset1 == iset3);
438
439 iset2.clear();
440 iset2.insert(0,1);
441 iset1.intersection_of(iset2);
442 ASSERT_TRUE( iset1.num_intervals() == 1);
443 ASSERT_TRUE( iset1.size() == 1);
444
445 iset1 = iset3;
446 iset2.clear();
447 iset1.intersection_of(iset2);
448 ASSERT_TRUE( iset1.num_intervals() == 0);
449 ASSERT_TRUE( iset1.size() == 0);
450
451 }
452
453 TYPED_TEST(IntervalSetTest, union_of) {
454 typedef typename TestFixture::ISet ISet;
455 ISet iset1, iset2, iset3;
456
457 iset1.union_of( iset2, iset3 );
458 ASSERT_TRUE( iset1.num_intervals() == 0);
459 ASSERT_TRUE( iset1.size() == 0);
460
461 iset2.insert( 0, 1 );
462 iset2.insert( 5, 10 );
463 iset2.insert( 30, 10 );
464
465 iset3.insert( 0, 2 );
466 iset3.insert( 15, 1 );
467 iset3.insert( 20, 5 );
468 iset3.insert( 29, 3 );
469 iset3.insert( 39, 3 );
470
471 iset1.union_of( iset2, iset3 );
472 ASSERT_TRUE( iset1.num_intervals() == 4);
473 ASSERT_EQ( iset1.size(), 31);
474 ASSERT_TRUE( iset1.contains( 0, 2 ));
475 ASSERT_FALSE( iset1.contains( 0, 3 ));
476
477 ASSERT_TRUE( iset1.contains( 5, 11 ));
478 ASSERT_FALSE( iset1.contains( 4, 1 ));
479 ASSERT_FALSE( iset1.contains( 16, 1 ));
480
481 ASSERT_TRUE( iset1.contains( 20, 5 ));
482
483 ASSERT_TRUE( iset1.contains( 30, 10 ));
484 ASSERT_TRUE( iset1.contains( 29, 13 ));
485 ASSERT_FALSE( iset1.contains( 29, 14 ));
486 ASSERT_FALSE( iset1.contains( 42, 1 ));
487
488 iset2.clear();
489 iset1.union_of(iset2);
490 ASSERT_TRUE( iset1.num_intervals() == 4);
491 ASSERT_EQ( iset1.size(), 31);
492
493 iset3.clear();
494 iset3.insert( 29, 3 );
495 iset3.insert( 39, 2 );
496 iset1.union_of(iset3);
497
498 ASSERT_TRUE( iset1.num_intervals() == 4);
499 ASSERT_EQ( iset1.size(), 31); //actually we added nothing
500 ASSERT_TRUE( iset1.contains( 29, 13 ));
501 ASSERT_FALSE( iset1.contains( 29, 14 ));
502 ASSERT_FALSE( iset1.contains( 42, 1 ));
503
504 }
505
506 TYPED_TEST(IntervalSetTest, subset_of) {
507 typedef typename TestFixture::ISet ISet;
508 ISet iset1, iset2;
509
510 ASSERT_TRUE(iset1.subset_of(iset2));
511
512 iset1.insert(5,10);
513 ASSERT_FALSE(iset1.subset_of(iset2));
514
515 iset2.insert(6,8);
516 ASSERT_FALSE(iset1.subset_of(iset2));
517
518 iset2.insert(5,1);
519 ASSERT_FALSE(iset1.subset_of(iset2));
520
521 iset2.insert(14,10);
522 ASSERT_TRUE(iset1.subset_of(iset2));
523
524 iset1.insert( 20, 4);
525 ASSERT_TRUE(iset1.subset_of(iset2));
526
527 iset1.insert( 24, 1);
528 ASSERT_FALSE(iset1.subset_of(iset2));
529 }
530
531 TYPED_TEST(IntervalSetTest, span_of) {
532 typedef typename TestFixture::ISet ISet;
533 ISet iset1, iset2;
534
535 iset2.insert(5,5);
536 iset2.insert(20,5);
537
538 iset1.span_of( iset2, 8, 5 );
539 ASSERT_EQ( iset1.num_intervals(), 2);
540 ASSERT_EQ( iset1.size(), 5);
541 ASSERT_TRUE( iset1.contains( 8, 2 ));
542 ASSERT_TRUE( iset1.contains( 20, 3 ));
543
544 iset1.span_of( iset2, 3, 5 );
545 ASSERT_EQ( iset1.num_intervals(), 1);
546 ASSERT_EQ( iset1.size(), 5);
547 ASSERT_TRUE( iset1.contains( 5, 5 ));
548
549 iset1.span_of( iset2, 10, 7 );
550 ASSERT_EQ( iset1.num_intervals(), 1);
551 ASSERT_EQ( iset1.size(), 5);
552 ASSERT_TRUE( iset1.contains( 20, 5 ));
553 ASSERT_FALSE( iset1.contains( 20, 6 ));
554
555 iset1.span_of( iset2, 5, 10);
556 ASSERT_EQ( iset1.num_intervals(), 2);
557 ASSERT_EQ( iset1.size(), 10);
558 ASSERT_TRUE( iset1.contains( 5, 5 ));
559 ASSERT_TRUE( iset1.contains( 20, 5 ));
560
561 iset1.span_of( iset2, 100, 5 );
562 ASSERT_EQ( iset1.num_intervals(), 0);
563 ASSERT_EQ( iset1.size(), 0);
564 }