The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#/bin/perl
# Copyright (c) 2001 Flavio Soibelmann Glock. All rights reserved.
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#
# Tests for Set::Infinite
# This is work in progress
#

BEGIN { $| = 1; print "1..74\n"; }
END {$test++; print "not ok $test\n" unless $loaded;}

use Set::Infinite;
$loaded = 1;
use Math::BigFloat;

my $errors = 0;
my $test = 0;


sub test {
	my ($header, $sub, $expected) = @_;
	$test++;
	print "\t# $header \n";
	$result = eval $sub;
	if ("$expected" eq "$result") {
		print "ok $test";
	}
	else {
		print "not ok $test\n\t# expected \"$expected\" got \"$result\"";
		$errors++;
	}
	print " \n";
}

sub stats {
	if ($errors) {
		print "\n\t# Errors: $errors\n";
	}
	else {
		print "\n\t# No errors.\n";
	}
}

Set::Infinite->type('Math::BigFloat');
Set::Infinite->real;

print "\t# Add element:\n";

$a = Set::Infinite->new(1,2);
$a = $a->union(3,4);
test (" (1,2) (3,4) : ",'$a',"[1...2.],[3...4.]");

print "\t# Parameter passing:\n";
test (" complement  : ",'$a->complement',"(-inf..1.),(2...3.),(4...inf)");
test (" complement   (1.5,2.5) : ",'$a->complement(1.5,2.5)',"[1...1.5),[3...4.]");
test (" union        (1.5,2.5) : ",'$a->union(1.5,2.5)',"[1...2.5],[3...4.]");
test (" intersection (1.5,2.5) : ",'$a->intersection(1.5,2.5)',"[1.5..2.]");
test (" intersects   (1.5,2.5) : ",'$a->intersects(1.5,2.5)',"1");

$a = Set::Infinite->new(Set::Infinite->new(1,2));
$a->add(3, 4);
$a->add(-1, 0);
$b = Set::Infinite->new($a);
$b->cleanup;
test ("Interval: (1,2) (3, 4) (-1, 0) : $b \n");

$a = $b;
$a->add(0, 1);
$a->add(7, 8);
$a->add(6, 7.5);
$a->cleanup;
test ("Interval: add (0, 1) (7, 8) (6, 7.5) : $a \n");

print "\t# Integer + cleanup:\n";

$a->integer;
$a->cleanup;
test ("Interval: integer",'$a',"[-1...4.],[6...8.]");

print "\t# Operations on open sets\n";
$a = Set::Infinite->new(1,'inf');
test ("set : ", '$a', "[1...inf)");
$a = $a->complement;
test ("[-inf,1) : ", '$a', "(-inf..1.)");
$b = $a;
test ("copy : ",'$b',"(-inf..1.)");
test ("complement : ",$a->complement,"");
test ("union [-1...0] : ", '$a->union(-1,0)', "(-inf..1.)");
test ("union [0...1]  : ", '$a->union(0,1)', "(-inf..1.]");
test ("union [1...2]  : ", '$a->union(1,2)', "(-inf..2.]");
test ("union [2...3]  : ", '$a->union(2,3)', "(-inf..1.),[2...3.]");
$b = Set::Infinite->new(-inf,1)->complement;
#test ("set : ", '$a, "");
$c = $a->union($b);
test ("union $b : ", '$c', "(-inf..1.),(1...inf)");
test ("  complement : ", '$c->complement',"1.");
test ("union $c [1...inf) ", '$c->union(1,inf)', "(-inf..inf)");
test ("union $b [1...inf) ", '$b->union(1,inf)', "[1...inf)");

print "\t# Testing 'null' and (0...0)\n";

$a = Set::Infinite->new();
test ("null : ",$a,"null");

$a = Set::Infinite->new('null');
test ("null : ",$a,"null");

$a = Set::Infinite->new(undef);
test ("null : ",$a,"null");

$a = Set::Infinite->new();
test ("(0,0) intersects to null : ",$a->intersects(0,0),"0");
test ("(0,0) intersection to null : ",$a->intersection(0,0),"null");

$a = Set::Infinite->new(0,0);
test ("(0,0) intersects to null : ",$a->intersects(),"0");
test ("(0,0) intersection to null : ",$a->intersection(),"null");

test ("(0,0) intersects to 0    : ",$a->intersects(0),"1");
test ("(0,0) intersection to 0    : ",$a->intersection(0),"0");

$a = Set::Infinite->new();
test ("(0,0) union to null : ",$a->union(0,0),"0");

$a = Set::Infinite->new(0,0);
test ("(0,0) union to null : ",$a->union(),"0");

$a = Set::Infinite->new(0,0);
test ("(0,0) intersects to (1,1) : ",$a->intersects(1,1),"0");
test ("(0,0) intersection to (1,1) : ",$a->intersection(1,1)->as_string,"null");


print "\t# New:\n";

