use strict;
use warnings;
-use Test::More tests => 22;
+use Test::More tests => 13;
use Test::NoWarnings;
use Data::Dump 'pp';
BEGIN { use_ok('List::Index' => 'rangematch'); }
-for (
- [ q => 'q'],
- ['#foo.!$' => '\#foo\.\!\$'],
- [ -q => '(?:(?![q-z])|q)'],
- [ -qqq => '(?:(?![q-z])|q(?![q-z])|qq(?![q-z])|qqq)'],
- [ 'q-' => '[q-z]'],
- ['qqq-' => '(?:[r-z]|q[r-z]|qq[q-z])'],
- [ 'q-x' => '[q-x]'],
- [ 'q-q' => 'q'],
- [ 'qq-qq' => 'qq'],
- [ 'qq-qqx' => '(?:qq(?![x-z])|qqx)'],
- [ 'q-qx' => '(?:q(?![x-z])|qx)'],
- ['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)'],
- ['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])'],
-) {
- my ($in, $out) = @$_;
- is(eval { rangematch($in) }, "(?i-xsm:^$out)", $in);
- diag($@) if $@;
+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]'],
+ ],
+ ['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)'],
+ ],
+ ['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 ($name, @tests) = @$_;
+ subtest $name => sub {
+ plan tests => scalar @tests;
+ for (@tests) {
+ my ($in, $out) = @$_;
+ is(
+ eval { rangematch($in) },
+ defined $out ? "(?i-xsm:^$out)" : undef,
+ (length $in ? $in : q{''}) . (!defined $out && ' failure')
+ );
+ diag($@) if $@;
+ }
+ };
}