|
Packit |
ff3280 |
#/bin/perl -w
|
|
Packit |
ff3280 |
# Copyright (c) 2001 Flavio Soibelmann Glock. All rights reserved.
|
|
Packit |
ff3280 |
# This program is free software; you can redistribute it and/or
|
|
Packit |
ff3280 |
# modify it under the same terms as Perl itself.
|
|
Packit |
ff3280 |
#
|
|
Packit |
ff3280 |
# Tests for Set::Infinite backtracking
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
use strict;
|
|
Packit |
ff3280 |
# use warnings;
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
$| = 1;
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
use Set::Infinite qw($inf);
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
my ($a, $a_quant, $b, $c, $d, $finite, $q, $r);
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
my $test = 0;
|
|
Packit |
ff3280 |
my ($result, $errors);
|
|
Packit |
ff3280 |
my $neg_inf = -$inf;
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
sub test {
|
|
Packit |
ff3280 |
my ($header, $sub, $expected) = @_;
|
|
Packit |
ff3280 |
$test++;
|
|
Packit |
ff3280 |
# print " # $header \n";
|
|
Packit |
ff3280 |
$result = eval $sub;
|
|
Packit |
ff3280 |
$result = '' unless defined $result;
|
|
Packit |
ff3280 |
if ("$expected" eq "$result") {
|
|
Packit |
ff3280 |
print "ok $test\n";
|
|
Packit |
ff3280 |
print " # $header \n";
|
|
Packit |
ff3280 |
}
|
|
Packit |
ff3280 |
else {
|
|
Packit |
ff3280 |
print "not ok $test\n"; # \n\t# expected \"$expected\" got \"$result\"";
|
|
Packit |
ff3280 |
print " # $header \n";
|
|
Packit |
ff3280 |
print " # $sub expected \"$expected\" got \"$result\" $@\n";
|
|
Packit |
ff3280 |
$errors++;
|
|
Packit |
ff3280 |
}
|
|
Packit |
ff3280 |
# print " \n";
|
|
Packit |
ff3280 |
}
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
print "1..40\n";
|
|
Packit |
ff3280 |
$a = Set::Infinite->new([$neg_inf,15]);
|
|
Packit |
ff3280 |
$a_quant = $a->quantize(quant => 1);
|
|
Packit |
ff3280 |
$finite = Set::Infinite->new([10,20]);
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
$b = Set::Infinite->new([15,$inf]);
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# print "a = $a\n";
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# 1 "too complex"
|
|
Packit |
ff3280 |
$q = $a->quantize(quant => 1);
|
|
Packit |
ff3280 |
# print "q = ",$q,"\n";
|
|
Packit |
ff3280 |
test ('complex', '$q', $Set::Infinite::too_complex);
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# 2 quantize has min/max
|
|
Packit |
ff3280 |
$q = $a->quantize(quant => 1);
|
|
Packit |
ff3280 |
# print " q $q ",$q->min," $q ",$q->max," ",$q->intersection($finite),"\n";
|
|
Packit |
ff3280 |
test ('min', '$q->min', "$neg_inf");
|
|
Packit |
ff3280 |
test ('max', '$q->max', '16' );
|
|
Packit |
ff3280 |
test ('span', '$q->span', "($neg_inf..16)" );
|
|
Packit |
ff3280 |
test ('size', '$q->size', $inf );
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
$q = $b->quantize(quant => 1);
|
|
Packit |
ff3280 |
test ('min', '$q->min', '15');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# 7 min/max with open set
|
|
Packit |
ff3280 |
$r = $a->copy->complement(15);
|
|
Packit |
ff3280 |
# print "r = ",$r,"\n";
|
|
Packit |
ff3280 |
$r = $r->quantize(quant => 1);
|
|
Packit |
ff3280 |
test ('max', '$r->max', '15' );
|
|
Packit |
ff3280 |
test ('span', '$r->span', "($neg_inf..15)" );
|
|
Packit |
ff3280 |
test ('size', '$r->size', $inf );
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# 10 offset
|
|
Packit |
ff3280 |
$q = $r->offset( value => [ -10, 10 ] );
|
|
Packit |
ff3280 |
# print "r = ",$r->intersection(-100,100),"\n";
|
|
Packit |
ff3280 |
# print "r offset = ... ",$q->intersection(-100,100),"\n";
|
|
Packit |
ff3280 |
# $Set::Infinite::TRACE = 1;
|
|
Packit |
ff3280 |
# $Set::Infinite::PRETTY_PRINT = 1;
|
|
Packit |
ff3280 |
test ('max', '$q->max', '25' );
|
|
Packit |
ff3280 |
test ('span', '$q->span', "($neg_inf..25)" );
|
|
Packit |
ff3280 |
test ('size', '$q->size', $inf );
|
|
Packit |
ff3280 |
# $Set::Infinite::TRACE = 0;
|
|
Packit |
ff3280 |
# $Set::Infinite::PRETTY_PRINT = 0;
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# 13 min/max with open "integer" set
|
|
Packit |
ff3280 |
$r = $r->integer;
|
|
Packit |
ff3280 |
# print "r = ",$r->intersection(-1000,1000),"\n";
|
|
Packit |
ff3280 |
# print "r tolerance = ",$r->tolerance,"\n";
|
|
Packit |
ff3280 |
test ('max', '$r->max', '14' );
|
|
Packit |
ff3280 |
test ('span', '$r->span', "($neg_inf..14]" );
|
|
Packit |
ff3280 |
test ('size', '$r->size', $inf );
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# 16 max with union
|
|
Packit |
ff3280 |
$q = Set::Infinite->new([$neg_inf,15])->quantize;
|
|
Packit |
ff3280 |
$r = Set::Infinite->new([$neg_inf,10])->quantize;
|
|
Packit |
ff3280 |
test ('union-max', '$r->union($q)->max', '16' );
|
|
Packit |
ff3280 |
# max with intersection
|
|
Packit |
ff3280 |
# TODO: test this after we implement last()
|
|
Packit |
ff3280 |
test ('intersection-max', '$r->intersection($q)->max', '11' );
|
|
Packit |
ff3280 |
# min with union
|
|
Packit |
ff3280 |
# $Set::Infinite::TRACE = 1;
|
|
Packit |
ff3280 |
# $Set::Infinite::PRETTY_PRINT = 1;
|
|
Packit |
ff3280 |
$q = Set::Infinite->new([15,$inf])->quantize;
|
|
Packit |
ff3280 |
$r = Set::Infinite->new([10,$inf])->quantize;
|
|
Packit |
ff3280 |
# $Set::Infinite::TRACE = 1;
|
|
Packit |
ff3280 |
# $Set::Infinite::PRETTY_PRINT = 1;
|
|
Packit |
ff3280 |
test ('union-min', '$r->union($q)->min', '10' );
|
|
Packit |
ff3280 |
# min with intersection
|
|
Packit |
ff3280 |
# $Set::Infinite::TRACE = 1;
|
|
Packit |
ff3280 |
# $Set::Infinite::PRETTY_PRINT = 1;
|
|
Packit |
ff3280 |
test ('intersection-min', '$r->intersection($q)->min', '15' );
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# 20 min/max of complement works
|
|
Packit |
ff3280 |
# $Set::Infinite::TRACE = 1;
|
|
Packit |
ff3280 |
# $Set::Infinite::PRETTY_PRINT = 1;
|
|
Packit |
ff3280 |
$r = Set::Infinite->new([$neg_inf,15])->complement(15)->integer->quantize(quant => 1);
|
|
Packit |
ff3280 |
# print "r = ",$r,"\n";
|
|
Packit |
ff3280 |
$r = $r->complement(15); # complement doesn't backtrack yet
|
|
Packit |
ff3280 |
# print "r = ",$r,"\n";
|
|
Packit |
ff3280 |
test ('complement-max', '$r->max', '14' );
|
|
Packit |
ff3280 |
# $Set::Infinite::TRACE = 1;
|
|
Packit |
ff3280 |
# $Set::Infinite::PRETTY_PRINT = 1;
|
|
Packit |
ff3280 |
$r = $r->complement;
|
|
Packit |
ff3280 |
test ('complement-max=inf', '$r->max', $inf );
|
|
Packit |
ff3280 |
# $Set::Infinite::TRACE = 1;
|
|
Packit |
ff3280 |
# $Set::Infinite::PRETTY_PRINT = 1;
|
|
Packit |
ff3280 |
# (14..inf)
|
|
Packit |
ff3280 |
test ('complement-min', '$r->min', '15' );
|
|
Packit |
ff3280 |
# $Set::Infinite::TRACE = 0;
|
|
Packit |
ff3280 |
# $Set::Infinite::PRETTY_PRINT = 0;
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# 23 scalar
|
|
Packit |
ff3280 |
$q = $a->quantize(quant => 1);
|
|
Packit |
ff3280 |
# print "r = ",$q->intersection(10,20),"\n";
|
|
Packit |
ff3280 |
test ('intersection', '$q->intersection(10,20)', '[10..16)');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# 24 "date"
|
|
Packit |
ff3280 |
$a = Set::Infinite->new([$neg_inf,3800]);
|
|
Packit |
ff3280 |
# print "s = ",$a->quantize(quant => 1, unit => 'hours')->intersection(1000,15000),"\n";
|
|
Packit |
ff3280 |
test ('date', '$a->quantize(quant => 1, unit => \'hours\')->intersection(1000,15000)',
|
|
Packit |
ff3280 |
'[1000..7200)');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# 25 almost-intersecting "date"
|
|
Packit |
ff3280 |
$a = Set::Infinite->new([$neg_inf,3800]);
|
|
Packit |
ff3280 |
# print "t = ",$a->quantize(quant => 1, unit => 'hours')->intersection(3700,15000),"\n";
|
|
Packit |
ff3280 |
test ('', '$a->quantize(quant => 1, unit => \'hours\')->intersection(3700,15000)',
|
|
Packit |
ff3280 |
'[3700..7200)');
|
|
Packit |
ff3280 |
test ('', '$a->quantize(quant => 1, unit => \'hours\')->intersection(3900,15000)',
|
|
Packit |
ff3280 |
'[3900..7200)');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# 27 null "date"
|
|
Packit |
ff3280 |
# print "u = ",$a->quantize(quant => 1, unit => 'hours')->intersection(9000,15000),"\n";
|
|
Packit |
ff3280 |
test ('', '$a->quantize(quant => 1, unit => \'hours\')->intersection(9000,15000)',
|
|
Packit |
ff3280 |
'');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# 28 recursive
|
|
Packit |
ff3280 |
# print "v: ", $a->quantize(quant => 1)->quantize(quant => 1)->intersection(10,20), "\n";
|
|
Packit |
ff3280 |
test ('', '$a->quantize(quant => 1)->quantize(quant => 1)->intersection(10,20)',
|
|
Packit |
ff3280 |
'[10..20]');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# 29 intersection with 'b' complex
|
|
Packit |
ff3280 |
# print "w: ", $finite->intersection( $a->quantize(quant => 1) ), "\n";
|
|
Packit |
ff3280 |
test ('', '$finite->intersection( $a->quantize(quant => 1) )',
|
|
Packit |
ff3280 |
'[10..20]');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# 30 intersection with both 'a' and 'b' complex
|
|
Packit |
ff3280 |
$a = Set::Infinite->new([$neg_inf,15]);
|
|
Packit |
ff3280 |
$a_quant = $a->quantize(quant => 1);
|
|
Packit |
ff3280 |
$b = Set::Infinite->new([10,$inf])->quantize(quant => 1);
|
|
Packit |
ff3280 |
$c = Set::Infinite->new([20,$inf])->quantize(quant => 1);
|
|
Packit |
ff3280 |
$d = Set::Infinite->new([$neg_inf,12])->quantize(quant => 1);
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# intersecting
|
|
Packit |
ff3280 |
# print "x = ",$a_quant->intersection($b),"\n";
|
|
Packit |
ff3280 |
test ('complex intersection', '$a_quant->intersection($b)',
|
|
Packit |
ff3280 |
'[10..16)');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# non-intersecting
|
|
Packit |
ff3280 |
# print "y = ",$a_quant->intersection($c),"\n";
|
|
Packit |
ff3280 |
test ('complex no-intersection', '$a_quant->intersection($c)',
|
|
Packit |
ff3280 |
'');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# intersecting but too complex
|
|
Packit |
ff3280 |
# $Set::Infinite::TRACE = 1;
|
|
Packit |
ff3280 |
# $Set::Infinite::PRETTY_PRINT = 1;
|
|
Packit |
ff3280 |
# print "z = ",$a_quant->intersection($d),"\n";
|
|
Packit |
ff3280 |
test ('too-complex intersection', '$a_quant->intersection($d)',
|
|
Packit |
ff3280 |
"($neg_inf..13)" );
|
|
Packit |
ff3280 |
# $Set::Infinite::TRACE = 0;
|
|
Packit |
ff3280 |
# $Set::Infinite::PRETTY_PRINT = 0;
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# intersecting but too complex, then intersect again
|
|
Packit |
ff3280 |
# print "i = ",$a_quant->intersection($d)->intersection($finite),"\n";
|
|
Packit |
ff3280 |
test ('', '$a_quant->intersection($d)->intersection($finite)',
|
|
Packit |
ff3280 |
'[10..13)');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# 13 - 15 offset
|
|
Packit |
ff3280 |
# print "j = ",$a->quantize(quant => 4)->offset( value => [1,-1] )->intersection($finite),"\n";
|
|
Packit |
ff3280 |
# $Set::Infinite::TRACE = 1;
|
|
Packit |
ff3280 |
# $Set::Infinite::PRETTY_PRINT = 1;
|
|
Packit |
ff3280 |
test ('', '$a->quantize(quant => 4)->offset( value => [1,-1] )->intersection($finite)',
|
|
Packit |
ff3280 |
'[10..11),[13..15)');
|
|
Packit |
ff3280 |
# $Set::Infinite::TRACE = 0;
|
|
Packit |
ff3280 |
# $Set::Infinite::PRETTY_PRINT = 0;
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# BIG offset
|
|
Packit |
ff3280 |
# print "k = ",$a->quantize(quant => 4)->offset( value => [20,18] )->intersection($finite),"\n";
|
|
Packit |
ff3280 |
test ('', '$a->quantize(quant => 4)->offset( value => [20,18] )->intersection($finite)',
|
|
Packit |
ff3280 |
'[12..14),[16..18),20');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# intersecting, both complex
|
|
Packit |
ff3280 |
$a = Set::Infinite->new([$neg_inf,15]);
|
|
Packit |
ff3280 |
test ('', '$a->quantize(quant => 4)->offset( value => [1,-1] )->intersection($b)->intersection($finite)',
|
|
Packit |
ff3280 |
'[10..11),[13..15)');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# select
|
|
Packit |
ff3280 |
# print "l = ", $a->quantize(quant => 2)->select( freq => 3 )->intersection($finite), "\n";
|
|
Packit |
ff3280 |
# test ('', '$a->quantize(quant => 1)->select( by => [ 2, 4, 6, 8 ] )->intersection($finite)',
|
|
Packit |
ff3280 |
# '[10..11),[12..13),[14..15)');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# BIG, negative select
|
|
Packit |
ff3280 |
# -- wrong! (TODO ????)
|
|
Packit |
ff3280 |
# test ('', '$a->quantize(quant => 1)->select( freq => 2, by => [-10,10] )->intersection($finite)',
|
|
Packit |
ff3280 |
# '[10..11),[12..13),[14..15)');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# intersecting, both complex
|
|
Packit |
ff3280 |
# (TODO ????)
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# intersects
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# intersecting
|
|
Packit |
ff3280 |
test ('', '$a_quant->intersects($b)',
|
|
Packit |
ff3280 |
'1');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# non-intersecting
|
|
Packit |
ff3280 |
test ('', '$a_quant->intersects($c)',
|
|
Packit |
ff3280 |
'0');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# union
|
|
Packit |
ff3280 |
test ('', '$a_quant->union([50,60])->intersection([0,100])',
|
|
Packit |
ff3280 |
'[0..16),[50..60]');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# complement
|
|
Packit |
ff3280 |
# (TODO ????)
|
|
Packit |
ff3280 |
# $Set::Infinite::TRACE = 1;
|
|
Packit |
ff3280 |
# $Set::Infinite::DEBUG_BT = 1;
|
|
Packit |
ff3280 |
test ('', '$a_quant->complement->intersection([0,25])', '[16..25]');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# size
|
|
Packit |
ff3280 |
# (TODO ????)
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
# contains
|
|
Packit |
ff3280 |
# -- wrong! (TODO ????)
|
|
Packit |
ff3280 |
# test ('', '$a_quant->contains([0,100])',
|
|
Packit |
ff3280 |
# '');
|
|
Packit |
ff3280 |
|
|
Packit |
ff3280 |
1;
|