f5c4f7888abb133dc7961db015587a125a5bbeca
[p5sagit/p5-mst-13.2.git] / t / uni / case.pl
1 use File::Spec;
2
3 require "test.pl";
4
5 sub casetest {
6     my ($base, $spec, $func) = @_;
7     my $file = File::Spec->catfile(File::Spec->catdir(File::Spec->updir,
8                                                       "lib", "unicore", "To"),
9                                    "$base.pl");
10     my $simple = do $file;
11     my %simple;
12     for my $i (split(/\n/, $simple)) {
13         my ($k, $v) = split(' ', $i);
14         $simple{$k} = $v;
15     }
16     my %seen;
17
18     for my $i (sort keys %simple) {
19         $seen{hex $i}++;
20     }
21     print "# ", scalar keys %simple, " simple mappings\n";
22
23     my $both;
24
25     for my $i (sort keys %$spec) {
26         if (++$seen{hex $i} == 2) {
27             warn "$base: $i seen twice\n";
28             $both++;
29         }
30     }
31     print "# ", scalar keys %$spec, " special mappings\n";
32
33     exit(1) if $both;
34
35     my %none;
36     for my $i (map { ord } split //,
37                "\e !\"#\$%&'()+,-./0123456789:;<=>?\@[\\]^_{|}~\b") {
38         next if pack("U0U", $i) =~ /\w/;
39         $none{$i}++ unless $seen{$i};
40     }
41     print "# ", scalar keys %none, " noncase mappings\n";
42
43     my $tests = 
44         (scalar keys %simple) +
45         (scalar keys %$spec) +
46         (scalar keys %none);
47     print "1..$tests\n";
48
49     my $test = 1;
50
51     for my $i (sort { hex $a <=> hex $b } keys %simple) {
52         my $w = "$i -> $simple{$i}";
53         my $c = pack "U0U", hex $i;
54         my $d = $func->($c);
55         print $d eq pack("U0U", hex $simple{$i}) ?
56             "ok $test # $w\n" : "not ok $test # $w\n";
57         $test++;
58     }
59
60     for my $i (sort { hex $a <=> hex $b } keys %$spec) {
61         my $w = qq[$i -> "] . display($spec->{$i}) . qq["];
62         my $c = pack "U0U", hex $i;
63         my $d = $func->($c);
64         print $d eq $spec->{$i} ?
65             "ok $test # $w\n" : "not ok $test # $w\n";
66         $test++;
67     }
68
69
70     for my $i (sort { $a <=> $b } keys %none) {
71         my $w = sprintf "%04X -> %04X", $i, $i;
72         my $c = pack "U0U", $i;
73         my $d = $func->($c);
74         print $d eq $c ?
75             "ok $test # $w\n" : "not ok $test # $w\n";
76         $test++;
77     }
78 }
79
80 1;