TODO: non-alphabetic (.) support
[perl/list-index.git] / t / 20-links.t
index afa2b7bc186d0e4b6572ef874700ee61b8d86706..68432052cb842ef699a1f2de8e11e6cc5efef92c 100644 (file)
@@ -2,48 +2,82 @@
 use strict;
 use warnings;
 
-use Test::More tests => 29;
+use Test::More tests => 47;
 use Test::NoWarnings;
 use Data::Dump 'pp';
 
 BEGIN { use_ok('List::Index' => 'rangematch'); }
 
-for (
+my @RANGETESTS = (
+       # single prefix
        [   q      =>          'q'],
        ['#foo.!$' =>          '\#foo\.\!\$'],
        [   '-'    =>          ''],
        [   ''     =>          ''],
+       # end only
        [    -q    =>            '(?:(?![q-z])|q)'],
        [    -qqq  =>            '(?:(?![q-z])|q(?![q-z])|qq(?![q-z])|qqq)'],
+       # start only
        [  'q-'    =>    '[q-z]'],
        ['qqq-'    => '(?:[r-z]|q[r-z]|qq[q-z])'],
        ['zzz-'    =>                 'zz[z-z]'],
-       [  'q-x'   =>    '[q-x]'],
+       # prefixed range
        [  'q-q'   =>          'q'],
        [ 'qq-qq'  =>                 'qq'],
        [ 'qq-qqx' =>                                 '(?:qq(?![x-z])|qqx)'],
        [  'q-qx'  =>                      '(?:q(?![x-z])|qx)'],
+       # end within prefix
+       ['qqq-qq'  =>                 'qq[q-z]'],
+       ['qqq-q'   =>       '(?:q[r-z]|qq[q-z])'],
+       # interchar range
+       [  'q-x'   =>    '[q-x]'],
        ['qqq-xxx' => '(?:[r-w]|q[r-z]|qq[q-z]|x(?![x-z])|xx(?![x-z])|xxx)'],
        ['qqq-xqq' => '(?:[r-w]|q[r-z]|qq[q-z]|x(?![q-z])|xq(?![q-z])|xqq)'],
+       # interchar mixed length
        ['qqq-xq'  => '(?:[r-w]|q[r-z]|qq[q-z]|x(?![q-z])|xq)'],
        [ 'qq-xqq' => '(?:[r-w]|q[q-z]|'   .  'x(?![q-z])|xq(?![q-z])|xqq)'],
        [  'q-xxx' =>                '(?:[q-w]|x(?![x-z])|xx(?![x-z])|xxx)'],
        ['qqq-x'   => '(?:[r-x]|q[r-z]|qq[q-z])'],
        ['qaa-qb'  =>              '(?:qa[a-z]|qb)'],
        ['qaa-qq'  =>       '(?:q[b-p]|qa[a-z]|qq)'],
-       ['qqq-q'   =>       '(?:q[r-z]|qq[q-z])'],
-) {
+       # reversed
+       [  'x-q'   => undef],
+       ['xxx-qqq' => undef],
+       ['xxx-q'   => undef],
+       ['qqq-qc'  => undef],
+
+       # non-alphabetic offset
+       [  '.-'    =>          ''],
+       ['...-'    => '(?:[a-z]|[^a-z][a-z])'],
+       [ '.q-'    => '(?:[a-z]|[^a-z][q-z])'],
+       [ '.q-.'   =>          '[^a-z][q-z]'],
+       # limit
+       ['.q.-q'   => '(?:[a-q]|[^a-z][q-z])'],
+       ['..z-q'   => '(?:[a-q]|[^a-z][a-z]|[^a-z][^a-z][z-z])'],
+       ['.q.-z'   => '(?:[a-z]|[^a-z][q-z])'],
+       ['.q.-zz'  => '(?:[a-y]|[^a-z][q-z]|'        .       'z(?![z-z])|zz)'],
+       ['.q..-zz' => '(?:[a-y]|[^a-z][r-z]|[^a-z]q' . '[a-z]|z(?![z-z])|zz)'],
+       # non-alpha limit
+       ['.q.-z.'  => '(?:[a-y]|[^a-z][q-z]|'        .       'z(?![a-z]))'],
+       [ '..-.'   =>                                '(?:[^a-z](?![a-z]))'],
+       [  '.-.'   =>                                         '(?![a-z])'],
+       [   '-.'   =>                                         '(?![a-z])'],
+       [   '-...' =>                                         '(?![a-z])(?!.[a-z])(?!..[a-z])'],
+       [   '-q.'  =>                           '(?:(?![q-z])|q(?![a-z]))'],
+       [   '-q..' =>                           '(?:(?![q-z])|q(?![a-z])(?!.[a-z]))'],
+#      [ '..-...' =>                                '(?:[^a-z](?![a-z])|[^a-z][^a-z](?![a-z]))'],
+#      [  '.-...' =>                                                   '[^a-z][^a-z](?![a-z])'],
+       #
+       [  'a-.'   => undef],
+);
+
+for (@RANGETESTS) {
        my ($in, $out) = @$_;
-       is(eval { rangematch($in) }, "(?i-xsm:^$out)", (length $in ? $in : q{''}));
+       is(
+               eval { rangematch($in) },
+               defined $out ? "(?i-xsm:^$out)" : undef,
+               (length $in ? $in : q{''}) . (!defined $out && ' failure')
+       );
        diag($@) if $@;
 }
 
-for my $in (
-       'qqq-qc',
-         'x-q',
-       'xxx-qqq',
-       'xxx-q',
-) {
-       is(eval { rangematch($in) }, undef, (length $in ? $in : q{''}) . ' failure');
-}
-