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

BEGIN {
    unless ("A" eq pack('U', 0x41)) {
	print "1..0 # Unicode::Collate " .
	    "cannot stringify a Unicode code point\n";
	exit 0;
    }
    if ($ENV{PERL_CORE}) {
	chdir('t') if -d 't';
	@INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
    }
}

use strict;
use warnings;
BEGIN { $| = 1; print "1..42\n"; }
my $count = 0;
sub ok ($;$) {
    my $p = my $r = shift;
    if (@_) {
	my $x = shift;
	$p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
    }
    print $p ? "ok" : "not ok", ' ', ++$count, "\n";
}

use Unicode::Collate;

ok(1);

#########################

my $Collator = Unicode::Collate->new(
  table => 'keys.txt',
  normalization => undef,
  ignore_level2 => 1,
  entry => << 'ENTRIES',
1B00  ; [.0000.00FF.0002.1B00] # BALINESE SIGN ULU RICEM
1B01  ; [.0000.0100.0002.1B01] # BALINESE SIGN ULU CANDRA
1B02  ; [.0000.0101.0002.1B02] # BALINESE SIGN CECEK
03C6  ; [.1900.0020.0002.03C6] # GREEK SMALL LETTER PHI
03D5  ; [.1900.0020.0004.03D5] # GREEK PHI SYMBOL; QQK
03A6  ; [.1900.0020.0008.03A6] # GREEK CAPITAL LETTER PHI
ENTRIES
);

ok($Collator->eq("camel", "came\x{300}l"));
ok($Collator->eq("camel", "ca\x{300}me\x{301}l"));
ok($Collator->lt("camel", "Camel"));

# 4

$Collator->change(ignore_level2 => 0);

ok($Collator->lt("camel", "came\x{300}l"));
ok($Collator->lt("camel", "ca\x{300}me\x{301}l"));
ok($Collator->lt("camel", "Camel"));

$Collator->change(level => 1);

ok($Collator->eq("camel", "came\x{300}l"));
ok($Collator->eq("camel", "ca\x{300}me\x{301}l"));
ok($Collator->eq("camel", "Camel"));

$Collator->change(level => 2);

ok($Collator->lt("camel", "came\x{300}l"));
ok($Collator->lt("camel", "ca\x{300}me\x{301}l"));
ok($Collator->eq("camel", "Camel"));

# 13

$Collator->change(ignore_level2 => 1);

ok($Collator->eq("camel", "came\x{300}l"));
ok($Collator->eq("camel", "ca\x{300}me\x{301}l"));
ok($Collator->eq("camel", "Camel"));

$Collator->change(level => 3);

ok($Collator->eq("camel", "came\x{300}l"));
ok($Collator->eq("camel", "ca\x{300}me\x{301}l"));
ok($Collator->lt("camel", "Camel"));

#  secondary: neither 00FF nor 0100 is zero
ok($Collator->eq("camel", "came\x{1B00}l"));
ok($Collator->eq("camel", "came\x{1B01}l"));
ok($Collator->eq("camel", "came\x{1B02}l"));

#  primary: 1900 isn't zero
ok($Collator->lt("\x{3C6}", "\x{3D5}"));
ok($Collator->lt("\x{3D5}", "\x{3A6}"));

# 24

{
    my $s;
    my $txt = "Camel donkey zebra came\x{301}l CAMEL horse cAm\0E\0L.";

    $Collator->change(ignore_level2 => 0, level => 1);

    $s = $txt;
    $Collator->gsubst($s, "camel", sub { "=$_[0]=" });
    ok($s, "=Camel= donkey zebra =came\x{301}l= =CAMEL= horse =cAm\0E\0L=.");

    $Collator->change(level => 2);

    $s = $txt;
    $Collator->gsubst($s, "camel", sub { "=$_[0]=" });
    ok($s, "=Camel= donkey zebra came\x{301}l =CAMEL= horse =cAm\0E\0L=.");

    $Collator->change(level => 3);

    $s = $txt;
    $Collator->gsubst($s, "camel", sub { "=$_[0]=" });
    ok($s, "Camel donkey zebra came\x{301}l CAMEL horse cAm\0E\0L.");

    $Collator->change(ignore_level2 => 1);

    $s = $txt;
    $Collator->gsubst($s, "camel", sub { "=$_[0]=" });
    ok($s, "Camel donkey zebra =came\x{301}l= CAMEL horse cAm\0E\0L.");

    $Collator->change(level => 2);
    $s = $txt;
    $Collator->gsubst($s, "camel", sub { "=$_[0]=" });
    ok($s, "=Camel= donkey zebra =came\x{301}l= =CAMEL= horse =cAm\0E\0L=.");

    $Collator->change(level => 1);
    $s = $txt;
    $Collator->gsubst($s, "camel", sub { "=$_[0]=" });
    ok($s, "=Camel= donkey zebra =came\x{301}l= =CAMEL= horse =cAm\0E\0L=.");

}

