10using namespace stdex::parser;
12using namespace Microsoft::VisualStudio::CppUnitTestFramework;
19 return stdex::sprintf(
L"<%zu, %zu>",
nullptr, q.start, q.end);
33 static const wchar_t text[] =
L"This is a test.\nSecond line.";
37 Assert::IsTrue(p.match(text));
38 Assert::AreEqual((
size_t)0, p.interval.start);
39 Assert::AreEqual((
size_t)0, p.interval.end);
44 Assert::IsFalse(p.match(text));
45 Assert::IsTrue(p.match(text, 0, _countof(text), match_case_insensitive));
46 Assert::AreEqual((
size_t)0, p.interval.start);
47 Assert::AreEqual((
size_t)1, p.interval.end);
52 Assert::IsFalse(p.match(text));
53 Assert::IsTrue(p.match(text, 4));
54 Assert::AreEqual((
size_t)4, p.interval.start);
55 Assert::AreEqual((
size_t)5, p.interval.end);
60 Assert::IsFalse(p.match(text));
61 Assert::IsTrue(p.match(text, 14));
62 Assert::AreEqual((
size_t)14, p.interval.start);
63 Assert::AreEqual((
size_t)15, p.interval.end);
68 Assert::IsFalse(p.match(text));
69 Assert::IsTrue(p.match(text, 4));
70 Assert::AreEqual((
size_t)4, p.interval.start);
71 Assert::AreEqual((
size_t)5, p.interval.end);
72 Assert::IsTrue(p.match(text, 14));
73 Assert::AreEqual((
size_t)14, p.interval.start);
74 Assert::AreEqual((
size_t)15, p.interval.end);
79 Assert::IsTrue(p.match(text));
80 Assert::AreEqual((
size_t)0, p.interval.start);
81 Assert::AreEqual((
size_t)0, p.interval.end);
82 Assert::IsFalse(p.match(text, 1));
83 Assert::IsFalse(p.match(text, 15));
84 Assert::IsTrue(p.match(text, 16));
85 Assert::AreEqual((
size_t)16, p.interval.start);
86 Assert::AreEqual((
size_t)16, p.interval.end);
91 Assert::IsFalse(p.match(text));
92 Assert::IsFalse(p.match(text, 1));
93 Assert::IsTrue(p.match(text, 15));
94 Assert::AreEqual((
size_t)15, p.interval.start);
95 Assert::AreEqual((
size_t)15, p.interval.end);
96 Assert::IsFalse(p.match(text, 16));
101 Assert::IsFalse(p.match(text));
102 Assert::IsTrue(p.match(text, 8));
103 Assert::AreEqual((
size_t)8, p.interval.start);
104 Assert::AreEqual((
size_t)9, p.interval.end);
105 Assert::AreEqual((
size_t)0, p.hit_offset);
106 Assert::IsFalse(p.match(text, 21));
107 Assert::IsTrue(p.match(text, 21, _countof(text), match_case_insensitive));
108 Assert::AreEqual((
size_t)21, p.interval.start);
109 Assert::AreEqual((
size_t)22, p.interval.end);
110 Assert::AreEqual((
size_t)3, p.hit_offset);
114 stdex::parser::wstring p(
L"this");
115 Assert::IsFalse(p.match(text));
116 Assert::IsTrue(p.match(text, 0,
sizeof(text), match_case_insensitive));
117 Assert::AreEqual((
size_t)0, p.interval.start);
118 Assert::AreEqual((
size_t)4, p.interval.end);
124 Assert::IsTrue(p.match(text));
125 Assert::AreEqual((
size_t)0, p.interval.start);
126 Assert::AreEqual((
size_t)5, p.interval.end);
132 Assert::IsTrue(p.match(text));
133 Assert::AreEqual((
size_t)0, p.interval.start);
134 Assert::AreEqual((
size_t)4, p.interval.end);
141 make_shared_no_delete(&
chr_t),
142 make_shared_no_delete(&
chr_h),
143 make_shared_no_delete(&
chr_i),
144 make_shared_no_delete(&
chr_s),
145 make_shared_no_delete(&space) });
146 Assert::IsFalse(p.match(text));
147 Assert::IsTrue(p.match(text, 0, _countof(text), match_case_insensitive));
148 Assert::AreEqual((
size_t)0, p.interval.start);
149 Assert::AreEqual((
size_t)5, p.interval.end);
156 make_shared_no_delete(&
apple),
157 make_shared_no_delete(&
orange),
158 make_shared_no_delete(&
_this),
159 make_shared_no_delete(&space) });
160 Assert::IsFalse(p.match(text));
161 Assert::IsTrue(p.match(text, 0, _countof(text), match_case_insensitive));
162 Assert::AreEqual((
size_t)2, p.hit_offset);
163 Assert::AreEqual((
size_t)0, p.interval.start);
164 Assert::AreEqual((
size_t)4, p.interval.end);
169 Assert::IsFalse(p.match(text));
170 Assert::IsTrue(p.match(text, 0, _countof(text), match_case_insensitive));
171 Assert::AreEqual((
size_t)2, p.hit_offset);
172 Assert::AreEqual((
size_t)0, p.interval.start);
173 Assert::AreEqual((
size_t)4, p.interval.end);
179 make_shared_no_delete(&
chr_s),
180 make_shared_no_delete(&
chr_h),
181 make_shared_no_delete(&
chr_i),
182 make_shared_no_delete(&
chr_t) });
183 Assert::IsFalse(p.match(text));
184 Assert::IsTrue(p.match(text, 0, _countof(text), match_case_insensitive));
185 Assert::AreEqual((
size_t)0, p.interval.start);
186 Assert::AreEqual((
size_t)4, p.interval.end);
193 Assert::IsTrue(p.match(
L"SI56023120015226972", 0,
SIZE_MAX));
194 Assert::IsTrue(p.is_valid);
195 Assert::AreEqual(
L"SI", p.country);
196 Assert::AreEqual(
L"56", p.check_digits);
197 Assert::AreEqual(
L"023120015226972", p.bban);
198 Assert::IsTrue(p.match(
L"SI56 0231 2001 5226 972", 0,
SIZE_MAX));
199 Assert::IsTrue(p.is_valid);
200 Assert::AreEqual(
L"SI", p.country);
201 Assert::AreEqual(
L"56", p.check_digits);
202 Assert::AreEqual(
L"023120015226972", p.bban);
203 Assert::IsFalse(p.match(
L"si56 0231 2001 5226 972", 0,
SIZE_MAX));
204 Assert::IsFalse(p.is_valid);
205 Assert::IsTrue(p.match(
L"si56 0231 2001 5226 972", 0,
SIZE_MAX, match_case_insensitive));
206 Assert::IsTrue(p.is_valid);
207 Assert::IsTrue(p.match(
L"SI56 0231 2001 5226 9720", 0,
SIZE_MAX));
209 Assert::IsTrue(p.is_valid);
210 Assert::IsTrue(p.match(
L"...SI56 0231 2001 5226 972...", 3,
SIZE_MAX));
211 Assert::IsTrue(p.is_valid);
212 Assert::IsTrue(p.match(
L"SI56 0231 2001 5226 972", 0,
SIZE_MAX));
213 Assert::IsTrue(p.is_valid);
215 Assert::IsTrue(p.match(
L"BE71 0961 2345 6769", 0,
SIZE_MAX));
216 Assert::IsTrue(p.is_valid);
217 Assert::IsTrue(p.match(
L"BR15 0000 0000 0000 1093 2840 814 P2", 0,
SIZE_MAX));
218 Assert::IsTrue(p.is_valid);
219 Assert::IsTrue(p.match(
L"CR99 0000 0000 0000 8888 88", 0,
SIZE_MAX));
220 Assert::IsFalse(p.is_valid);
221 Assert::IsTrue(p.match(
L"FR76 3000 6000 0112 3456 7890 189", 0,
SIZE_MAX));
222 Assert::IsTrue(p.is_valid);
223 Assert::IsTrue(p.match(
L"IE12 BOFI 9000 0112 3456 78", 0,
SIZE_MAX));
224 Assert::IsFalse(p.is_valid);
225 Assert::IsTrue(p.match(
L"DE91 1000 0000 0123 4567 89", 0,
SIZE_MAX));
226 Assert::IsTrue(p.is_valid);
227 Assert::IsTrue(p.match(
L"GR96 0810 0010 0000 0123 4567 890", 0,
SIZE_MAX));
228 Assert::IsTrue(p.is_valid);
229 Assert::IsTrue(p.match(
L"MU43 BOMM 0101 1234 5678 9101 000 MUR", 0,
SIZE_MAX));
230 Assert::IsTrue(p.is_valid);
231 Assert::IsTrue(p.match(
L"PK70 BANK 0000 1234 5678 9000", 0,
SIZE_MAX));
232 Assert::IsTrue(p.is_valid);
233 Assert::IsTrue(p.match(
L"PL10 1050 0099 7603 1234 5678 9123", 0,
SIZE_MAX));
234 Assert::IsTrue(p.is_valid);
235 Assert::IsTrue(p.match(
L"RO09 BCYP 0000 0012 3456 7890", 0,
SIZE_MAX));
236 Assert::IsTrue(p.is_valid);
237 Assert::IsTrue(p.match(
L"LC14 BOSL 1234 5678 9012 3456 7890 1234", 0,
SIZE_MAX));
238 Assert::IsTrue(p.is_valid);
239 Assert::IsTrue(p.match(
L"SA44 2000 0001 2345 6789 1234", 0,
SIZE_MAX));
240 Assert::IsTrue(p.is_valid);
241 Assert::IsTrue(p.match(
L"ES79 2100 0813 6101 2345 6789", 0,
SIZE_MAX));
242 Assert::IsTrue(p.is_valid);
243 Assert::IsTrue(p.match(
L"SE87 3000 0000 0101 2345 6789", 0,
SIZE_MAX));
244 Assert::IsFalse(p.is_valid);
245 Assert::IsTrue(p.match(
L"CH56 0483 5012 3456 7800 9", 0,
SIZE_MAX));
246 Assert::IsTrue(p.is_valid);
247 Assert::IsTrue(p.match(
L"GB98 MIDL 0700 9312 3456 78", 0,
SIZE_MAX));
248 Assert::IsTrue(p.is_valid);
255 Assert::IsTrue(p.match(
L"RF18539007547034", 0,
SIZE_MAX));
256 Assert::IsTrue(p.is_valid);
257 Assert::AreEqual(
L"18", p.check_digits);
258 Assert::AreEqual(
L"000000000539007547034", p.reference);
259 Assert::IsTrue(p.match(
L"RF18 5390 0754 7034", 0,
SIZE_MAX));
260 Assert::IsTrue(p.is_valid);
261 Assert::AreEqual(
L"18", p.check_digits);
262 Assert::AreEqual(
L"000000000539007547034", p.reference);
263 Assert::IsFalse(p.match(
L"rf18 5390 0754 7034", 0,
SIZE_MAX));
264 Assert::IsFalse(p.is_valid);
265 Assert::IsTrue(p.match(
L"rf18 5390 0754 7034", 0,
SIZE_MAX, match_case_insensitive));
266 Assert::IsTrue(p.is_valid);
267 Assert::IsTrue(p.match(
L"RF18 5390 0754 70340", 0,
SIZE_MAX));
268 Assert::IsFalse(p.is_valid);
269 Assert::IsTrue(p.match(
L"...RF18 5390 0754 7034...", 3,
SIZE_MAX));
270 Assert::IsTrue(p.is_valid);
271 Assert::IsTrue(p.match(
L"RF18 5390 0754 7034", 0,
SIZE_MAX));
272 Assert::IsTrue(p.is_valid);
279 Assert::IsTrue(p.match(
L"SI121234567890120", 0,
SIZE_MAX));
280 Assert::IsTrue(p.is_valid);
281 Assert::AreEqual(
L"12", p.model);
283 Assert::IsTrue(p.match(
L"SI12 1234567890120", 0,
SIZE_MAX));
284 Assert::IsTrue(p.is_valid);
285 Assert::AreEqual(
L"12", p.model);
287 Assert::IsFalse(p.match(
L"si12 1234567890120", 0,
SIZE_MAX));
288 Assert::IsTrue(p.match(
L"si12 1234567890120", 0,
SIZE_MAX, match_case_insensitive));
289 Assert::IsTrue(p.match(
L"...SI12 1234567890120...", 3,
SIZE_MAX));
290 Assert::IsTrue(p.match(
L"SI12 1234567890120", 0,
SIZE_MAX));
297 static const char text[] =
"V kožuščku zlobnega mizarja stopiclja fant\nin kliče 1234567890.";
301 Assert::IsTrue(p.match(text));
302 Assert::AreEqual((
size_t)0, p.interval.start);
303 Assert::AreEqual((
size_t)0, p.interval.end);
308 Assert::IsFalse(p.match(text));
309 Assert::IsTrue(p.match(text, 0, _countof(text), match_case_insensitive));
310 Assert::AreEqual((
size_t)0, p.interval.start);
311 Assert::AreEqual((
size_t)1, p.interval.end);
316 Assert::IsFalse(p.match(text, 4));
317 Assert::IsTrue(p.match(text, 4, _countof(text), match_case_insensitive));
318 Assert::AreEqual((
size_t)4, p.interval.start);
319 Assert::AreEqual((
size_t)12, p.interval.end);
324 Assert::IsFalse(p.match(text));
325 Assert::IsTrue(p.match(text, 1));
326 Assert::AreEqual((
size_t)1, p.interval.start);
327 Assert::AreEqual((
size_t)2, p.interval.end);
328 Assert::IsTrue(p.match(text, 79));
329 Assert::AreEqual((
size_t)79, p.interval.start);
330 Assert::AreEqual((
size_t)85, p.interval.end);
335 Assert::IsFalse(p.match(text, 2));
336 Assert::IsTrue(p.match(text, 2, _countof(text), match_case_insensitive));
337 Assert::AreEqual((
size_t)2, p.hit_offset);
338 Assert::AreEqual((
size_t)2, p.interval.start);
339 Assert::AreEqual((
size_t)31, p.interval.end);
345 Assert::IsTrue(p.match(
"SI56023120015226972", 0,
SIZE_MAX));
346 Assert::IsTrue(p.is_valid);
347 Assert::AreEqual(
"SI", p.country);
348 Assert::AreEqual(
"56", p.check_digits);
349 Assert::AreEqual(
"023120015226972", p.bban);
350 Assert::IsTrue(p.match(
"SI56 0231 2001 5226 972", 0,
SIZE_MAX));
351 Assert::IsTrue(p.is_valid);
352 Assert::AreEqual(
"SI", p.country);
353 Assert::AreEqual(
"56", p.check_digits);
354 Assert::AreEqual(
"023120015226972", p.bban);
355 Assert::IsFalse(p.match(
"si56 0231 2001 5226 972", 0,
SIZE_MAX));
356 Assert::IsFalse(p.is_valid);
357 Assert::IsTrue(p.match(
"si56 0231 2001 5226 972", 0,
SIZE_MAX, match_case_insensitive));
358 Assert::IsTrue(p.is_valid);
359 Assert::IsTrue(p.match(
"SI56 0231 2001 5226 9720", 0,
SIZE_MAX));
361 Assert::IsTrue(p.is_valid);
362 Assert::IsTrue(p.match(
"...SI56 0231 2001 5226 972...", 3,
SIZE_MAX));
363 Assert::IsTrue(p.is_valid);
364 Assert::IsTrue(p.match(
"SI56 0231 2001 5226 972", 0,
SIZE_MAX));
365 Assert::IsTrue(p.is_valid);
371 Assert::IsTrue(p.match(
"RF18539007547034", 0,
SIZE_MAX));
372 Assert::IsTrue(p.is_valid);
373 Assert::AreEqual(
"18", p.check_digits);
374 Assert::AreEqual(
"000000000539007547034", p.reference);
375 Assert::IsTrue(p.match(
"RF18 5390 0754 7034", 0,
SIZE_MAX));
376 Assert::IsTrue(p.is_valid);
377 Assert::AreEqual(
"18", p.check_digits);
378 Assert::AreEqual(
"000000000539007547034", p.reference);
379 Assert::IsFalse(p.match(
"rf18 5390 0754 7034", 0,
SIZE_MAX));
380 Assert::IsFalse(p.is_valid);
381 Assert::IsTrue(p.match(
"rf18 5390 0754 7034", 0,
SIZE_MAX, match_case_insensitive));
382 Assert::IsTrue(p.is_valid);
383 Assert::IsTrue(p.match(
"RF18 5390 0754 70340", 0,
SIZE_MAX));
384 Assert::IsFalse(p.is_valid);
385 Assert::IsTrue(p.match(
"...RF18 5390 0754 7034...", 3,
SIZE_MAX));
386 Assert::IsTrue(p.is_valid);
387 Assert::IsTrue(p.match(
"RF18 5390 0754 7034", 0,
SIZE_MAX));
388 Assert::IsTrue(p.is_valid);
394 Assert::IsTrue(p.match(
"SI121234567890120", 0,
SIZE_MAX));
395 Assert::IsTrue(p.is_valid);
396 Assert::AreEqual(
"12", p.model);
398 Assert::IsTrue(p.match(
"SI12 1234567890120", 0,
SIZE_MAX));
399 Assert::IsTrue(p.is_valid);
400 Assert::AreEqual(
"12", p.model);
402 Assert::IsFalse(p.match(
"si12 1234567890120", 0,
SIZE_MAX));
403 Assert::IsTrue(p.match(
"si12 1234567890120", 0,
SIZE_MAX, match_case_insensitive));
404 Assert::IsTrue(p.match(
"...SI12 1234567890120...", 3,
SIZE_MAX));
405 Assert::IsTrue(p.match(
"SI12 1234567890120", 0,
SIZE_MAX));
411 static const std::locale
locale(
"en_US.UTF-8");
414 "Host: stackoverflow.com\r\n"
415 "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0\r\n"
416 "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\n"
417 "Accept-Language: sl,en-US;q=0.8,en;q=0.6,de-DE;q=0.4,de;q=0.2\r\n"
418 "Accept-Encoding: gzip, deflate, br\r\n"
420 "Connection: keep-alive\r\n"
421 "Cookie: prov=00000000-0000-0000-0000-000000000000; acct=t=00000000000000000%2f%2f0000%2b0000%2b000&s=00000000000000000000000000000000; OptanonConsent=isGpcEnabled=0&datestamp=Fri+Feb+03+2023+11%3A11%3A08+GMT%2B0100+(Srednjeevropski+standardni+%C4%8Das)&version=6.37.0&isIABGlobal=false&hosts=&consentId=00000000-0000-0000-0000-000000000000&interactionCount=1&landingPath=NotLandingPage&groups=00000%3A0%2C00000%3A0%2C00000%3A0%2C00000%3A0; OptanonAlertBoxClosed=2023-02-03T10:11:08.683Z\r\n"
422 "Upgrade-Insecure-Requests: 1\r\n"
423 "Sec-Fetch-Dest: document\r\n"
424 "Sec-Fetch-Mode: navigate\r\n"
425 "Sec-Fetch-Site: none\r\n"
426 "Sec-Fetch-User: ?1\r\n"
427 "Pragma: no-cache\r\n"
428 "Cache-Control: no-cache\r\n"
433 Assert::IsTrue(p.match(
request));
434 Assert::AreEqual((
size_t)0, p.interval.start);
435 Assert::AreEqual((
size_t)14, p.interval.end);
436 Assert::AreEqual((
size_t)0, p.verb.start);
437 Assert::AreEqual((
size_t)3, p.verb.end);
438 Assert::AreEqual((
size_t)4, p.url.interval.start);
439 Assert::AreEqual((
size_t)5, p.url.interval.end);
440 Assert::AreEqual((
size_t)6, p.protocol.interval.start);
441 Assert::AreEqual((
size_t)12, p.protocol.interval.end);
442 Assert::AreEqual((
uint16_t)0x200, p.protocol.version);
446 std::list<http_header>
hdrs;
452 hdrs.push_back(std::move(
h));
457 Assert::AreEqual((
size_t)15,
hdrs.size());
459 for (
const auto&
h :
hdrs)
462 Assert::IsTrue(!
langs.empty());
465 "sl",
"en-US",
"en",
"de-DE",
"de"
471 Assert::IsTrue(
c ==
control.cend());
472 Assert::IsTrue(
l ==
langs.cend());
locale_t helper class to free_locale when going out of scope.
Definition locale.hpp:69
stdex::interval< size_t > interval
Region of the last match.
Definition parser.hpp:116
Test for given string.
Definition parser.hpp:831
Test for HTTP request.
Definition parser.hpp:6937
Test for specific SGML code point.
Definition parser.hpp:353
Test for any SGML space code point.
Definition parser.hpp:440
Numerical interval.
Definition interval.hpp:18
T size() const
Returns interval size.
Definition interval.hpp:47
T end
interval end
Definition interval.hpp:20
T start
interval start
Definition interval.hpp:19