#!/usr/bin/ruby

func ok(a, b) {
    a == b || die "error: #{a} != #{b}";
}

var str = "J\x{332}o\x{332}s\x{332}e\x{301}\x{332}";
ok(str.bytes.len, 14);
ok(str.encode('UTF-8').bytes.len, 14);
ok(str.encode('UTF-16').bytes.len, 20);
ok(str.chars.len, 9);
ok(str.graphs.len, 4);
ok(str.encode('UTF-16').bytes.decode('UTF-16'), str);
ok(str.chars.join, str);
ok(str.bytes.decode, str);
ok(str.encode('UTF-8').bytes.decode, str);

var str_2 = "𝔘𝔫𝔦𝔠𝔬𝔡𝔢";
ok(str_2.chars.len, 7);
ok(str_2.bytes.len, 28);
ok(str_2.bytes.decode, str_2);
ok(str_2.encode('UTF-16').bytes.decode('UTF-16'), str_2);

var str_3 = "møøse";
assert_eq(pack('C*', str_3.bytes...).bytes, str_3.bytes.map{.chr}.join.bytes);
assert_eq(str_3.encode_utf8.bytes.decode('UTF-8'), str_3);
ok(str_3.chars.len, 5);
ok(str_3.bytes.len, 5);
ok(str_3.bytes.map{.chr}.join, str_3);
ok(pack('C*', str_3.bytes...), str_3);
ok(str_3.encode_utf8.bytes.len, 7);
ok(str_3.encode_utf8.bytes.decode, str_3);
ok(str_3.encode('UTF-16').bytes.decode('UTF-16'), str_3);

assert_eq("\37\x8B".bytes, [31, 139])
assert_eq("\37\x8B".bytes_len, 2)
assert_eq("\37\x8B".chars.map{.ord}, [31, 139])
assert_eq([unpack("C*", "\37\x8B")], ["31", "139"])
assert_eq(pack("C*", unpack("C*", "\37\x8B")), "\37\x8B")

do { # non-UTF8 escaped strings
    var s = "\37\x8B\b\0\xD3A\xF1c\0\3+N\xACTP\xF2H\xCD\xC9\xC9\xD7Q(\xCF/\xCAIQT\xE2\2\0u\21\xC9\xF7\24\0\0\0"
    var t = ["C*".unpack(s)].map{.to_i.chr}.join

    assert_eq(t, s)
    assert_eq(t.gunzip, %Q(say "Hello, world!"\n))

    assert_eq(t.bytes, s.bytes)
    assert_eq(s.gunzip, %Q(say "Hello, world!"\n))
}

do {
    var s = "+N\xACTP\xF2H\xCD\xC9\xC9\xD7Q(\xCF/\xCAIQT\xE2\2\0"
    assert_eq(s.inflate, %Q(say "Hello, world!"\n))
}

say "** All tests passed!";