# 30

{
    my $c = Unicode::Collate->new(
        table => 'keys.txt', normalization => undef, level => 1,
    );
    my $str = "Camel donkey zebra came\x{301}l CAMEL horse cam\0e\0l...";
    $c->gsubst($str, "camel", sub { "<b>$_[0]</b>" });
    ok($str, "<b>Camel</b> donkey zebra <b>came\x{301}l</b> <b>CAMEL</b> horse <b>cam\0e\0l</b>...");
}

{
    my $c = Unicode::Collate->new(
        table => 'keys.txt', normalization => undef, level => 2,
    );
    my $str = "Camel donkey zebra came\x{301}l CAMEL horse cam\0e\0l...";
    $c->gsubst($str, "camel", sub { "<b>$_[0]</b>" });
    ok($str, "<b>Camel</b> donkey zebra came\x{301}l <b>CAMEL</b> horse <b>cam\0e\0l</b>...");
}

{
    my $c = Unicode::Collate->new(
        table => 'keys.txt', normalization => undef, ignore_level2 => 1,
    );
    my $str = "Camel donkey zebra came\x{301}l CAMEL horse cam\0e\0l...";
    $c->gsubst($str, "camel", sub { "<b>$_[0]</b>" });
    ok($str, "Camel donkey zebra <b>came\x{301}l</b> CAMEL horse <b>cam\0e\0l</b>...");
}

{
    my $c = Unicode::Collate->new(
        table => 'keys.txt', normalization => undef, level => 3,
    );
    my $str = "Camel donkey zebra came\x{301}l CAMEL horse cam\0e\0l...";
    $c->gsubst($str, "camel", sub { "<b>$_[0]</b>" });
    ok($str, "Camel donkey zebra came\x{301}l CAMEL horse <b>cam\0e\0l</b>...");
}

# 34

{
    my $str;
    my $camel = "camel Camel came\x{301}l c-a-m-e-l cam\0e\0l";

    $Collator->change(ignore_level2 => 0);

    $Collator->change(level => 1);
    $str = $camel;
    $Collator->gsubst($str, "camel", sub { "=$_[0]=" });
    ok($str, "=camel= =Camel= =came\x{301}l= =c-a-m-e-l= =cam\0e\0l=");

    $Collator->change(level => 2);
    $str = $camel;
    $Collator->gsubst($str, "camel", sub { "=$_[0]=" });
    ok($str, "=camel= =Camel= came\x{301}l =c-a-m-e-l= =cam\0e\0l=");

    $Collator->change(level => 3);
    $str = $camel;
    $Collator->gsubst($str, "camel", sub { "=$_[0]=" });
    ok($str, "=camel= Camel came\x{301}l =c-a-m-e-l= =cam\0e\0l=");

    $Collator->change(level => 4);
    $str = $camel;
    $Collator->gsubst($str, "camel", sub { "=$_[0]=" });
    ok($str, "=camel= Camel came\x{301}l c-a-m-e-l =cam\0e\0l=");

    $Collator->change(ignore_level2 => 1);

    $Collator->change(level => 1);
    $str = $camel;
    $Collator->gsubst($str, "camel", sub { "=$_[0]=" });
    ok($str, "=camel= =Camel= =came\x{301}l= =c-a-m-e-l= =cam\0e\0l=");

    $Collator->change(level => 2);
    $str = $camel;
    $Collator->gsubst($str, "camel", sub { "=$_[0]=" });
    ok($str, "=camel= =Camel= =came\x{301}l= =c-a-m-e-l= =cam\0e\0l=");

    $Collator->change(level => 3);
    $str = $camel;
    $Collator->gsubst($str, "camel", sub { "=$_[0]=" });
    ok($str, "=camel= Camel =came\x{301}l= =c-a-m-e-l= =cam\0e\0l=");

    $Collator->change(level => 4);
    $str = $camel;
    $Collator->gsubst($str, "camel", sub { "=$_[0]=" });
    ok($str, "=camel= Camel =came\x{301}l= c-a-m-e-l =cam\0e\0l=");
}

# 42