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