// Vectors mirror ref/hare/encoding/utf8/encode.ha. A failing row aborts // via the assert/abort builtin (task #5 @test conversion). package utf8_test; import encoding.utf8; import test; // ref/hare/encoding/utf8/encode.ha:7. Byte vectors come from the // Unicode specification (UAX standard examples). @test fn encode_ascii() void = { let out: [4]u8; let n: i32 = utf8.encoderune(out[0:4], 0x41u32: rune); // 'A' assert(!(n != 1)); assert(!(out[0] != 0x41u8)); }; @test fn encode_two_byte() void = { let out: [4]u8; let n: i32 = utf8.encoderune(out[0:4], 0xE9u32: rune); // 'é' U+00E9 assert(!(n != 2)); assert(!(out[0] != 0xC3u8)); assert(!(out[1] != 0xA9u8)); }; @test fn encode_three_byte() void = { let out: [4]u8; let n: i32 = utf8.encoderune(out[0:4], 0x20ACu32: rune); // '€' U+20AC assert(!(n != 3)); assert(!(out[0] != 0xE2u8)); assert(!(out[1] != 0x82u8)); assert(!(out[2] != 0xACu8)); }; @test fn encode_four_byte() void = { let out: [4]u8; let n: i32 = utf8.encoderune(out[0:4], 0x1F980u32: rune); // '🦀' U+1F980 assert(!(n != 4)); assert(!(out[0] != 0xF0u8)); assert(!(out[1] != 0x9Fu8)); assert(!(out[2] != 0xA6u8)); assert(!(out[3] != 0x80u8)); }; // The ww API writes into caller storage, unlike Hare's static-buffer return. // A short slice must fail before the first out-of-bounds store. @test fn encode_short_buffer_aborts() void = { test.expectabort(); let out: [1]u8; utf8.encoderune(out[0:1], 0xE9u32: rune); };