mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
80 lines
2.7 KiB
C
80 lines
2.7 KiB
C
module conv_tests;
|
|
import std::io;
|
|
|
|
fn void! comparison_helper_32_to_8(Char32 c32, String expected_output)
|
|
{
|
|
char[8] out;
|
|
usz len = conv::char32_to_utf8(c32, &out, 4)!;
|
|
assert(len == expected_output.len, "Len should be 1");
|
|
foreach (i, c : expected_output)
|
|
{
|
|
assert(out[i] == c, "Expected other value");
|
|
}
|
|
}
|
|
|
|
fn void! comparison_helper_8_to_32(String in, Char32 c32)
|
|
{
|
|
usz len = in.len;
|
|
Char32 res = conv::utf8_to_char32(in.ptr, &len)!;
|
|
assert(len == in.len, "All len should be used.");
|
|
assert(res == c32, "Expected character match.");
|
|
}
|
|
|
|
fn void assert_utf8_is_error(String in)
|
|
{
|
|
usz len = in.len;
|
|
assert(@catch(conv::utf8_to_char32(in.ptr, &len)), "Expected error");
|
|
}
|
|
|
|
fn void! test_char32_ut8_boundary() @test
|
|
{
|
|
// First sequence per len
|
|
comparison_helper_32_to_8(0x00000000, { 0 })!;
|
|
comparison_helper_32_to_8(0x00000080, { 0xc2, 0x80 })!;
|
|
comparison_helper_32_to_8(0x00000800, { 0xe0, 0xa0, 0x80 })!;
|
|
comparison_helper_32_to_8(0x00010000, { 0xf0, 0x90, 0x80, 0x80 })!;
|
|
assert(@catch(comparison_helper_32_to_8(0x10ffff + 1, { 0 })), "Expected error");
|
|
// Last seq per len
|
|
comparison_helper_32_to_8(0x0000007f, { 0x7f })!;
|
|
comparison_helper_32_to_8(0x000007ff, { 0xdf, 0xbf })!;
|
|
comparison_helper_32_to_8(0x0000ffff, { 0xef, 0xbf, 0xbf })!;
|
|
comparison_helper_32_to_8(0x0010ffff, { 0xf4, 0x8f, 0xbf, 0xbf })!;
|
|
// Other boundaries
|
|
comparison_helper_32_to_8(0x0000d7ff, { 0xed, 0x9f, 0xbf})!;
|
|
comparison_helper_32_to_8(0x0000e000, { 0xee, 0x80, 0x80 })!;
|
|
comparison_helper_32_to_8(0x0000fffd, { 0xef, 0xbf, 0xbd })!;
|
|
|
|
}
|
|
|
|
fn void! test_utf8_to_char32_boundary() @test
|
|
{
|
|
// First sequence per len
|
|
comparison_helper_8_to_32("\0", 0x0 )!;
|
|
comparison_helper_8_to_32({ 0xc2, 0x80 }, 0x80)!;
|
|
comparison_helper_8_to_32({ 0xe0, 0xa0, 0x80 }, 0x800 )!;
|
|
comparison_helper_8_to_32({ 0xf0, 0x90, 0x80, 0x80 }, 0x10000)!;
|
|
// Last seq per len
|
|
comparison_helper_8_to_32({ 0x7f }, 0x7f)!;
|
|
comparison_helper_8_to_32({ 0xdf, 0xbf }, 0x7ff )!;
|
|
comparison_helper_8_to_32({ 0xef, 0xbf, 0xbf }, 0xffff)!;
|
|
comparison_helper_8_to_32({ 0xf4, 0x8f, 0xbf, 0xbf }, 0x10ffff)!;
|
|
// Other boundaries
|
|
comparison_helper_8_to_32({ 0xed, 0x9f, 0xbf }, 0xd7ff)!;
|
|
comparison_helper_8_to_32({ 0xee, 0x80, 0x80 }, 0xe000)!;
|
|
comparison_helper_8_to_32({ 0xef, 0xbf, 0xbd }, 0xfffd)!;
|
|
|
|
assert_utf8_is_error({ 0x80 });
|
|
assert_utf8_is_error({ 0xbf });
|
|
assert_utf8_is_error({ 0xfe });
|
|
assert_utf8_is_error({ 0xff });
|
|
assert_utf8_is_error({ 0xfe, 0xfe, 0xff, 0xff });
|
|
|
|
// Overlong
|
|
assert_utf8_is_error({ 0xc0, 0xaf });
|
|
assert_utf8_is_error({ 0xe0, 0x80, 0xaf });
|
|
assert_utf8_is_error({ 0xf0, 0x80, 0x80, 0xaf });
|
|
assert_utf8_is_error({ 0xf8, 0x80, 0x80, 0xaf });
|
|
assert_utf8_is_error({ 0xfc, 0x80, 0x80, 0x80, 0xaf });
|
|
}
|
|
|