1# -*- perl -*-
2
3use strict;
4use Set::IntSpan 1.17;
5
6my $N = 1;
7sub Not { print "not " }
8sub OK  { print "ok ", $N++, "\n" }
9
10my @Cardinality =
11#		 C  E  F  N  P  I  U   <      >
12    (['  -   ',  0, 1, 1, 0, 0, 0, 0,  undef, undef ],
13     [' (-)  ', -1, 0, 0, 1, 1, 1, 1,  undef, undef ],
14     [' (-0  ', -1, 0, 0, 1, 0, 1, 0,  undef, 0     ],
15     [' 0-)  ', -1, 0, 0, 0, 1, 1, 0,  0    , undef ],
16     ['  1   ',  1, 0, 1, 0, 0, 0, 0,  1    , 1     ],
17     ['  5   ',  1, 0, 1, 0, 0, 0, 0,  5    , 5     ],
18     [' 1,3,5',  3, 0, 1, 0, 0, 0, 0,  1    , 5     ],
19     [' 1,3-5',  4, 0, 1, 0, 0, 0, 0,  1    , 5     ],
20     ['-1-5  ',  7, 0, 1, 0, 0, 0, 0, -1    , 5     ],
21     );
22
23
24print "1..", 9 * @Cardinality, "\n";
25Cardinality();
26Empty();
27Finite();
28Neg_inf();
29Pos_inf();
30Infinite();
31Universal();
32Min();
33Max();
34
35
36sub Cardinality
37{
38    print "#cardinality\n";
39
40    for my $t (@Cardinality)
41    {
42	my $operand = $t->[0];
43	my $set = new Set::IntSpan $operand;
44	my $expected = $t->[1];
45
46	my $result = $set->cardinality();
47	printf "#%-12s %-12s -> %d\n", 'cardinality', $operand, $result;
48	$result == $expected or Not; OK;
49    }
50}
51
52
53sub Empty     { Size("empty"    , 2) }
54sub Finite    { Size("finite"   , 3) }
55sub Neg_inf   { Size("neg_inf"  , 4) }
56sub Pos_inf   { Size("pos_inf"  , 5) }
57sub Infinite  { Size("infinite" , 6) }
58sub Universal { Size("universal", 7) }
59
60sub Size
61{
62    my($method, $column) = @_;
63
64    print "#$method\n";
65
66    for my $t (@Cardinality)
67    {
68	my $operand = $t->[0];
69	my $set = new Set::IntSpan $operand;
70	my $expected = $t->[$column];
71	my $result = $set->$method();
72
73	printf "#%-12s %-12s -> %d\n", $method, $operand, $result;
74	$result ? $expected : ! $expected or Not; OK;
75    }
76}
77
78
79sub Min { Extrema("min", 8) }
80sub Max { Extrema("max", 9) }
81
82
83sub Extrema
84{
85    my($method, $column) = @_;
86
87    print "#$method\n";
88
89    for my $t (@Cardinality)
90    {
91	my $operand  = $t->[0];
92	my $set      = new Set::IntSpan $operand;
93	my $expected = $t->[$column];
94	my $result   = $set->$method();
95
96	printf "#%-12s %-12s -> %s\n",
97	$method, $operand, defined $result ? $result : 'undef';
98
99	not defined $result and not defined $expected or
100	    defined $result and     defined $expected and $result==$expected or
101		Not; OK;
102    }
103}
104
105
106