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

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

use String::Multibyte;

$bytes = String::Multibyte->new('Bytes',1);
$euc   = String::Multibyte->new('EUC',1);
$eucjp = String::Multibyte->new('EUC_JP',1);
$sjis  = String::Multibyte->new('ShiftJIS',1);
$utf8  = String::Multibyte->new('UTF8',1);
$u16be = String::Multibyte->new('UTF16BE',1);
$u16le = String::Multibyte->new('UTF16LE',1);
$u32be = String::Multibyte->new('UTF32BE',1);
$u32le = String::Multibyte->new('UTF32LE',1);

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

#####

print $bytes->length("") == 0
   && $euc  ->length("") == 0
   && $eucjp->length("") == 0
   && $sjis ->length("") == 0
   && $utf8 ->length("") == 0
   && $u16be->length("") == 0
   && $u16le->length("") == 0
   && $u32be->length("") == 0
   && $u32le->length("") == 0
  ? "ok" : "not ok", " 2\n";

print $bytes->length("\x00\x00") == 2
   && $euc  ->length("\x00\x00") == 2
   && $eucjp->length("\x00\x00") == 2
   && $sjis ->length("\x00\x00") == 2
   && $utf8 ->length("\x00\x00") == 2
   && $u16be->length("\x00\x00") == 1
   && $u16le->length("\x00\x00") == 1
   && $u16be->length("\x00\x00\x00\x00") == 2
   && $u16le->length("\x00\x00\x00\x00") == 2
   && $u32be->length("\x00\x00\x00\x00") == 1
   && $u32le->length("\x00\x00\x00\x00") == 1
  ? "ok" : "not ok", " 3\n";

print $sjis ->length("\x81\x40\xAD\x40") == 3
   && $sjis ->length("\xDF\xA1\xAD\xAE") == 4
   && $euc  ->length("\xDF\xA1\xAD\xAE") == 2
   && $euc  ->length("\xA1\xA1\x20\xBD\xBE") == 3
   && $eucjp->length("\xA1\xA1\x20\xBD\xBE") == 3
   && $eucjp->length("\x8F\xA1\xA1\x20\x8F\xBD\xBE") == 3
   && $eucjp->length("\x8E\xA1\x20\x8F\xBD\xBE") == 3
  ? "ok" : "not ok", " 4\n";

print $utf8 ->length("\xC2\xA0\xEF\xBD\xBF\x60") == 3
   && $utf8 ->length("\x41\xE2\x89\xA2\xCE\x91\x2E") == 4
   && $utf8 ->length("\xED\x95\x9C\xEA\xB5\xAD\xEC\x96\xB4") == 3
   && $utf8 ->length("\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E") == 3
  ? "ok" : "not ok", " 5\n";

print $u16be->length("\xD8\x08\xDF\x45\x00\x3D\x00\x52\x00\x61") == 4
   && $u16le->length("\x08\xD8\x45\xDF\x3D\x00\x52\x00\x61\x00") == 4
   && $u16be->length("\x08\xD8\x45\xDF\x3D\x00\x52\x00\x61\x00") == 5
   && $u16le->length("\xD8\x08\xDF\x45\x00\x3D\x00\x52\x00\x61") == 5
  ? "ok" : "not ok", " 6\n";

if ($] < 5.008) {
    print 1 ? "ok" : "not ok", " 7\n";
    print 1 ? "ok" : "not ok", " 8\n";
} else {
    $uni   = String::Multibyte->new('Unicode',1);
    $bytes = String::Multibyte->new('Bytes',1);

    print 0 == $uni->length("")
      &&  3 == $uni->length("abc")
      &&  5 == $uni->length(pack 'U*',
	0xFF71,0xFF72,0xFF73,0xFF74,0xFF75)
      &&  4 == $uni->length(pack 'U*', 0x3042,0x304B,0x3055,0x305F)
      &&  9 == $uni->length('AIUEO'.
	pack 'U*', 0x65E5, 0x672C,0x6F22,0x5B57)
      ? "ok" : "not ok", " 7\n";

    print 0 == $bytes->length("")
      &&  3 == $bytes->length("abc")
      && 15 == $bytes->length(pack 'U*',
	0xFF71,0xFF72,0xFF73,0xFF74,0xFF75)
      && 12 == $bytes->length(pack 'U*', 0x3042,0x304B,0x3055,0x305F)
      && 17 == $bytes->length('AIUEO'.
	pack 'U*', 0x65E5, 0x672C,0x6F22,0x5B57)
      ? "ok" : "not ok", " 8\n";
}

# see perlfaq6
$martian  = String::Multibyte->new({
	charset => "martian",
	regexp => '[A-Z][A-Z]|[^A-Z]',
    },1);

print $martian->length("AAxBGy") == 4
   && $martian->length("") == 0
   && $martian->length("zzz") == 3
   && $martian->length("ZZZZ") == 2
  ? "ok" : "not ok", " 9\n";

1;
__END__