1BEGIN { 2 unless ('A' eq pack('U', 0x41)) { 3 print "1..0 # Unicode::Collate cannot pack a Unicode code point\n"; 4 exit 0; 5 } 6 unless (0x41 == unpack('U', 'A')) { 7 print "1..0 # Unicode::Collate cannot get a Unicode code point\n"; 8 exit 0; 9 } 10 if ($ENV{PERL_CORE}) { 11 chdir('t') if -d 't'; 12 @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib); 13 } 14} 15 16BEGIN { 17 eval { require Unicode::Normalize; }; 18 if ($@) { 19 print "1..0 # skipped: Unicode::Normalize needed for this test\n"; 20 print $@; 21 exit; 22 } 23} 24use strict; 25use warnings; 26BEGIN { $| = 1; print "1..100\n"; } 27my $count = 0; 28sub ok ($;$) { 29 my $p = my $r = shift; 30 if (@_) { 31 my $x = shift; 32 $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x; 33 } 34 print $p ? "ok" : "not ok", ' ', ++$count, "\n"; 35} 36 37use Unicode::Collate; 38 39our $Aring = pack('U', 0xC5); 40our $aring = pack('U', 0xE5); 41 42our $entry = <<'ENTRIES'; 43030A; [.0000.030A.0002] # COMBINING RING ABOVE 44212B; [.002B.0020.0008] # ANGSTROM SIGN 450061; [.0A41.0020.0002] # LATIN SMALL LETTER A 460041; [.0A41.0020.0008] # LATIN CAPITAL LETTER A 47007A; [.0A5A.0020.0002] # LATIN SMALL LETTER Z 48005A; [.0A5A.0020.0008] # LATIN CAPITAL LETTER Z 49FF41; [.0A87.0020.0002] # LATIN SMALL LETTER A 50FF21; [.0A87.0020.0008] # LATIN CAPITAL LETTER A 5100E5; [.0AC5.0020.0002] # LATIN SMALL LETTER A WITH RING ABOVE 5200C5; [.0AC5.0020.0008] # LATIN CAPITAL LETTER A WITH RING ABOVE 53ENTRIES 54 55# Aong < A+ring < Z < fullA+ring < A-ring 56 57######################### 58 59our $noN = Unicode::Collate->new( 60 level => 1, 61 table => undef, 62 normalization => undef, 63 entry => $entry, 64); 65 66our $nfc = Unicode::Collate->new( 67 level => 1, 68 table => undef, 69 normalization => 'NFC', 70 entry => $entry, 71); 72 73our $nfd = Unicode::Collate->new( 74 level => 1, 75 table => undef, 76 normalization => 'NFD', 77 entry => $entry, 78); 79 80our $nfkc = Unicode::Collate->new( 81 level => 1, 82 table => undef, 83 normalization => 'NFKC', 84 entry => $entry, 85); 86 87our $nfkd = Unicode::Collate->new( 88 level => 1, 89 table => undef, 90 normalization => 'NFKD', 91 entry => $entry, 92); 93 94ok($noN->lt("\x{212B}", "A")); 95ok($noN->lt("\x{212B}", $Aring)); 96ok($noN->lt("A\x{30A}", $Aring)); 97ok($noN->lt("A", "\x{FF21}")); 98ok($noN->lt("Z", "\x{FF21}")); 99ok($noN->lt("Z", $Aring)); 100ok($noN->lt("\x{212B}", $aring)); 101ok($noN->lt("A\x{30A}", $aring)); 102ok($noN->lt("Z", $aring)); 103ok($noN->lt("a\x{30A}", "Z")); 104 105ok($nfd->eq("\x{212B}", "A")); 106ok($nfd->eq("\x{212B}", $Aring)); 107ok($nfd->eq("A\x{30A}", $Aring)); 108ok($nfd->lt("A", "\x{FF21}")); 109ok($nfd->lt("Z", "\x{FF21}")); 110ok($nfd->gt("Z", $Aring)); 111ok($nfd->eq("\x{212B}", $aring)); 112ok($nfd->eq("A\x{30A}", $aring)); 113ok($nfd->gt("Z", $aring)); 114ok($nfd->lt("a\x{30A}", "Z")); 115 116ok($nfc->gt("\x{212B}", "A")); 117ok($nfc->eq("\x{212B}", $Aring)); 118ok($nfc->eq("A\x{30A}", $Aring)); 119ok($nfc->lt("A", "\x{FF21}")); 120ok($nfc->lt("Z", "\x{FF21}")); 121ok($nfc->lt("Z", $Aring)); 122ok($nfc->eq("\x{212B}", $aring)); 123ok($nfc->eq("A\x{30A}", $aring)); 124ok($nfc->lt("Z", $aring)); 125ok($nfc->gt("a\x{30A}", "Z")); 126 127ok($nfkd->eq("\x{212B}", "A")); 128ok($nfkd->eq("\x{212B}", $Aring)); 129ok($nfkd->eq("A\x{30A}", $Aring)); 130ok($nfkd->eq("A", "\x{FF21}")); 131ok($nfkd->gt("Z", "\x{FF21}")); 132ok($nfkd->gt("Z", $Aring)); 133ok($nfkd->eq("\x{212B}", $aring)); 134ok($nfkd->eq("A\x{30A}", $aring)); 135ok($nfkd->gt("Z", $aring)); 136ok($nfkd->lt("a\x{30A}", "Z")); 137 138ok($nfkc->gt("\x{212B}", "A")); 139ok($nfkc->eq("\x{212B}", $Aring)); 140ok($nfkc->eq("A\x{30A}", $Aring)); 141ok($nfkc->eq("A", "\x{FF21}")); 142ok($nfkc->gt("Z", "\x{FF21}")); 143ok($nfkc->lt("Z", $Aring)); 144ok($nfkc->eq("\x{212B}", $aring)); 145ok($nfkc->eq("A\x{30A}", $aring)); 146ok($nfkc->lt("Z", $aring)); 147ok($nfkc->gt("a\x{30A}", "Z")); 148 149$nfd->change(normalization => undef); 150 151ok($nfd->lt("\x{212B}", "A")); 152ok($nfd->lt("\x{212B}", $Aring)); 153ok($nfd->lt("A\x{30A}", $Aring)); 154ok($nfd->lt("A", "\x{FF21}")); 155ok($nfd->lt("Z", "\x{FF21}")); 156ok($nfd->lt("Z", $Aring)); 157ok($nfd->lt("\x{212B}", $aring)); 158ok($nfd->lt("A\x{30A}", $aring)); 159ok($nfd->lt("Z", $aring)); 160ok($nfd->lt("a\x{30A}", "Z")); 161 162$nfd->change(normalization => 'C'); 163 164ok($nfd->gt("\x{212B}", "A")); 165ok($nfd->eq("\x{212B}", $Aring)); 166ok($nfd->eq("A\x{30A}", $Aring)); 167ok($nfd->lt("A", "\x{FF21}")); 168ok($nfd->lt("Z", "\x{FF21}")); 169ok($nfd->lt("Z", $Aring)); 170ok($nfd->eq("\x{212B}", $aring)); 171ok($nfd->eq("A\x{30A}", $aring)); 172ok($nfd->lt("Z", $aring)); 173ok($nfd->gt("a\x{30A}", "Z")); 174 175$nfd->change(normalization => 'D'); 176 177ok($nfd->eq("\x{212B}", "A")); 178ok($nfd->eq("\x{212B}", $Aring)); 179ok($nfd->eq("A\x{30A}", $Aring)); 180ok($nfd->lt("A", "\x{FF21}")); 181ok($nfd->lt("Z", "\x{FF21}")); 182ok($nfd->gt("Z", $Aring)); 183ok($nfd->eq("\x{212B}", $aring)); 184ok($nfd->eq("A\x{30A}", $aring)); 185ok($nfd->gt("Z", $aring)); 186ok($nfd->lt("a\x{30A}", "Z")); 187 188$nfd->change(normalization => 'KD'); 189 190ok($nfd->eq("\x{212B}", "A")); 191ok($nfd->eq("\x{212B}", $Aring)); 192ok($nfd->eq("A\x{30A}", $Aring)); 193ok($nfd->eq("A", "\x{FF21}")); 194ok($nfd->gt("Z", "\x{FF21}")); 195ok($nfd->gt("Z", $Aring)); 196ok($nfd->eq("\x{212B}", $aring)); 197ok($nfd->eq("A\x{30A}", $aring)); 198ok($nfd->gt("Z", $aring)); 199ok($nfd->lt("a\x{30A}", "Z")); 200 201$nfd->change(normalization => 'KC'); 202 203ok($nfd->gt("\x{212B}", "A")); 204ok($nfd->eq("\x{212B}", $Aring)); 205ok($nfd->eq("A\x{30A}", $Aring)); 206ok($nfd->eq("A", "\x{FF21}")); 207ok($nfd->gt("Z", "\x{FF21}")); 208ok($nfd->lt("Z", $Aring)); 209ok($nfd->eq("\x{212B}", $aring)); 210ok($nfd->eq("A\x{30A}", $aring)); 211ok($nfd->lt("Z", $aring)); 212ok($nfd->gt("a\x{30A}", "Z")); 213 214