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