53 lines
1.4 KiB
Plaintext
53 lines
1.4 KiB
Plaintext
// 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);
|
|
};
|