#!perl -w
use strict;
no strict "vars";
eval
{
require Storable;
*freeze = \&Storable::freeze;
*nfreeze = \&Storable::nfreeze;
*thaw = \&Storable::thaw;
*dclone = \&Storable::dclone;
};
if ($@ or $Storable::VERSION < 2.21)
{
print "1..0 # skip module Storable 2.21 or newer not found (we have $Storable::VERSION)\n";
exit 0;
}
require Bit::Vector;
# ======================================================================
# Determine the size of the nested data structure to be tested in the second part:
$length = 20;
# Create a set of numbers which will represent vector lengths to be tested:
$limit = 4096;
$set = Bit::Vector->new($limit);
$set->Primes(); # Initialize the set with prime numbers (pseudo-random)
$set->Bit_On(0); # Also test special cases with vectors of 0 and 1 bits length
$set->Bit_On(1);
for ( $i = 4; $i-1 < $limit; $i <<= 1 ) # Also test special cases of multiples of two and +/- 1
{
$set->Bit_On($i-1) if ($i-1 < $limit);
$set->Bit_On($i) if ($i < $limit);
$set->Bit_On($i+1) if ($i+1 < $limit);
}
$tests = (24 * $set->Norm()) + (69 * $length) - 14; # Determine number of test cases
print "1..$tests\n";
$n = 1;
$start = 0;
while (($start < $set->Size()) &&
(($min,$max) = $set->Interval_Scan_inc($start)))
{
$start = $max + 2;
for ( $bits = $min; $bits <= $max; $bits++ )
{
$vector = Bit::Vector->new($bits);
$vector->Primes();
$twin = thaw(freeze($vector));
if (ref($twin) eq 'Bit::Vector')
{print "ok $n\n";} else {print "not ok $n\n";} # 01
$n++;
if ($twin->Size() == $bits)
{print "ok $n\n";} else {print "not ok $n\n";} # 02
$n++;
if (${$vector} != ${$twin})
{print "ok $n\n";} else {print "not ok $n\n";} # 03
$n++;
if ($vector->equal($twin))
{print "ok $n\n";} else {print "not ok $n\n";} # 04
$n++;
$clone = dclone($vector);
if (ref($clone) eq 'Bit::Vector')
{print "ok $n\n";} else {print "not ok $n\n";} # 05
$n++;
if ($clone->Size() == $bits)
{print "ok $n\n";} else {print "not ok $n\n";} # 06
$n++;
if (${$vector} != ${$clone})
{print "ok $n\n";} else {print "not ok $n\n";} # 07
$n++;
if ($vector->equal($clone))
{print "ok $n\n";} else {print "not ok $n\n";} # 08
$n++;
if (${$twin} != ${$clone})
{print "ok $n\n";} else {print "not ok $n\n";} # 09
$n++;
if ($twin->equal($clone))
{print "ok $n\n";} else {print "not ok $n\n";} # 10
$n++;
if ($bits > 0)
{
$vector->Flip();
$twin = thaw(nfreeze($vector));
if (ref($twin) eq 'Bit::Vector')
{print "ok $n\n";} else {print "not ok $n\n";} # 11
$n++;
if ($twin->Size() == $bits)
{print "ok $n\n";} else {print "not ok $n\n";} # 12
$n++;
if (${$vector} != ${$twin})
{print "ok $n\n";} else {print "not ok $n\n";} # 13
$n++;
if ($vector->equal($twin))
{print "ok $n\n";} else {print "not ok $n\n";} # 14
$n++;
if (${$twin} != ${$clone})
{print "ok $n\n";} else {print "not ok $n\n";} # 15
$n++;
unless ($twin->equal($clone))
{print "ok $n\n";} else {print "not ok $n\n";} # 16
$n++;
$twin->Flip();
if ($twin->equal($clone))
{print "ok $n\n";} else {print "not ok $n\n";} # 17
$n++;
$clone = dclone($vector);
if (ref($clone) eq 'Bit::Vector')
{print "ok $n\n";} else {print "not ok $n\n";} # 18
$n++;
if ($clone->Size() == $bits)
{print "ok $n\n";} else {print "not ok $n\n";} # 19
$n++;
if (${$vector} != ${$clone})
{print "ok $n\n";} else {print "not ok $n\n";} # 20
$n++;
if ($vector->equal($clone))
{print "ok $n\n";} else {print "not ok $n\n";} # 21
$n++;
if (${$twin} != ${$clone})
{print "ok $n\n";} else {print "not ok $n\n";} # 22
$n++;
unless ($twin->equal($clone))
{print "ok $n\n";} else {print "not ok $n\n";} # 23
$n++;
$twin->Flip();
if ($twin->equal($clone))
{print "ok $n\n";} else {print "not ok $n\n";} # 24
$n++;
}
}
}
$i = 0;
$table = [];
$vector->Primes();
$start = $vector->Size() - 1;
while (($start >= 0) && ($i < $length) &&
(($min,$max) = $vector->Interval_Scan_dec($start)))
{
$start = $min - 2;
for ( $bits = $max; ($bits >= $min) && ($i < $length); $bits-- )
{
$temp = Bit::Vector->new($bits);
$temp->Primes();
$temp->Flip() if ($i & 1);
$table->[$i][0] = $temp;
$table->[$i][1] = $temp->Clone();
$table->[$i][2] = $temp;
$i++;
}
}
$twin = thaw(freeze( $table ));
$clone = dclone( $table );
for ( $i = 0; $i < $length; $i++ )
{
if (ref($twin->[$i][0]) eq 'Bit::Vector')
{print "ok $n\n";} else {print "not ok $n\n";} # 01
$n++;
if (ref($twin->[$i][1]) eq 'Bit::Vector')
{print "ok $n\n";} else {print "not ok $n\n";} # 02
$n++;
if (ref($twin->[$i][2]) eq 'Bit::Vector')
{print "ok $n\n";} else {print "not ok $n\n";} # 03
$n++;
if (ref($clone->[$i][0]) eq 'Bit::Vector')
{print "ok $n\n";} else {print "not ok $n\n";} # 04
$n++;
if (ref($clone->[$i][1]) eq 'Bit::Vector')
{print "ok $n\n";} else {print "not ok $n\n";} # 05
$n++;
if (ref($clone->[$i][2]) eq 'Bit::Vector')
{print "ok $n\n";} else {print "not ok $n\n";} # 06
$n++;
#####################################################
if ($twin->[$i][0]->Size() == $table->[$i][0]->Size())
{print "ok $n\n";} else {print "not ok $n\n";} # 07
$n++;
if ($twin->[$i][1]->Size() == $table->[$i][1]->Size())
{print "ok $n\n";} else {print "not ok $n\n";} # 08
$n++;
if ($twin->[$i][2]->Size() == $table->[$i][2]->Size())
{print "ok $n\n";} else {print "not ok $n\n";} # 09
$n++;
if ($twin->[$i][0]->equal( $table->[$i][0] ))
{print "ok $n\n";} else {print "not ok $n\n";} # 10
$n++;
if ($twin->[$i][1]->equal( $table->[$i][1] ))
{print "ok $n\n";} else {print "not ok $n\n";} # 11
$n++;
if ($twin->[$i][2]->equal( $table->[$i][2] ))
{print "ok $n\n";} else {print "not ok $n\n";} # 12
$n++;
if ($twin->[$i][0]->Size() == $twin->[$i][1]->Size())
{print "ok $n\n";} else {print "not ok $n\n";} # 13
$n++;
if ($twin->[$i][1]->Size() == $twin->[$i][2]->Size())
{print "ok $n\n";} else {print "not ok $n\n";} # 14
$n++;
if ($twin->[$i][2]->Size() == $twin->[$i][0]->Size())
{print "ok $n\n";} else {print "not ok $n\n";} # 15
$n++;
if ($twin->[$i][0]->equal( $twin->[$i][1] ))
{print "ok $n\n";} else {print "not ok $n\n";} # 16
$n++;
if ($twin->[$i][1]->equal( $twin->[$i][2] ))
{print "ok $n\n";} else {print "not ok $n\n";} # 17
$n++;
if ($twin->[$i][2]->equal( $twin->[$i][0] ))
{print "ok $n\n";} else {print "not ok $n\n";} # 18
$n++;
if (${$twin->[$i][0]} != ${$table->[$i][0]})
{print "ok $n\n";} else {print "not ok $n\n";} # 19
$n++;
if (${$twin->[$i][1]} != ${$table->[$i][0]})
{print "ok $n\n";} else {print "not ok $n\n";} # 20
$n++;
if (${$twin->[$i][2]} != ${$table->[$i][0]})
{print "ok $n\n";} else {print "not ok $n\n";} # 21
$n++;
if (${$twin->[$i][0]} != ${$table->[$i][1]})
{print "ok $n\n";} else {print "not ok $n\n";} # 22
$n++;
if (${$twin->[$i][1]} != ${$table->[$i][1]})
{print "ok $n\n";} else {print "not ok $n\n";} # 23
$n++;
if (${$twin->[$i][2]} != ${$table->[$i][1]})
{print "ok $n\n";} else {print "not ok $n\n";} # 24
$n++;
if (${$twin->[$i][0]} != ${$table->[$i][2]})
{print "ok $n\n";} else {print "not ok $n\n";} # 25
$n++;
if (${$twin->[$i][1]} != ${$table->[$i][2]})
{print "ok $n\n";} else {print "not ok $n\n";} # 26
$n++;
if (${$twin->[$i][2]} != ${$table->[$i][2]})
{print "ok $n\n";} else {print "not ok $n\n";} # 27
$n++;
if ($twin->[$i][0] ne $twin->[$i][1])
{print "ok $n\n";} else {print "not ok $n\n";} # 28
$n++;
if ($twin->[$i][1] ne $twin->[$i][2])
{print "ok $n\n";} else {print "not ok $n\n";} # 29
$n++;
if ($twin->[$i][2] eq $twin->[$i][0])
{print "ok $n\n";} else {print "not ok $n\n";} # 30
$n++;
if (${$twin->[$i][0]} != ${$twin->[$i][1]})
{print "ok $n\n";} else {print "not ok $n\n";} # 31
$n++;
if (${$twin->[$i][1]} != ${$twin->[$i][2]})
{print "ok $n\n";} else {print "not ok $n\n";} # 32
$n++;
if (${$twin->[$i][2]} == ${$twin->[$i][0]})
{print "ok $n\n";} else {print "not ok $n\n";} # 33
$n++;
#####################################################
if ($clone->[$i][0]->Size() == $table->[$i][0]->Size())
{print "ok $n\n";} else {print "not ok $n\n";} # 34
$n++;
if ($clone->[$i][1]->Size() == $table->[$i][1]->Size())
{print "ok $n\n";} else {print "not ok $n\n";} # 35
$n++;
if ($clone->[$i][2]->Size() == $table->[$i][2]->Size())
{print "ok $n\n";} else {print "not ok $n\n";} # 36
$n++;
if ($clone->[$i][0]->equal( $table->[$i][0] ))
{print "ok $n\n";} else {print "not ok $n\n";} # 37
$n++;
if ($clone->[$i][1]->equal( $table->[$i][1] ))
{print "ok $n\n";} else {print "not ok $n\n";} # 38
$n++;
if ($clone->[$i][2]->equal( $table->[$i][2] ))
{print "ok $n\n";} else {print "not ok $n\n";} # 39
$n++;
if ($clone->[$i][0]->Size() == $clone->[$i][1]->Size())
{print "ok $n\n";} else {print "not ok $n\n";} # 40
$n++;
if ($clone->[$i][1]->Size() == $clone->[$i][2]->Size())
{print "ok $n\n";} else {print "not ok $n\n";} # 41
$n++;
if ($clone->[$i][2]->Size() == $clone->[$i][0]->Size())
{print "ok $n\n";} else {print "not ok $n\n";} # 42
$n++;
if ($clone->[$i][0]->equal( $clone->[$i][1] ))
{print "ok $n\n";} else {print "not ok $n\n";} # 43
$n++;
if ($clone->[$i][1]->equal( $clone->[$i][2] ))
{print "ok $n\n";} else {print "not ok $n\n";} # 44
$n++;
if ($clone->[$i][2]->equal( $clone->[$i][0] ))
{print "ok $n\n";} else {print "not ok $n\n";} # 45
$n++;
if (${$clone->[$i][0]} != ${$table->[$i][0]})
{print "ok $n\n";} else {print "not ok $n\n";} # 46
$n++;
if (${$clone->[$i][1]} != ${$table->[$i][0]})
{print "ok $n\n";} else {print "not ok $n\n";} # 47
$n++;
if (${$clone->[$i][2]} != ${$table->[$i][0]})
{print "ok $n\n";} else {print "not ok $n\n";} # 48
$n++;
if (${$clone->[$i][0]} != ${$table->[$i][1]})
{print "ok $n\n";} else {print "not ok $n\n";} # 49
$n++;
if (${$clone->[$i][1]} != ${$table->[$i][1]})
{print "ok $n\n";} else {print "not ok $n\n";} # 50
$n++;
if (${$clone->[$i][2]} != ${$table->[$i][1]})
{print "ok $n\n";} else {print "not ok $n\n";} # 51
$n++;
if (${$clone->[$i][0]} != ${$table->[$i][2]})
{print "ok $n\n";} else {print "not ok $n\n";} # 52
$n++;
if (${$clone->[$i][1]} != ${$table->[$i][2]})
{print "ok $n\n";} else {print "not ok $n\n";} # 53
$n++;
if (${$clone->[$i][2]} != ${$table->[$i][2]})
{print "ok $n\n";} else {print "not ok $n\n";} # 54
$n++;
if ($clone->[$i][0] ne $clone->[$i][1])
{print "ok $n\n";} else {print "not ok $n\n";} # 55
$n++;
if ($clone->[$i][1] ne $clone->[$i][2])
{print "ok $n\n";} else {print "not ok $n\n";} # 56
$n++;
if ($clone->[$i][2] eq $clone->[$i][0])
{print "ok $n\n";} else {print "not ok $n\n";} # 57
$n++;
if (${$clone->[$i][0]} != ${$clone->[$i][1]})
{print "ok $n\n";} else {print "not ok $n\n";} # 58
$n++;
if (${$clone->[$i][1]} != ${$clone->[$i][2]})
{print "ok $n\n";} else {print "not ok $n\n";} # 59
$n++;
if (${$clone->[$i][2]} == ${$clone->[$i][0]})
{print "ok $n\n";} else {print "not ok $n\n";} # 60
$n++;
#####################################################
if (${$twin->[$i][0]} != ${$clone->[$i][0]})
{print "ok $n\n";} else {print "not ok $n\n";} # 61
$n++;
if (${$twin->[$i][1]} != ${$clone->[$i][0]})
{print "ok $n\n";} else {print "not ok $n\n";} # 62
$n++;
if (${$twin->[$i][2]} != ${$clone->[$i][0]})
{print "ok $n\n";} else {print "not ok $n\n";} # 63
$n++;
if (${$twin->[$i][0]} != ${$clone->[$i][1]})
{print "ok $n\n";} else {print "not ok $n\n";} # 64
$n++;
if (${$twin->[$i][1]} != ${$clone->[$i][1]})
{print "ok $n\n";} else {print "not ok $n\n";} # 65
$n++;
if (${$twin->[$i][2]} != ${$clone->[$i][1]})
{print "ok $n\n";} else {print "not ok $n\n";} # 66
$n++;
if (${$twin->[$i][0]} != ${$clone->[$i][2]})
{print "ok $n\n";} else {print "not ok $n\n";} # 67
$n++;
if (${$twin->[$i][1]} != ${$clone->[$i][2]})
{print "ok $n\n";} else {print "not ok $n\n";} # 68
$n++;
if (${$twin->[$i][2]} != ${$clone->[$i][2]})
{print "ok $n\n";} else {print "not ok $n\n";} # 69
$n++;
}
__END__