brintos

brintos / llvm-project-archived public Read only

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