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