1 //===---- ADT/IntervalMapTest.cpp - IntervalMap unit tests ------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/ADT/IntervalMap.h"
11 #include "gtest/gtest.h"
17 typedef IntervalMap
<unsigned, unsigned, 4> UUMap
;
20 TEST(IntervalMapTest
, EmptyMap
) {
21 UUMap::Allocator allocator
;
23 EXPECT_TRUE(map
.empty());
25 // Lookup on empty map.
26 EXPECT_EQ(0u, map
.lookup(0));
27 EXPECT_EQ(7u, map
.lookup(0, 7));
28 EXPECT_EQ(0u, map
.lookup(~0u-1));
29 EXPECT_EQ(7u, map
.lookup(~0u-1, 7));
32 EXPECT_TRUE(map
.begin() == map
.begin());
33 EXPECT_TRUE(map
.begin() == map
.end());
34 EXPECT_TRUE(map
.end() == map
.end());
35 EXPECT_FALSE(map
.begin() != map
.begin());
36 EXPECT_FALSE(map
.begin() != map
.end());
37 EXPECT_FALSE(map
.end() != map
.end());
38 EXPECT_FALSE(map
.begin().valid());
39 EXPECT_FALSE(map
.end().valid());
40 UUMap::iterator I
= map
.begin();
41 EXPECT_FALSE(I
.valid());
42 EXPECT_TRUE(I
== map
.end());
44 // Default constructor and cross-constness compares.
45 UUMap::const_iterator CI
;
50 EXPECT_TRUE(I2
== CI
);
53 // Single entry map tests
54 TEST(IntervalMapTest
, SingleEntryMap
) {
55 UUMap::Allocator allocator
;
57 map
.insert(100, 150, 1);
58 EXPECT_FALSE(map
.empty());
60 // Lookup around interval.
61 EXPECT_EQ(0u, map
.lookup(0));
62 EXPECT_EQ(0u, map
.lookup(99));
63 EXPECT_EQ(1u, map
.lookup(100));
64 EXPECT_EQ(1u, map
.lookup(101));
65 EXPECT_EQ(1u, map
.lookup(125));
66 EXPECT_EQ(1u, map
.lookup(149));
67 EXPECT_EQ(1u, map
.lookup(150));
68 EXPECT_EQ(0u, map
.lookup(151));
69 EXPECT_EQ(0u, map
.lookup(200));
70 EXPECT_EQ(0u, map
.lookup(~0u-1));
73 EXPECT_TRUE(map
.begin() == map
.begin());
74 EXPECT_FALSE(map
.begin() == map
.end());
75 EXPECT_TRUE(map
.end() == map
.end());
76 EXPECT_TRUE(map
.begin().valid());
77 EXPECT_FALSE(map
.end().valid());
80 UUMap::iterator I
= map
.begin();
81 ASSERT_TRUE(I
.valid());
82 EXPECT_EQ(100u, I
.start());
83 EXPECT_EQ(150u, I
.stop());
84 EXPECT_EQ(1u, I
.value());
88 EXPECT_FALSE(I
.valid());
89 EXPECT_FALSE(I
== map
.begin());
90 EXPECT_TRUE(I
== map
.end());
94 ASSERT_TRUE(I
.valid());
95 EXPECT_EQ(100u, I
.start());
96 EXPECT_EQ(150u, I
.stop());
97 EXPECT_EQ(1u, I
.value());
98 EXPECT_TRUE(I
== map
.begin());
99 EXPECT_FALSE(I
== map
.end());
103 ASSERT_TRUE(I
.valid());
104 EXPECT_EQ(100u, I
.start());
105 EXPECT_EQ(150u, I
.stop());
106 EXPECT_EQ(2u, I
.value());
110 ASSERT_TRUE(I
.valid());
111 EXPECT_EQ(0u, I
.start());
112 EXPECT_EQ(150u, I
.stop());
113 EXPECT_EQ(2u, I
.value());
116 ASSERT_TRUE(I
.valid());
117 EXPECT_EQ(0u, I
.start());
118 EXPECT_EQ(200u, I
.stop());
119 EXPECT_EQ(2u, I
.value());
121 // Shrink the bounds.
123 ASSERT_TRUE(I
.valid());
124 EXPECT_EQ(150u, I
.start());
125 EXPECT_EQ(200u, I
.stop());
126 EXPECT_EQ(2u, I
.value());
129 ASSERT_TRUE(I
.valid());
130 EXPECT_EQ(150u, I
.start());
131 EXPECT_EQ(160u, I
.stop());
132 EXPECT_EQ(2u, I
.value());
136 EXPECT_TRUE(map
.empty());
137 EXPECT_EQ(0, std::distance(map
.begin(), map
.end()));
140 // Flat coalescing tests.
141 TEST(IntervalMapTest
, RootCoalescing
) {
142 UUMap::Allocator allocator
;
143 UUMap
map(allocator
);
144 map
.insert(100, 150, 1);
146 // Coalesce from the left.
147 map
.insert(90, 99, 1);
148 EXPECT_EQ(1, std::distance(map
.begin(), map
.end()));
149 EXPECT_EQ(90u, map
.start());
150 EXPECT_EQ(150u, map
.stop());
152 // Coalesce from the right.
153 map
.insert(151, 200, 1);
154 EXPECT_EQ(1, std::distance(map
.begin(), map
.end()));
155 EXPECT_EQ(90u, map
.start());
156 EXPECT_EQ(200u, map
.stop());
158 // Non-coalesce from the left.
159 map
.insert(60, 89, 2);
160 EXPECT_EQ(2, std::distance(map
.begin(), map
.end()));
161 EXPECT_EQ(60u, map
.start());
162 EXPECT_EQ(200u, map
.stop());
163 EXPECT_EQ(2u, map
.lookup(89));
164 EXPECT_EQ(1u, map
.lookup(90));
166 UUMap::iterator I
= map
.begin();
167 EXPECT_EQ(60u, I
.start());
168 EXPECT_EQ(89u, I
.stop());
169 EXPECT_EQ(2u, I
.value());
171 EXPECT_EQ(90u, I
.start());
172 EXPECT_EQ(200u, I
.stop());
173 EXPECT_EQ(1u, I
.value());
175 EXPECT_FALSE(I
.valid());
177 // Non-coalesce from the right.
178 map
.insert(201, 210, 2);
179 EXPECT_EQ(3, std::distance(map
.begin(), map
.end()));
180 EXPECT_EQ(60u, map
.start());
181 EXPECT_EQ(210u, map
.stop());
182 EXPECT_EQ(2u, map
.lookup(201));
183 EXPECT_EQ(1u, map
.lookup(200));
185 // Erase from the left.
187 EXPECT_EQ(2, std::distance(map
.begin(), map
.end()));
188 EXPECT_EQ(90u, map
.start());
189 EXPECT_EQ(210u, map
.stop());
191 // Erase from the right.
192 (--map
.end()).erase();
193 EXPECT_EQ(1, std::distance(map
.begin(), map
.end()));
194 EXPECT_EQ(90u, map
.start());
195 EXPECT_EQ(200u, map
.stop());
197 // Add non-coalescing, then trigger coalescing with setValue.
198 map
.insert(80, 89, 2);
199 map
.insert(201, 210, 2);
200 EXPECT_EQ(3, std::distance(map
.begin(), map
.end()));
201 (++map
.begin()).setValue(2);
202 EXPECT_EQ(1, std::distance(map
.begin(), map
.end()));
204 ASSERT_TRUE(I
.valid());
205 EXPECT_EQ(80u, I
.start());
206 EXPECT_EQ(210u, I
.stop());
207 EXPECT_EQ(2u, I
.value());
210 // Flat multi-coalescing tests.
211 TEST(IntervalMapTest
, RootMultiCoalescing
) {
212 UUMap::Allocator allocator
;
213 UUMap
map(allocator
);
214 map
.insert(140, 150, 1);
215 map
.insert(160, 170, 1);
216 map
.insert(100, 110, 1);
217 map
.insert(120, 130, 1);
218 EXPECT_EQ(4, std::distance(map
.begin(), map
.end()));
219 EXPECT_EQ(100u, map
.start());
220 EXPECT_EQ(170u, map
.stop());
223 UUMap::iterator I
= map
.begin();
224 EXPECT_EQ(100u, I
.start());
225 EXPECT_EQ(110u, I
.stop());
227 EXPECT_EQ(120u, I
.start());
228 EXPECT_EQ(130u, I
.stop());
230 EXPECT_EQ(140u, I
.start());
231 EXPECT_EQ(150u, I
.stop());
233 EXPECT_EQ(160u, I
.start());
234 EXPECT_EQ(170u, I
.stop());
236 EXPECT_FALSE(I
.valid());
238 // Test advanceTo on flat tree.
241 ASSERT_TRUE(I
.valid());
242 EXPECT_EQ(140u, I
.start());
243 EXPECT_EQ(150u, I
.stop());
246 ASSERT_TRUE(I
.valid());
247 EXPECT_EQ(140u, I
.start());
248 EXPECT_EQ(150u, I
.stop());
251 EXPECT_FALSE(I
.valid());
254 EXPECT_FALSE(I
.valid());
256 // Coalesce left with followers.
257 // [100;110] [120;130] [140;150] [160;170]
258 map
.insert(111, 115, 1);
260 ASSERT_TRUE(I
.valid());
261 EXPECT_EQ(100u, I
.start());
262 EXPECT_EQ(115u, I
.stop());
264 ASSERT_TRUE(I
.valid());
265 EXPECT_EQ(120u, I
.start());
266 EXPECT_EQ(130u, I
.stop());
268 ASSERT_TRUE(I
.valid());
269 EXPECT_EQ(140u, I
.start());
270 EXPECT_EQ(150u, I
.stop());
272 ASSERT_TRUE(I
.valid());
273 EXPECT_EQ(160u, I
.start());
274 EXPECT_EQ(170u, I
.stop());
276 EXPECT_FALSE(I
.valid());
278 // Coalesce right with followers.
279 // [100;115] [120;130] [140;150] [160;170]
280 map
.insert(135, 139, 1);
282 ASSERT_TRUE(I
.valid());
283 EXPECT_EQ(100u, I
.start());
284 EXPECT_EQ(115u, I
.stop());
286 ASSERT_TRUE(I
.valid());
287 EXPECT_EQ(120u, I
.start());
288 EXPECT_EQ(130u, I
.stop());
290 ASSERT_TRUE(I
.valid());
291 EXPECT_EQ(135u, I
.start());
292 EXPECT_EQ(150u, I
.stop());
294 ASSERT_TRUE(I
.valid());
295 EXPECT_EQ(160u, I
.start());
296 EXPECT_EQ(170u, I
.stop());
298 EXPECT_FALSE(I
.valid());
300 // Coalesce left and right with followers.
301 // [100;115] [120;130] [135;150] [160;170]
302 map
.insert(131, 134, 1);
304 ASSERT_TRUE(I
.valid());
305 EXPECT_EQ(100u, I
.start());
306 EXPECT_EQ(115u, I
.stop());
308 ASSERT_TRUE(I
.valid());
309 EXPECT_EQ(120u, I
.start());
310 EXPECT_EQ(150u, I
.stop());
312 ASSERT_TRUE(I
.valid());
313 EXPECT_EQ(160u, I
.start());
314 EXPECT_EQ(170u, I
.stop());
316 EXPECT_FALSE(I
.valid());
318 // Test clear() on non-branched map.
320 EXPECT_TRUE(map
.empty());
321 EXPECT_TRUE(map
.begin() == map
.end());
324 // Branched, non-coalescing tests.
325 TEST(IntervalMapTest
, Branched
) {
326 UUMap::Allocator allocator
;
327 UUMap
map(allocator
);
329 // Insert enough intervals to force a branched tree.
330 // This creates 9 leaf nodes with 11 elements each, tree height = 1.
331 for (unsigned i
= 1; i
< 100; ++i
) {
332 map
.insert(10*i
, 10*i
+5, i
);
333 EXPECT_EQ(10u, map
.start());
334 EXPECT_EQ(10*i
+5, map
.stop());
338 EXPECT_FALSE(map
.empty());
339 EXPECT_EQ(10u, map
.start());
340 EXPECT_EQ(995u, map
.stop());
343 for (unsigned i
= 1; i
< 100; ++i
) {
344 EXPECT_EQ(0u, map
.lookup(10*i
-1));
345 EXPECT_EQ(i
, map
.lookup(10*i
));
346 EXPECT_EQ(i
, map
.lookup(10*i
+5));
347 EXPECT_EQ(0u, map
.lookup(10*i
+6));
350 // Forward iteration.
351 UUMap::iterator I
= map
.begin();
352 for (unsigned i
= 1; i
< 100; ++i
) {
353 ASSERT_TRUE(I
.valid());
354 EXPECT_EQ(10*i
, I
.start());
355 EXPECT_EQ(10*i
+5, I
.stop());
359 EXPECT_FALSE(I
.valid());
360 EXPECT_TRUE(I
== map
.end());
362 // Backwards iteration.
363 for (unsigned i
= 99; i
; --i
) {
365 ASSERT_TRUE(I
.valid());
366 EXPECT_EQ(10*i
, I
.start());
367 EXPECT_EQ(10*i
+5, I
.stop());
370 EXPECT_TRUE(I
== map
.begin());
372 // Test advanceTo in same node.
374 ASSERT_TRUE(I
.valid());
375 EXPECT_EQ(20u, I
.start());
376 EXPECT_EQ(25u, I
.stop());
378 // Change value, no coalescing.
380 ASSERT_TRUE(I
.valid());
381 EXPECT_EQ(20u, I
.start());
382 EXPECT_EQ(25u, I
.stop());
383 EXPECT_EQ(0u, I
.value());
385 // Close the gap right, no coalescing.
387 ASSERT_TRUE(I
.valid());
388 EXPECT_EQ(20u, I
.start());
389 EXPECT_EQ(29u, I
.stop());
390 EXPECT_EQ(0u, I
.value());
392 // Change value, no coalescing.
394 ASSERT_TRUE(I
.valid());
395 EXPECT_EQ(20u, I
.start());
396 EXPECT_EQ(29u, I
.stop());
397 EXPECT_EQ(2u, I
.value());
399 // Change value, now coalescing.
401 ASSERT_TRUE(I
.valid());
402 EXPECT_EQ(20u, I
.start());
403 EXPECT_EQ(35u, I
.stop());
404 EXPECT_EQ(3u, I
.value());
406 // Close the gap, now coalescing.
408 ASSERT_TRUE(I
.valid());
410 ASSERT_TRUE(I
.valid());
411 EXPECT_EQ(20u, I
.start());
412 EXPECT_EQ(45u, I
.stop());
413 EXPECT_EQ(4u, I
.value());
415 // advanceTo another node.
417 ASSERT_TRUE(I
.valid());
418 EXPECT_EQ(200u, I
.start());
419 EXPECT_EQ(205u, I
.stop());
421 // Close the gap left, no coalescing.
423 ASSERT_TRUE(I
.valid());
424 EXPECT_EQ(196u, I
.start());
425 EXPECT_EQ(205u, I
.stop());
426 EXPECT_EQ(20u, I
.value());
428 // Change value, no coalescing.
430 ASSERT_TRUE(I
.valid());
431 EXPECT_EQ(196u, I
.start());
432 EXPECT_EQ(205u, I
.stop());
433 EXPECT_EQ(0u, I
.value());
435 // Change value, now coalescing.
437 ASSERT_TRUE(I
.valid());
438 EXPECT_EQ(190u, I
.start());
439 EXPECT_EQ(205u, I
.stop());
440 EXPECT_EQ(19u, I
.value());
442 // Close the gap, now coalescing.
444 ASSERT_TRUE(I
.valid());
446 ASSERT_TRUE(I
.valid());
447 EXPECT_EQ(180u, I
.start());
448 EXPECT_EQ(205u, I
.stop());
449 EXPECT_EQ(18u, I
.value());
451 // Erase from the front.
453 for (unsigned i
= 0; i
!= 20; ++i
) {
455 EXPECT_TRUE(I
== map
.begin());
456 EXPECT_FALSE(map
.empty());
457 EXPECT_EQ(I
.start(), map
.start());
458 EXPECT_EQ(995u, map
.stop());
461 // Test clear() on branched map.
463 EXPECT_TRUE(map
.empty());
464 EXPECT_TRUE(map
.begin() == map
.end());
467 // Branched, high, non-coalescing tests.
468 TEST(IntervalMapTest
, Branched2
) {
469 UUMap::Allocator allocator
;
470 UUMap
map(allocator
);
472 // Insert enough intervals to force a height >= 2 tree.
473 for (unsigned i
= 1; i
< 1000; ++i
)
474 map
.insert(10*i
, 10*i
+5, i
);
477 EXPECT_FALSE(map
.empty());
478 EXPECT_EQ(10u, map
.start());
479 EXPECT_EQ(9995u, map
.stop());
482 for (unsigned i
= 1; i
< 1000; ++i
) {
483 EXPECT_EQ(0u, map
.lookup(10*i
-1));
484 EXPECT_EQ(i
, map
.lookup(10*i
));
485 EXPECT_EQ(i
, map
.lookup(10*i
+5));
486 EXPECT_EQ(0u, map
.lookup(10*i
+6));
489 // Forward iteration.
490 UUMap::iterator I
= map
.begin();
491 for (unsigned i
= 1; i
< 1000; ++i
) {
492 ASSERT_TRUE(I
.valid());
493 EXPECT_EQ(10*i
, I
.start());
494 EXPECT_EQ(10*i
+5, I
.stop());
498 EXPECT_FALSE(I
.valid());
499 EXPECT_TRUE(I
== map
.end());
501 // Backwards iteration.
502 for (unsigned i
= 999; i
; --i
) {
504 ASSERT_TRUE(I
.valid());
505 EXPECT_EQ(10*i
, I
.start());
506 EXPECT_EQ(10*i
+5, I
.stop());
509 EXPECT_TRUE(I
== map
.begin());
511 // Test advanceTo in same node.
513 ASSERT_TRUE(I
.valid());
514 EXPECT_EQ(20u, I
.start());
515 EXPECT_EQ(25u, I
.stop());
517 // advanceTo sibling leaf node.
519 ASSERT_TRUE(I
.valid());
520 EXPECT_EQ(200u, I
.start());
521 EXPECT_EQ(205u, I
.stop());
523 // advanceTo further.
525 ASSERT_TRUE(I
.valid());
526 EXPECT_EQ(2000u, I
.start());
527 EXPECT_EQ(2005u, I
.stop());
529 // advanceTo beyond end()
531 EXPECT_FALSE(I
.valid());
533 // end().advanceTo() is valid as long as x > map.stop()
535 EXPECT_FALSE(I
.valid());
537 // Test clear() on branched map.
539 EXPECT_TRUE(map
.empty());
540 EXPECT_TRUE(map
.begin() == map
.end());
543 // Random insertions, coalescing to a single interval.
544 TEST(IntervalMapTest
, RandomCoalescing
) {
545 UUMap::Allocator allocator
;
546 UUMap
map(allocator
);
548 // This is a poor PRNG with maximal period:
549 // x_n = 5 x_{n-1} + 1 mod 2^N
552 for (unsigned i
= 0; i
!= 4096; ++i
) {
553 map
.insert(10*x
, 10*x
+9, 1);
554 EXPECT_GE(10*x
, map
.start());
555 EXPECT_LE(10*x
+9, map
.stop());
559 // Map should be fully coalesced after that exercise.
560 EXPECT_FALSE(map
.empty());
561 EXPECT_EQ(0u, map
.start());
562 EXPECT_EQ(40959u, map
.stop());
563 EXPECT_EQ(1, std::distance(map
.begin(), map
.end()));
567 TEST(IntervalMapOverlapsTest
, SmallMaps
) {
568 typedef IntervalMapOverlaps
<UUMap
,UUMap
> UUOverlaps
;
569 UUMap::Allocator allocator
;
570 UUMap
mapA(allocator
);
571 UUMap
mapB(allocator
);
574 EXPECT_FALSE(UUOverlaps(mapA
, mapB
).valid());
576 mapA
.insert(1, 2, 3);
579 EXPECT_FALSE(UUOverlaps(mapA
, mapB
).valid());
581 EXPECT_FALSE(UUOverlaps(mapB
, mapA
).valid());
583 mapB
.insert(3, 4, 5);
585 // full, full, non-overlapping
586 EXPECT_FALSE(UUOverlaps(mapA
, mapB
).valid());
587 EXPECT_FALSE(UUOverlaps(mapB
, mapA
).valid());
589 // Add an overlapping segment.
590 mapA
.insert(4, 5, 6);
592 UUOverlaps
AB(mapA
, mapB
);
593 ASSERT_TRUE(AB
.valid());
594 EXPECT_EQ(4u, AB
.a().start());
595 EXPECT_EQ(3u, AB
.b().start());
597 EXPECT_FALSE(AB
.valid());
599 UUOverlaps
BA(mapB
, mapA
);
600 ASSERT_TRUE(BA
.valid());
601 EXPECT_EQ(3u, BA
.a().start());
602 EXPECT_EQ(4u, BA
.b().start());
605 EXPECT_FALSE(BA
.valid());
606 // advance an invalid iterator.
608 EXPECT_FALSE(BA
.valid());
611 TEST(IntervalMapOverlapsTest
, BigMaps
) {
612 typedef IntervalMapOverlaps
<UUMap
,UUMap
> UUOverlaps
;
613 UUMap::Allocator allocator
;
614 UUMap
mapA(allocator
);
615 UUMap
mapB(allocator
);
617 // [0;4] [10;14] [20;24] ...
618 for (unsigned n
= 0; n
!= 100; ++n
)
619 mapA
.insert(10*n
, 10*n
+4, n
);
621 // [5;6] [15;16] [25;26] ...
622 for (unsigned n
= 10; n
!= 20; ++n
)
623 mapB
.insert(10*n
+5, 10*n
+6, n
);
625 // [208;209] [218;219] ...
626 for (unsigned n
= 20; n
!= 30; ++n
)
627 mapB
.insert(10*n
+8, 10*n
+9, n
);
629 // insert some overlapping segments.
630 mapB
.insert(400, 400, 400);
631 mapB
.insert(401, 401, 401);
632 mapB
.insert(402, 500, 402);
633 mapB
.insert(600, 601, 402);
635 UUOverlaps
AB(mapA
, mapB
);
636 ASSERT_TRUE(AB
.valid());
637 EXPECT_EQ(400u, AB
.a().start());
638 EXPECT_EQ(400u, AB
.b().start());
640 ASSERT_TRUE(AB
.valid());
641 EXPECT_EQ(400u, AB
.a().start());
642 EXPECT_EQ(401u, AB
.b().start());
644 ASSERT_TRUE(AB
.valid());
645 EXPECT_EQ(400u, AB
.a().start());
646 EXPECT_EQ(402u, AB
.b().start());
648 ASSERT_TRUE(AB
.valid());
649 EXPECT_EQ(410u, AB
.a().start());
650 EXPECT_EQ(402u, AB
.b().start());
652 ASSERT_TRUE(AB
.valid());
653 EXPECT_EQ(420u, AB
.a().start());
654 EXPECT_EQ(402u, AB
.b().start());
656 ASSERT_TRUE(AB
.valid());
657 EXPECT_EQ(600u, AB
.a().start());
658 EXPECT_EQ(600u, AB
.b().start());
660 EXPECT_FALSE(AB
.valid());
663 UUOverlaps
AB2(mapA
, mapB
);
665 ASSERT_TRUE(AB2
.valid());
666 EXPECT_EQ(410u, AB2
.a().start());
667 EXPECT_EQ(402u, AB2
.b().start());
669 // It is valid to advanceTo with any monotonic sequence.
671 ASSERT_TRUE(AB2
.valid());
672 EXPECT_EQ(410u, AB2
.a().start());
673 EXPECT_EQ(402u, AB2
.b().start());
675 // Check reversed maps.
676 UUOverlaps
BA(mapB
, mapA
);
677 ASSERT_TRUE(BA
.valid());
678 EXPECT_EQ(400u, BA
.b().start());
679 EXPECT_EQ(400u, BA
.a().start());
681 ASSERT_TRUE(BA
.valid());
682 EXPECT_EQ(400u, BA
.b().start());
683 EXPECT_EQ(401u, BA
.a().start());
685 ASSERT_TRUE(BA
.valid());
686 EXPECT_EQ(400u, BA
.b().start());
687 EXPECT_EQ(402u, BA
.a().start());
689 ASSERT_TRUE(BA
.valid());
690 EXPECT_EQ(410u, BA
.b().start());
691 EXPECT_EQ(402u, BA
.a().start());
693 ASSERT_TRUE(BA
.valid());
694 EXPECT_EQ(420u, BA
.b().start());
695 EXPECT_EQ(402u, BA
.a().start());
697 ASSERT_TRUE(BA
.valid());
698 EXPECT_EQ(600u, BA
.b().start());
699 EXPECT_EQ(600u, BA
.a().start());
701 EXPECT_FALSE(BA
.valid());
704 UUOverlaps
BA2(mapB
, mapA
);
706 ASSERT_TRUE(BA2
.valid());
707 EXPECT_EQ(410u, BA2
.b().start());
708 EXPECT_EQ(402u, BA2
.a().start());
711 ASSERT_TRUE(BA2
.valid());
712 EXPECT_EQ(410u, BA2
.b().start());
713 EXPECT_EQ(402u, BA2
.a().start());