The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

BEGIN { $| = 1; print "1..8\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->strrev("") eq ""
   && $euc  ->strrev("") eq ""
   && $eucjp->strrev("") eq ""
   && $sjis ->strrev("") eq ""
   && $utf8 ->strrev("") eq ""
   && $u16be->strrev("") eq ""
   && $u16le->strrev("") eq ""
   && $u32be->strrev("") eq ""
   && $u32le->strrev("") eq ""
  ? "ok" : "not ok", " 2\n";

print $bytes ->strrev("\x00\x00") eq "\x00\x00"
   && $euc  ->strrev("\x00\x00") eq "\x00\x00"
   && $eucjp->strrev("\x00\x00") eq "\x00\x00"
   && $sjis ->strrev("\x00\x00") eq "\x00\x00"
   && $utf8 ->strrev("\x00\x00") eq "\x00\x00"
   && $u16be->strrev("\x00\x00") eq "\x00\x00"
   && $u16le->strrev("\x00\x00") eq "\x00\x00"
  ? "ok" : "not ok", " 3\n";

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

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

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

print $u32be->strrev("\0\0\x30\x42\x00\x01\xFF\xFE\0\0\x00\x41")
	eq "\0\0\x00\x41\x00\x01\xFF\xFE\0\0\x30\x42"
   && $u32le->strrev("\x42\x30\0\0\xFE\xFF\x01\x00\x41\x00\0\0")
	eq "\x41\x00\0\0\xFE\xFF\x01\x00\x42\x30\0\0"
   && $u32be->strrev("\0\0\x30\x00\x00\x01\x00\x00\0\0\x00\x41")
	eq "\0\0\x00\x41\x00\x01\x00\x00\0\0\x30\x00"
   && $u32le->strrev("\x00\x30\0\0\x00\x00\x01\x00\x41\x00\0\0")
	eq "\x41\x00\0\0\x00\x00\x01\x00\x00\x30\0\0"
    ? "ok" : "not ok", " 7\n";

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

print $martian->strrev("AAxBGy") eq "yBGxAA"
   && $martian->strrev("") eq ""
   && $martian->strrev("xyz") eq "zyx"
   && $martian->strrev("zXZq") eq "qXZz"
   && $martian->strrev("ZZZZ") eq "ZZZZ"
   && $martian->strrev("zzz") eq "zzz"
  ? "ok" : "not ok", " 8\n";

1;
__END__