The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

BEGIN { $| = 1; print "1..181\n"; }
END {print "not ok 1\n" unless $loaded;}

use ShiftJIS::X0213::MapUTF qw(:all);

use strict;
$^W = 1;
our $loaded = 1;
print "ok 1\n";

#####

our @arys = (
  [ "",   "",   "" ],						#  2.. 19
  [ "\n\n\0\n", "\n\n\0\n", "n:n:0:n" ],			# 20.. 37
  [ "ABC\0\0\0", "\x41\x42\x43\0\0\0", "41:42:43:0:0:0" ],	# 38.. 55
  [ "ABC\n\n", "\x41\x42\x43\n\n", "41:42:43:n:n" ],		# 56.. 73
  [
    "\x82\xa0\x82\xa2\x82\xa4\x81\xe0\x82\xa6\x82\xa8",		# 74.. 91
    "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE2\x89\x92\xE3\x81\x88\xE3\x81\x8A",
    "3042:3044:3046:2252:3048:304a",
  ],
  [
    "\x8a\xbf\x8e\x9a\n\x00\x41\xdf\x81\x40\x88\x9F",		# 92..109
    "\xE6\xBC\xA2\xE5\xAD\x97\n\0\x41\xEF\xBE\x9F\xE3\x80\x80\xE4\xBA\x9C",
    "6f22:5b57:n:0:41:FF9F:3000:4E9C",
  ],
  [
    "abc\x82\xf2pqr\x82\xf2xyz",				#110..127
    "abc\xE3\x82\x94pqr\xE3\x82\x94xyz",
    "61:62:63:3094:70:71:72:3094:78:79:7a",
  ],
  [
    "\xFB\x55\x84\x47\xFB\x5C",					#128..145
    "\xf0\xa8\xaa\x99\xd0\x96\xf0\xa8\xab\xa4",
    "28A99:416:28AE4",
  ],
  [
    "\x82\xF5\x82\xA9",						#146..163
    "\xe3\x81\x8b\xe3\x82\x9a\xe3\x81\x8b",
    "304B:309A:304B",
  ],
  [
    "\x41\x86\x85\x41\x86\x86\x41\x86\x84",			#164..181
    "\x41\xcb\xa9\xcb\xa5\x41\xcb\xa5\xcb\xa9\x41\xcb\xa9",
    "41:02E9:02E5:41:02E5:02E9:41:02E9",
  ],
);

sub uv_to_utf16 {
    my $u = shift;
    return $u if $u <= 0xFFFF;
    return    if $u > 0x10FFFF;
    $u -= 0x10000;
    my $hi = ($u >> 10) + 0xD800;
    my $lo = ($u & 0x3FF) + 0xDC00;
    return $hi, $lo;
}

for my $ary (@arys) {
    my $sjis    = $ary->[0];
    my $sjisre  = defined $ary->[3] ? $ary->[3] : $ary->[0];
    my $utf8    = $ary->[1];
    my @char    = map { $_ eq 'n' ? ord("\n") : hex $_ } split /:/, $ary->[2];
    my $unicode = pack 'U*', @char;
    my $utf16le = pack 'v*', map uv_to_utf16($_), @char;
    my $utf16be = pack 'n*', map uv_to_utf16($_), @char;
    my $utf32le = pack 'V*', @char;
    my $utf32be = pack 'N*', @char;
    my $utf16_l = pack 'v*', 0xFEFF, map uv_to_utf16($_), @char;
    my $utf16_b = pack 'n*', 0xFEFF, map uv_to_utf16($_), @char;
    my $utf16_n = pack 'n*', map uv_to_utf16($_), @char;
    my $utf32_l = pack 'V*', 0xFEFF, @char;
    my $utf32_b = pack 'N*', 0xFEFF, @char;
    my $utf32_n = pack 'N*', @char;

    print $unicode eq sjis0213_to_unicode(sub {""}, $sjis)
	? "ok" : "not ok" , " ", ++$loaded, "\n";

    print $utf8    eq sjis0213_to_utf8(sub {""}, $sjis)
	? "ok" : "not ok" , " ", ++$loaded, "\n";

    print $utf16le eq sjis0213_to_utf16le(sub {""}, $sjis)
	? "ok" : "not ok" , " ", ++$loaded, "\n";

    print $utf16be eq sjis0213_to_utf16be(sub {""}, $sjis)
	? "ok" : "not ok" , " ", ++$loaded, "\n";

    print $utf32le eq sjis0213_to_utf32le(sub {""}, $sjis)
	? "ok" : "not ok" , " ", ++$loaded, "\n";

    print $utf32be eq sjis0213_to_utf32be(sub {""}, $sjis)
	? "ok" : "not ok" , " ", ++$loaded, "\n";

    print $sjisre eq unicode_to_sjis0213(sub {""}, $unicode)
	? "ok" : "not ok" , " ", ++$loaded, "\n";

    print $sjisre eq utf8_to_sjis0213(sub {""}, $utf8)
	? "ok" : "not ok" , " ", ++$loaded, "\n";

    print $sjisre eq utf16le_to_sjis0213(sub {""}, $utf16le)
	? "ok" : "not ok" , " ", ++$loaded, "\n";

    print $sjisre eq utf16be_to_sjis0213(sub {""}, $utf16be)
	? "ok" : "not ok" , " ", ++$loaded, "\n";

    print $sjisre eq utf32le_to_sjis0213(sub {""}, $utf32le)
	? "ok" : "not ok" , " ", ++$loaded, "\n";

    print $sjisre eq utf32be_to_sjis0213(sub {""}, $utf32be)
	? "ok" : "not ok" , " ", ++$loaded, "\n";

    print $sjisre eq utf16_to_sjis0213(sub {""}, $utf16_b)
	? "ok" : "not ok" , " ", ++$loaded, "\n";

    print $sjisre eq utf16_to_sjis0213(sub {""}, $utf16_l)
	? "ok" : "not ok" , " ", ++$loaded, "\n";

    print $sjisre eq utf16_to_sjis0213(sub {""}, $utf16_n)
	? "ok" : "not ok" , " ", ++$loaded, "\n";

    print $sjisre eq utf32_to_sjis0213(sub {""}, $utf32_b)
	? "ok" : "not ok" , " ", ++$loaded, "\n";

    print $sjisre eq utf32_to_sjis0213(sub {""}, $utf32_l)
	? "ok" : "not ok" , " ", ++$loaded, "\n";

    print $sjisre eq utf32_to_sjis0213(sub {""}, $utf32_n)
	? "ok" : "not ok" , " ", ++$loaded, "\n";
}