1
2BEGIN {
3    unless ('A' eq pack('U', 0x41)) {
4	print "1..0 # Unicode::Normalize cannot pack a Unicode code point\n";
5	exit 0;
6    }
7    unless (0x41 == unpack('U', 'A')) {
8	print "1..0 # Unicode::Normalize cannot get a Unicode code point\n";
9	exit 0;
10    }
11}
12
13BEGIN {
14    if ($ENV{PERL_CORE}) {
15        chdir('t') if -d 't';
16        @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
17    }
18}
19
20BEGIN {
21    unless (5.006001 <= $]) {
22	print "1..0 # skipped: Perl 5.6.1 or later".
23		" needed for this test\n";
24	exit;
25    }
26}
27
28#########################
29
30use strict;
31use warnings;
32BEGIN { $| = 1; print "1..26\n"; }
33my $count = 0;
34sub ok ($;$) {
35    my $p = my $r = shift;
36    if (@_) {
37	my $x = shift;
38	$p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
39    }
40    print $p ? "ok" : "not ok", ' ', ++$count, "\n";
41}
42
43use Unicode::Normalize qw(:all);
44
45ok(1);
46
47sub _pack_U   { Unicode::Normalize::pack_U(@_) }
48sub _unpack_U { Unicode::Normalize::unpack_U(@_) }
49
50#########################
51
52sub arraynorm {
53    my $form   = shift;
54    my @string = @_;
55    my $result = "";
56    my $unproc = "";
57    foreach my $str (@string) {
58        $unproc .= $str;
59        $result .= $form eq 'NFC'  ? NFC_partial ($unproc) :
60		   $form eq 'NFD'  ? NFD_partial ($unproc) :
61		   $form eq 'NFKC' ? NFKC_partial($unproc) :
62		   $form eq 'NFKD' ? NFKD_partial($unproc) :
63		   undef;
64    }
65    $result .= $unproc;
66    return $result;
67}
68
69my $strD = "\x{3C9}\x{301}\x{1100}\x{1161}\x{11A8}\x{1100}\x{1161}\x{11AA}";
70my $strC = "\x{3CE}\x{AC01}\x{AC03}";
71my @str1 = (substr($strD,0,3), substr($strD,3,4), substr($strD,7));
72my @str2 = (substr($strD,0,1), substr($strD,1,3), substr($strD,4));
73ok($strC eq NFC($strD));
74ok($strD eq join('', @str1));
75ok($strC eq arraynorm('NFC', @str1));
76ok($strD eq join('', @str2));
77ok($strC eq arraynorm('NFC', @str2));
78
79my @strX = ("\x{300}\x{AC00}", "\x{11A8}");
80my $strX =  "\x{300}\x{AC01}";
81ok($strX eq NFC(join('', @strX)));
82ok($strX eq arraynorm('NFC', @strX));
83ok($strX eq NFKC(join('', @strX)));
84ok($strX eq arraynorm('NFKC', @strX));
85
86my @strY = ("\x{304B}\x{0308}", "\x{0323}\x{3099}");
87my $strY = ("\x{304C}\x{0323}\x{0308}");
88ok($strY eq NFC(join('', @strY)));
89ok($strY eq arraynorm('NFC', @strY));
90ok($strY eq NFKC(join('', @strY)));
91ok($strY eq arraynorm('NFKC', @strY));
92
93my @strZ = ("\x{304B}\x{0308}", "\x{0323}", "\x{3099}");
94my $strZ = ("\x{304B}\x{3099}\x{0323}\x{0308}");
95ok($strZ eq NFD(join('', @strZ)));
96ok($strZ eq arraynorm('NFD', @strZ));
97ok($strZ eq NFKD(join('', @strZ)));
98ok($strZ eq arraynorm('NFKD', @strZ));
99
100# 18
101
102# must modify the source
103my $sNFD = "\x{FA19}";
104ok(NFD_partial($sNFD), "");
105ok($sNFD, "\x{795E}");
106
107my $sNFC = "\x{FA1B}";
108ok(NFC_partial($sNFC), "");
109ok($sNFC, "\x{798F}");
110
111my $sNFKD = "\x{FA1E}";
112ok(NFKD_partial($sNFKD), "");
113ok($sNFKD, "\x{7FBD}");
114
115my $sNFKC = "\x{FA26}";
116ok(NFKC_partial($sNFKC), "");
117ok($sNFKC, "\x{90FD}");
118
119# 26
120
121