UnorderedMapTest.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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/UnorderedMap.h>
  6. TEST_SUITE("UnorderedMapTest")
  7. {
  8. TEST_CASE("TestUnorderedMap")
  9. {
  10. UnorderedMap<int, int> map;
  11. map.reserve(10);
  12. // Insert some entries
  13. CHECK(map.insert({ 1, 2 }).first->first == 1);
  14. CHECK(map.insert({ 3, 4 }).second);
  15. CHECK(!map.insert({ 3, 5 }).second);
  16. CHECK(map.size() == 2);
  17. CHECK(map.find(1)->second == 2);
  18. CHECK(map.find(3)->second == 4);
  19. CHECK(map.find(5) == map.end());
  20. // Use operator []
  21. map[5] = 6;
  22. CHECK(map.size() == 3);
  23. CHECK(map.find(5)->second == 6);
  24. map[5] = 7;
  25. CHECK(map.size() == 3);
  26. CHECK(map.find(5)->second == 7);
  27. // Validate all elements are visited by a visitor
  28. int count = 0;
  29. bool visited[10] = { false };
  30. for (UnorderedMap<int, int>::const_iterator i = map.begin(); i != map.end(); ++i)
  31. {
  32. visited[i->first] = true;
  33. ++count;
  34. }
  35. CHECK(count == 3);
  36. CHECK(visited[1]);
  37. CHECK(visited[3]);
  38. CHECK(visited[5]);
  39. for (UnorderedMap<int, int>::iterator i = map.begin(); i != map.end(); ++i)
  40. {
  41. visited[i->first] = false;
  42. --count;
  43. }
  44. CHECK(count == 0);
  45. CHECK(!visited[1]);
  46. CHECK(!visited[3]);
  47. CHECK(!visited[5]);
  48. // Copy the map
  49. UnorderedMap<int, int> map2;
  50. map2 = map;
  51. CHECK(map2.find(1)->second == 2);
  52. CHECK(map2.find(3)->second == 4);
  53. CHECK(map2.find(5)->second == 7);
  54. CHECK(map2.find(7) == map2.end());
  55. // Try emplace
  56. map.try_emplace(7, 8);
  57. CHECK(map.size() == 4);
  58. CHECK(map.find(7)->second == 8);
  59. // Swap
  60. UnorderedMap<int, int> map3;
  61. map3.swap(map);
  62. CHECK(map3.find(1)->second == 2);
  63. CHECK(map3.find(3)->second == 4);
  64. CHECK(map3.find(5)->second == 7);
  65. CHECK(map3.find(7)->second == 8);
  66. CHECK(map3.find(9) == map3.end());
  67. CHECK(map.empty());
  68. // Move construct
  69. UnorderedMap<int, int> map4(std::move(map3));
  70. CHECK(map4.find(1)->second == 2);
  71. CHECK(map4.find(3)->second == 4);
  72. CHECK(map4.find(5)->second == 7);
  73. CHECK(map4.find(7)->second == 8);
  74. CHECK(map4.find(9) == map4.end());
  75. CHECK(map3.empty());
  76. }
  77. TEST_CASE("TestUnorderedMapGrow")
  78. {
  79. UnorderedMap<int, int> map;
  80. for (int i = 0; i < 10000; ++i)
  81. CHECK(map.try_emplace(i, ~i).second);
  82. CHECK(map.size() == 10000);
  83. for (int i = 0; i < 10000; ++i)
  84. CHECK(map.find(i)->second == ~i);
  85. CHECK(map.find(10001) == map.end());
  86. for (int i = 0; i < 5000; ++i)
  87. CHECK(map.erase(i) == 1);
  88. CHECK(map.size() == 5000);
  89. for (int i = 0; i < 5000; ++i)
  90. CHECK(map.find(i) == map.end());
  91. for (int i = 5000; i < 10000; ++i)
  92. CHECK(map.find(i)->second == ~i);
  93. CHECK(map.find(10001) == map.end());
  94. for (int i = 0; i < 5000; ++i)
  95. CHECK(map.try_emplace(i, i + 1).second);
  96. CHECK(!map.try_emplace(0, 0).second);
  97. CHECK(map.size() == 10000);
  98. for (int i = 0; i < 5000; ++i)
  99. CHECK(map.find(i)->second == i + 1);
  100. for (int i = 5000; i < 10000; ++i)
  101. CHECK(map.find(i)->second == ~i);
  102. CHECK(map.find(10001) == map.end());
  103. }
  104. }