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
10sub Table { [ map { [ split(' ', $_) ] } split(/\s*\n\s*/, shift) ] }
11
12my @Sets     = split(' ',  q{ - (-) (-3 3-) 3 3-5 3-5,7-9 } );
13my @Elements = ( 1..7 );
14
15my $Member = Table <<TABLE;
160 0 0 0 0 0 0
171 1 1 1 1 1 1
181 1 1 0 0 0 0
190 0 1 1 1 1 1
200 0 1 0 0 0 0
210 0 1 1 1 0 0
220 0 1 1 1 0 1
23TABLE
24
25my $Insert = Table <<TABLE;
26 1         2       3       4       5       6     7
27(-)       (-)     (-)     (-)     (-)     (-)   (-)
28(-3       (-3     (-3     (-4     (-3,5   (-3,6 (-3,7
291,3-)     2-)     3-)     3-)     3-)     3-)   3-)
301,3       2-3     3       3-4     3,5     3,6   3,7
311,3-5     2-5     3-5     3-5     3-5     3-6   3-5,7
321,3-5,7-9 2-5,7-9 3-5,7-9 3-5,7-9 3-5,7-9 3-9   3-5,7-9
33TABLE
34
35my $Remove = Table <<TABLE;
36-       -       -       -       -       -       -
37(-0,2-) (-1,3-) (-2,4-) (-3,5-) (-4,6-) (-5,7-) (-6,8-)
38(-0,2-3 (-1,3   (-2     (-3     (-3     (-3     (-3
393-)     3-)     4-)     3,5-)   3-4,6-) 3-5,7-) 3-6,8-)
403       3       -       3       3       3       3
413-5     3-5     4-5     3,5     3-4     3-5     3-5
423-5,7-9 3-5,7-9 4-5,7-9 3,5,7-9 3-4,7-9 3-5,7-9 3-5,8-9
43TABLE
44
45
46print "1..", 3 * @Sets * @Elements, "\n";
47Member();
48Insert();
49Remove();
50
51
52sub Member
53{
54    print "#member\n";
55
56    for my $s (0..$#Sets)
57    {
58	for my $i (0..$#Elements)
59	{
60	    my $run_list = $Sets[$s];
61	    my $set = new Set::IntSpan $run_list;
62	    my $int = $Elements[$i];
63	    my $result = member $set $int;
64
65	    printf "#%-12s %-12s %d -> %d\n",
66	    "member", $run_list, $int, $result;
67	    my $expected = $Member->[$s][$i];
68	    $result ? $expected : ! $expected or Not; OK;
69	}
70    }
71}
72
73
74sub Insert { Delta("insert", $Insert) }
75sub Remove { Delta("remove", $Remove) }
76
77sub Delta
78{
79    my($method, $expected) = @_;
80
81    print "#$method\n";
82
83    for my $s (0..$#Sets)
84    {
85	for my $i (0..$#Elements)
86	{
87	    my $run_list = $Sets[$s];
88	    my $set = new Set::IntSpan $run_list;
89	    my $int = $Elements[$i];
90	    $set->$method($int);
91	    my $result = run_list $set;
92
93	    printf "#%-12s %-12s %d -> %s\n",
94	    $method, $run_list, $int, $result;
95	    $result eq $expected->[$s][$i] or Not; OK;
96	}
97    }
98}
99