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
;
18 typedef IntervalMap
<unsigned, unsigned, 4,
19 IntervalMapHalfOpenInfo
<unsigned>> UUHalfOpenMap
;
22 TEST(IntervalMapTest
, EmptyMap
) {
23 UUMap::Allocator allocator
;
25 EXPECT_TRUE(map
.empty());
27 // Lookup on empty map.
28 EXPECT_EQ(0u, map
.lookup(0));
29 EXPECT_EQ(7u, map
.lookup(0, 7));
30 EXPECT_EQ(0u, map
.lookup(~0u-1));
31 EXPECT_EQ(7u, map
.lookup(~0u-1, 7));
34 EXPECT_TRUE(map
.begin() == map
.begin());
35 EXPECT_TRUE(map
.begin() == map
.end());
36 EXPECT_TRUE(map
.end() == map
.end());
37 EXPECT_FALSE(map
.begin() != map
.begin());
38 EXPECT_FALSE(map
.begin() != map
.end());
39 EXPECT_FALSE(map
.end() != map
.end());
40 EXPECT_FALSE(map
.begin().valid());
41 EXPECT_FALSE(map
.end().valid());
42 UUMap::iterator I
= map
.begin();
43 EXPECT_FALSE(I
.valid());
44 EXPECT_TRUE(I
== map
.end());
46 // Default constructor and cross-constness compares.
47 UUMap::const_iterator CI
;
52 EXPECT_TRUE(I2
== CI
);
55 // Single entry map tests
56 TEST(IntervalMapTest
, SingleEntryMap
) {
57 UUMap::Allocator allocator
;
59 map
.insert(100, 150, 1);
60 EXPECT_FALSE(map
.empty());
62 // Lookup around interval.
63 EXPECT_EQ(0u, map
.lookup(0));
64 EXPECT_EQ(0u, map
.lookup(99));
65 EXPECT_EQ(1u, map
.lookup(100));
66 EXPECT_EQ(1u, map
.lookup(101));
67 EXPECT_EQ(1u, map
.lookup(125));
68 EXPECT_EQ(1u, map
.lookup(149));
69 EXPECT_EQ(1u, map
.lookup(150));
70 EXPECT_EQ(0u, map
.lookup(151));
71 EXPECT_EQ(0u, map
.lookup(200));
72 EXPECT_EQ(0u, map
.lookup(~0u-1));
75 EXPECT_TRUE(map
.begin() == map
.begin());
76 EXPECT_FALSE(map
.begin() == map
.end());
77 EXPECT_TRUE(map
.end() == map
.end());
78 EXPECT_TRUE(map
.begin().valid());
79 EXPECT_FALSE(map
.end().valid());
82 UUMap::iterator I
= map
.begin();
83 ASSERT_TRUE(I
.valid());
84 EXPECT_EQ(100u, I
.start());
85 EXPECT_EQ(150u, I
.stop());
86 EXPECT_EQ(1u, I
.value());
90 EXPECT_FALSE(I
.valid());
91 EXPECT_FALSE(I
== map
.begin());
92 EXPECT_TRUE(I
== map
.end());
96 ASSERT_TRUE(I
.valid());
97 EXPECT_EQ(100u, I
.start());
98 EXPECT_EQ(150u, I
.stop());
99 EXPECT_EQ(1u, I
.value());
100 EXPECT_TRUE(I
== map
.begin());
101 EXPECT_FALSE(I
== map
.end());
105 ASSERT_TRUE(I
.valid());
106 EXPECT_EQ(100u, I
.start());
107 EXPECT_EQ(150u, I
.stop());
108 EXPECT_EQ(2u, I
.value());
112 ASSERT_TRUE(I
.valid());
113 EXPECT_EQ(0u, I
.start());
114 EXPECT_EQ(150u, I
.stop());
115 EXPECT_EQ(2u, I
.value());
118 ASSERT_TRUE(I
.valid());
119 EXPECT_EQ(0u, I
.start());
120 EXPECT_EQ(200u, I
.stop());
121 EXPECT_EQ(2u, I
.value());
123 // Shrink the bounds.
125 ASSERT_TRUE(I
.valid());
126 EXPECT_EQ(150u, I
.start());
127 EXPECT_EQ(200u, I
.stop());
128 EXPECT_EQ(2u, I
.value());
130 // Shrink the interval to have a length of 1
132 ASSERT_TRUE(I
.valid());
133 EXPECT_EQ(150u, I
.start());
134 EXPECT_EQ(150u, I
.stop());
135 EXPECT_EQ(2u, I
.value());
138 ASSERT_TRUE(I
.valid());
139 EXPECT_EQ(150u, I
.start());
140 EXPECT_EQ(160u, I
.stop());
141 EXPECT_EQ(2u, I
.value());
143 // Shrink the interval to have a length of 1
145 ASSERT_TRUE(I
.valid());
146 EXPECT_EQ(160u, I
.start());
147 EXPECT_EQ(160u, I
.stop());
148 EXPECT_EQ(2u, I
.value());
152 EXPECT_TRUE(map
.empty());
153 EXPECT_EQ(0, std::distance(map
.begin(), map
.end()));
156 // Single entry half-open map tests
157 TEST(IntervalMapTest
, SingleEntryHalfOpenMap
) {
158 UUHalfOpenMap::Allocator allocator
;
159 UUHalfOpenMap
map(allocator
);
160 map
.insert(100, 150, 1);
161 EXPECT_FALSE(map
.empty());
163 UUHalfOpenMap::iterator I
= map
.begin();
164 ASSERT_TRUE(I
.valid());
166 // Shrink the interval to have a length of 1
168 ASSERT_TRUE(I
.valid());
169 EXPECT_EQ(149u, I
.start());
170 EXPECT_EQ(150u, I
.stop());
171 EXPECT_EQ(1u, I
.value());
174 ASSERT_TRUE(I
.valid());
175 EXPECT_EQ(149u, I
.start());
176 EXPECT_EQ(160u, I
.stop());
177 EXPECT_EQ(1u, I
.value());
179 // Shrink the interval to have a length of 1
181 ASSERT_TRUE(I
.valid());
182 EXPECT_EQ(149u, I
.start());
183 EXPECT_EQ(150u, I
.stop());
184 EXPECT_EQ(1u, I
.value());
187 // Flat coalescing tests.
188 TEST(IntervalMapTest
, RootCoalescing
) {
189 UUMap::Allocator allocator
;
190 UUMap
map(allocator
);
191 map
.insert(100, 150, 1);
193 // Coalesce from the left.
194 map
.insert(90, 99, 1);
195 EXPECT_EQ(1, std::distance(map
.begin(), map
.end()));
196 EXPECT_EQ(90u, map
.start());
197 EXPECT_EQ(150u, map
.stop());
199 // Coalesce from the right.
200 map
.insert(151, 200, 1);
201 EXPECT_EQ(1, std::distance(map
.begin(), map
.end()));
202 EXPECT_EQ(90u, map
.start());
203 EXPECT_EQ(200u, map
.stop());
205 // Non-coalesce from the left.
206 map
.insert(60, 89, 2);
207 EXPECT_EQ(2, std::distance(map
.begin(), map
.end()));
208 EXPECT_EQ(60u, map
.start());
209 EXPECT_EQ(200u, map
.stop());
210 EXPECT_EQ(2u, map
.lookup(89));
211 EXPECT_EQ(1u, map
.lookup(90));
213 UUMap::iterator I
= map
.begin();
214 EXPECT_EQ(60u, I
.start());
215 EXPECT_EQ(89u, I
.stop());
216 EXPECT_EQ(2u, I
.value());
218 EXPECT_EQ(90u, I
.start());
219 EXPECT_EQ(200u, I
.stop());
220 EXPECT_EQ(1u, I
.value());
222 EXPECT_FALSE(I
.valid());
224 // Non-coalesce from the right.
225 map
.insert(201, 210, 2);
226 EXPECT_EQ(3, std::distance(map
.begin(), map
.end()));
227 EXPECT_EQ(60u, map
.start());
228 EXPECT_EQ(210u, map
.stop());
229 EXPECT_EQ(2u, map
.lookup(201));
230 EXPECT_EQ(1u, map
.lookup(200));
232 // Erase from the left.
234 EXPECT_EQ(2, std::distance(map
.begin(), map
.end()));
235 EXPECT_EQ(90u, map
.start());
236 EXPECT_EQ(210u, map
.stop());
238 // Erase from the right.
239 (--map
.end()).erase();
240 EXPECT_EQ(1, std::distance(map
.begin(), map
.end()));
241 EXPECT_EQ(90u, map
.start());
242 EXPECT_EQ(200u, map
.stop());
244 // Add non-coalescing, then trigger coalescing with setValue.
245 map
.insert(80, 89, 2);
246 map
.insert(201, 210, 2);
247 EXPECT_EQ(3, std::distance(map
.begin(), map
.end()));
248 (++map
.begin()).setValue(2);
249 EXPECT_EQ(1, std::distance(map
.begin(), map
.end()));
251 ASSERT_TRUE(I
.valid());
252 EXPECT_EQ(80u, I
.start());
253 EXPECT_EQ(210u, I
.stop());
254 EXPECT_EQ(2u, I
.value());
257 // Flat multi-coalescing tests.
258 TEST(IntervalMapTest
, RootMultiCoalescing
) {
259 UUMap::Allocator allocator
;
260 UUMap
map(allocator
);
261 map
.insert(140, 150, 1);
262 map
.insert(160, 170, 1);
263 map
.insert(100, 110, 1);
264 map
.insert(120, 130, 1);
265 EXPECT_EQ(4, std::distance(map
.begin(), map
.end()));
266 EXPECT_EQ(100u, map
.start());
267 EXPECT_EQ(170u, map
.stop());
270 UUMap::iterator I
= map
.begin();
271 EXPECT_EQ(100u, I
.start());
272 EXPECT_EQ(110u, I
.stop());
274 EXPECT_EQ(120u, I
.start());
275 EXPECT_EQ(130u, I
.stop());
277 EXPECT_EQ(140u, I
.start());
278 EXPECT_EQ(150u, I
.stop());
280 EXPECT_EQ(160u, I
.start());
281 EXPECT_EQ(170u, I
.stop());
283 EXPECT_FALSE(I
.valid());
285 // Test advanceTo on flat tree.
288 ASSERT_TRUE(I
.valid());
289 EXPECT_EQ(140u, I
.start());
290 EXPECT_EQ(150u, I
.stop());
293 ASSERT_TRUE(I
.valid());
294 EXPECT_EQ(140u, I
.start());
295 EXPECT_EQ(150u, I
.stop());
298 EXPECT_FALSE(I
.valid());
301 EXPECT_FALSE(I
.valid());
303 // Coalesce left with followers.
304 // [100;110] [120;130] [140;150] [160;170]
305 map
.insert(111, 115, 1);
307 ASSERT_TRUE(I
.valid());
308 EXPECT_EQ(100u, I
.start());
309 EXPECT_EQ(115u, I
.stop());
311 ASSERT_TRUE(I
.valid());
312 EXPECT_EQ(120u, I
.start());
313 EXPECT_EQ(130u, I
.stop());
315 ASSERT_TRUE(I
.valid());
316 EXPECT_EQ(140u, I
.start());
317 EXPECT_EQ(150u, I
.stop());
319 ASSERT_TRUE(I
.valid());
320 EXPECT_EQ(160u, I
.start());
321 EXPECT_EQ(170u, I
.stop());
323 EXPECT_FALSE(I
.valid());
325 // Coalesce right with followers.
326 // [100;115] [120;130] [140;150] [160;170]
327 map
.insert(135, 139, 1);
329 ASSERT_TRUE(I
.valid());
330 EXPECT_EQ(100u, I
.start());
331 EXPECT_EQ(115u, I
.stop());
333 ASSERT_TRUE(I
.valid());
334 EXPECT_EQ(120u, I
.start());
335 EXPECT_EQ(130u, I
.stop());
337 ASSERT_TRUE(I
.valid());
338 EXPECT_EQ(135u, I
.start());
339 EXPECT_EQ(150u, I
.stop());
341 ASSERT_TRUE(I
.valid());
342 EXPECT_EQ(160u, I
.start());
343 EXPECT_EQ(170u, I
.stop());
345 EXPECT_FALSE(I
.valid());
347 // Coalesce left and right with followers.
348 // [100;115] [120;130] [135;150] [160;170]
349 map
.insert(131, 134, 1);
351 ASSERT_TRUE(I
.valid());
352 EXPECT_EQ(100u, I
.start());
353 EXPECT_EQ(115u, I
.stop());
355 ASSERT_TRUE(I
.valid());
356 EXPECT_EQ(120u, I
.start());
357 EXPECT_EQ(150u, I
.stop());
359 ASSERT_TRUE(I
.valid());
360 EXPECT_EQ(160u, I
.start());
361 EXPECT_EQ(170u, I
.stop());
363 EXPECT_FALSE(I
.valid());
365 // Test clear() on non-branched map.
367 EXPECT_TRUE(map
.empty());
368 EXPECT_TRUE(map
.begin() == map
.end());
371 // Branched, non-coalescing tests.
372 TEST(IntervalMapTest
, Branched
) {
373 UUMap::Allocator allocator
;
374 UUMap
map(allocator
);
376 // Insert enough intervals to force a branched tree.
377 // This creates 9 leaf nodes with 11 elements each, tree height = 1.
378 for (unsigned i
= 1; i
< 100; ++i
) {
379 map
.insert(10*i
, 10*i
+5, i
);
380 EXPECT_EQ(10u, map
.start());
381 EXPECT_EQ(10*i
+5, map
.stop());
385 EXPECT_FALSE(map
.empty());
386 EXPECT_EQ(10u, map
.start());
387 EXPECT_EQ(995u, map
.stop());
390 for (unsigned i
= 1; i
< 100; ++i
) {
391 EXPECT_EQ(0u, map
.lookup(10*i
-1));
392 EXPECT_EQ(i
, map
.lookup(10*i
));
393 EXPECT_EQ(i
, map
.lookup(10*i
+5));
394 EXPECT_EQ(0u, map
.lookup(10*i
+6));
397 // Forward iteration.
398 UUMap::iterator I
= map
.begin();
399 for (unsigned i
= 1; i
< 100; ++i
) {
400 ASSERT_TRUE(I
.valid());
401 EXPECT_EQ(10*i
, I
.start());
402 EXPECT_EQ(10*i
+5, I
.stop());
406 EXPECT_FALSE(I
.valid());
407 EXPECT_TRUE(I
== map
.end());
409 // Backwards iteration.
410 for (unsigned i
= 99; i
; --i
) {
412 ASSERT_TRUE(I
.valid());
413 EXPECT_EQ(10*i
, I
.start());
414 EXPECT_EQ(10*i
+5, I
.stop());
417 EXPECT_TRUE(I
== map
.begin());
419 // Test advanceTo in same node.
421 ASSERT_TRUE(I
.valid());
422 EXPECT_EQ(20u, I
.start());
423 EXPECT_EQ(25u, I
.stop());
425 // Change value, no coalescing.
427 ASSERT_TRUE(I
.valid());
428 EXPECT_EQ(20u, I
.start());
429 EXPECT_EQ(25u, I
.stop());
430 EXPECT_EQ(0u, I
.value());
432 // Close the gap right, no coalescing.
434 ASSERT_TRUE(I
.valid());
435 EXPECT_EQ(20u, I
.start());
436 EXPECT_EQ(29u, I
.stop());
437 EXPECT_EQ(0u, I
.value());
439 // Change value, no coalescing.
441 ASSERT_TRUE(I
.valid());
442 EXPECT_EQ(20u, I
.start());
443 EXPECT_EQ(29u, I
.stop());
444 EXPECT_EQ(2u, I
.value());
446 // Change value, now coalescing.
448 ASSERT_TRUE(I
.valid());
449 EXPECT_EQ(20u, I
.start());
450 EXPECT_EQ(35u, I
.stop());
451 EXPECT_EQ(3u, I
.value());
453 // Close the gap, now coalescing.
455 ASSERT_TRUE(I
.valid());
457 ASSERT_TRUE(I
.valid());
458 EXPECT_EQ(20u, I
.start());
459 EXPECT_EQ(45u, I
.stop());
460 EXPECT_EQ(4u, I
.value());
462 // advanceTo another node.
464 ASSERT_TRUE(I
.valid());
465 EXPECT_EQ(200u, I
.start());
466 EXPECT_EQ(205u, I
.stop());
468 // Close the gap left, no coalescing.
470 ASSERT_TRUE(I
.valid());
471 EXPECT_EQ(196u, I
.start());
472 EXPECT_EQ(205u, I
.stop());
473 EXPECT_EQ(20u, I
.value());
475 // Change value, no coalescing.
477 ASSERT_TRUE(I
.valid());
478 EXPECT_EQ(196u, I
.start());
479 EXPECT_EQ(205u, I
.stop());
480 EXPECT_EQ(0u, I
.value());
482 // Change value, now coalescing.
484 ASSERT_TRUE(I
.valid());
485 EXPECT_EQ(190u, I
.start());
486 EXPECT_EQ(205u, I
.stop());
487 EXPECT_EQ(19u, I
.value());
489 // Close the gap, now coalescing.
491 ASSERT_TRUE(I
.valid());
493 ASSERT_TRUE(I
.valid());
494 EXPECT_EQ(180u, I
.start());
495 EXPECT_EQ(205u, I
.stop());
496 EXPECT_EQ(18u, I
.value());
498 // Erase from the front.
500 for (unsigned i
= 0; i
!= 20; ++i
) {
502 EXPECT_TRUE(I
== map
.begin());
503 EXPECT_FALSE(map
.empty());
504 EXPECT_EQ(I
.start(), map
.start());
505 EXPECT_EQ(995u, map
.stop());
508 // Test clear() on branched map.
510 EXPECT_TRUE(map
.empty());
511 EXPECT_TRUE(map
.begin() == map
.end());
514 // Branched, high, non-coalescing tests.
515 TEST(IntervalMapTest
, Branched2
) {
516 UUMap::Allocator allocator
;
517 UUMap
map(allocator
);
519 // Insert enough intervals to force a height >= 2 tree.
520 for (unsigned i
= 1; i
< 1000; ++i
)
521 map
.insert(10*i
, 10*i
+5, i
);
524 EXPECT_FALSE(map
.empty());
525 EXPECT_EQ(10u, map
.start());
526 EXPECT_EQ(9995u, map
.stop());
529 for (unsigned i
= 1; i
< 1000; ++i
) {
530 EXPECT_EQ(0u, map
.lookup(10*i
-1));
531 EXPECT_EQ(i
, map
.lookup(10*i
));
532 EXPECT_EQ(i
, map
.lookup(10*i
+5));
533 EXPECT_EQ(0u, map
.lookup(10*i
+6));
536 // Forward iteration.
537 UUMap::iterator I
= map
.begin();
538 for (unsigned i
= 1; i
< 1000; ++i
) {
539 ASSERT_TRUE(I
.valid());
540 EXPECT_EQ(10*i
, I
.start());
541 EXPECT_EQ(10*i
+5, I
.stop());
545 EXPECT_FALSE(I
.valid());
546 EXPECT_TRUE(I
== map
.end());
548 // Backwards iteration.
549 for (unsigned i
= 999; i
; --i
) {
551 ASSERT_TRUE(I
.valid());
552 EXPECT_EQ(10*i
, I
.start());
553 EXPECT_EQ(10*i
+5, I
.stop());
556 EXPECT_TRUE(I
== map
.begin());
558 // Test advanceTo in same node.
560 ASSERT_TRUE(I
.valid());
561 EXPECT_EQ(20u, I
.start());
562 EXPECT_EQ(25u, I
.stop());
564 // advanceTo sibling leaf node.
566 ASSERT_TRUE(I
.valid());
567 EXPECT_EQ(200u, I
.start());
568 EXPECT_EQ(205u, I
.stop());
570 // advanceTo further.
572 ASSERT_TRUE(I
.valid());
573 EXPECT_EQ(2000u, I
.start());
574 EXPECT_EQ(2005u, I
.stop());
576 // advanceTo beyond end()
578 EXPECT_FALSE(I
.valid());
580 // end().advanceTo() is valid as long as x > map.stop()
582 EXPECT_FALSE(I
.valid());
584 // Test clear() on branched map.
586 EXPECT_TRUE(map
.empty());
587 EXPECT_TRUE(map
.begin() == map
.end());
590 // Random insertions, coalescing to a single interval.
591 TEST(IntervalMapTest
, RandomCoalescing
) {
592 UUMap::Allocator allocator
;
593 UUMap
map(allocator
);
595 // This is a poor PRNG with maximal period:
596 // x_n = 5 x_{n-1} + 1 mod 2^N
599 for (unsigned i
= 0; i
!= 4096; ++i
) {
600 map
.insert(10*x
, 10*x
+9, 1);
601 EXPECT_GE(10*x
, map
.start());
602 EXPECT_LE(10*x
+9, map
.stop());
606 // Map should be fully coalesced after that exercise.
607 EXPECT_FALSE(map
.empty());
608 EXPECT_EQ(0u, map
.start());
609 EXPECT_EQ(40959u, map
.stop());
610 EXPECT_EQ(1, std::distance(map
.begin(), map
.end()));
614 TEST(IntervalMapOverlapsTest
, SmallMaps
) {
615 typedef IntervalMapOverlaps
<UUMap
,UUMap
> UUOverlaps
;
616 UUMap::Allocator allocator
;
617 UUMap
mapA(allocator
);
618 UUMap
mapB(allocator
);
621 EXPECT_FALSE(UUOverlaps(mapA
, mapB
).valid());
623 mapA
.insert(1, 2, 3);
626 EXPECT_FALSE(UUOverlaps(mapA
, mapB
).valid());
628 EXPECT_FALSE(UUOverlaps(mapB
, mapA
).valid());
630 mapB
.insert(3, 4, 5);
632 // full, full, non-overlapping
633 EXPECT_FALSE(UUOverlaps(mapA
, mapB
).valid());
634 EXPECT_FALSE(UUOverlaps(mapB
, mapA
).valid());
636 // Add an overlapping segment.
637 mapA
.insert(4, 5, 6);
639 UUOverlaps
AB(mapA
, mapB
);
640 ASSERT_TRUE(AB
.valid());
641 EXPECT_EQ(4u, AB
.a().start());
642 EXPECT_EQ(3u, AB
.b().start());
644 EXPECT_FALSE(AB
.valid());
646 UUOverlaps
BA(mapB
, mapA
);
647 ASSERT_TRUE(BA
.valid());
648 EXPECT_EQ(3u, BA
.a().start());
649 EXPECT_EQ(4u, BA
.b().start());
652 EXPECT_FALSE(BA
.valid());
653 // advance an invalid iterator.
655 EXPECT_FALSE(BA
.valid());
658 TEST(IntervalMapOverlapsTest
, BigMaps
) {
659 typedef IntervalMapOverlaps
<UUMap
,UUMap
> UUOverlaps
;
660 UUMap::Allocator allocator
;
661 UUMap
mapA(allocator
);
662 UUMap
mapB(allocator
);
664 // [0;4] [10;14] [20;24] ...
665 for (unsigned n
= 0; n
!= 100; ++n
)
666 mapA
.insert(10*n
, 10*n
+4, n
);
668 // [5;6] [15;16] [25;26] ...
669 for (unsigned n
= 10; n
!= 20; ++n
)
670 mapB
.insert(10*n
+5, 10*n
+6, n
);
672 // [208;209] [218;219] ...
673 for (unsigned n
= 20; n
!= 30; ++n
)
674 mapB
.insert(10*n
+8, 10*n
+9, n
);
676 // insert some overlapping segments.
677 mapB
.insert(400, 400, 400);
678 mapB
.insert(401, 401, 401);
679 mapB
.insert(402, 500, 402);
680 mapB
.insert(600, 601, 402);
682 UUOverlaps
AB(mapA
, mapB
);
683 ASSERT_TRUE(AB
.valid());
684 EXPECT_EQ(400u, AB
.a().start());
685 EXPECT_EQ(400u, AB
.b().start());
687 ASSERT_TRUE(AB
.valid());
688 EXPECT_EQ(400u, AB
.a().start());
689 EXPECT_EQ(401u, AB
.b().start());
691 ASSERT_TRUE(AB
.valid());
692 EXPECT_EQ(400u, AB
.a().start());
693 EXPECT_EQ(402u, AB
.b().start());
695 ASSERT_TRUE(AB
.valid());
696 EXPECT_EQ(410u, AB
.a().start());
697 EXPECT_EQ(402u, AB
.b().start());
699 ASSERT_TRUE(AB
.valid());
700 EXPECT_EQ(420u, AB
.a().start());
701 EXPECT_EQ(402u, AB
.b().start());
703 ASSERT_TRUE(AB
.valid());
704 EXPECT_EQ(600u, AB
.a().start());
705 EXPECT_EQ(600u, AB
.b().start());
707 EXPECT_FALSE(AB
.valid());
710 UUOverlaps
AB2(mapA
, mapB
);
712 ASSERT_TRUE(AB2
.valid());
713 EXPECT_EQ(410u, AB2
.a().start());
714 EXPECT_EQ(402u, AB2
.b().start());
716 // It is valid to advanceTo with any monotonic sequence.
718 ASSERT_TRUE(AB2
.valid());
719 EXPECT_EQ(410u, AB2
.a().start());
720 EXPECT_EQ(402u, AB2
.b().start());
722 // Check reversed maps.
723 UUOverlaps
BA(mapB
, mapA
);
724 ASSERT_TRUE(BA
.valid());
725 EXPECT_EQ(400u, BA
.b().start());
726 EXPECT_EQ(400u, BA
.a().start());
728 ASSERT_TRUE(BA
.valid());
729 EXPECT_EQ(400u, BA
.b().start());
730 EXPECT_EQ(401u, BA
.a().start());
732 ASSERT_TRUE(BA
.valid());
733 EXPECT_EQ(400u, BA
.b().start());
734 EXPECT_EQ(402u, BA
.a().start());
736 ASSERT_TRUE(BA
.valid());
737 EXPECT_EQ(410u, BA
.b().start());
738 EXPECT_EQ(402u, BA
.a().start());
740 ASSERT_TRUE(BA
.valid());
741 EXPECT_EQ(420u, BA
.b().start());
742 EXPECT_EQ(402u, BA
.a().start());
744 ASSERT_TRUE(BA
.valid());
745 EXPECT_EQ(600u, BA
.b().start());
746 EXPECT_EQ(600u, BA
.a().start());
748 EXPECT_FALSE(BA
.valid());
751 UUOverlaps
BA2(mapB
, mapA
);
753 ASSERT_TRUE(BA2
.valid());
754 EXPECT_EQ(410u, BA2
.b().start());
755 EXPECT_EQ(402u, BA2
.a().start());
758 ASSERT_TRUE(BA2
.valid());
759 EXPECT_EQ(410u, BA2
.b().start());
760 EXPECT_EQ(402u, BA2
.a().start());