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