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