1BEGIN { 2 unless ("A" eq pack('U', 0x41)) { 3 print "1..0 # Unicode::Collate " . 4 "cannot stringify a Unicode code point\n"; 5 exit 0; 6 } 7} 8 9BEGIN { 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 Test; 25BEGIN { plan tests => 100 }; 26 27use strict; 28use warnings; 29use Unicode::Collate; 30 31our $Aring = pack('U', 0xC5); 32our $aring = pack('U', 0xE5); 33 34our $entry = <<'ENTRIES'; 35030A; [.0000.030A.0002] # COMBINING RING ABOVE 36212B; [.002B.0020.0008] # ANGSTROM SIGN 370061; [.0A41.0020.0002] # LATIN SMALL LETTER A 380041; [.0A41.0020.0008] # LATIN CAPITAL LETTER A 39007A; [.0A5A.0020.0002] # LATIN SMALL LETTER Z 40005A; [.0A5A.0020.0008] # LATIN CAPITAL LETTER Z 41FF41; [.0A87.0020.0002] # LATIN SMALL LETTER A 42FF21; [.0A87.0020.0008] # LATIN CAPITAL LETTER A 4300E5; [.0AC5.0020.0002] # LATIN SMALL LETTER A WITH RING ABOVE 4400C5; [.0AC5.0020.0008] # LATIN CAPITAL LETTER A WITH RING ABOVE 45ENTRIES 46 47# Aong < A+ring < Z < fullA+ring < A-ring 48 49######################### 50 51our $noN = Unicode::Collate->new( 52 level => 1, 53 table => undef, 54 normalization => undef, 55 entry => $entry, 56); 57 58our $nfc = Unicode::Collate->new( 59 level => 1, 60 table => undef, 61 normalization => 'NFC', 62 entry => $entry, 63); 64 65our $nfd = Unicode::Collate->new( 66 level => 1, 67 table => undef, 68 normalization => 'NFD', 69 entry => $entry, 70); 71 72our $nfkc = Unicode::Collate->new( 73 level => 1, 74 table => undef, 75 normalization => 'NFKC', 76 entry => $entry, 77); 78 79our $nfkd = Unicode::Collate->new( 80 level => 1, 81 table => undef, 82 normalization => 'NFKD', 83 entry => $entry, 84); 85 86ok($noN->lt("\x{212B}", "A")); 87ok($noN->lt("\x{212B}", $Aring)); 88ok($noN->lt("A\x{30A}", $Aring)); 89ok($noN->lt("A", "\x{FF21}")); 90ok($noN->lt("Z", "\x{FF21}")); 91ok($noN->lt("Z", $Aring)); 92ok($noN->lt("\x{212B}", $aring)); 93ok($noN->lt("A\x{30A}", $aring)); 94ok($noN->lt("Z", $aring)); 95ok($noN->lt("a\x{30A}", "Z")); 96 97ok($nfd->eq("\x{212B}", "A")); 98ok($nfd->eq("\x{212B}", $Aring)); 99ok($nfd->eq("A\x{30A}", $Aring)); 100ok($nfd->lt("A", "\x{FF21}")); 101ok($nfd->lt("Z", "\x{FF21}")); 102ok($nfd->gt("Z", $Aring)); 103ok($nfd->eq("\x{212B}", $aring)); 104ok($nfd->eq("A\x{30A}", $aring)); 105ok($nfd->gt("Z", $aring)); 106ok($nfd->lt("a\x{30A}", "Z")); 107 108ok($nfc->gt("\x{212B}", "A")); 109ok($nfc->eq("\x{212B}", $Aring)); 110ok($nfc->eq("A\x{30A}", $Aring)); 111ok($nfc->lt("A", "\x{FF21}")); 112ok($nfc->lt("Z", "\x{FF21}")); 113ok($nfc->lt("Z", $Aring)); 114ok($nfc->eq("\x{212B}", $aring)); 115ok($nfc->eq("A\x{30A}", $aring)); 116ok($nfc->lt("Z", $aring)); 117ok($nfc->gt("a\x{30A}", "Z")); 118 119ok($nfkd->eq("\x{212B}", "A")); 120ok($nfkd->eq("\x{212B}", $Aring)); 121ok($nfkd->eq("A\x{30A}", $Aring)); 122ok($nfkd->eq("A", "\x{FF21}")); 123ok($nfkd->gt("Z", "\x{FF21}")); 124ok($nfkd->gt("Z", $Aring)); 125ok($nfkd->eq("\x{212B}", $aring)); 126ok($nfkd->eq("A\x{30A}", $aring)); 127ok($nfkd->gt("Z", $aring)); 128ok($nfkd->lt("a\x{30A}", "Z")); 129 130ok($nfkc->gt("\x{212B}", "A")); 131ok($nfkc->eq("\x{212B}", $Aring)); 132ok($nfkc->eq("A\x{30A}", $Aring)); 133ok($nfkc->eq("A", "\x{FF21}")); 134ok($nfkc->gt("Z", "\x{FF21}")); 135ok($nfkc->lt("Z", $Aring)); 136ok($nfkc->eq("\x{212B}", $aring)); 137ok($nfkc->eq("A\x{30A}", $aring)); 138ok($nfkc->lt("Z", $aring)); 139ok($nfkc->gt("a\x{30A}", "Z")); 140 141$nfd->change(normalization => undef); 142 143ok($nfd->lt("\x{212B}", "A")); 144ok($nfd->lt("\x{212B}", $Aring)); 145ok($nfd->lt("A\x{30A}", $Aring)); 146ok($nfd->lt("A", "\x{FF21}")); 147ok($nfd->lt("Z", "\x{FF21}")); 148ok($nfd->lt("Z", $Aring)); 149ok($nfd->lt("\x{212B}", $aring)); 150ok($nfd->lt("A\x{30A}", $aring)); 151ok($nfd->lt("Z", $aring)); 152ok($nfd->lt("a\x{30A}", "Z")); 153 154$nfd->change(normalization => 'C'); 155 156ok($nfd->gt("\x{212B}", "A")); 157ok($nfd->eq("\x{212B}", $Aring)); 158ok($nfd->eq("A\x{30A}", $Aring)); 159ok($nfd->lt("A", "\x{FF21}")); 160ok($nfd->lt("Z", "\x{FF21}")); 161ok($nfd->lt("Z", $Aring)); 162ok($nfd->eq("\x{212B}", $aring)); 163ok($nfd->eq("A\x{30A}", $aring)); 164ok($nfd->lt("Z", $aring)); 165ok($nfd->gt("a\x{30A}", "Z")); 166 167$nfd->change(normalization => 'D'); 168 169ok($nfd->eq("\x{212B}", "A")); 170ok($nfd->eq("\x{212B}", $Aring)); 171ok($nfd->eq("A\x{30A}", $Aring)); 172ok($nfd->lt("A", "\x{FF21}")); 173ok($nfd->lt("Z", "\x{FF21}")); 174ok($nfd->gt("Z", $Aring)); 175ok($nfd->eq("\x{212B}", $aring)); 176ok($nfd->eq("A\x{30A}", $aring)); 177ok($nfd->gt("Z", $aring)); 178ok($nfd->lt("a\x{30A}", "Z")); 179 180$nfd->change(normalization => 'KD'); 181 182ok($nfd->eq("\x{212B}", "A")); 183ok($nfd->eq("\x{212B}", $Aring)); 184ok($nfd->eq("A\x{30A}", $Aring)); 185ok($nfd->eq("A", "\x{FF21}")); 186ok($nfd->gt("Z", "\x{FF21}")); 187ok($nfd->gt("Z", $Aring)); 188ok($nfd->eq("\x{212B}", $aring)); 189ok($nfd->eq("A\x{30A}", $aring)); 190ok($nfd->gt("Z", $aring)); 191ok($nfd->lt("a\x{30A}", "Z")); 192 193$nfd->change(normalization => 'KC'); 194 195ok($nfd->gt("\x{212B}", "A")); 196ok($nfd->eq("\x{212B}", $Aring)); 197ok($nfd->eq("A\x{30A}", $Aring)); 198ok($nfd->eq("A", "\x{FF21}")); 199ok($nfd->gt("Z", "\x{FF21}")); 200ok($nfd->lt("Z", $Aring)); 201ok($nfd->eq("\x{212B}", $aring)); 202ok($nfd->eq("A\x{30A}", $aring)); 203ok($nfd->lt("Z", $aring)); 204ok($nfd->gt("a\x{30A}", "Z")); 205 206