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..70\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 33sub _pack_U { Unicode::Collate::pack_U(@_) } 34sub _unpack_U { Unicode::Collate::unpack_U(@_) } 35 36my $A_acute = _pack_U(0xC1); 37my $a_acute = _pack_U(0xE1); 38my $acute = _pack_U(0x0301); 39 40my $hiragana = "\x{3042}\x{3044}"; 41my $katakana = "\x{30A2}\x{30A4}"; 42 43my $Collator = Unicode::Collate->new( 44 normalization => undef, 45); 46 47ok(ref $Collator, "Unicode::Collate"); 48 49ok($Collator->version, Unicode::Collate::Base_Unicode_Version); 50ok($Collator->version(), Unicode::Collate->Base_Unicode_Version); 51ok($Collator->version, $Collator->Base_Unicode_Version); 52ok($Collator->version(), $Collator->Base_Unicode_Version()); 53 54# 6 55 56ok($Collator->cmp("", ""), 0); 57ok($Collator->eq("", "")); 58ok($Collator->cmp("", "perl"), -1); 59 60ok( 61 join(':', $Collator->sort( qw/ acha aca ada acia acka / ) ), 62 join(':', qw/ aca acha acia acka ada / ), 63); 64 65ok( 66 join(':', $Collator->sort( qw/ ACHA ACA ADA ACIA ACKA / ) ), 67 join(':', qw/ ACA ACHA ACIA ACKA ADA / ), 68); 69 70# 11 71 72ok($Collator->cmp("A$acute", $A_acute), 0); # @version 3.1.1 (prev: -1) 73ok($Collator->cmp($a_acute, $A_acute), -1); 74ok($Collator->eq("A\cA$acute", $A_acute)); # UCA v9. \cA is invariant. 75 76my %old_level = $Collator->change(level => 1); 77ok($Collator->eq("A$acute", $A_acute)); 78ok($Collator->eq("A", $A_acute)); 79 80ok($Collator->change(level => 2)->eq($a_acute, $A_acute)); 81ok($Collator->lt("A", $A_acute)); 82 83ok($Collator->change(%old_level)->lt("A", $A_acute)); 84ok($Collator->lt("A", $A_acute)); 85ok($Collator->lt("A", $a_acute)); 86ok($Collator->lt($a_acute, $A_acute)); 87 88# 22 89 90$Collator->change(level => 2); 91 92ok($Collator->{level}, 2); 93 94ok( $Collator->cmp("ABC","abc"), 0); 95ok( $Collator->eq("ABC","abc") ); 96ok( $Collator->le("ABC","abc") ); 97ok( $Collator->cmp($hiragana, $katakana), 0); 98ok( $Collator->eq($hiragana, $katakana) ); 99ok( $Collator->ge($hiragana, $katakana) ); 100 101# 29 102 103# hangul 104ok( $Collator->eq("a\x{AC00}b", "a\x{1100}\x{1161}b") ); 105ok( $Collator->eq("a\x{AE00}b", "a\x{1100}\x{1173}\x{11AF}b") ); 106ok( $Collator->gt("a\x{AE00}b", "a\x{1100}\x{1173}b\x{11AF}") ); 107ok( $Collator->lt("a\x{AC00}b", "a\x{AE00}b") ); 108ok( $Collator->gt("a\x{D7A3}b", "a\x{C544}b") ); 109ok( $Collator->lt("a\x{C544}b", "a\x{30A2}b") ); # hangul < hiragana 110 111# 35 112 113$Collator->change(%old_level, katakana_before_hiragana => 1); 114 115ok($Collator->{level}, 4); 116 117ok( $Collator->cmp("abc", "ABC"), -1); 118ok( $Collator->ne("abc", "ABC") ); 119ok( $Collator->lt("abc", "ABC") ); 120ok( $Collator->le("abc", "ABC") ); 121ok( $Collator->cmp($hiragana, $katakana), 1); 122ok( $Collator->ne($hiragana, $katakana) ); 123ok( $Collator->gt($hiragana, $katakana) ); 124ok( $Collator->ge($hiragana, $katakana) ); 125 126# 44 127 128$Collator->change(upper_before_lower => 1); 129 130ok( $Collator->cmp("abc", "ABC"), 1); 131ok( $Collator->ge("abc", "ABC"), 1); 132ok( $Collator->gt("abc", "ABC"), 1); 133ok( $Collator->cmp($hiragana, $katakana), 1); 134ok( $Collator->ge($hiragana, $katakana), 1); 135ok( $Collator->gt($hiragana, $katakana), 1); 136 137# 50 138 139$Collator->change(katakana_before_hiragana => 0); 140 141ok( $Collator->cmp("abc", "ABC"), 1); 142ok( $Collator->cmp($hiragana, $katakana), -1); 143 144# 52 145 146$Collator->change(upper_before_lower => 0); 147 148ok( $Collator->cmp("abc", "ABC"), -1); 149ok( $Collator->le("abc", "ABC") ); 150ok( $Collator->cmp($hiragana, $katakana), -1); 151ok( $Collator->lt($hiragana, $katakana) ); 152 153# 56 154 155$Collator->change(level => 1); 156 157my $Tailored = Unicode::Collate->new( 158 normalization => undef, 159 suppress => [0x400..0x4FF], 160 level => 1, 161 entry => '0000 ; [.FFFE.0020.0005.0000]', 162); 163 164# Ka vs Kje 165ok($Collator->gt("\x{45C}", "\x{43A}")); 166ok($Collator->gt("\x{40C}", "\x{41A}")); 167ok($Tailored->gt("\x{45C}", "\x{43A}")); 168ok($Tailored->gt("\x{40C}", "\x{41A}")); 169 170# 60 171 172ok($Collator->eq("abc\0", "abc")); 173ok($Tailored->gt("abc\0", "abc\x{4E00}")); 174ok($Tailored->gt("abc\0", "abc\x{FFFD}")); 175ok($Tailored->gt("abc\0", "abc\x{FFFD}")); 176 177# 64 178 179$Tailored->change(UCA_Version => 9); 180 181ok($Tailored->gt("abc\0", "abc\x{4E00}")); 182ok($Tailored->gt("abc\0", "abc\x{FFFD}")); 183ok($Tailored->gt("abc\0", "abc\x{FFFD}")); 184 185# 67 186 187$Tailored->change(UCA_Version => 8); 188 189ok($Tailored->gt("abc\0", "abc\x{4E00}")); 190ok($Tailored->gt("abc\0", "abc\x{FFFD}")); 191ok($Tailored->gt("abc\0", "abc\x{FFFD}")); 192 193# 70 194