Skip to content

Commit 5913fce

Browse files
author
Julian LALU
committed
Update Hashset tests
1 parent 00fe07e commit 5913fce

File tree

1 file changed

+129
-8
lines changed

1 file changed

+129
-8
lines changed

test/hashset/hashset_misc.cpp

Lines changed: 129 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,129 @@
1-
// #include <core/containers/hashset.h>
2-
// #include <core/traits/is_same.h>
3-
4-
// GTEST_TEST(hashset, hashset_value_type_is_correct)
5-
// {
6-
// hud_assert_true((hud::is_same_v<i64, hud::hashset<i64>::key_type>));
7-
// hud_assert_true((hud::is_same_v<const i64, hud::hashset<const i64>::key_type>));
8-
// }
1+
#include <core/containers/hashset.h>
2+
#include <core/traits/is_same.h>
3+
4+
GTEST_TEST(hashset, hashmap_value_type_is_correct)
5+
{
6+
hud_assert_true((hud::is_same_v<i64, hud::hashset<i64, i32>::key_type>));
7+
hud_assert_true((hud::is_same_v<const i64, hud::hashset<const i64, i32>::key_type>));
8+
}
9+
10+
GTEST_TEST(hashset, metadata)
11+
{
12+
// Testing metadata byte filtering
13+
using control_type = hud::details::hashset::control_type;
14+
hud_assert_true(hud::details::hashset::control::is_byte_empty(hud::details::hashset::empty_byte));
15+
hud_assert_false(hud::details::hashset::control::is_byte_empty(hud::details::hashset::deleted_byte));
16+
hud_assert_false(hud::details::hashset::control::is_byte_empty(hud::details::hashset::sentinel_byte));
17+
hud_assert_false(hud::details::hashset::control::is_byte_empty(0x7F));
18+
19+
hud_assert_false(hud::details::hashset::control::is_byte_deleted(hud::details::hashset::empty_byte));
20+
hud_assert_true(hud::details::hashset::control::is_byte_deleted(hud::details::hashset::deleted_byte));
21+
hud_assert_false(hud::details::hashset::control::is_byte_deleted(hud::details::hashset::sentinel_byte));
22+
hud_assert_false(hud::details::hashset::control::is_byte_deleted(0x7F));
23+
24+
hud_assert_true(hud::details::hashset::control::is_byte_empty_or_deleted(hud::details::hashset::empty_byte));
25+
hud_assert_true(hud::details::hashset::control::is_byte_empty_or_deleted(hud::details::hashset::deleted_byte));
26+
hud_assert_false(hud::details::hashset::control::is_byte_empty_or_deleted(hud::details::hashset::sentinel_byte));
27+
hud_assert_false(hud::details::hashset::control::is_byte_empty_or_deleted(0x7F));
28+
29+
hud_assert_false(hud::details::hashset::control::is_byte_full(hud::details::hashset::empty_byte));
30+
hud_assert_false(hud::details::hashset::control::is_byte_full(hud::details::hashset::deleted_byte));
31+
hud_assert_false(hud::details::hashset::control::is_byte_full(hud::details::hashset::sentinel_byte));
32+
hud_assert_true(hud::details::hashset::control::is_byte_full(0x7F));
33+
34+
// Testing metadata group
35+
using group_type = hud::details::hashset::group_type;
36+
using mask_type = group_type::mask;
37+
using mask_empty_type = group_type::empty_mask;
38+
using mask_empty_or_deleted_type = group_type::empty_or_deleted_mask;
39+
using mask_full_type = group_type::full_mask;
40+
41+
u64 group_value = 0x80FEFF7F80FEFF7F;
42+
group_type g {reinterpret_cast<control_type *>(&group_value)};
43+
hud_assert_eq(g.match(0x7F), mask_type {0x0000008000000080});
44+
hud_assert_eq(g.mask_of_empty_or_deleted_slot(), mask_empty_or_deleted_type {0x8080000080800000});
45+
hud_assert_eq(g.mask_of_empty_slot(), mask_empty_type {0x8000000080000000});
46+
hud_assert_eq(g.mask_of_full_slot(), mask_full_type {0x0000008000000080});
47+
48+
// Test group at index
49+
// empty (0x80), deleted (0xFE), sentinel (0xFF)
50+
u64 two_group[2] = {0x7F00806DFE002A6D, 0x807B00800000FEFF};
51+
control_type *metadata_ptr(reinterpret_cast<control_type *>(&two_group));
52+
group_type g0 {metadata_ptr};
53+
// Read first group
54+
hud_assert_eq(g0.match(0x7F), mask_type {0x8000000000000000});
55+
hud_assert_eq(g0.match(0x2A), mask_type {0x0000000000008000});
56+
hud_assert_eq(g0.match(0x6D), mask_type {0x0000008000000080});
57+
hud_assert_eq(g0.mask_of_empty_or_deleted_slot(), mask_empty_or_deleted_type {0x0000800080000000});
58+
hud_assert_eq(g0.mask_of_empty_slot(), mask_empty_type {0x0000800000000000});
59+
hud_assert_eq(g0.mask_of_full_slot(), mask_full_type {0x8080008000808080});
60+
61+
group_type g1 {metadata_ptr + group_type::SLOT_PER_GROUP * 1};
62+
// Read second group
63+
hud_assert_eq(g1.match(0x7B), mask_type {0x0080000000000000});
64+
hud_assert_eq(g1.mask_of_empty_or_deleted_slot(), mask_empty_or_deleted_type {0x8000008000008000});
65+
hud_assert_eq(g1.mask_of_empty_slot(), mask_empty_type {0x8000008000000000});
66+
hud_assert_eq(g1.mask_of_full_slot(), mask_full_type {0x0080800080800000});
67+
68+
// Test find with group and iteration
69+
// Find the 2 indices of 0x6D in the group and iterate over it
70+
// Expect to have index 0 and 4 in the group 0x7F00806DFE002A6D
71+
group_type::mask h2_match_mask = g0.match(0x6D);
72+
u32 indices[2] = {hud::u32_max, hud::u32_max};
73+
u32 current_index = 0;
74+
for (u32 value : h2_match_mask)
75+
{
76+
hud_assert_ne(current_index, 2);
77+
indices[current_index] = value;
78+
++current_index;
79+
}
80+
hud_assert_eq(indices[0], 0);
81+
hud_assert_eq(indices[1], 4);
82+
}
83+
84+
GTEST_TEST(hashset, count_return_count_of_element)
85+
{
86+
using type = usize;
87+
using HashMapType = hud::hashset<type>;
88+
89+
const auto test = []()
90+
{
91+
HashMapType set;
92+
93+
// Count return 0 if array is empty
94+
bool empty_ok = set.count() == 0;
95+
96+
// Count return number of element if not empty
97+
constexpr usize COUNT = 256;
98+
for (usize value = 0; value < COUNT; value++)
99+
{
100+
set.add(value);
101+
}
102+
bool return_correct_count = set.count() == COUNT;
103+
104+
// Count return number of element after remove
105+
// Remove half
106+
for (usize value = 0; value < COUNT; value += 2)
107+
{
108+
set.remove(value);
109+
}
110+
bool return_correct_count_after_erase_some = (set.count() == COUNT / 2);
111+
return std::tuple {empty_ok, return_correct_count, return_correct_count_after_erase_some};
112+
};
113+
114+
// Non constant
115+
{
116+
const auto result = test();
117+
hud_assert_true(std::get<0>(result));
118+
hud_assert_true(std::get<1>(result));
119+
hud_assert_true(std::get<2>(result));
120+
}
121+
122+
// Constant
123+
{
124+
constexpr auto result = test();
125+
hud_assert_true(std::get<0>(result));
126+
hud_assert_true(std::get<1>(result));
127+
hud_assert_true(std::get<2>(result));
128+
}
129+
}

0 commit comments

Comments
 (0)