1898184e3Ssthen 2898184e3SsthenBEGIN { 3898184e3Ssthen if ($ENV{PERL_CORE}) { 4898184e3Ssthen chdir('t') if -d 't'; 5898184e3Ssthen @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib); 6898184e3Ssthen } 7898184e3Ssthen} 8898184e3Ssthen 9898184e3Ssthenuse strict; 10898184e3Ssthenuse warnings; 1191f110e0Safresh1BEGIN { $| = 1; print "1..70\n"; } 12898184e3Ssthenmy $count = 0; 13898184e3Ssthensub ok ($;$) { 14898184e3Ssthen my $p = my $r = shift; 15898184e3Ssthen if (@_) { 16898184e3Ssthen my $x = shift; 17898184e3Ssthen $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x; 18898184e3Ssthen } 19898184e3Ssthen print $p ? "ok" : "not ok", ' ', ++$count, "\n"; 20898184e3Ssthen} 21898184e3Ssthen 22898184e3Ssthenuse Unicode::Collate; 23898184e3Ssthen 24898184e3Ssthenok(1); 25898184e3Ssthen 26898184e3Ssthensub _pack_U { Unicode::Collate::pack_U(@_) } 27898184e3Ssthensub _unpack_U { Unicode::Collate::unpack_U(@_) } 28898184e3Ssthen 29*256a93a4Safresh1######################### 30*256a93a4Safresh1 31898184e3Ssthenmy $A_acute = _pack_U(0xC1); 32898184e3Ssthenmy $a_acute = _pack_U(0xE1); 33898184e3Ssthenmy $acute = _pack_U(0x0301); 34898184e3Ssthen 35898184e3Ssthenmy $hiragana = "\x{3042}\x{3044}"; 36898184e3Ssthenmy $katakana = "\x{30A2}\x{30A4}"; 37898184e3Ssthen 38898184e3Ssthenmy $Collator = Unicode::Collate->new( 39898184e3Ssthen normalization => undef, 40898184e3Ssthen); 41898184e3Ssthen 42898184e3Ssthenok(ref $Collator, "Unicode::Collate"); 43898184e3Ssthen 44898184e3Ssthenok($Collator->version, Unicode::Collate::Base_Unicode_Version); 45898184e3Ssthenok($Collator->version(), Unicode::Collate->Base_Unicode_Version); 46898184e3Ssthenok($Collator->version, $Collator->Base_Unicode_Version); 47898184e3Ssthenok($Collator->version(), $Collator->Base_Unicode_Version()); 48898184e3Ssthen 4991f110e0Safresh1# 6 5091f110e0Safresh1 51898184e3Ssthenok($Collator->cmp("", ""), 0); 52898184e3Ssthenok($Collator->eq("", "")); 53898184e3Ssthenok($Collator->cmp("", "perl"), -1); 54898184e3Ssthen 55898184e3Ssthenok( 56898184e3Ssthen join(':', $Collator->sort( qw/ acha aca ada acia acka / ) ), 57898184e3Ssthen join(':', qw/ aca acha acia acka ada / ), 58898184e3Ssthen); 59898184e3Ssthen 60898184e3Ssthenok( 61898184e3Ssthen join(':', $Collator->sort( qw/ ACHA ACA ADA ACIA ACKA / ) ), 62898184e3Ssthen join(':', qw/ ACA ACHA ACIA ACKA ADA / ), 63898184e3Ssthen); 64898184e3Ssthen 6591f110e0Safresh1# 11 66898184e3Ssthen 67898184e3Ssthenok($Collator->cmp("A$acute", $A_acute), 0); # @version 3.1.1 (prev: -1) 68898184e3Ssthenok($Collator->cmp($a_acute, $A_acute), -1); 69898184e3Ssthenok($Collator->eq("A\cA$acute", $A_acute)); # UCA v9. \cA is invariant. 70898184e3Ssthen 71898184e3Ssthenmy %old_level = $Collator->change(level => 1); 72898184e3Ssthenok($Collator->eq("A$acute", $A_acute)); 73898184e3Ssthenok($Collator->eq("A", $A_acute)); 74898184e3Ssthen 75898184e3Ssthenok($Collator->change(level => 2)->eq($a_acute, $A_acute)); 76898184e3Ssthenok($Collator->lt("A", $A_acute)); 77898184e3Ssthen 78898184e3Ssthenok($Collator->change(%old_level)->lt("A", $A_acute)); 79898184e3Ssthenok($Collator->lt("A", $A_acute)); 80898184e3Ssthenok($Collator->lt("A", $a_acute)); 81898184e3Ssthenok($Collator->lt($a_acute, $A_acute)); 82898184e3Ssthen 8391f110e0Safresh1# 22 84898184e3Ssthen 85898184e3Ssthen$Collator->change(level => 2); 86898184e3Ssthen 87898184e3Ssthenok($Collator->{level}, 2); 88898184e3Ssthen 89898184e3Ssthenok( $Collator->cmp("ABC","abc"), 0); 90898184e3Ssthenok( $Collator->eq("ABC","abc") ); 91898184e3Ssthenok( $Collator->le("ABC","abc") ); 92898184e3Ssthenok( $Collator->cmp($hiragana, $katakana), 0); 93898184e3Ssthenok( $Collator->eq($hiragana, $katakana) ); 94898184e3Ssthenok( $Collator->ge($hiragana, $katakana) ); 95898184e3Ssthen 9691f110e0Safresh1# 29 97898184e3Ssthen 98898184e3Ssthen# hangul 99898184e3Ssthenok( $Collator->eq("a\x{AC00}b", "a\x{1100}\x{1161}b") ); 100898184e3Ssthenok( $Collator->eq("a\x{AE00}b", "a\x{1100}\x{1173}\x{11AF}b") ); 101898184e3Ssthenok( $Collator->gt("a\x{AE00}b", "a\x{1100}\x{1173}b\x{11AF}") ); 102898184e3Ssthenok( $Collator->lt("a\x{AC00}b", "a\x{AE00}b") ); 103898184e3Ssthenok( $Collator->gt("a\x{D7A3}b", "a\x{C544}b") ); 104898184e3Ssthenok( $Collator->lt("a\x{C544}b", "a\x{30A2}b") ); # hangul < hiragana 105898184e3Ssthen 10691f110e0Safresh1# 35 107898184e3Ssthen 108898184e3Ssthen$Collator->change(%old_level, katakana_before_hiragana => 1); 109898184e3Ssthen 110898184e3Ssthenok($Collator->{level}, 4); 111898184e3Ssthen 112898184e3Ssthenok( $Collator->cmp("abc", "ABC"), -1); 113898184e3Ssthenok( $Collator->ne("abc", "ABC") ); 114898184e3Ssthenok( $Collator->lt("abc", "ABC") ); 115898184e3Ssthenok( $Collator->le("abc", "ABC") ); 116898184e3Ssthenok( $Collator->cmp($hiragana, $katakana), 1); 117898184e3Ssthenok( $Collator->ne($hiragana, $katakana) ); 118898184e3Ssthenok( $Collator->gt($hiragana, $katakana) ); 119898184e3Ssthenok( $Collator->ge($hiragana, $katakana) ); 120898184e3Ssthen 12191f110e0Safresh1# 44 122898184e3Ssthen 123898184e3Ssthen$Collator->change(upper_before_lower => 1); 124898184e3Ssthen 125898184e3Ssthenok( $Collator->cmp("abc", "ABC"), 1); 126898184e3Ssthenok( $Collator->ge("abc", "ABC"), 1); 127898184e3Ssthenok( $Collator->gt("abc", "ABC"), 1); 128898184e3Ssthenok( $Collator->cmp($hiragana, $katakana), 1); 129898184e3Ssthenok( $Collator->ge($hiragana, $katakana), 1); 130898184e3Ssthenok( $Collator->gt($hiragana, $katakana), 1); 131898184e3Ssthen 13291f110e0Safresh1# 50 133898184e3Ssthen 134898184e3Ssthen$Collator->change(katakana_before_hiragana => 0); 135898184e3Ssthen 136898184e3Ssthenok( $Collator->cmp("abc", "ABC"), 1); 137898184e3Ssthenok( $Collator->cmp($hiragana, $katakana), -1); 138898184e3Ssthen 13991f110e0Safresh1# 52 140898184e3Ssthen 141898184e3Ssthen$Collator->change(upper_before_lower => 0); 142898184e3Ssthen 143898184e3Ssthenok( $Collator->cmp("abc", "ABC"), -1); 144898184e3Ssthenok( $Collator->le("abc", "ABC") ); 145898184e3Ssthenok( $Collator->cmp($hiragana, $katakana), -1); 146898184e3Ssthenok( $Collator->lt($hiragana, $katakana) ); 147898184e3Ssthen 14891f110e0Safresh1# 56 149898184e3Ssthen 150898184e3Ssthen$Collator->change(level => 1); 151898184e3Ssthen 15291f110e0Safresh1my $Tailored = Unicode::Collate->new( 153898184e3Ssthen normalization => undef, 154898184e3Ssthen suppress => [0x400..0x4FF], 155898184e3Ssthen level => 1, 15691f110e0Safresh1 entry => '0000 ; [.FFFE.0020.0005.0000]', 157898184e3Ssthen); 158898184e3Ssthen 159898184e3Ssthen# Ka vs Kje 1605759b3d2Safresh1ok($Collator->eq("\x{45C}", "\x{43A}")); 1615759b3d2Safresh1ok($Collator->eq("\x{40C}", "\x{41A}")); 1625759b3d2Safresh1ok($Tailored->eq("\x{45C}", "\x{43A}")); 1635759b3d2Safresh1ok($Tailored->eq("\x{40C}", "\x{41A}")); 164898184e3Ssthen 16591f110e0Safresh1# 60 16691f110e0Safresh1 16791f110e0Safresh1ok($Collator->eq("abc\0", "abc")); 16891f110e0Safresh1ok($Tailored->gt("abc\0", "abc\x{4E00}")); 16991f110e0Safresh1ok($Tailored->gt("abc\0", "abc\x{FFFD}")); 17091f110e0Safresh1ok($Tailored->gt("abc\0", "abc\x{FFFD}")); 17191f110e0Safresh1 17291f110e0Safresh1# 64 17391f110e0Safresh1 17491f110e0Safresh1$Tailored->change(UCA_Version => 9); 17591f110e0Safresh1 17691f110e0Safresh1ok($Tailored->gt("abc\0", "abc\x{4E00}")); 17791f110e0Safresh1ok($Tailored->gt("abc\0", "abc\x{FFFD}")); 17891f110e0Safresh1ok($Tailored->gt("abc\0", "abc\x{FFFD}")); 17991f110e0Safresh1 18091f110e0Safresh1# 67 18191f110e0Safresh1 18291f110e0Safresh1$Tailored->change(UCA_Version => 8); 18391f110e0Safresh1 18491f110e0Safresh1ok($Tailored->gt("abc\0", "abc\x{4E00}")); 18591f110e0Safresh1ok($Tailored->gt("abc\0", "abc\x{FFFD}")); 18691f110e0Safresh1ok($Tailored->gt("abc\0", "abc\x{FFFD}")); 18791f110e0Safresh1 18891f110e0Safresh1# 70 189