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.17;

my $N = 1;
sub Not { print "not " }
sub OK  { print "ok ", $N++, "\n" }

print "1..", 6 + 8 + 1 + 8 + 4 + 12 + 7 + 1 + 12 + 2, "\n";

my $a = new Set::IntSpan "1-5";
my $e = new Set::IntSpan;
my $i = new Set::IntSpan "(-)";


# Conversion
$a or  Not; OK;
$e and Not; OK;
$i or  Not; OK;

"$a" eq "1-5" or Not; OK;
"$e" eq "-"   or Not; OK;
"$i" eq "(-)" or Not; OK;

# Equality
$a eq "1-5" or Not; OK;  $a eq "6-9" and Not; OK;
"1-5" eq $a or Not; OK;  "6-9" eq $a and Not; OK;
$a ne "6-9" or Not; OK;  $a ne "1-5" and Not; OK;
"6-9" ne $a or Not; OK;  "1-5" ne $a and Not; OK;

# Unary
~$a eq "(-0,6-)" or Not; OK;

# Binary
my $u1 = $a + "3-8";
my $u2 = "3-8" + $a;
$u1 eq "1-8" or Not; OK;
$u2 eq "1-8" or Not; OK;

my $d1 = $a - "3-8";
my $d2 = "3-8" - $a;
$d1 eq "1-2" or Not; OK;
$d2 eq "6-8" or Not; OK;

my $i1 = $a * "3-8";
my $i2 = "3-8" * $a;
$i1 eq "3-5" or Not; OK;
$i2 eq "3-5" or Not; OK;

# Assignment
my $x1 = $a ^ "3-8";
my $x2 = "3-8" ^ $a;
$x1 eq "1-2,6-8" or Not; OK;
$x2 eq "1-2,6-8" or Not; OK;

$a += "3-8";
$a eq "1-8" or Not; OK;

$a -= "3-8";
$a eq "1-2" or Not; OK;

$a *= "3-8";
$a eq "-"   or Not; OK;

$a ^= "3-8";
$a eq "3-8" or Not; OK;

# Equivalence
$a == 6 or Not; OK;	 $a == 7 and Not; OK;
$a != 7 or Not; OK;	 $a != 6 and Not; OK;
$a <  7 or Not; OK;	 $a <  6 and Not; OK;
$a <= 6 or Not; OK;	 $a <= 5 and Not; OK;
$a >  5 or Not; OK;	 $a >  6 and Not; OK;
$a >= 6 or Not; OK;	 $a >= 7 and Not; OK;

($a <=>  7) == -1 or Not; OK;
($a <=>  6) ==  0 or Not; OK;
($a <=>  5) ==  1 or Not; OK;
( 5 <=> $a) == -1 or Not; OK;
( 7 <=> $a) ==  1 or Not; OK;
($a <=> $i) == -1 or Not; OK;
($i <=> $a) ==  1 or Not; OK;

my @c = sort($i, $a, $e);
$c[0] eq $e and $c[1] eq $a and $c[2] eq $i or Not; OK;

$a lt $i or Not; OK;     $i lt $a and Not; OK;
$a le $i or Not; OK;     $i le $a and Not; OK;
$i gt $a or Not; OK;     $a gt $i and Not; OK;
$i ge $a or Not; OK;     $a ge $i and Not; OK;
$a le $a or Not; OK;     $a lt $a and Not; OK;
$a ge $a or Not; OK;     $a gt $a and Not; OK;

"3-8" le $a or Not; OK;
"3-8" ge $a or Not; OK;