// asciitest — exercises lib/ascii case folding. Run with // `ww run lib/ascii/asciitest.ww`. Same signalled-then-fail()-with-+10 // pattern as bytestest: a non-zero exit pinpoints the failing scenario. // // Vectors mirror Hare's @test fn strcasecmp in ref/hare/ascii/string.ha. package ascii; import ascii; import os; let signalled: i32 = 0; fn fail() void = { os.exit(signalled + 10); }; // checkfold — one table row: strlower(in) == lo and strupper(in) == up. fn checkfold(in: str, lo: str, up: str) void = { match (ascii.strlower(in)) { case let got: str => { if (got != lo) { fail(); }; }; case nomem => { fail(); }; }; match (ascii.strupper(in)) { case let got: str => { if (got != up) { fail(); }; }; case nomem => { fail(); }; }; }; // ref/hare/ascii/string.ha:70 case-fold vectors. The こ row pins that a // UTF-8 multibyte sequence (all bytes >=0x80) passes through unchanged. @test fn strfold_cases() void = { signalled = 100; checkfold("ABC", "abc", "ABC"); signalled = 101; checkfold("abc", "abc", "ABC"); signalled = 102; checkfold("[[[", "[[[", "[[["); signalled = 103; checkfold("こ", "こ", "こ"); signalled = 104; checkfold("", "", ""); signalled = 105; checkfold("aB1z", "ab1z", "AB1Z"); }; export fn main() i32 = { signalled = 1; strfold_cases(); return 0; };