f22937a4f63f239e9cfd1c0bc4e8433aac734665
[perl/list-index.git] / t / 20-links.t
1 #!/usr/bin/env perl
2 use strict;
3 use warnings;
4
5 use Test::More tests => 13;
6 use Test::NoWarnings;
7 use Data::Dump 'pp';
8
9 BEGIN { use_ok('List::Index' => 'rangematch'); }
10
11 my @RANGETESTS = (
12         ['single prefix',
13                 [   q      =>          'q'],
14                 ['#foo.!$' =>          '\#foo\.\!\$'],
15                 [   '-'    =>          ''],
16                 [   ''     =>          ''],
17         ],
18         ['end only',
19                 [    -q    =>            '(?:(?![q-z])|q)'],
20                 [    -qqq  =>            '(?:(?![q-z])|q(?![q-z])|qq(?![q-z])|qqq)'],
21         ],
22         ['start only',
23                 [  'q-'    =>    '[q-z]'],
24                 ['qqq-'    => '(?:[r-z]|q[r-z]|qq[q-z])'],
25                 ['zzz-'    =>                 'zz[z-z]'],
26         ],
27         ['prefixed range',
28                 [  'q-q'   =>          'q'],
29                 [ 'qq-qq'  =>                 'qq'],
30                 [ 'qq-qqx' =>                                 '(?:qq(?![x-z])|qqx)'],
31                 [  'q-qx'  =>                      '(?:q(?![x-z])|qx)'],
32         ],
33         ['end within prefix',
34                 ['qqq-qq'  =>                 'qq[q-z]'],
35                 ['qqq-q'   =>       '(?:q[r-z]|qq[q-z])'],
36         ],
37         ['interchar range',
38                 [  'q-x'   =>    '[q-x]'],
39                 ['qqq-xxx' => '(?:[r-w]|q[r-z]|qq[q-z]|x(?![x-z])|xx(?![x-z])|xxx)'],
40                 ['qqq-xqq' => '(?:[r-w]|q[r-z]|qq[q-z]|x(?![q-z])|xq(?![q-z])|xqq)'],
41         ],
42         ['interchar mixed length',
43                 ['qqq-xq'  => '(?:[r-w]|q[r-z]|qq[q-z]|x(?![q-z])|xq)'],
44                 [ 'qq-xqq' => '(?:[r-w]|q[q-z]|'   .  'x(?![q-z])|xq(?![q-z])|xqq)'],
45                 [  'q-xxx' =>                '(?:[q-w]|x(?![x-z])|xx(?![x-z])|xxx)'],
46                 ['qqq-x'   => '(?:[r-x]|q[r-z]|qq[q-z])'],
47                 ['qaa-qb'  =>              '(?:qa[a-z]|qb)'],
48                 ['qaa-qq'  =>       '(?:q[b-p]|qa[a-z]|qq)'],
49         ],
50         ['reversed',
51                 [  'x-q'   => undef],
52                 ['xxx-qqq' => undef],
53                 ['xxx-q'   => undef],
54                 ['qqq-qc'  => undef],
55         ],
56
57         ['non-alphabetic offset',
58                 [  '.-'    =>          ''],
59                 ['...-'    => '(?:[a-z]|[^a-z][a-z])'],
60                 [ '.q-'    => '(?:[a-z]|[^a-z][q-z])'],
61                 [ '.q-.'   =>          '[^a-z][q-z]'],
62         ],
63         ['limit',
64                 ['.q.-q'   => '(?:[a-q]|[^a-z][q-z])'],
65                 ['..z-q'   => '(?:[a-q]|[^a-z][a-z]|[^a-z][^a-z][z-z])'],
66                 ['.q.-z'   => '(?:[a-z]|[^a-z][q-z])'],
67                 ['.q.-zz'  => '(?:[a-y]|[^a-z][q-z]|'        .       'z(?![z-z])|zz)'],
68                 ['.q..-zz' => '(?:[a-y]|[^a-z][r-z]|[^a-z]q' . '[a-z]|z(?![z-z])|zz)'],
69         ],
70         ['non-alpha limit',
71                 ['.q.-z.'  => '(?:[a-y]|[^a-z][q-z]|'        .       'z(?![a-z]))'],
72                 [ '..-.'   =>                                '(?:[^a-z](?![a-z]))'],
73                 [  '.-.'   =>                                         '(?![a-z])'],
74                 [   '-.'   =>                                         '(?![a-z])'],
75                 [   '-...' =>                                         '(?![a-z])(?!.[a-z])(?!..[a-z])'],
76                 [   '-q.'  =>                           '(?:(?![q-z])|q(?![a-z]))'],
77                 [   '-q..' =>                           '(?:(?![q-z])|q(?![a-z])(?!.[a-z]))'],
78         #       [ '..-...' =>                                '(?:[^a-z](?![a-z])|[^a-z][^a-z](?![a-z]))'],
79         #       [  '.-...' =>                                                   '[^a-z][^a-z](?![a-z])'],
80                 [  'a-.'   => undef],
81         ],
82 );
83
84 for (@RANGETESTS) {
85         my ($name, @tests) = @$_;
86         subtest $name => sub {
87                 plan tests => scalar @tests;
88                 for (@tests) {
89                         my ($in, $out) = @$_;
90                         is(
91                                 eval { rangematch($in) },
92                                 defined $out ? "(?i-xsm:^$out)" : undef,
93                                 (length $in ? $in : q{''}) . (!defined $out && ' failure')
94                         );
95                         diag($@) if $@;
96                 }
97         };
98 }
99