#!perl
BEGIN { $| = 1; print "1..33\n"; }
END {print "not ok 1\n" unless $loaded;}
use String::Multibyte;
$^W = 1;
$loaded = 1;
print "ok 1\n";
# this is a very long test.
# start from NULL till gets undef...
my $time = time;
%MBCS = (
Big5 => {
"last" => "\xFE\xFE", count => 0x80 + 0x7E * 0x9D },
Big5Plus => {
"last" => "\xFE\xFE", count => 0x80 + 0x7E * 0xBE },
Bytes => {
"last" => "\xFF", count => 0x100 },
EUC => {
"last" => "\xFE\xFE", count => 0x80 + 0x5E * 0x5E },
EUC_JP => {
"last" => "\x8F\xFE\xFE", count => 0x80 + 0xBD * 0x5E },
EUC_TW => {
"last" => "\x8E\xB0\xFE\xFE", count => 0x80 + 0x11 * 0x5E * 0x5E },
GB18030 => {
"last" => "\xFE\x39\xFE\x39",
count => 0x81 + 0x7E * 0xBE + 0x7E * 0x7E * 100 },
GBK => {
"last" => "\xFE\xFE", count => 0x81 + 0x7E * 0xBE },
Johab => {
"last" => "\xF9\xFE", count => 0x80 + 0x21 * 0xBC + 11172 + 51 },
ShiftJIS => {
"last" => "\xFC\xFC", count => 0x80 + 0x3F + 0x5E * 120 },
UHC => {
"last" => "\xFE\xFE", count => 0x80 + 0x45 * 0x5E + 11172 },
UTF16BE => {
"last" => "\xDB\xFF\xDF\xFF", count => 0x110000 - 0x800 },
UTF16LE => {
"last" => "\xFF\xDB\xFF\xDF", count => 0x110000 - 0x800 },
UTF32BE => {
"last" => "\x00\x10\xFF\xFF", count => 0x110000 - 0x800 },
UTF32LE => {
"last" => "\xFF\xFF\x10\x00", count => 0x110000 - 0x800 },
UTF8 => {
"last" => "\xF4\x8F\xBF\xBF", count => 0x110000 - 0x800 },
);
for $name (sort keys %MBCS) {
my $mb = String::Multibyte->new($name);
my $last = $MBCS{$name}{last};
my $count = $MBCS{$name}{count};
my $c = 0;
my $NG = 0;
my $ch =
$name =~ /UTF32/ ? "\x00\x00\x00\x00" :
$name =~ /UTF16/ ? "\x00\x00" : "\x00";
use vars qw($re);
$] < 5.005
? $re = '^'.$mb->{regexp}.'(?!\n)$'
: eval q{ $re = qr/^$mb->{regexp}\z/ };
my $nextchar = $mb->{nextchar};
my $cmpchar = $mb->{cmpchar};
while (1) {
$c++;
# printdeb($name, $ch, "\r") if $c % 256 == 0;
$NG++ unless $ch =~ /$re/;
my $next = &$nextchar($ch);
$NG++ unless $ch eq $last
? !defined($next)
: 0 > &$cmpchar($ch, $next);
last if ! defined($next);
$ch = $next;
}
print !$NG ? "ok" : "not ok", " ", ++$loaded, "\n";
print $c == $count ? "ok" : "not ok" , " ", ++$loaded, "\n";
}
print "time: ", time - $time, " sec.\n";
sub printdeb {
# return;
print "$_[0] ".unpack('H*', $_[1]).$_[2];
}
__END__