$a = Set::Infinite->new(1,2);
$b = Set::Infinite->new([4,5],[7,8]);
$x = Set::Infinite->new(10,11);
$c = Set::Infinite->new($x);
# <removed!> $d = Set::Infinite->new( a => 13, b => 14 );
#print "\t#  a : $a\n b : $b\n c : $c\n";  # d : $d\n";
$abcd = ' ';
$abcd = Set::Infinite->new([$a],[$b],[$c]);
#print " abcd $abcd\n";
test ("abcd",'$abcd',"[1...2.],[4...5.],[7...8.],[10...11.]");

print "\t# Contains\n";
$a = Set::Infinite->new([3,6],[12,18]);
test ("set : ", '$a', "[3...6.],[12...18.]");
test ("contains (4,5) : ", '$a->contains(4,5)', "1");
test ("contains (3,5) : ", '$a->contains(3,5)', "1");
test ("contains (2,5) : ", '$a->contains(2,5)', "0");
test ("contains (4,15) : ", '$a->contains(4,15)', "0");
test ("contains (15,16) : ", '$a->contains(15,16)', "1");
test ("contains (4,5),(15,16) : ", '$a->contains([4,5],[15,16])', "1");
test ("contains (4,5),(15,20) : ", '$a->contains([4,5],[15,20])', "0");



print "\t# Intersects:\n";

$a = Set::Infinite->new(2,1);
test ("Interval:",'$a',"[1...2.]");
test ("intersects 2.5 : ", '$a->intersects(2.5)', "0");
test ("intersects 1.5 : ", '$a->intersects(1.5)', "1");
test ("intersects 0.5 : ", '$a->intersects(0.5)', "0");
test ("intersects 0.1 ... 0.3 : ", '$a->intersects(Set::Infinite->new(0.1,0.3))', "0");
test ("intersects 0.1 ... 1.3 : ", '$a->intersects(Set::Infinite->new(0.1,1.3))', "1");
test ("intersects 1.1 ... 1.3 : ", '$a->intersects(Set::Infinite->new(1.1,1.3))', "1");
test ("intersects 1.1 ... 2.3 : ", '$a->intersects(Set::Infinite->new(1.1,2.3))', "1");
test ("intersects 2.1 ... 2.3 : ", '$a->intersects(Set::Infinite->new(2.1,2.3))', "0");
test ("intersects 0.0 ... 4.0 : ", '$a->intersects(Set::Infinite->new(0.0,4.0))', "1");

print "\t# Other:\n";

test ("Union 2.0 : ", '$a->union(2.0)', "[1...2.]");
test ("Union 2.5 ", '$a->union(2.5)', "[1...2.],2.5");
test ("Union 2.0 ... 2.5 : ", '$a->union(Set::Infinite->new(2.0,2.5))', "[1...2.5]");
test ("Union 0.5 ... 1.5 : ", '$a->union(Set::Infinite->new(0.5,1.5))', "[.5..2.]");
test ("Union 3.0 ... 4.0 : ", '$a->union(Set::Infinite->new(3.0,4.0))', "[1...2.],[3...4.]");
test ("Union 0.0 ... 4.0 5 ... 6 : ", '$a->union(Set::Infinite->new([0.0,4.0],[5.0,6.0]))', "[0...4.],[5...6.]");

$a = Set::Infinite->new(2,1);
test ("Interval",'$a',"[1...2.]");
test ("intersection 2.5 : ", '$a->intersection(2.5)', "null");
test ("intersection 1.5 : ", '$a->intersection(1.5)', "1.5");
test ("intersection 0.5 : ", '$a->intersection(0.5)', "null");
test ("intersection 0.1 ... 0.3 : ", '$a->intersection(Set::Infinite->new(0.1,0.3))', "null");
test ("intersection 0.1 ... 1.3 : ", '$a->intersection(Set::Infinite->new(0.1,1.3))', "[1...1.3]");
test ("intersection 1.1 ... 1.3 : ", '$a->intersection(Set::Infinite->new(1.1,1.3))', "[1.1..1.3]");
test ("intersection 1.1 ... 2.3 : ", '$a->intersection(Set::Infinite->new(1.1,2.3))', "[1.1..2.]");
test ("intersection 2.1 ... 2.3 : ", '$a->intersection(Set::Infinite->new(2.1,2.3))', "null");
test ("Union 5.5 : ", '$a->union(5.5)', "[1...2.],5.5");
test ("intersection 0.0 ... 4.0 5 ... 6 : ", '$a->intersection(Set::Infinite->new([0.0,4.0],[5.0,6.0]))', "[1...2.]");

$a = Set::Infinite->new(2,1,4,5);
$b = Set::Infinite->new(2.1,1.1,4.1,5.1);
test ("intersection $a with $b", '$a->intersection($b)', "[1.1..2.],[4.1..5.]");
test ("size of $b is : ", '$b->size', "2.");
test ("span of $b is : ", '$b->span', "[1.1..5.1]");

tie $a, 'Set::Infinite', [1,2], [9,10];
test ("tied: ",'$a',"[1...2.],[9...10.]");

stats;
1;