IntervalMapTests.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include "RHITestFixture.h"
  9. #include <Atom/RHI/interval_map.h>
  10. namespace UnitTest
  11. {
  12. using namespace AZ;
  13. class IntervalMapTests
  14. : public RHITestFixture
  15. {
  16. public:
  17. IntervalMapTests()
  18. : RHITestFixture()
  19. {}
  20. protected:
  21. RHI::interval_map<uint32_t, uint32_t> m_intervalMap;
  22. };
  23. TEST_F(IntervalMapTests, TestEmpty)
  24. {
  25. EXPECT_TRUE(m_intervalMap.empty());
  26. }
  27. TEST_F(IntervalMapTests, TestAssign)
  28. {
  29. RHI::Interval interval(232, 12312);
  30. auto it = m_intervalMap.assign(interval.m_min, interval.m_max, 1337);
  31. EXPECT_FALSE(m_intervalMap.empty());
  32. EXPECT_EQ(it, m_intervalMap.begin());
  33. EXPECT_EQ(m_intervalMap.begin().value(), 1337);
  34. }
  35. TEST_F(IntervalMapTests, TestAssignInvalidInterval)
  36. {
  37. RHI::Interval interval(12312, 232);
  38. auto it = m_intervalMap.assign(interval.m_min, interval.m_max, 1337);
  39. EXPECT_TRUE(m_intervalMap.empty());
  40. EXPECT_EQ(it, m_intervalMap.end());
  41. }
  42. TEST_F(IntervalMapTests, TestAt)
  43. {
  44. RHI::Interval interval(232, 12312);
  45. m_intervalMap.assign(interval.m_min, interval.m_max, 1337);
  46. EXPECT_FALSE(m_intervalMap.empty());
  47. EXPECT_EQ(m_intervalMap.begin().value(), 1337);
  48. EXPECT_EQ(m_intervalMap.at(interval.m_min), m_intervalMap.begin());
  49. EXPECT_EQ(m_intervalMap.at(interval.m_max), m_intervalMap.end());
  50. EXPECT_EQ(m_intervalMap.at(interval.m_min + 1), m_intervalMap.begin());
  51. EXPECT_EQ(m_intervalMap.at(interval.m_max + 1), m_intervalMap.end());
  52. }
  53. TEST_F(IntervalMapTests, TestAtMultipleIntervals)
  54. {
  55. RHI::Interval interval1(0, 500);
  56. RHI::Interval interval2(600, 1000);
  57. m_intervalMap.assign(interval1.m_min, interval1.m_max, 1337);
  58. m_intervalMap.assign(interval2.m_min, interval2.m_max, 1338);
  59. auto iterator1 = m_intervalMap.at(interval1.m_min);
  60. auto iterator2 = m_intervalMap.at(interval2.m_min);
  61. EXPECT_EQ(iterator1.value(), 1337);
  62. EXPECT_EQ(iterator1.interval_begin(), interval1.m_min);
  63. EXPECT_EQ(iterator1.interval_end(), interval1.m_max);
  64. EXPECT_EQ(iterator2.value(), 1338);
  65. EXPECT_EQ(iterator2.interval_begin(), interval2.m_min);
  66. EXPECT_EQ(iterator2.interval_end(), interval2.m_max);
  67. EXPECT_EQ(m_intervalMap.at(interval1.m_max), m_intervalMap.end());
  68. }
  69. TEST_F(IntervalMapTests, TestMergeIntervals)
  70. {
  71. RHI::Interval interval1(0, 500);
  72. RHI::Interval interval2(500, 1000);
  73. m_intervalMap.assign(interval1.m_min, interval1.m_max, 1337);
  74. m_intervalMap.assign(interval2.m_min, interval2.m_max, 1337);
  75. auto iter = m_intervalMap.begin();
  76. EXPECT_FALSE(m_intervalMap.empty());
  77. EXPECT_EQ(iter.value(), 1337);
  78. EXPECT_EQ(iter.interval_begin(), interval1.m_min);
  79. EXPECT_EQ(iter.interval_end(), interval2.m_max);
  80. iter++;
  81. EXPECT_EQ(iter, m_intervalMap.end());
  82. }
  83. TEST_F(IntervalMapTests, TestNoMergeIntervals)
  84. {
  85. RHI::Interval interval1(0, 500);
  86. RHI::Interval interval2(500, 1000);
  87. m_intervalMap.assign(interval1.m_min, interval1.m_max, 1337);
  88. m_intervalMap.assign(interval2.m_min, interval2.m_max, 1338);
  89. auto iter = m_intervalMap.begin();
  90. EXPECT_FALSE(m_intervalMap.empty());
  91. EXPECT_EQ(iter.value(), 1337);
  92. EXPECT_EQ(iter.interval_begin(), interval1.m_min);
  93. EXPECT_EQ(iter.interval_end(), interval1.m_max);
  94. iter++;
  95. EXPECT_EQ(iter.value(), 1338);
  96. EXPECT_EQ(iter.interval_begin(), interval2.m_min);
  97. EXPECT_EQ(iter.interval_end(), interval2.m_max);
  98. iter++;
  99. EXPECT_EQ(iter, m_intervalMap.end());
  100. }
  101. TEST_F(IntervalMapTests, TestOverlapSingleInterval)
  102. {
  103. RHI::Interval interval(0, 500);
  104. m_intervalMap.assign(interval.m_min, interval.m_max, 1337);
  105. auto overlap = m_intervalMap.overlap(interval.m_min, interval.m_max);
  106. EXPECT_EQ(overlap.first, m_intervalMap.begin());
  107. EXPECT_EQ(overlap.second, m_intervalMap.end());
  108. }
  109. TEST_F(IntervalMapTests, TestOverlapMultipleIntervals)
  110. {
  111. RHI::Interval interval1(0, 500);
  112. RHI::Interval interval2(600, 1000);
  113. m_intervalMap.assign(interval1.m_min, interval1.m_max, 1337);
  114. m_intervalMap.assign(interval2.m_min, interval2.m_max, 1338);
  115. auto overlap = m_intervalMap.overlap(interval1.m_min, interval2.m_max);
  116. auto iter = overlap.first;
  117. EXPECT_EQ(iter.value(), 1337);
  118. EXPECT_EQ(iter.interval_begin(), interval1.m_min);
  119. EXPECT_EQ(iter.interval_end(), interval1.m_max);
  120. iter++;
  121. EXPECT_EQ(iter.value(), 1338);
  122. EXPECT_EQ(iter.interval_begin(), interval2.m_min);
  123. EXPECT_EQ(iter.interval_end(), interval2.m_max);
  124. iter++;
  125. EXPECT_EQ(iter, m_intervalMap.end());
  126. }
  127. TEST_F(IntervalMapTests, TestNoOverlap)
  128. {
  129. RHI::Interval interval(0, 500);
  130. m_intervalMap.assign(interval.m_min, interval.m_max, 1337);
  131. auto overlap = m_intervalMap.overlap(interval.m_max, interval.m_max + 1);
  132. EXPECT_EQ(overlap.first, m_intervalMap.end());
  133. EXPECT_EQ(overlap.second, m_intervalMap.end());
  134. }
  135. TEST_F(IntervalMapTests, TestErase)
  136. {
  137. RHI::Interval interval1(0, 500);
  138. RHI::Interval interval2(500, 1000);
  139. RHI::Interval interval3(1000, 1500);
  140. m_intervalMap.assign(interval2.m_min, interval2.m_max, 1338);
  141. m_intervalMap.assign(interval3.m_min, interval3.m_max, 1339);
  142. m_intervalMap.assign(interval1.m_min, interval1.m_max, 1337);
  143. auto iter = m_intervalMap.at(interval2.m_min);
  144. EXPECT_EQ(iter.value(), 1338);
  145. EXPECT_EQ(iter.interval_begin(), interval2.m_min);
  146. EXPECT_EQ(iter.interval_end(), interval2.m_max);
  147. auto iter2 = m_intervalMap.erase(iter);
  148. EXPECT_EQ(iter2.value(), 1339);
  149. EXPECT_EQ(iter2.interval_begin(), interval3.m_min);
  150. EXPECT_EQ(iter2.interval_end(), interval3.m_max);
  151. auto iter3 = m_intervalMap.erase(iter2);
  152. EXPECT_EQ(iter3, m_intervalMap.end());
  153. EXPECT_EQ(m_intervalMap.begin().value(), 1337);
  154. EXPECT_EQ(m_intervalMap.begin().interval_begin(), interval1.m_min);
  155. EXPECT_EQ(m_intervalMap.begin().interval_end(), interval1.m_max);
  156. m_intervalMap.erase(m_intervalMap.begin());
  157. EXPECT_TRUE(m_intervalMap.empty());
  158. }
  159. TEST_F(IntervalMapTests, TestEraseComplex)
  160. {
  161. RHI::Interval interval1(0, 500);
  162. RHI::Interval interval2(600, 1000);
  163. RHI::Interval interval3(1100, 1500);
  164. m_intervalMap.assign(interval2.m_min, interval2.m_max, 1338);
  165. m_intervalMap.assign(interval3.m_min, interval3.m_max, 1339);
  166. m_intervalMap.assign(interval1.m_min, interval1.m_max, 1337);
  167. auto iter = m_intervalMap.at(interval2.m_min);
  168. EXPECT_EQ(iter.value(), 1338);
  169. EXPECT_EQ(iter.interval_begin(), interval2.m_min);
  170. EXPECT_EQ(iter.interval_end(), interval2.m_max);
  171. auto iter2 = m_intervalMap.erase(iter);
  172. EXPECT_EQ(iter2.value(), 1339);
  173. EXPECT_EQ(iter2.interval_begin(), interval3.m_min);
  174. EXPECT_EQ(iter2.interval_end(), interval3.m_max);
  175. auto iter3 = m_intervalMap.erase(iter2);
  176. EXPECT_EQ(iter3, m_intervalMap.end());
  177. EXPECT_EQ(m_intervalMap.begin().value(), 1337);
  178. EXPECT_EQ(m_intervalMap.begin().interval_begin(), interval1.m_min);
  179. EXPECT_EQ(m_intervalMap.begin().interval_end(), interval1.m_max);
  180. m_intervalMap.erase(m_intervalMap.begin());
  181. EXPECT_TRUE(m_intervalMap.empty());
  182. }
  183. }