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