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} 8 9BEGIN { 10 if ($ENV{PERL_CORE}) { 11 chdir('t') if -d 't'; 12 @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib); 13 } 14} 15 16use Test; 17BEGIN { plan tests => 40 }; 18 19use strict; 20use warnings; 21use Unicode::Collate; 22 23use vars qw($IsEBCDIC); 24$IsEBCDIC = ord("A") != 0x41; 25 26our $kjeEntry = <<'ENTRIES'; 270301 ; [.0000.0032.0002.0301] # COMBINING ACUTE ACCENT 280334 ; [.0000.008B.0002.0334] # COMBINING TILDE OVERLAY 29043A ; [.0D31.0020.0002.043A] # CYRILLIC SMALL LETTER KA 30041A ; [.0D31.0020.0008.041A] # CYRILLIC CAPITAL LETTER KA 31045C ; [.0DA1.0020.0002.045C] # CYRILLIC SMALL LETTER KJE 32043A 0301 ; [.0DA1.0020.0002.045C] # CYRILLIC SMALL LETTER KJE 33040C ; [.0DA1.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE 34041A 0301 ; [.0DA1.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE 35ENTRIES 36 37our $aaEntry = <<'ENTRIES'; 380304 ; [.0000.005A.0002.0304] # COMBINING MACRON (cc = 230) 39030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE (cc = 230) 400327 ; [.0000.0055.0002.0327] # COMBINING CEDILLA (cc = 202) 41031A ; [.0000.006B.0002.031A] # COMBINING LEFT ANGLE ABOVE (cc = 232) 420061 ; [.0A15.0020.0002.0061] # LATIN SMALL LETTER A 430041 ; [.0A15.0020.0008.0041] # LATIN CAPITAL LETTER A 44007A ; [.0C13.0020.0002.007A] # LATIN SMALL LETTER Z 45005A ; [.0C13.0020.0008.005A] # LATIN CAPITAL LETTER Z 4600E5 ; [.0C25.0020.0002.00E5] # LATIN SMALL LETTER A WITH RING ABOVE; QQCM 4700C5 ; [.0C25.0020.0008.00C5] # LATIN CAPITAL LETTER A WITH RING ABOVE; QQCM 480061 030A ; [.0C25.0020.0002.0061] # LATIN SMALL LETTER A WITH RING ABOVE 490041 030A ; [.0C25.0020.0008.0041] # LATIN CAPITAL LETTER A WITH RING ABOVE 50ENTRIES 51 52######################### 53 54ok(1); 55 56my $kjeNoN = Unicode::Collate->new( 57 level => 1, 58 table => undef, 59 normalization => undef, 60 entry => $kjeEntry, 61); 62 63ok($kjeNoN->lt("\x{043A}", "\x{043A}\x{0301}")); 64ok($kjeNoN->gt("\x{045C}", "\x{043A}\x{0334}\x{0301}")); 65ok($kjeNoN->eq("\x{043A}", "\x{043A}\x{0334}\x{0301}")); 66ok($kjeNoN->eq("\x{045C}", "\x{043A}\x{0301}\x{0334}")); 67 68our %sortkeys; 69 70$sortkeys{'KAac'} = $kjeNoN->viewSortKey("\x{043A}\x{0301}"); 71$sortkeys{'KAta'} = $kjeNoN->viewSortKey("\x{043A}\x{0334}\x{0301}"); 72$sortkeys{'KAat'} = $kjeNoN->viewSortKey("\x{043A}\x{0301}\x{0334}"); 73 74eval { require Unicode::Normalize }; 75if (!$@) { 76 my $kjeNFD = Unicode::Collate->new( 77 level => 1, 78 table => undef, 79 entry => $kjeEntry, 80 ); 81ok($kjeNFD->lt("\x{043A}", "\x{043A}\x{0301}")); 82ok($kjeNFD->eq("\x{045C}", "\x{043A}\x{0334}\x{0301}")); 83ok($kjeNFD->lt("\x{043A}", "\x{043A}\x{0334}\x{0301}")); 84ok($kjeNFD->eq("\x{045C}", "\x{043A}\x{0301}\x{0334}")); 85 86 my $aaNFD = Unicode::Collate->new( 87 level => 1, 88 table => undef, 89 entry => $aaEntry, 90 ); 91 92ok($aaNFD->lt("Z", "A\x{30A}\x{304}")); 93ok($aaNFD->eq("A", "A\x{304}\x{30A}")); 94ok($aaNFD->eq(pack('U', 0xE5), "A\x{30A}\x{304}")); 95ok($aaNFD->eq("A\x{304}", "A\x{304}\x{30A}")); 96ok($aaNFD->lt("Z", "A\x{327}\x{30A}")); 97ok($aaNFD->lt("Z", "A\x{30A}\x{327}")); 98ok($aaNFD->lt("Z", "A\x{31A}\x{30A}")); 99ok($aaNFD->lt("Z", "A\x{30A}\x{31A}")); 100 101 my $aaPre = Unicode::Collate->new( 102 level => 1, 103 normalization => "prenormalized", 104 table => undef, 105 entry => $aaEntry, 106 ); 107 108ok($aaPre->lt("Z", "A\x{30A}\x{304}")); 109ok($aaPre->eq("A", "A\x{304}\x{30A}")); 110ok($aaPre->eq(pack('U', 0xE5), "A\x{30A}\x{304}")); 111ok($aaPre->eq("A\x{304}", "A\x{304}\x{30A}")); 112ok($aaPre->lt("Z", "A\x{327}\x{30A}")); 113ok($aaPre->lt("Z", "A\x{30A}\x{327}")); 114ok($aaPre->lt("Z", "A\x{31A}\x{30A}")); 115ok($aaPre->lt("Z", "A\x{30A}\x{31A}")); 116} 117else { 118 ok(1) for 1..20; 119} 120 121# again: loading Unicode::Normalize should not affect $kjeNoN. 122ok($kjeNoN->lt("\x{043A}", "\x{043A}\x{0301}")); 123ok($kjeNoN->gt("\x{045C}", "\x{043A}\x{0334}\x{0301}")); 124ok($kjeNoN->eq("\x{043A}", "\x{043A}\x{0334}\x{0301}")); 125ok($kjeNoN->eq("\x{045C}", "\x{043A}\x{0301}\x{0334}")); 126 127ok($sortkeys{'KAac'}, $kjeNoN->viewSortKey("\x{043A}\x{0301}")); 128ok($sortkeys{'KAta'}, $kjeNoN->viewSortKey("\x{043A}\x{0334}\x{0301}")); 129ok($sortkeys{'KAat'}, $kjeNoN->viewSortKey("\x{043A}\x{0301}\x{0334}")); 130 131my $aaNoN = Unicode::Collate->new( 132 level => 1, 133 table => undef, 134 entry => $aaEntry, 135 normalization => undef, 136); 137 138ok($aaNoN->lt("Z", "A\x{30A}\x{304}")); 139ok($aaNoN->eq("A", "A\x{304}\x{30A}")); 140ok($aaNoN->eq(pack('U', 0xE5), "A\x{30A}\x{304}")); 141ok($aaNoN->eq("A\x{304}", "A\x{304}\x{30A}")); 142ok($aaNoN->eq("A", "A\x{327}\x{30A}")); 143ok($aaNoN->lt("Z", "A\x{30A}\x{327}")); 144ok($aaNoN->eq("A", "A\x{31A}\x{30A}")); 145ok($aaNoN->lt("Z", "A\x{30A}\x{31A}")); 146 147