The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- perl -*-

use strict;
use Set::IntSpan 1.14;

my $N = 1;
sub Not { print "not " }

sub OK_ord
{
    my $test = shift;

    my($runlist, $n, $ord_exp, $span_exp) = @$test;
    $ord_exp = '<undef>' unless defined $ord_exp;
    print "ok $N ord : $runlist $n\t-> $ord_exp\n";
    $N++;
}

sub OK_span
{
    my $test = shift;

    my($runlist, $n, $ord_exp, $span_exp) = @$test;
    $span_exp = defined $span_exp ? join ', ', map { defined($_) ? $_ : '<undef>' } @$span_exp : '<undef>';
    print "ok $N span: $runlist $n\t-> $span_exp\n";

    $N++;
}

my @Span_ord_test =
(
 [ '-'	  	    	  ,  0, undef, undef	      ],
 [ '(-)'  	    	  ,  0, 0    , [undef, undef] ],
 [ '0'	  	    	  ,  0, 0    , [    0,     0] ],
 [ '1'	  	    	  ,  0, undef, undef	      ],
 [ '1'	  	    	  ,  1, 0    , [    1,     1] ],
 [ '1'	  	    	  ,  2, undef, undef	      ],
 [ '1,3-5'	    	  ,  0, undef, undef	      ],
 [ '1,3-5'	    	  ,  1, 0    , [    1,     1] ],
 [ '1,3-5'	    	  ,  2, undef, undef	      ],
 [ '1,3-5'	    	  ,  3, 1    , [    3,     5] ],
 [ '1,3-5'	    	  ,  4, 1    , [    3,     5] ],
 [ '1,3-5'	    	  ,  5, 1    , [    3,     5] ],
 [ '1,3-5'	    	  ,  6, undef, undef	      ],
 [ '1-)'  	    	  ,  0, undef, undef	      ],
 [ '1-)'  	    	  ,  1, 0    , [    1, undef] ],
 [ '1-)'  	    	  ,  2, 0    , [    1, undef] ],
 [ '(-1'  	    	  ,  0, 0    , [undef,     1] ],
 [ '(-1'  	    	  ,  1, 0    , [undef,     1] ],
 [ '(-1'  	    	  ,  2, undef, undef	      ],
 [ '1-5,11-15,21-25'	  , 21, 2    , [   21,    25] ],
 [ '(-5,11-15,21-25'	  , 21, 2    , [   21,    25] ],
 [ '1-5,11-15,21-25,30-40', 21, 2    , [   21,    25] ],
 [ '(-5,11-15,21-25,30-)' , 21, 2    , [   21,    25] ],
 [ '(-5,11-15,21-25,30-)' , 20, undef, undef	      ],
);

print "1..",  2 * @Span_ord_test, "\n";

for my $test (@Span_ord_test)
{
    my($run_list, $n, $ord_exp, $span_exp) = @$test;

    my $set = new Set::IntSpan $run_list;
    my $ord_act = $set->span_ord($n);
    identical_n($ord_act, $ord_exp) or Not; OK_ord($test);

    my $span_act = defined $ord_act ? ($set->spans)[$ord_act] : undef;
    identical_span($span_act, $span_exp) or Not; OK_span($test);
}

sub identical_n
{
    my($a, $b) = @_;

    not defined $a and not defined $b or
        defined $a and     defined $b and $a == $b
}

sub identical_span
{
    my($a, $b) = @_;

    not defined $a and not defined $b or
	defined $a and     defined $b and
	    identical_n($a->[0], $b->[0]) and identical_n($a->[1], $b->[1])
}