brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.9 KiB · 76e7e5e Raw
431 lines · cpp
1//===- llvm/unittest/Support/AddresRangeTest.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 "llvm/ADT/AddressRanges.h"10#include "llvm/Testing/Support/Error.h"11 12#include "gmock/gmock.h"13#include "gtest/gtest.h"14 15using namespace llvm;16 17TEST(AddressRangeTest, TestRanges) {18  // test llvm::AddressRange.19  const uint64_t StartAddr = 0x1000;20  const uint64_t EndAddr = 0x2000;21  // Verify constructor and API to ensure it takes start and end address.22  const AddressRange Range(StartAddr, EndAddr);23  EXPECT_EQ(Range.size(), EndAddr - StartAddr);24 25  // Verify llvm::AddressRange::contains().26  EXPECT_FALSE(Range.contains(0));27  EXPECT_FALSE(Range.contains(StartAddr - 1));28  EXPECT_TRUE(Range.contains(StartAddr));29  EXPECT_TRUE(Range.contains(EndAddr - 1));30  EXPECT_FALSE(Range.contains(EndAddr));31  EXPECT_FALSE(Range.contains(UINT64_MAX));32 33  const AddressRange RangeSame(StartAddr, EndAddr);34  const AddressRange RangeDifferentStart(StartAddr + 1, EndAddr);35  const AddressRange RangeDifferentEnd(StartAddr, EndAddr + 1);36  const AddressRange RangeDifferentStartEnd(StartAddr + 1, EndAddr + 1);37  // Test == and != with values that are the same38  EXPECT_EQ(Range, RangeSame);39  EXPECT_FALSE(Range != RangeSame);40  // Test == and != with values that are the different41  EXPECT_NE(Range, RangeDifferentStart);42  EXPECT_NE(Range, RangeDifferentEnd);43  EXPECT_NE(Range, RangeDifferentStartEnd);44  EXPECT_FALSE(Range == RangeDifferentStart);45  EXPECT_FALSE(Range == RangeDifferentEnd);46  EXPECT_FALSE(Range == RangeDifferentStartEnd);47 48  // Test "bool operator<(const AddressRange &, const AddressRange &)".49  EXPECT_FALSE(Range < RangeSame);50  EXPECT_FALSE(RangeSame < Range);51  EXPECT_LT(Range, RangeDifferentStart);52  EXPECT_LT(Range, RangeDifferentEnd);53  EXPECT_LT(Range, RangeDifferentStartEnd);54  // Test "bool operator<(const AddressRange &, uint64_t)"55  EXPECT_LT(Range.start(), StartAddr + 1);56  // Test "bool operator<(uint64_t, const AddressRange &)"57  EXPECT_LT(StartAddr - 1, Range.start());58 59  // Verify llvm::AddressRange::isContiguousWith() and60  // llvm::AddressRange::intersects().61  const AddressRange EndsBeforeRangeStart(0, StartAddr - 1);62  const AddressRange EndsAtRangeStart(0, StartAddr);63  const AddressRange OverlapsRangeStart(StartAddr - 1, StartAddr + 1);64  const AddressRange InsideRange(StartAddr + 1, EndAddr - 1);65  const AddressRange OverlapsRangeEnd(EndAddr - 1, EndAddr + 1);66  const AddressRange StartsAtRangeEnd(EndAddr, EndAddr + 0x100);67  const AddressRange StartsAfterRangeEnd(EndAddr + 1, EndAddr + 0x100);68 69  EXPECT_FALSE(Range.intersects(EndsBeforeRangeStart));70  EXPECT_FALSE(Range.intersects(EndsAtRangeStart));71  EXPECT_TRUE(Range.intersects(OverlapsRangeStart));72  EXPECT_TRUE(Range.intersects(InsideRange));73  EXPECT_TRUE(Range.intersects(OverlapsRangeEnd));74  EXPECT_FALSE(Range.intersects(StartsAtRangeEnd));75  EXPECT_FALSE(Range.intersects(StartsAfterRangeEnd));76 77  // Test the functions that maintain address ranges:78  //  "bool AddressRange::contains(uint64_t Addr) const;"79  //  "void AddressRanges::insert(const AddressRange &R);"80  AddressRanges Ranges;81  Ranges.insert(AddressRange(0x1000, 0x2000));82  Ranges.insert(AddressRange(0x2000, 0x3000));83  Ranges.insert(AddressRange(0x4000, 0x5000));84 85  EXPECT_FALSE(Ranges.contains(0));86  EXPECT_FALSE(Ranges.contains(0x1000 - 1));87  EXPECT_TRUE(Ranges.contains(0x1000));88  EXPECT_TRUE(Ranges.contains(0x2000));89  EXPECT_TRUE(Ranges.contains(0x4000));90  EXPECT_TRUE(Ranges.contains(0x2000 - 1));91  EXPECT_TRUE(Ranges.contains(0x3000 - 1));92  EXPECT_FALSE(Ranges.contains(0x3000 + 1));93  EXPECT_TRUE(Ranges.contains(0x5000 - 1));94  EXPECT_FALSE(Ranges.contains(0x5000 + 1));95  EXPECT_FALSE(Ranges.contains(UINT64_MAX));96 97  EXPECT_FALSE(Ranges.contains(AddressRange()));98  EXPECT_FALSE(Ranges.contains(AddressRange(0x1000 - 1, 0x1000)));99  EXPECT_FALSE(Ranges.contains(AddressRange(0x1000, 0x1000)));100  EXPECT_TRUE(Ranges.contains(AddressRange(0x1000, 0x1000 + 1)));101  EXPECT_TRUE(Ranges.contains(AddressRange(0x1000, 0x2000)));102  EXPECT_TRUE(Ranges.contains(AddressRange(0x1000, 0x2001)));103  EXPECT_TRUE(Ranges.contains(AddressRange(0x2000, 0x3000)));104  EXPECT_FALSE(Ranges.contains(AddressRange(0x2000, 0x3001)));105  EXPECT_FALSE(Ranges.contains(AddressRange(0x3000, 0x3001)));106  EXPECT_FALSE(Ranges.contains(AddressRange(0x1500, 0x4500)));107  EXPECT_FALSE(Ranges.contains(AddressRange(0x5000, 0x5001)));108 109  // Verify that intersecting ranges get combined110  Ranges.clear();111  Ranges.insert(AddressRange(0x1100, 0x1F00));112  // Verify a wholy contained range that is added doesn't do anything.113  Ranges.insert(AddressRange(0x1500, 0x1F00));114  EXPECT_EQ(Ranges.size(), 1u);115  EXPECT_EQ(Ranges[0], AddressRange(0x1100, 0x1F00));116 117  // Verify a range that starts before and intersects gets combined.118  Ranges.insert(AddressRange(0x1000, Ranges[0].start() + 1));119  EXPECT_EQ(Ranges.size(), 1u);120  EXPECT_EQ(Ranges[0], AddressRange(0x1000, 0x1F00));121 122  // Verify a range that starts inside and extends ranges gets combined.123  Ranges.insert(AddressRange(Ranges[0].end() - 1, 0x2000));124  EXPECT_EQ(Ranges.size(), 1u);125  EXPECT_EQ(Ranges[0], AddressRange(0x1000, 0x2000));126 127  // Verify that adjacent ranges get combined128  Ranges.insert(AddressRange(0x2000, 0x2fff));129  EXPECT_EQ(Ranges.size(), 1u);130  EXPECT_EQ(Ranges[0], AddressRange(0x1000, 0x2fff));131 132  // Verify that ranges having 1 byte gap do not get combined133  Ranges.insert(AddressRange(0x3000, 0x4000));134  EXPECT_EQ(Ranges.size(), 2u);135  EXPECT_EQ(Ranges[0], AddressRange(0x1000, 0x2fff));136  EXPECT_EQ(Ranges[1], AddressRange(0x3000, 0x4000));137 138  // Verify if we add an address range that intersects two ranges139  // that they get combined140  Ranges.insert(AddressRange(Ranges[0].end() - 1, Ranges[1].start() + 1));141  EXPECT_EQ(Ranges.size(), 1u);142  EXPECT_EQ(Ranges[0], AddressRange(0x1000, 0x4000));143 144  Ranges.insert(AddressRange(0x3000, 0x4000));145  Ranges.insert(AddressRange(0x4000, 0x5000));146  Ranges.insert(AddressRange(0x2000, 0x4500));147  EXPECT_EQ(Ranges.size(), 1u);148  EXPECT_EQ(Ranges[0], AddressRange(0x1000, 0x5000));149}150 151TEST(AddressRangeTest, TestRangesRandom) {152  AddressRanges Ranges;153  size_t NumElements = 100;154 155  std::srand(std::time(nullptr));156 157  // Fill ranges.158  for (size_t Idx = 0; Idx < NumElements; Idx++) {159    uint64_t Start = static_cast<uint64_t>(std::rand() % 1000);160    uint64_t End = Start + static_cast<uint64_t>(std::rand() % 1000);161    Ranges.insert({Start, End});162  }163 164  // Check ranges.165  for (size_t Idx = 0; Idx + 1 < Ranges.size(); Idx++) {166    // Check that ranges are not intersected.167    EXPECT_FALSE(Ranges[Idx].intersects(Ranges[Idx + 1]));168 169    // Check that ranges are sorted and not adjusted.170    EXPECT_TRUE(Ranges[Idx].end() < Ranges[Idx + 1].start());171  }172}173 174TEST(AddressRangeTest, TestRangesMap) {175  AddressRangesMap Ranges;176 177  EXPECT_EQ(Ranges.size(), 0u);178  EXPECT_TRUE(Ranges.empty());179 180  // Add single range.181  Ranges.insert(AddressRange(0x1000, 0x2000), 0xfe);182  EXPECT_EQ(Ranges.size(), 1u);183  EXPECT_FALSE(Ranges.empty());184  EXPECT_TRUE(Ranges.contains(0x1500));185  EXPECT_TRUE(Ranges.contains(AddressRange(0x1000, 0x2000)));186 187  ///////////////////////////////////////188  /// Check ranges with the same mapped value.189 190  // Clear ranges.191  Ranges.clear();192  EXPECT_EQ(Ranges.size(), 0u);193  EXPECT_TRUE(Ranges.empty());194 195  // Add range and check mapped value.196  Ranges.insert(AddressRange(0x1000, 0x2000), 0x11);197  EXPECT_EQ(Ranges.size(), 1u);198  EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0x11);199 200  // Add adjacent range and check mapped value.201  Ranges.insert(AddressRange(0x2000, 0x3000), 0x11);202  EXPECT_EQ(Ranges.size(), 2u);203  EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0x11);204  EXPECT_EQ(Ranges.getRangeThatContains(0x2000)->Value, 0x11);205  EXPECT_EQ(Ranges.getRangeThatContains(0x2900)->Value, 0x11);206  EXPECT_FALSE(Ranges.getRangeThatContains(0x3000));207 208  // Add intersecting range and check mapped value.209  Ranges.insert(AddressRange(0x1000, 0x3000), 0x11);210  EXPECT_EQ(Ranges.size(), 2u);211  EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0x11);212 213  // Add second range and check mapped values.214  Ranges.insert(AddressRange(0x4000, 0x5000), 0x11);215  EXPECT_EQ(Ranges.size(), 3u);216  EXPECT_EQ(Ranges[0].Range, AddressRange(0x1000, 0x2000));217  EXPECT_EQ(Ranges[0].Value, 0x11);218  EXPECT_EQ(Ranges[1].Range, AddressRange(0x2000, 0x3000));219  EXPECT_EQ(Ranges[1].Value, 0x11);220  EXPECT_EQ(Ranges[2].Range, AddressRange(0x4000, 0x5000));221  EXPECT_EQ(Ranges[2].Value, 0x11);222  EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0x11);223  EXPECT_EQ(Ranges.getRangeThatContains(0x4000)->Value, 0x11);224 225  // Add intersecting range and check mapped value.226  Ranges.insert(AddressRange(0x0, 0x6000), 0x11);227  EXPECT_EQ(Ranges.size(), 6u);228  EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0x11);229 230  // Check that mapped values are correctly preserved for combined ranges.231  Ranges.clear();232  Ranges.insert(AddressRange(0x0, 0xff), 0x11);233  Ranges.insert(AddressRange(0x100, 0x1ff), 0x11);234  Ranges.insert(AddressRange(0x200, 0x2ff), 0x11);235  Ranges.insert(AddressRange(0x500, 0x5ff), 0x11);236  Ranges.insert(AddressRange(0x300, 0x3ff), 0x11);237  Ranges.insert(AddressRange(0x400, 0x4ff), 0x11);238  Ranges.insert(AddressRange(0x600, 0x6ff), 0x11);239  EXPECT_EQ(Ranges.size(), 7u);240 241  Ranges.insert(AddressRange(0x150, 0x350), 0x11);242  EXPECT_EQ(Ranges.size(), 9u);243  EXPECT_EQ(Ranges[0].Range, AddressRange(0x0, 0xff));244  EXPECT_EQ(Ranges[0].Value, 0x11);245  EXPECT_EQ(Ranges[1].Range, AddressRange(0x100, 0x1ff));246  EXPECT_EQ(Ranges[1].Value, 0x11);247  EXPECT_EQ(Ranges[2].Range, AddressRange(0x1ff, 0x200));248  EXPECT_EQ(Ranges[2].Value, 0x11);249  EXPECT_EQ(Ranges[3].Range, AddressRange(0x200, 0x2ff));250  EXPECT_EQ(Ranges[3].Value, 0x11);251  EXPECT_EQ(Ranges[4].Range, AddressRange(0x2ff, 0x300));252  EXPECT_EQ(Ranges[4].Value, 0x11);253  EXPECT_EQ(Ranges[5].Range, AddressRange(0x300, 0x3ff));254  EXPECT_EQ(Ranges[5].Value, 0x11);255  EXPECT_EQ(Ranges[6].Range, AddressRange(0x400, 0x4ff));256  EXPECT_EQ(Ranges[6].Value, 0x11);257  EXPECT_EQ(Ranges[7].Range, AddressRange(0x500, 0x5ff));258  EXPECT_EQ(Ranges[7].Value, 0x11);259  EXPECT_EQ(Ranges[8].Range, AddressRange(0x600, 0x6ff));260  EXPECT_EQ(Ranges[8].Value, 0x11);261 262  Ranges.insert(AddressRange(0x3ff, 0x400), 0x11);263  EXPECT_EQ(Ranges.size(), 10u);264  EXPECT_EQ(Ranges[0].Range, AddressRange(0x0, 0xff));265  EXPECT_EQ(Ranges[0].Value, 0x11);266  EXPECT_EQ(Ranges[1].Range, AddressRange(0x100, 0x1ff));267  EXPECT_EQ(Ranges[1].Value, 0x11);268  EXPECT_EQ(Ranges[2].Range, AddressRange(0x1ff, 0x200));269  EXPECT_EQ(Ranges[2].Value, 0x11);270  EXPECT_EQ(Ranges[3].Range, AddressRange(0x200, 0x2ff));271  EXPECT_EQ(Ranges[3].Value, 0x11);272  EXPECT_EQ(Ranges[4].Range, AddressRange(0x2ff, 0x300));273  EXPECT_EQ(Ranges[4].Value, 0x11);274  EXPECT_EQ(Ranges[5].Range, AddressRange(0x300, 0x3ff));275  EXPECT_EQ(Ranges[5].Value, 0x11);276  EXPECT_EQ(Ranges[6].Range, AddressRange(0x3ff, 0x400));277  EXPECT_EQ(Ranges[6].Value, 0x11);278  EXPECT_EQ(Ranges[7].Range, AddressRange(0x400, 0x4ff));279  EXPECT_EQ(Ranges[7].Value, 0x11);280  EXPECT_EQ(Ranges[8].Range, AddressRange(0x500, 0x5ff));281  EXPECT_EQ(Ranges[8].Value, 0x11);282  EXPECT_EQ(Ranges[9].Range, AddressRange(0x600, 0x6ff));283  EXPECT_EQ(Ranges[9].Value, 0x11);284 285  /////////////////////////////////////////////286  /// Check ranges with various mapped values.287 288  // Clear ranges.289  Ranges.clear();290  EXPECT_EQ(Ranges.size(), 0u);291  EXPECT_TRUE(Ranges.empty());292 293  // Add range and check mapped value.294  Ranges.insert(AddressRange(0x1000, 0x2000), 0xfe);295  EXPECT_EQ(Ranges.size(), 1u);296  EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0xfe);297 298  // Add adjacent range and check mapped value.299  Ranges.insert(AddressRange(0x2000, 0x3000), 0xfc);300  EXPECT_EQ(Ranges.size(), 2u);301  EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0xfe);302  EXPECT_EQ(Ranges.getRangeThatContains(0x2000)->Value, 0xfc);303  EXPECT_EQ(Ranges.getRangeThatContains(0x2900)->Value, 0xfc);304  EXPECT_FALSE(Ranges.getRangeThatContains(0x3000));305 306  // Add intersecting range and check mapped value.307  Ranges.insert(AddressRange(0x1000, 0x3000), 0xff);308  EXPECT_EQ(Ranges.size(), 2u);309  EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0xfe);310 311  // Add one more range and check mapped values.312  Ranges.insert(AddressRange(0x4000, 0x5000), 0x0);313  EXPECT_EQ(Ranges.size(), 3u);314  EXPECT_EQ(Ranges[0].Value, 0xfe);315  EXPECT_EQ(Ranges[1].Value, 0xfc);316  EXPECT_EQ(Ranges[2].Value, 0x0);317  EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0xfe);318  EXPECT_EQ(Ranges.getRangeThatContains(0x4000)->Value, 0x0);319 320  // Add intersecting range and check mapped value.321  Ranges.insert(AddressRange(0x0, 0x6000), 0x1);322  EXPECT_EQ(Ranges.size(), 6u);323  EXPECT_EQ(Ranges[0].Value, 0x1);324  EXPECT_EQ(Ranges[1].Value, 0xfe);325  EXPECT_EQ(Ranges[2].Value, 0xfc);326  EXPECT_EQ(Ranges[3].Value, 0x1);327  EXPECT_EQ(Ranges[4].Value, 0x0);328  EXPECT_EQ(Ranges[5].Value, 0x1);329  EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0xfe);330 331  // Check that mapped values are correctly preserved for combined ranges.332  Ranges.clear();333  Ranges.insert(AddressRange(0x0, 0xff), 0x1);334  Ranges.insert(AddressRange(0x100, 0x1ff), 0x2);335  Ranges.insert(AddressRange(0x200, 0x2ff), 0x3);336  Ranges.insert(AddressRange(0x300, 0x3ff), 0x4);337  Ranges.insert(AddressRange(0x500, 0x5ff), 0x6);338  Ranges.insert(AddressRange(0x400, 0x4ff), 0x5);339  Ranges.insert(AddressRange(0x600, 0x6ff), 0x7);340  EXPECT_EQ(Ranges.size(), 7u);341 342  Ranges.insert(AddressRange(0x150, 0x350), 0xff);343  EXPECT_EQ(Ranges.size(), 9u);344  EXPECT_EQ(Ranges[0].Range, AddressRange(0x0, 0xff));345  EXPECT_EQ(Ranges[0].Value, 0x1);346  EXPECT_EQ(Ranges[1].Range, AddressRange(0x100, 0x1ff));347  EXPECT_EQ(Ranges[1].Value, 0x2);348  EXPECT_EQ(Ranges[2].Range, AddressRange(0x1ff, 0x200));349  EXPECT_EQ(Ranges[2].Value, 0xff);350  EXPECT_EQ(Ranges[3].Range, AddressRange(0x200, 0x2ff));351  EXPECT_EQ(Ranges[3].Value, 0x3);352  EXPECT_EQ(Ranges[4].Range, AddressRange(0x2ff, 0x300));353  EXPECT_EQ(Ranges[4].Value, 0xff);354  EXPECT_EQ(Ranges[5].Range, AddressRange(0x300, 0x3ff));355  EXPECT_EQ(Ranges[5].Value, 0x4);356  EXPECT_EQ(Ranges[6].Range, AddressRange(0x400, 0x4ff));357  EXPECT_EQ(Ranges[6].Value, 0x5);358  EXPECT_EQ(Ranges[7].Range, AddressRange(0x500, 0x5ff));359  EXPECT_EQ(Ranges[7].Value, 0x6);360  EXPECT_EQ(Ranges[8].Range, AddressRange(0x600, 0x6ff));361  EXPECT_EQ(Ranges[8].Value, 0x7);362 363  Ranges.insert(AddressRange(0x650, 0x700), 0x8);364  Ranges.insert(AddressRange(0x3ff, 0x400), 0x5);365  Ranges.insert(AddressRange(0x0, 0x40), 0xee);366  EXPECT_EQ(Ranges.size(), 11u);367  EXPECT_EQ(Ranges[0].Range, AddressRange(0x0, 0xff));368  EXPECT_EQ(Ranges[0].Value, 0x1);369  EXPECT_EQ(Ranges[1].Range, AddressRange(0x100, 0x1ff));370  EXPECT_EQ(Ranges[1].Value, 0x2);371  EXPECT_EQ(Ranges[2].Range, AddressRange(0x1ff, 0x200));372  EXPECT_EQ(Ranges[2].Value, 0xff);373  EXPECT_EQ(Ranges[3].Range, AddressRange(0x200, 0x2ff));374  EXPECT_EQ(Ranges[3].Value, 0x3);375  EXPECT_EQ(Ranges[4].Range, AddressRange(0x2ff, 0x300));376  EXPECT_EQ(Ranges[4].Value, 0xff);377  EXPECT_EQ(Ranges[5].Range, AddressRange(0x300, 0x3ff));378  EXPECT_EQ(Ranges[5].Value, 0x4);379  EXPECT_EQ(Ranges[6].Range, AddressRange(0x3ff, 0x400));380  EXPECT_EQ(Ranges[6].Value, 0x5);381  EXPECT_EQ(Ranges[7].Range, AddressRange(0x400, 0x4ff));382  EXPECT_EQ(Ranges[7].Value, 0x5);383  EXPECT_EQ(Ranges[8].Range, AddressRange(0x500, 0x5ff));384  EXPECT_EQ(Ranges[8].Value, 0x6);385  EXPECT_EQ(Ranges[9].Range, AddressRange(0x600, 0x6ff));386  EXPECT_EQ(Ranges[9].Value, 0x7);387  EXPECT_EQ(Ranges[10].Range, AddressRange(0x6ff, 0x700));388  EXPECT_EQ(Ranges[10].Value, 0x8);389}390 391TEST(AddressRangeTest, TestRangesMapRandom) {392  AddressRangesMap Ranges;393  size_t NumElements = 100;394 395  std::srand(std::time(nullptr));396 397  // Fill ranges. Use the same mapped value.398  for (size_t Idx = 0; Idx < NumElements; Idx++) {399    uint64_t Start = static_cast<uint64_t>(std::rand() % 1000);400    uint64_t End = Start + static_cast<uint64_t>(std::rand() % 1000);401    Ranges.insert({Start, End}, 0xffLL);402  }403 404  // Check ranges.405  for (size_t Idx = 0; Idx + 1 < Ranges.size(); Idx++) {406    // Check that ranges are not intersected.407    EXPECT_FALSE(Ranges[Idx].Range.intersects(Ranges[Idx + 1].Range));408 409    // Check that ranges are sorted and not adjusted.410    EXPECT_TRUE(Ranges[Idx].Range.end() <= Ranges[Idx + 1].Range.start());411  }412 413  Ranges.clear();414  // Fill ranges. Use the various mapped value.415  for (size_t Idx = 0; Idx < NumElements; Idx++) {416    uint64_t Start = static_cast<uint64_t>(std::rand() % 1000);417    uint64_t End = Start + static_cast<uint64_t>(std::rand() % 1000);418    int64_t Value = static_cast<int64_t>(std::rand() % 10);419    Ranges.insert({Start, End}, Value);420  }421 422  // Check ranges.423  for (size_t Idx = 0; Idx + 1 < Ranges.size(); Idx++) {424    // Check that ranges are not intersected.425    EXPECT_FALSE(Ranges[Idx].Range.intersects(Ranges[Idx + 1].Range));426 427    // Check that ranges are sorted and not adjusted.428    EXPECT_TRUE(Ranges[Idx].Range.end() <= Ranges[Idx + 1].Range.start());429  }430}431