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