1 2BEGIN { 3 unless ("A" eq pack('U', 0x41)) { 4 print "1..0 # Unicode::Collate " . 5 "cannot stringify a Unicode code point\n"; 6 exit 0; 7 } 8 if ($ENV{PERL_CORE}) { 9 chdir('t') if -d 't'; 10 @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib); 11 } 12} 13 14use strict; 15use warnings; 16BEGIN { $| = 1; print "1..45\n"; } 17my $count = 0; 18sub ok ($;$) { 19 my $p = my $r = shift; 20 if (@_) { 21 my $x = shift; 22 $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x; 23 } 24 print $p ? "ok" : "not ok", ' ', ++$count, "\n"; 25} 26 27use Unicode::Collate; 28 29ok(1); 30 31######################### 32 33my $Collator = Unicode::Collate->new( 34 table => 'keys.txt', 35 normalization => undef, 36); 37 38# [001F] UNIT SEPARATOR 39{ 40 ok($Collator->eq("\0", "\x1F")); 41 ok($Collator->eq("\x1F", "\x{200B}")); 42 ok($Collator->eq("\0", "\x{200B}")); 43 ok($Collator->eq("\x{313}", "\x{343}")); 44 ok($Collator->eq("\x{2000}", "\x{2001}")); 45 ok($Collator->eq("\x{200B}", "\x{200C}")); 46 ok($Collator->eq("\x{304C}", "\x{304B}\x{3099}")); 47 48 $Collator->change(identical => 1); 49 50 ok($Collator->lt("\0", "\x1F")); 51 ok($Collator->lt("\x1F", "\x{200B}")); 52 ok($Collator->lt("\0", "\x{200B}")); 53 ok($Collator->lt("\x{313}", "\x{343}")); 54 ok($Collator->lt("\x{2000}", "\x{2001}")); 55 ok($Collator->lt("\x{200B}", "\x{200C}")); 56 ok($Collator->gt("\x{304C}", "\x{304B}\x{3099}")); 57 58 $Collator->change(identical => 0); 59 60 ok($Collator->eq("\0", "\x1F")); 61 ok($Collator->eq("\x1F", "\x{200B}")); 62 ok($Collator->eq("\0", "\x{200B}")); 63 ok($Collator->eq("\x{313}", "\x{343}")); 64 ok($Collator->eq("\x{2000}", "\x{2001}")); 65 ok($Collator->eq("\x{200B}", "\x{200C}")); 66 ok($Collator->eq("\x{304C}", "\x{304B}\x{3099}")); 67} 68 69#### 22 70 71eval { require Unicode::Normalize }; 72if (!$@) { 73 $Collator->change(normalization => "NFD"); 74 75 $Collator->change(identical => 1); 76 77 ok($Collator->lt("\0", "\x{200B}")); 78 ok($Collator->eq("\x{313}", "\x{343}")); 79 ok($Collator->lt("\x{2000}", "\x{2001}")); 80 ok($Collator->lt("\x{200B}", "\x{200C}")); 81 ok($Collator->eq("\x{304C}", "\x{304B}\x{3099}")); 82 83 $Collator->change(identical => 0); 84 85 ok($Collator->eq("\0", "\x{200B}")); 86 ok($Collator->eq("\x{313}", "\x{343}")); 87 ok($Collator->eq("\x{2000}", "\x{2001}")); 88 ok($Collator->eq("\x{200B}", "\x{200C}")); 89 ok($Collator->eq("\x{304C}", "\x{304B}\x{3099}")); 90} else { 91 ok(1) for 1..10; 92} 93 94$Collator->change(normalization => undef, identical => 1); 95 96##### 32 97 98ok($Collator->viewSortKey("\0"), '[| | | | 0000 0000]'); 99ok($Collator->viewSortKey("\x{200B}"), '[| | | | 0000 200B]'); 100 101ok($Collator->viewSortKey('a'), 102 '[0A15 | 0020 | 0002 | FFFF | 0000 0061]'); 103 104ok($Collator->viewSortKey("\x{304C}"), 105 '[1926 | 0020 013D | 000E 0002 | FFFF FFFF | 0000 304C]'); 106 107ok($Collator->viewSortKey("\x{100000}"), 108 '[FBE0 8000 | 0020 | 0002 | FFFF FFFF | 0010 0000]'); 109 110eval { require Unicode::Normalize }; 111if (!$@) { 112 $Collator->change(normalization => "NFD"); 113 114 ok($Collator->viewSortKey("\x{304C}"), 115 '[1926 | 0020 013D | 000E 0002 | FFFF FFFF | 0000 304B 0000 3099]'); 116} else { 117 ok(1); 118} 119 120$Collator->change(normalization => undef); 121 122##### 38 123 124$Collator->change(level => 3); 125 126ok($Collator->viewSortKey("\x{304C}"), 127 '[1926 | 0020 013D | 000E 0002 | | 0000 304C]'); 128 129$Collator->change(level => 2); 130 131ok($Collator->viewSortKey("\x{304C}"), 132 '[1926 | 0020 013D | | | 0000 304C]'); 133 134$Collator->change(level => 1); 135 136ok($Collator->viewSortKey("\x{304C}"), 137 '[1926 | | | | 0000 304C]'); 138 139##### 41 140 141$Collator->change(UCA_Version => 8); 142 143ok($Collator->viewSortKey("\x{304C}"), 144 '[1926||||0000 304C]'); 145 146$Collator->change(level => 2); 147 148ok($Collator->viewSortKey("\x{304C}"), 149 '[1926|0020 013D|||0000 304C]'); 150 151$Collator->change(level => 3); 152 153ok($Collator->viewSortKey("\x{304C}"), 154 '[1926|0020 013D|000E 0002||0000 304C]'); 155 156$Collator->change(level => 4); 157 158ok($Collator->viewSortKey("\x{304C}"), 159 '[1926|0020 013D|000E 0002|FFFF FFFF|0000 304C]'); 160 161##### 45 162