Skip to content

Commit d0fd1c1

Browse files
test(parser): add comprehensive tests for StringInterner
1 parent 1d8393f commit d0fd1c1

1 file changed

Lines changed: 72 additions & 0 deletions

File tree

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#include <string>
2+
#include <format>
3+
#include <utility>
4+
#include <wheel_parser/ast/symbol.hxx>
5+
#include <__internal/__assert.hxx>
6+
7+
using std::string;
8+
using std::move;
9+
using std::format;
10+
using wheel_parser::ast::StringInterner;
11+
using wheel_parser::ast::INVALID_SYMBOL_ID;
12+
13+
TEST(test_symbol_interner_deduplicates_strings)
14+
StringInterner string_interner;
15+
auto id1 = string_interner.intern("alpha");
16+
auto id2 = string_interner.intern("alpha");
17+
auto id3 = string_interner.intern("beta");
18+
19+
internal_assert(id1 == id2, "expected same symbol id for duplicate string");
20+
internal_assert(id1 != id3, "expected distinct ids for distinct strings");
21+
internal_assert(string_interner.resolve(id1) == "alpha", "expected alpha resolve");
22+
internal_assert(string_interner.resolve(id3) == "beta", "expected beta resolve");
23+
DONE
24+
25+
TEST(test_symbol_interner_invalid_resolve_type)
26+
StringInterner interner;
27+
28+
const auto root_id = interner.intern("root");
29+
internal_assert(interner.resolve(root_id) == "root", "expected root resolve");
30+
internal_assert(interner.resolve(INVALID_SYMBOL_ID).empty(), "invalid symbol id should resolve empty");
31+
internal_assert(interner.resolve(1000).empty(), "out-of-range symbol id should resolve empty");
32+
DONE
33+
34+
TEST(test_symbol_interner_move_edge)
35+
StringInterner source;
36+
auto id1 = source.intern("alpha");
37+
auto id2 = source.intern("beta");
38+
39+
StringInterner moved(move(source));
40+
internal_assert(moved.resolve(id1) == "alpha", "moved interner should preserve alpha");
41+
internal_assert(moved.resolve(id2) == "beta", "moved interner should preserve beta");
42+
internal_assert(moved.intern("alpha") == id1, "moved interner should preserve dedup index");
43+
DONE
44+
45+
TEST(test_symbol_interner_fuzz_many_identifier)
46+
StringInterner interner;
47+
48+
for (int index = 0; index < 5000; ++index) {
49+
const string symbol = format("symbol_{}", index);
50+
auto id = interner.intern(symbol);
51+
52+
internal_assert(interner.resolve(id) == symbol, "resoved symbol mismatch");
53+
}
54+
55+
for (int index = 0; index < 5000; ++index) {
56+
const string symbol = std::format("symbol_{}", index);
57+
58+
auto id1 = interner.intern(symbol);
59+
auto id2 = interner.intern(symbol);
60+
61+
internal_assert(id1 == id2, "duplicate symbol must keep stable id");
62+
}
63+
64+
internal_assert(interner.size() == 5000, "expected unique symbol count");
65+
DONE
66+
67+
TEST_MAIN
68+
RUN(test_symbol_interner_deduplicates_strings)
69+
RUN(test_symbol_interner_invalid_resolve_type)
70+
RUN(test_symbol_interner_move_edge)
71+
RUN(test_symbol_interner_fuzz_many_identifier)
72+
END_MAIN

0 commit comments

Comments
 (0)