1use Regex::PreSuf;
2
3print "1..24\n";
4
5my $test = 1;
6
7sub tlen {
8    my ($sub, $list, $n_want, $diff_want) = @_;
9
10    $list = [ map { [ quotemeta() =~ /(.)/g ] } @$list ];
11
12    my ($n, %diff) = $sub->(@$list);
13    my @diff = sort keys %diff;
14    my $ok = $n == $n_want &&
15	     @diff == @$diff_want &&
16	     unpack("%32C*", join("\0", @diff)) eq
17	     unpack("%32C*", join("\0", @$diff_want));
18    print "not " unless $ok;
19    print "ok $test";
20    $test++;
21    print "\n";
22    print <<EOF
23# expected: $n_want @$diff_want
24# got:      $n @diff
25EOF
26        unless $ok;
27}
28
29tlen(\&Regex::PreSuf::prefix_length, [qw(foobar foobar)], 6, [qw()]);
30tlen(\&Regex::PreSuf::prefix_length, [qw(foobar fooxar)], 3, [qw(b x)]);
31tlen(\&Regex::PreSuf::prefix_length, [qw(foobar foobaz)], 5, [qw(r z)]);
32tlen(\&Regex::PreSuf::prefix_length, [qw(foobar foozot)], 3, [qw(b z)]);
33tlen(\&Regex::PreSuf::prefix_length, [qw(foobar feebar)], 1, [qw(e o)]);
34tlen(\&Regex::PreSuf::prefix_length, [qw(foobar barfoo)], 0, [qw(b f)]);
35tlen(\&Regex::PreSuf::prefix_length, [qw(foopar fooqar)], 3, [qw(p q)]);
36tlen(\&Regex::PreSuf::prefix_length, [qw(foopar fooar)],  3, [qw(a p)]);
37tlen(\&Regex::PreSuf::prefix_length, [qw(o o o o o o o)], 1, [qw()]);
38tlen(\&Regex::PreSuf::prefix_length, [qw(o o o o o o u)], 0, [qw(o u)]);
39tlen(\&Regex::PreSuf::prefix_length, [qw(ou ou ou ou ou)],2, [qw()]);
40tlen(\&Regex::PreSuf::prefix_length, [qw(ou ou ou ou uo)],0, [qw(o u)]);
41
42tlen(\&Regex::PreSuf::suffix_length, [qw(foobar foobar)], 6, [qw()]);
43tlen(\&Regex::PreSuf::suffix_length, [qw(foobar fooxar)], 2, [qw(b x)]);
44tlen(\&Regex::PreSuf::suffix_length, [qw(foobar goobar)], 5, [qw(f g)]);
45tlen(\&Regex::PreSuf::suffix_length, [qw(foobar barbar)], 3, [qw(o r)]);
46tlen(\&Regex::PreSuf::suffix_length, [qw(foobar foober)], 1, [qw(a e)]);
47tlen(\&Regex::PreSuf::suffix_length, [qw(foobar barfoo)], 0, [qw(o r)]);
48tlen(\&Regex::PreSuf::suffix_length, [qw(foopar fooqar)], 2, [qw(p q)]);
49tlen(\&Regex::PreSuf::suffix_length, [qw(foopar fooar)],  2, [qw(o p)]);
50tlen(\&Regex::PreSuf::suffix_length, [qw(o o o o o o o)], 1, [qw()]);
51tlen(\&Regex::PreSuf::suffix_length, [qw(o o o o o o u)], 0, [qw(o u)]);
52tlen(\&Regex::PreSuf::suffix_length, [qw(ou ou ou ou ou)],2, [qw()]);
53tlen(\&Regex::PreSuf::suffix_length, [qw(ou ou ou ou uo)],0, [qw(o u)]);
54
55