UnorderedSetTest.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2024 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include "UnitTestFramework.h"
  5. #include <Jolt/Core/UnorderedSet.h>
  6. TEST_SUITE("UnorderedSetTest")
  7. {
  8. TEST_CASE("TestUnorderedSet")
  9. {
  10. UnorderedSet<int> set;
  11. set.reserve(10);
  12. // Insert some entries
  13. CHECK(*set.insert(1).first == 1);
  14. CHECK(set.insert(3).second);
  15. CHECK(!set.insert(3).second);
  16. CHECK(set.size() == 2);
  17. CHECK(*set.find(1) == 1);
  18. CHECK(*set.find(3) == 3);
  19. CHECK(set.find(5) == set.cend());
  20. // Validate all elements are visited by a visitor
  21. int count = 0;
  22. bool visited[10] = { false };
  23. for (UnorderedSet<int>::const_iterator i = set.begin(); i != set.end(); ++i)
  24. {
  25. visited[*i] = true;
  26. ++count;
  27. }
  28. CHECK(count == 2);
  29. CHECK(visited[1]);
  30. CHECK(visited[3]);
  31. for (UnorderedSet<int>::iterator i = set.begin(); i != set.end(); ++i)
  32. {
  33. visited[*i] = false;
  34. --count;
  35. }
  36. CHECK(count == 0);
  37. CHECK(!visited[1]);
  38. CHECK(!visited[3]);
  39. // Copy the set
  40. UnorderedSet<int> set2;
  41. set2 = set;
  42. CHECK(*set2.find(1) == 1);
  43. CHECK(*set2.find(3) == 3);
  44. CHECK(set2.find(5) == set2.cend());
  45. // Swap
  46. UnorderedSet<int> set3;
  47. set3.swap(set);
  48. CHECK(*set3.find(1) == 1);
  49. CHECK(*set3.find(3) == 3);
  50. CHECK(set3.find(5) == set3.end());
  51. CHECK(set.empty());
  52. // Move construct
  53. UnorderedSet<int> set4(std::move(set3));
  54. CHECK(*set4.find(1) == 1);
  55. CHECK(*set4.find(3) == 3);
  56. CHECK(set4.find(5) == set4.end());
  57. CHECK(set3.empty());
  58. }
  59. TEST_CASE("TestUnorderedSetGrow")
  60. {
  61. UnorderedSet<int> set;
  62. for (int i = 0; i < 10000; ++i)
  63. CHECK(set.insert(i).second);
  64. CHECK(set.size() == 10000);
  65. for (int i = 0; i < 10000; ++i)
  66. CHECK(*set.find(i) == i);
  67. CHECK(set.find(10001) == set.cend());
  68. for (int i = 0; i < 5000; ++i)
  69. CHECK(set.erase(i) == 1);
  70. CHECK(set.size() == 5000);
  71. for (int i = 0; i < 5000; ++i)
  72. CHECK(set.find(i) == set.end());
  73. for (int i = 5000; i < 10000; ++i)
  74. CHECK(*set.find(i) == i);
  75. CHECK(set.find(10001) == set.cend());
  76. for (int i = 0; i < 5000; ++i)
  77. CHECK(set.insert(i).second);
  78. CHECK(!set.insert(0).second);
  79. CHECK(set.size() == 10000);
  80. for (int i = 0; i < 10000; ++i)
  81. CHECK(*set.find(i) == i);
  82. CHECK(set.find(10001) == set.cend());
  83. }
  84. TEST_CASE("TestUnorderedSetHashCollision")
  85. {
  86. // A hash function that's guaranteed to collide
  87. class MyBadHash
  88. {
  89. public:
  90. size_t operator () (int inValue) const
  91. {
  92. return 0;
  93. }
  94. };
  95. UnorderedSet<int, MyBadHash> set;
  96. for (int i = 0; i < 10; ++i)
  97. CHECK(set.insert(i).second);
  98. CHECK(set.size() == 10);
  99. for (int i = 0; i < 10; ++i)
  100. CHECK(*set.find(i) == i);
  101. CHECK(set.find(11) == set.cend());
  102. for (int i = 0; i < 5; ++i)
  103. CHECK(set.erase(i) == 1);
  104. CHECK(set.size() == 5);
  105. for (int i = 0; i < 5; ++i)
  106. CHECK(set.find(i) == set.end());
  107. for (int i = 5; i < 10; ++i)
  108. CHECK(*set.find(i) == i);
  109. CHECK(set.find(11) == set.cend());
  110. for (int i = 0; i < 5; ++i)
  111. CHECK(set.insert(i).second);
  112. CHECK(!set.insert(0).second);
  113. CHECK(set.size() == 10);
  114. for (int i = 0; i < 10; ++i)
  115. CHECK(*set.find(i) == i);
  116. CHECK(set.find(11) == set.cend());
  117. }
  118. }