range_map.cpp 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-3.0-or-later
  3. #include <stdexcept>
  4. #include <catch2/catch.hpp>
  5. #include "common/range_map.h"
  6. enum class MappedEnum : u32 {
  7. Invalid = 0,
  8. Valid_1 = 1,
  9. Valid_2 = 2,
  10. Valid_3 = 3,
  11. };
  12. TEST_CASE("Range Map: Setup", "[video_core]") {
  13. Common::RangeMap<u64, MappedEnum> my_map(MappedEnum::Invalid);
  14. my_map.Map(3000, 3500, MappedEnum::Valid_1);
  15. my_map.Unmap(3200, 3600);
  16. my_map.Map(4000, 4500, MappedEnum::Valid_2);
  17. my_map.Map(4200, 4400, MappedEnum::Valid_2);
  18. my_map.Map(4200, 4400, MappedEnum::Valid_1);
  19. REQUIRE(my_map.GetContinousSizeFrom(4200) == 200);
  20. REQUIRE(my_map.GetContinousSizeFrom(3000) == 200);
  21. REQUIRE(my_map.GetContinousSizeFrom(2900) == 0);
  22. REQUIRE(my_map.GetValueAt(2900) == MappedEnum::Invalid);
  23. REQUIRE(my_map.GetValueAt(3100) == MappedEnum::Valid_1);
  24. REQUIRE(my_map.GetValueAt(3000) == MappedEnum::Valid_1);
  25. REQUIRE(my_map.GetValueAt(3200) == MappedEnum::Invalid);
  26. REQUIRE(my_map.GetValueAt(4199) == MappedEnum::Valid_2);
  27. REQUIRE(my_map.GetValueAt(4200) == MappedEnum::Valid_1);
  28. REQUIRE(my_map.GetValueAt(4400) == MappedEnum::Valid_2);
  29. REQUIRE(my_map.GetValueAt(4500) == MappedEnum::Invalid);
  30. REQUIRE(my_map.GetValueAt(4600) == MappedEnum::Invalid);
  31. my_map.Unmap(0, 6000);
  32. for (u64 address = 0; address < 10000; address += 1000) {
  33. REQUIRE(my_map.GetContinousSizeFrom(address) == 0);
  34. }
  35. my_map.Map(1000, 3000, MappedEnum::Valid_1);
  36. my_map.Map(4000, 5000, MappedEnum::Valid_1);
  37. my_map.Map(2500, 4100, MappedEnum::Valid_1);
  38. REQUIRE(my_map.GetContinousSizeFrom(1000) == 4000);
  39. my_map.Map(1000, 3000, MappedEnum::Valid_1);
  40. my_map.Map(4000, 5000, MappedEnum::Valid_2);
  41. my_map.Map(2500, 4100, MappedEnum::Valid_3);
  42. REQUIRE(my_map.GetContinousSizeFrom(1000) == 1500);
  43. REQUIRE(my_map.GetContinousSizeFrom(2500) == 1600);
  44. REQUIRE(my_map.GetContinousSizeFrom(4100) == 900);
  45. REQUIRE(my_map.GetValueAt(900) == MappedEnum::Invalid);
  46. REQUIRE(my_map.GetValueAt(1000) == MappedEnum::Valid_1);
  47. REQUIRE(my_map.GetValueAt(2500) == MappedEnum::Valid_3);
  48. REQUIRE(my_map.GetValueAt(4100) == MappedEnum::Valid_2);
  49. REQUIRE(my_map.GetValueAt(5000) == MappedEnum::Invalid);
  50. my_map.Map(2000, 6000, MappedEnum::Valid_3);
  51. REQUIRE(my_map.GetContinousSizeFrom(1000) == 1000);
  52. REQUIRE(my_map.GetContinousSizeFrom(3000) == 3000);
  53. REQUIRE(my_map.GetValueAt(1000) == MappedEnum::Valid_1);
  54. REQUIRE(my_map.GetValueAt(1999) == MappedEnum::Valid_1);
  55. REQUIRE(my_map.GetValueAt(1500) == MappedEnum::Valid_1);
  56. REQUIRE(my_map.GetValueAt(2001) == MappedEnum::Valid_3);
  57. REQUIRE(my_map.GetValueAt(5999) == MappedEnum::Valid_3);
  58. REQUIRE(my_map.GetValueAt(6000) == MappedEnum::Invalid);
  59. }