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