|
1 | | -#include <c4/yml/evt/extra/event_handler_ints.hpp> |
2 | | -#include <c4/bitmask.hpp> |
3 | | -#include <vector> |
4 | 1 | #include "test_lib/test_case.hpp" |
5 | | - |
6 | | -namespace c4 { |
7 | | - |
8 | | -using EventFlags = c4::yml::evt::extra::ievt::EventFlags; |
9 | | - |
10 | | -template<> |
11 | | -c4::EnumSymbols<EventFlags> const esyms<EventFlags>() |
12 | | -{ |
13 | | - static constexpr typename c4::EnumSymbols<EventFlags>::Sym syms[] = { |
14 | | - {yml::evt::extra::ievt::KEY_, "KEY_"}, |
15 | | - {yml::evt::extra::ievt::VAL_, "VAL_"}, |
16 | | - {yml::evt::extra::ievt::SCLR, "SCLR"}, |
17 | | - {yml::evt::extra::ievt::BSEQ, "BSEQ"}, |
18 | | - {yml::evt::extra::ievt::ESEQ, "ESEQ"}, |
19 | | - {yml::evt::extra::ievt::BMAP, "BMAP"}, |
20 | | - {yml::evt::extra::ievt::EMAP, "EMAP"}, |
21 | | - {yml::evt::extra::ievt::ALIA, "ALIA"}, |
22 | | - {yml::evt::extra::ievt::ANCH, "ANCH"}, |
23 | | - {yml::evt::extra::ievt::TAG_, "TAG_"}, |
24 | | - {yml::evt::extra::ievt::PLAI, "PLAI"}, |
25 | | - {yml::evt::extra::ievt::SQUO, "SQUO"}, |
26 | | - {yml::evt::extra::ievt::DQUO, "DQUO"}, |
27 | | - {yml::evt::extra::ievt::LITL, "LITL"}, |
28 | | - {yml::evt::extra::ievt::FOLD, "FOLD"}, |
29 | | - {yml::evt::extra::ievt::FLOW, "FLOW"}, |
30 | | - {yml::evt::extra::ievt::BLCK, "BLCK"}, |
31 | | - {yml::evt::extra::ievt::BDOC, "BDOC"}, |
32 | | - {yml::evt::extra::ievt::EDOC, "EDOC"}, |
33 | | - {yml::evt::extra::ievt::BSTR, "BSTR"}, |
34 | | - {yml::evt::extra::ievt::ESTR, "ESTR"}, |
35 | | - {yml::evt::extra::ievt::EXPL, "EXPL"}, |
36 | | - }; |
37 | | - return c4::EnumSymbols<EventFlags>(syms); |
38 | | -} |
| 2 | +#include "test_lib/test_events_int.hpp" |
| 3 | +#include <c4/yml/evt/extra/event_handler_ints.hpp> |
39 | 4 |
|
40 | 5 |
|
| 6 | +namespace c4 { |
41 | 7 | namespace yml { |
42 | 8 | namespace evt { |
43 | 9 | namespace extra { |
44 | 10 |
|
45 | 11 |
|
46 | | -// provide a structured input for the events, grouping the relevant |
47 | | -// data in a single structure |
48 | | -struct IntEventWithScalar |
49 | | -{ |
50 | | - ievt::DataType flags, str_start, str_len; |
51 | | - csubstr scalar; |
52 | | - bool needs_filter; |
53 | | - IntEventWithScalar(ievt::DataType t, ievt::DataType start=0, ievt::DataType len=0, csubstr sclr={}, bool needs_filter_=false) |
54 | | - : flags(t) |
55 | | - , str_start(start) |
56 | | - , str_len(len) |
57 | | - , scalar(sclr) |
58 | | - , needs_filter(needs_filter_) |
59 | | - { |
60 | | - } |
61 | | - size_t required_size() const { return (flags & ievt::HAS_STR) ? 3u : 1u; } |
62 | | -}; |
63 | | - |
64 | | - |
65 | 12 | struct IntEventsCase |
66 | 13 | { |
67 | 14 | const char *file; |
68 | 15 | const int line; |
69 | 16 | csubstr yaml; |
70 | 17 | const std::vector<IntEventWithScalar> evt; |
71 | 18 |
|
72 | | - size_t expected_size() const |
73 | | - { |
74 | | - size_t sz = 0; |
75 | | - for(IntEventWithScalar const& e : evt) |
76 | | - sz += e.required_size(); |
77 | | - return sz; |
78 | | - } |
79 | 19 | void testeq(ievt::DataType const* actual, size_t actual_size, csubstr parsed_source) const |
80 | 20 | { |
81 | | - int status = true; |
82 | | - size_t num_events_expected = evt.size(); |
83 | | - size_t num_ints_expected = expected_size(); |
84 | | - |
85 | | - EXPECT_EQ(actual_size, num_ints_expected); |
86 | | - status = (actual_size == num_ints_expected); |
87 | | - |
88 | | - char actualbuf[100]; |
89 | | - char expectedbuf[100]; |
90 | | - for(size_t i = 0, ie = 0; ie < num_events_expected; ++ie) |
91 | | - { |
92 | | - EXPECT_LT(i, actual_size); |
93 | | - if (i >= actual_size) |
94 | | - break; |
95 | | - size_t reqsize_actual = c4::bm2str<ievt::EventFlags>(actual[i] & ievt::MASK, actualbuf, sizeof(actualbuf)); |
96 | | - size_t reqsize_expected = c4::bm2str<ievt::EventFlags>(evt[ie].flags & ievt::MASK, expectedbuf, sizeof(expectedbuf)); |
97 | | - ASSERT_GT(reqsize_actual, 0u); |
98 | | - ASSERT_GT(reqsize_expected, 0u); |
99 | | - ASSERT_LT(reqsize_actual, sizeof(actualbuf)); |
100 | | - ASSERT_LT(reqsize_expected, sizeof(expectedbuf)); |
101 | | - csubstr actual_str = {actualbuf, reqsize_actual-1u}; |
102 | | - csubstr expected_str = {expectedbuf, reqsize_expected-1u}; |
103 | | -#define _test_eq(fmt, lhs, rhs, ...) \ |
104 | | - do \ |
105 | | - { \ |
106 | | - _c4dbgpf("status={} cmp={} evt={} i={}: {}={} {}={} " fmt, status, (lhs == rhs), ie, i, #lhs, lhs, #rhs, rhs, __VA_ARGS__); \ |
107 | | - status &= (lhs == rhs); \ |
108 | | - EXPECT_EQ(lhs, rhs); \ |
109 | | - } while(0) |
110 | | - _test_eq("actual={} expected={}", actual[i], evt[ie].flags, actual_str, expected_str); |
111 | | - if((evt[ie].flags & ievt::HAS_STR) && (actual[i] & ievt::HAS_STR)) |
112 | | - { |
113 | | - _test_eq("", evt[ie].str_start, actual[i + 1], 0); |
114 | | - _test_eq("", evt[ie].str_len, actual[i + 2], 0); |
115 | | - bool safeactual = (i + 2 < actual_size) && (actual[i + 1] < (int)parsed_source.len && actual[i + 1] + actual[i + 2] <= (int)parsed_source.len); |
116 | | - bool safeexpected = (evt[ie].str_start < (int)parsed_source.len && evt[ie].str_start + evt[ie].str_len <= (int)parsed_source.len); |
117 | | - _test_eq("", safeactual, true, 0); |
118 | | - _test_eq("", safeactual, safeexpected, 0); |
119 | | - if(safeactual && safeexpected) |
120 | | - { |
121 | | - csubstr evtstr = parsed_source.sub((size_t)evt[ie].str_start, (size_t)evt[ie].str_len); |
122 | | - csubstr actualstr = parsed_source.sub((size_t)actual[i + 1], (size_t)actual[i + 2]); |
123 | | - _test_eq(" ref=[{}]~~~{}~~~ vs act=[{}]~~~{}~~~", |
124 | | - evt[ie].scalar, actualstr, |
125 | | - evt[ie].scalar.len, evt[ie].scalar, |
126 | | - actualstr.len, actualstr); |
127 | | - if( ! evt[ie].needs_filter) |
128 | | - { |
129 | | - _test_eq(" exp=[{}]~~~{}~~~ vs act=[{}]~~~{}~~~", |
130 | | - evtstr, actualstr, |
131 | | - evtstr.len, evtstr, |
132 | | - actualstr.len, actualstr); |
133 | | - } |
134 | | - } |
135 | | - } |
136 | | - i += (actual[i] & ievt::HAS_STR) ? 3u : 1u; |
137 | | - } |
138 | | - RYML_TRACE_FMT("defined in:\n{}:{}\n" |
139 | | - "input:[{}]~~~{}~~~\n" |
140 | | - "parsed:[{}]~~~{}~~~\n", |
141 | | - file, line, |
142 | | - yaml.len, yaml, |
143 | | - parsed_source.len, parsed_source); |
144 | | - EXPECT_TRUE(status); |
| 21 | + test_events_ints(evt.data(), evt.size(), actual, actual_size, yaml, parsed_source, file, line); |
145 | 22 | } |
146 | 23 | }; |
147 | 24 |
|
@@ -448,7 +325,7 @@ struct IntEventsTestHelper |
448 | 325 | std::vector<ievt::DataType> actual; |
449 | 326 | IntEventsTestHelper(IntEventsCase const& ec_) |
450 | 327 | : ec(ec_) |
451 | | - , required_size_expected(ec.expected_size()) |
| 328 | + , required_size_expected(num_ints(ec.evt.data(), ec.evt.size())) |
452 | 329 | , handler() |
453 | 330 | , parser(&handler) |
454 | 331 | , src_copy() |
|
0 commit comments