xref: /llvm-project/lldb/unittests/Utility/RangeTest.cpp (revision 808142876c10b52e7ee57cdc6dcf0acc5c97c1b7)
1*80814287SRaphael Isemann //===-- RangeTest.cpp -----------------------------------------------------===//
2b8093314SPavel Labath //
3b8093314SPavel Labath // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4b8093314SPavel Labath // See https://llvm.org/LICENSE.txt for license information.
5b8093314SPavel Labath // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b8093314SPavel Labath //
7b8093314SPavel Labath //===----------------------------------------------------------------------===//
8b8093314SPavel Labath 
9b8093314SPavel Labath #include "lldb/Utility/RangeMap.h"
10b8093314SPavel Labath #include <cstdint>
11b8093314SPavel Labath #include <type_traits>
12b8093314SPavel Labath 
13b8093314SPavel Labath #include "gtest/gtest.h"
14b8093314SPavel Labath 
15b8093314SPavel Labath using namespace lldb;
16b8093314SPavel Labath using namespace lldb_private;
17b8093314SPavel Labath 
TEST(RangeTest,SizeTypes)18b8093314SPavel Labath TEST(RangeTest, SizeTypes) {
19b8093314SPavel Labath   Range<lldb::addr_t, uint32_t> r;
20b8093314SPavel Labath   static_assert(std::is_same<lldb::addr_t, decltype(r.GetRangeBase())>::value,
21b8093314SPavel Labath                 "RangeBase type is not equal to the given one.");
22b8093314SPavel Labath   static_assert(std::is_same<lldb::addr_t, decltype(r.GetRangeEnd())>::value,
23b8093314SPavel Labath                 "RangeEnd type is not equal to the given one.");
24b8093314SPavel Labath   static_assert(std::is_same<uint32_t, decltype(r.GetByteSize())>::value,
25b8093314SPavel Labath                 "Size type is not equal to the given one.");
26b8093314SPavel Labath }
27b8093314SPavel Labath 
28b8093314SPavel Labath typedef Range<lldb::addr_t, uint32_t> RangeT;
29b8093314SPavel Labath 
TEST(RangeTest,DefaultConstructor)30b8093314SPavel Labath TEST(RangeTest, DefaultConstructor) {
31b8093314SPavel Labath   RangeT r;
32b8093314SPavel Labath   EXPECT_FALSE(r.IsValid());
33b8093314SPavel Labath   EXPECT_EQ(0U, r.GetByteSize());
34b8093314SPavel Labath   EXPECT_EQ(0U, r.GetRangeBase());
35b8093314SPavel Labath   EXPECT_EQ(0U, r.GetRangeEnd());
36b8093314SPavel Labath }
37b8093314SPavel Labath 
TEST(RangeTest,Constructor)38b8093314SPavel Labath TEST(RangeTest, Constructor) {
39b8093314SPavel Labath   RangeT r(3, 5);
40b8093314SPavel Labath   EXPECT_TRUE(r.IsValid());
41b8093314SPavel Labath   EXPECT_EQ(5U, r.GetByteSize());
42b8093314SPavel Labath   EXPECT_EQ(3U, r.GetRangeBase());
43b8093314SPavel Labath   EXPECT_EQ(8U, r.GetRangeEnd());
44b8093314SPavel Labath }
45b8093314SPavel Labath 
TEST(RangeTest,Copy)46b8093314SPavel Labath TEST(RangeTest, Copy) {
47b8093314SPavel Labath   RangeT orig(3, 5);
48b8093314SPavel Labath   RangeT r = orig;
49b8093314SPavel Labath   EXPECT_TRUE(r.IsValid());
50b8093314SPavel Labath   EXPECT_EQ(5U, r.GetByteSize());
51b8093314SPavel Labath   EXPECT_EQ(3U, r.GetRangeBase());
52b8093314SPavel Labath   EXPECT_EQ(8U, r.GetRangeEnd());
53b8093314SPavel Labath }
54b8093314SPavel Labath 
TEST(RangeTest,Clear)55b8093314SPavel Labath TEST(RangeTest, Clear) {
56b8093314SPavel Labath   RangeT r(3, 5);
57b8093314SPavel Labath   r.Clear();
58b8093314SPavel Labath   EXPECT_TRUE(r == RangeT());
59b8093314SPavel Labath }
60b8093314SPavel Labath 
TEST(RangeTest,ClearWithStarAddress)61b8093314SPavel Labath TEST(RangeTest, ClearWithStarAddress) {
62b8093314SPavel Labath   RangeT r(3, 5);
63b8093314SPavel Labath   r.Clear(4);
64b8093314SPavel Labath   EXPECT_TRUE(r == RangeT(4, 0));
65b8093314SPavel Labath }
66b8093314SPavel Labath 
TEST(RangeTest,SetRangeBase)67b8093314SPavel Labath TEST(RangeTest, SetRangeBase) {
68b8093314SPavel Labath   RangeT r(3, 5);
69b8093314SPavel Labath   r.SetRangeBase(6);
70b8093314SPavel Labath   EXPECT_EQ(6U, r.GetRangeBase());
71b8093314SPavel Labath   EXPECT_EQ(11U, r.GetRangeEnd());
72b8093314SPavel Labath   EXPECT_EQ(5U, r.GetByteSize());
73b8093314SPavel Labath }
74b8093314SPavel Labath 
TEST(RangeTest,Slide)75b8093314SPavel Labath TEST(RangeTest, Slide) {
76b8093314SPavel Labath   RangeT r(3, 5);
77b8093314SPavel Labath   r.Slide(1);
78b8093314SPavel Labath   EXPECT_EQ(4U, r.GetRangeBase());
79b8093314SPavel Labath   EXPECT_EQ(9U, r.GetRangeEnd());
80b8093314SPavel Labath   EXPECT_EQ(5U, r.GetByteSize());
81b8093314SPavel Labath 
82b8093314SPavel Labath   r.Slide(2);
83b8093314SPavel Labath   EXPECT_EQ(6U, r.GetRangeBase());
84b8093314SPavel Labath   EXPECT_EQ(11U, r.GetRangeEnd());
85b8093314SPavel Labath   EXPECT_EQ(5U, r.GetByteSize());
86b8093314SPavel Labath }
87b8093314SPavel Labath 
TEST(RangeTest,SlideZero)88b8093314SPavel Labath TEST(RangeTest, SlideZero) {
89b8093314SPavel Labath   RangeT r(3, 5);
90b8093314SPavel Labath   r.Slide(0);
91b8093314SPavel Labath   EXPECT_EQ(3U, r.GetRangeBase());
92b8093314SPavel Labath   EXPECT_EQ(8U, r.GetRangeEnd());
93b8093314SPavel Labath   EXPECT_EQ(5U, r.GetByteSize());
94b8093314SPavel Labath }
95b8093314SPavel Labath 
TEST(RangeTest,ContainsAddr)96b8093314SPavel Labath TEST(RangeTest, ContainsAddr) {
97b8093314SPavel Labath   RangeT r(3, 5);
98b8093314SPavel Labath   EXPECT_FALSE(r.Contains(0));
99b8093314SPavel Labath   EXPECT_FALSE(r.Contains(1));
100b8093314SPavel Labath   EXPECT_FALSE(r.Contains(2));
101b8093314SPavel Labath   EXPECT_TRUE(r.Contains(3));
102b8093314SPavel Labath   EXPECT_TRUE(r.Contains(4));
103b8093314SPavel Labath   EXPECT_TRUE(r.Contains(5));
104b8093314SPavel Labath   EXPECT_TRUE(r.Contains(6));
105b8093314SPavel Labath   EXPECT_TRUE(r.Contains(7));
106b8093314SPavel Labath   EXPECT_FALSE(r.Contains(8));
107b8093314SPavel Labath   EXPECT_FALSE(r.Contains(9));
108b8093314SPavel Labath   EXPECT_FALSE(r.Contains(10));
109b8093314SPavel Labath }
110b8093314SPavel Labath 
TEST(RangeTest,ContainsAddrInvalid)111b8093314SPavel Labath TEST(RangeTest, ContainsAddrInvalid) {
112b8093314SPavel Labath   RangeT r;
113b8093314SPavel Labath   EXPECT_FALSE(r.Contains(0));
114b8093314SPavel Labath   EXPECT_FALSE(r.Contains(1));
115b8093314SPavel Labath   EXPECT_FALSE(r.Contains(2));
116b8093314SPavel Labath   EXPECT_FALSE(r.Contains(3));
117b8093314SPavel Labath   EXPECT_FALSE(r.Contains(4));
118b8093314SPavel Labath }
119b8093314SPavel Labath 
TEST(RangeTest,ContainsEndInclusive)120b8093314SPavel Labath TEST(RangeTest, ContainsEndInclusive) {
121b8093314SPavel Labath   RangeT r(3, 5);
122b8093314SPavel Labath   EXPECT_FALSE(r.ContainsEndInclusive(0));
123b8093314SPavel Labath   EXPECT_FALSE(r.ContainsEndInclusive(1));
124b8093314SPavel Labath   EXPECT_FALSE(r.ContainsEndInclusive(2));
125b8093314SPavel Labath   EXPECT_TRUE(r.ContainsEndInclusive(3));
126b8093314SPavel Labath   EXPECT_TRUE(r.ContainsEndInclusive(4));
127b8093314SPavel Labath   EXPECT_TRUE(r.ContainsEndInclusive(5));
128b8093314SPavel Labath   EXPECT_TRUE(r.ContainsEndInclusive(6));
129b8093314SPavel Labath   EXPECT_TRUE(r.ContainsEndInclusive(7));
130b8093314SPavel Labath   EXPECT_TRUE(r.ContainsEndInclusive(8));
131b8093314SPavel Labath   EXPECT_FALSE(r.ContainsEndInclusive(9));
132b8093314SPavel Labath   EXPECT_FALSE(r.ContainsEndInclusive(10));
133b8093314SPavel Labath }
134b8093314SPavel Labath 
TEST(RangeTest,ContainsEndInclusiveInvalid)135b8093314SPavel Labath TEST(RangeTest, ContainsEndInclusiveInvalid) {
136b8093314SPavel Labath   RangeT r;
137b8093314SPavel Labath   // FIXME: This is probably not intended.
138b8093314SPavel Labath   EXPECT_TRUE(r.ContainsEndInclusive(0));
139b8093314SPavel Labath 
140b8093314SPavel Labath   EXPECT_FALSE(r.ContainsEndInclusive(1));
141b8093314SPavel Labath   EXPECT_FALSE(r.ContainsEndInclusive(2));
142b8093314SPavel Labath }
143b8093314SPavel Labath 
TEST(RangeTest,ContainsRange)144b8093314SPavel Labath TEST(RangeTest, ContainsRange) {
145b8093314SPavel Labath   RangeT r(3, 5);
146b8093314SPavel Labath 
147b8093314SPavel Labath   // Range always contains itself.
148b8093314SPavel Labath   EXPECT_TRUE(r.Contains(r));
149b8093314SPavel Labath   // Invalid range.
150b8093314SPavel Labath   EXPECT_FALSE(r.Contains(RangeT()));
151b8093314SPavel Labath   // Range starts and ends before.
152b8093314SPavel Labath   EXPECT_FALSE(r.Contains(RangeT(0, 3)));
153b8093314SPavel Labath   // Range starts before but contains beginning.
154b8093314SPavel Labath   EXPECT_FALSE(r.Contains(RangeT(0, 4)));
155b8093314SPavel Labath   // Range starts before but contains beginning and more.
156b8093314SPavel Labath   EXPECT_FALSE(r.Contains(RangeT(0, 5)));
157b8093314SPavel Labath   // Range starts before and contains the other.
158b8093314SPavel Labath   EXPECT_FALSE(r.Contains(RangeT(0, 9)));
159b8093314SPavel Labath   // Range is fully inside.
160b8093314SPavel Labath   EXPECT_TRUE(r.Contains(RangeT(4, 3)));
161b8093314SPavel Labath   // Range has same start, but not as large.
162b8093314SPavel Labath   EXPECT_TRUE(r.Contains(RangeT(3, 4)));
163b8093314SPavel Labath   // Range has same end, but starts earlier.
164b8093314SPavel Labath   EXPECT_TRUE(r.Contains(RangeT(4, 4)));
165b8093314SPavel Labath   // Range starts inside, but stops after the end of r.
166b8093314SPavel Labath   EXPECT_FALSE(r.Contains(RangeT(4, 5)));
167b8093314SPavel Labath   // Range starts directly after r.
168b8093314SPavel Labath   EXPECT_FALSE(r.Contains(RangeT(8, 2)));
169b8093314SPavel Labath   // Range starts directly after r.
170b8093314SPavel Labath   EXPECT_FALSE(r.Contains(RangeT(9, 2)));
171b8093314SPavel Labath 
172b8093314SPavel Labath   // Invalid range with different start.
173b8093314SPavel Labath   // FIXME: The first two probably not intended.
174b8093314SPavel Labath   EXPECT_TRUE(r.Contains(RangeT(3, 0)));
175b8093314SPavel Labath   EXPECT_TRUE(r.Contains(RangeT(4, 0)));
176b8093314SPavel Labath   EXPECT_FALSE(r.Contains(RangeT(8, 0)));
177b8093314SPavel Labath }
178b8093314SPavel Labath 
TEST(RangeTest,ContainsRangeStartingFromZero)179b8093314SPavel Labath TEST(RangeTest, ContainsRangeStartingFromZero) {
180b8093314SPavel Labath   RangeT r(0, 3);
181b8093314SPavel Labath   EXPECT_TRUE(r.Contains(r));
182b8093314SPavel Labath 
183b8093314SPavel Labath   // FIXME: This is probably not intended.
184b8093314SPavel Labath   EXPECT_TRUE(r.Contains(RangeT()));
185b8093314SPavel Labath }
186b8093314SPavel Labath 
TEST(RangeTest,Union)187b8093314SPavel Labath TEST(RangeTest, Union) {
188b8093314SPavel Labath   RangeT r(3, 5);
189b8093314SPavel Labath 
190b8093314SPavel Labath   // Ranges that we can't merge because it's not adjoin/intersecting.
191b8093314SPavel Labath   EXPECT_FALSE(r.Union(RangeT(9, 1)));
192b8093314SPavel Labath   // Check that we didn't modify our range.
193b8093314SPavel Labath   EXPECT_EQ(r, RangeT(3, 5));
194b8093314SPavel Labath 
195b8093314SPavel Labath   // Another range we can't merge, but before r.
196b8093314SPavel Labath   EXPECT_FALSE(r.Union(RangeT(1, 1)));
197b8093314SPavel Labath   EXPECT_EQ(r, RangeT(3, 5));
198b8093314SPavel Labath 
199b8093314SPavel Labath   // Merge an adjoin range after.
200b8093314SPavel Labath   EXPECT_TRUE(r.Union(RangeT(8, 2)));
201b8093314SPavel Labath   EXPECT_EQ(r, RangeT(3, 7));
202b8093314SPavel Labath 
203b8093314SPavel Labath   // Merge an adjoin range before.
204b8093314SPavel Labath   EXPECT_TRUE(r.Union(RangeT(1, 2)));
205b8093314SPavel Labath   EXPECT_EQ(r, RangeT(1, 9));
206b8093314SPavel Labath 
207b8093314SPavel Labath   // Merge an intersecting range after.
208b8093314SPavel Labath   EXPECT_TRUE(r.Union(RangeT(8, 3)));
209b8093314SPavel Labath   EXPECT_EQ(r, RangeT(1, 10));
210b8093314SPavel Labath 
211b8093314SPavel Labath   // Merge an intersecting range before.
212b8093314SPavel Labath   EXPECT_TRUE(r.Union(RangeT(0, 1)));
213b8093314SPavel Labath   EXPECT_EQ(r, RangeT(0, 11));
214b8093314SPavel Labath 
215b8093314SPavel Labath   // Merge a few ranges inside that shouldn't do anything.
216b8093314SPavel Labath   EXPECT_TRUE(r.Union(RangeT(0, 3)));
217b8093314SPavel Labath   EXPECT_EQ(r, RangeT(0, 11));
218b8093314SPavel Labath   EXPECT_TRUE(r.Union(RangeT(5, 1)));
219b8093314SPavel Labath   EXPECT_EQ(r, RangeT(0, 11));
220b8093314SPavel Labath   EXPECT_TRUE(r.Union(RangeT(9, 2)));
221b8093314SPavel Labath   EXPECT_EQ(r, RangeT(0, 11));
222b8093314SPavel Labath }
223b8093314SPavel Labath 
TEST(RangeTest,DoesAdjoinOrIntersect)224b8093314SPavel Labath TEST(RangeTest, DoesAdjoinOrIntersect) {
225b8093314SPavel Labath   RangeT r(3, 4);
226b8093314SPavel Labath 
227b8093314SPavel Labath   EXPECT_FALSE(r.DoesAdjoinOrIntersect(RangeT(1, 1)));
228b8093314SPavel Labath   EXPECT_TRUE(r.DoesAdjoinOrIntersect(RangeT(1, 2)));
229b8093314SPavel Labath   EXPECT_TRUE(r.DoesAdjoinOrIntersect(RangeT(2, 2)));
230b8093314SPavel Labath   EXPECT_TRUE(r.DoesAdjoinOrIntersect(RangeT(4, 2)));
231b8093314SPavel Labath   EXPECT_TRUE(r.DoesAdjoinOrIntersect(RangeT(6, 2)));
232b8093314SPavel Labath   EXPECT_TRUE(r.DoesAdjoinOrIntersect(RangeT(7, 2)));
233b8093314SPavel Labath   EXPECT_FALSE(r.DoesAdjoinOrIntersect(RangeT(8, 2)));
234b8093314SPavel Labath }
235b8093314SPavel Labath 
TEST(RangeTest,DoesIntersect)236b8093314SPavel Labath TEST(RangeTest, DoesIntersect) {
237b8093314SPavel Labath   RangeT r(3, 4);
238b8093314SPavel Labath 
239b8093314SPavel Labath   EXPECT_FALSE(r.DoesIntersect(RangeT(1, 1)));
240b8093314SPavel Labath   EXPECT_FALSE(r.DoesIntersect(RangeT(1, 2)));
241b8093314SPavel Labath   EXPECT_TRUE(r.DoesIntersect(RangeT(2, 2)));
242b8093314SPavel Labath   EXPECT_TRUE(r.DoesIntersect(RangeT(4, 2)));
243b8093314SPavel Labath   EXPECT_TRUE(r.DoesIntersect(RangeT(6, 2)));
244b8093314SPavel Labath   EXPECT_FALSE(r.DoesIntersect(RangeT(7, 2)));
245b8093314SPavel Labath   EXPECT_FALSE(r.DoesIntersect(RangeT(8, 2)));
246b8093314SPavel Labath }
247b8093314SPavel Labath 
TEST(RangeTest,LessThan)248b8093314SPavel Labath TEST(RangeTest, LessThan) {
249b8093314SPavel Labath   RangeT r(10, 20);
250b8093314SPavel Labath 
251b8093314SPavel Labath   // Equal range.
252b8093314SPavel Labath   EXPECT_FALSE(r < RangeT(10, 20));
253b8093314SPavel Labath   EXPECT_FALSE(RangeT(10, 20) < r);
254b8093314SPavel Labath 
255b8093314SPavel Labath   auto expect_ordered_less_than = [](RangeT r1, RangeT r2) {
256b8093314SPavel Labath     EXPECT_TRUE(r1 < r2);
257b8093314SPavel Labath     EXPECT_FALSE(r2 < r1);
258b8093314SPavel Labath   };
259b8093314SPavel Labath 
260b8093314SPavel Labath   // Same start, but bigger size.
261b8093314SPavel Labath   expect_ordered_less_than(r, RangeT(10, 21));
262b8093314SPavel Labath 
263b8093314SPavel Labath   // Start before and ends before.
264b8093314SPavel Labath   expect_ordered_less_than(RangeT(9, 20), r);
265b8093314SPavel Labath 
266b8093314SPavel Labath   // Start before and equal size.
267b8093314SPavel Labath   expect_ordered_less_than(RangeT(9, 21), r);
268b8093314SPavel Labath 
269b8093314SPavel Labath   // Start before and bigger size.
270b8093314SPavel Labath   expect_ordered_less_than(RangeT(9, 22), r);
271b8093314SPavel Labath 
272b8093314SPavel Labath   // Start after and ends before.
273b8093314SPavel Labath   expect_ordered_less_than(r, RangeT(11, 18));
274b8093314SPavel Labath 
275b8093314SPavel Labath   // Start after and equal size.
276b8093314SPavel Labath   expect_ordered_less_than(r, RangeT(11, 19));
277b8093314SPavel Labath 
278b8093314SPavel Labath   // Start after and bigger size.
279b8093314SPavel Labath   expect_ordered_less_than(r, RangeT(11, 20));
280b8093314SPavel Labath }
281b8093314SPavel Labath 
TEST(RangeTest,Equal)282b8093314SPavel Labath TEST(RangeTest, Equal) {
283b8093314SPavel Labath   RangeT r(10, 20);
284b8093314SPavel Labath 
285b8093314SPavel Labath   // Equal range.
286b8093314SPavel Labath   EXPECT_TRUE(r == RangeT(10, 20));
287b8093314SPavel Labath 
288b8093314SPavel Labath   // Same start, different size.
289b8093314SPavel Labath   EXPECT_FALSE(r == RangeT(10, 21));
290b8093314SPavel Labath 
291b8093314SPavel Labath   // Different start, same size.
292b8093314SPavel Labath   EXPECT_FALSE(r == RangeT(9, 20));
293b8093314SPavel Labath 
294b8093314SPavel Labath   // Different start, different size.
295b8093314SPavel Labath   EXPECT_FALSE(r == RangeT(9, 21));
296b8093314SPavel Labath   EXPECT_FALSE(r == RangeT(11, 19));
297b8093314SPavel Labath }
298b8093314SPavel Labath 
TEST(RangeTest,NotEqual)299b8093314SPavel Labath TEST(RangeTest, NotEqual) {
300b8093314SPavel Labath   RangeT r(10, 20);
301b8093314SPavel Labath 
302b8093314SPavel Labath   EXPECT_FALSE(r != RangeT(10, 20));
303b8093314SPavel Labath 
304b8093314SPavel Labath   EXPECT_TRUE(r != RangeT(10, 21));
305b8093314SPavel Labath   EXPECT_TRUE(r != RangeT(9, 20));
306b8093314SPavel Labath   EXPECT_TRUE(r != RangeT(9, 21));
307b8093314SPavel Labath }
308b8093314SPavel Labath 
309b8093314SPavel Labath // Comparison tests for invalid ranges (size == 0).
310b8093314SPavel Labath 
TEST(RangeTest,LessThanInvalid)311b8093314SPavel Labath TEST(RangeTest, LessThanInvalid) {
312b8093314SPavel Labath   EXPECT_TRUE(RangeT() < RangeT(1, 0));
313b8093314SPavel Labath   EXPECT_TRUE(RangeT() < RangeT(2, 0));
314b8093314SPavel Labath   EXPECT_TRUE(RangeT(1, 0) < RangeT(2, 0));
315b8093314SPavel Labath }
316b8093314SPavel Labath 
TEST(RangeTest,EqualInvalid)317b8093314SPavel Labath TEST(RangeTest, EqualInvalid) {
318b8093314SPavel Labath   RangeT r;
319b8093314SPavel Labath   EXPECT_TRUE(r == RangeT());
320b8093314SPavel Labath   // Another invalid range, but with a different start.
321b8093314SPavel Labath   EXPECT_FALSE(r == RangeT(3, 0));
322b8093314SPavel Labath }
323b8093314SPavel Labath 
TEST(RangeTest,NotEqualInvalid)324b8093314SPavel Labath TEST(RangeTest, NotEqualInvalid) {
325b8093314SPavel Labath   RangeT r;
326b8093314SPavel Labath   EXPECT_FALSE(r != RangeT());
327b8093314SPavel Labath   EXPECT_FALSE(r == RangeT(3, 0));
328b8093314SPavel Labath }
329