skip subtests if Test::More is too old
[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 eval { Test::More->VERSION(0.93) } or eval q{
12         diag "Install Test::More v0.93 to run subtests\n";
13         sub subtest {
14                 SKIP: { skip 'subtest', 1; }
15         }
16 };
17
18 my @RANGETESTS = (
19         ['single prefix',
20                 [   q      =>          'q'],
21                 ['#foo.!$' =>          '\#foo\.\!\$'],
22                 [   '-'    =>          ''],
23                 [   ''     =>          ''],
24         ],
25         ['end only',
26                 [    -q    =>            '(?:(?![q-z])|q)'],
27                 [    -qqq  =>            '(?:(?![q-z])|q(?![q-z])|qq(?![q-z])|qqq)'],
28         ],
29         ['start only',
30                 [  'q-'    =>    '[q-z]'],
31                 ['qqq-'    => '(?:[r-z]|q[r-z]|qq[q-z])'],
32                 ['zzz-'    =>                 'zz[z-z]'],
33         ],
34         ['prefixed range',
35                 [  'q-q'   =>          'q'],
36                 [ 'qq-qq'  =>                 'qq'],
37                 [ 'qq-qqx' =>                                 '(?:qq(?![x-z])|qqx)'],
38                 [  'q-qx'  =>                      '(?:q(?![x-z])|qx)'],
39         ],
40         ['end within prefix',
41                 ['qqq-qq'  =>                 'qq[q-z]'],
42                 ['qqq-q'   =>       '(?:q[r-z]|qq[q-z])'],
43         ],
44         ['interchar range',
45                 [  'q-x'   =>    '[q-x]'],
46                 ['qqq-xxx' => '(?:[r-w]|q[r-z]|qq[q-z]|x(?![x-z])|xx(?![x-z])|xxx)'],
47                 ['qqq-xqq' => '(?:[r-w]|q[r-z]|qq[q-z]|x(?![q-z])|xq(?![q-z])|xqq)'],
48         ],
49         ['interchar mixed length',
50                 ['qqq-xq'  => '(?:[r-w]|q[r-z]|qq[q-z]|x(?![q-z])|xq)'],
51                 [ 'qq-xqq' => '(?:[r-w]|q[q-z]|'   .  'x(?![q-z])|xq(?![q-z])|xqq)'],
52                 [  'q-xxx' =>                '(?:[q-w]|x(?![x-z])|xx(?![x-z])|xxx)'],
53                 ['qqq-x'   => '(?:[r-x]|q[r-z]|qq[q-z])'],
54                 ['qaa-qb'  =>              '(?:qa[a-z]|qb)'],
55                 ['qaa-qq'  =>       '(?:q[b-p]|qa[a-z]|qq)'],
56         ],
57         ['reversed',
58                 [  'x-q'   => undef],
59                 ['xxx-qqq' => undef],
60                 ['xxx-q'   => undef],
61                 ['qqq-qc'  => undef],
62         ],
63
64         ['non-alphabetic offset',
65                 [  '.-'    =>          ''],
66                 ['...-'    => '(?:[a-z]|[^a-z][a-z])'],
67                 [ '.q-'    => '(?:[a-z]|[^a-z][q-z])'],
68                 [ '.q-.'   =>          '[^a-z][q-z]'],
69         ],
70         ['limit',
71                 ['.q.-q'   => '(?:[a-q]|[^a-z][q-z])'],
72                 ['..z-q'   => '(?:[a-q]|[^a-z][a-z]|[^a-z][^a-z][z-z])'],
73                 ['.q.-z'   => '(?:[a-z]|[^a-z][q-z])'],
74                 ['.q.-zz'  => '(?:[a-y]|[^a-z][q-z]|'        .       'z(?![z-z])|zz)'],
75                 ['.q..-zz' => '(?:[a-y]|[^a-z][r-z]|[^a-z]q' . '[a-z]|z(?![z-z])|zz)'],
76         ],
77         ['non-alpha limit',
78                 ['.q.-z.'  => '(?:[a-y]|[^a-z][q-z]|'        .       'z(?![a-z]))'],
79                 [ '..-.'   =>                                '(?:[^a-z](?![a-z]))'],
80                 [  '.-.'   =>                                         '(?![a-z])'],
81                 [   '-.'   =>                                         '(?![a-z])'],
82                 [   '-...' =>                                         '(?![a-z])(?!.[a-z])(?!..[a-z])'],
83                 [   '-q.'  =>                           '(?:(?![q-z])|q(?![a-z]))'],
84                 [   '-q..' =>                           '(?:(?![q-z])|q(?![a-z])(?!.[a-z]))'],
85         #       [ '..-...' =>                                '(?:[^a-z](?![a-z])|[^a-z][^a-z](?![a-z]))'],
86         #       [  '.-...' =>                                                   '[^a-z][^a-z](?![a-z])'],
87                 [  'a-.'   => undef],
88         ],
89 );
90
91 for (@RANGETESTS) {
92         my ($name, @tests) = @$_;
93         subtest($name => sub {
94                 plan tests => scalar @tests;
95                 for (@tests) {
96                         my ($in, $out) = @$_;
97                         is(
98                                 eval { rangematch($in) },
99                                 defined $out ? "(?i-xsm:^$out)" : undef,
100                                 (length $in ? $in : q{''}) . (!defined $out && ' failure')
101                         );
102                         diag($@) if $@;
103                 }
104         });
105 }
106