123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
- // SPDX-FileCopyrightText: 2024 Jorrit Rouwe
- // SPDX-License-Identifier: MIT
- #include "UnitTestFramework.h"
- #include <Jolt/Core/UnorderedMap.h>
- TEST_SUITE("UnorderedMapTest")
- {
- TEST_CASE("TestUnorderedMap")
- {
- UnorderedMap<int, int> map;
- map.reserve(10);
- // Insert some entries
- CHECK(map.insert({ 1, 2 }).first->first == 1);
- CHECK(map.insert({ 3, 4 }).second);
- CHECK(!map.insert({ 3, 5 }).second);
- CHECK(map.size() == 2);
- CHECK(map.find(1)->second == 2);
- CHECK(map.find(3)->second == 4);
- CHECK(map.find(5) == map.end());
- // Use operator []
- map[5] = 6;
- CHECK(map.size() == 3);
- CHECK(map.find(5)->second == 6);
- map[5] = 7;
- CHECK(map.size() == 3);
- CHECK(map.find(5)->second == 7);
- // Validate all elements are visited by a visitor
- int count = 0;
- bool visited[10] = { false };
- for (UnorderedMap<int, int>::const_iterator i = map.begin(); i != map.end(); ++i)
- {
- visited[i->first] = true;
- ++count;
- }
- CHECK(count == 3);
- CHECK(visited[1]);
- CHECK(visited[3]);
- CHECK(visited[5]);
- for (UnorderedMap<int, int>::iterator i = map.begin(); i != map.end(); ++i)
- {
- visited[i->first] = false;
- --count;
- }
- CHECK(count == 0);
- CHECK(!visited[1]);
- CHECK(!visited[3]);
- CHECK(!visited[5]);
- // Copy the map
- UnorderedMap<int, int> map2;
- map2 = map;
- CHECK(map2.find(1)->second == 2);
- CHECK(map2.find(3)->second == 4);
- CHECK(map2.find(5)->second == 7);
- CHECK(map2.find(7) == map2.end());
- // Try emplace
- map.try_emplace(7, 8);
- CHECK(map.size() == 4);
- CHECK(map.find(7)->second == 8);
- // Swap
- UnorderedMap<int, int> map3;
- map3.swap(map);
- CHECK(map3.find(1)->second == 2);
- CHECK(map3.find(3)->second == 4);
- CHECK(map3.find(5)->second == 7);
- CHECK(map3.find(7)->second == 8);
- CHECK(map3.find(9) == map3.end());
- CHECK(map.empty());
- // Move construct
- UnorderedMap<int, int> map4(std::move(map3));
- CHECK(map4.find(1)->second == 2);
- CHECK(map4.find(3)->second == 4);
- CHECK(map4.find(5)->second == 7);
- CHECK(map4.find(7)->second == 8);
- CHECK(map4.find(9) == map4.end());
- CHECK(map3.empty());
- }
- TEST_CASE("TestUnorderedMapGrow")
- {
- UnorderedMap<int, int> map;
- for (int i = 0; i < 10000; ++i)
- CHECK(map.try_emplace(i, ~i).second);
- CHECK(map.size() == 10000);
- for (int i = 0; i < 10000; ++i)
- CHECK(map.find(i)->second == ~i);
- CHECK(map.find(10001) == map.end());
- for (int i = 0; i < 5000; ++i)
- CHECK(map.erase(i) == 1);
- CHECK(map.size() == 5000);
- for (int i = 0; i < 5000; ++i)
- CHECK(map.find(i) == map.end());
- for (int i = 5000; i < 10000; ++i)
- CHECK(map.find(i)->second == ~i);
- CHECK(map.find(10001) == map.end());
- for (int i = 0; i < 5000; ++i)
- CHECK(map.try_emplace(i, i + 1).second);
- CHECK(!map.try_emplace(0, 0).second);
- CHECK(map.size() == 10000);
- for (int i = 0; i < 5000; ++i)
- CHECK(map.find(i)->second == i + 1);
- for (int i = 5000; i < 10000; ++i)
- CHECK(map.find(i)->second == ~i);
- CHECK(map.find(10001) == map.end());
- }
- }
|