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