# Copyright (c) 2003, 2004 Jeffrey I Cohen. All rights reserved.
#
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl test.pl'
######################### We start with some black magic to print on failure.
# Change 1..1 below to 1..last_test_to_print .
# (It may become useful if the test is moved to ./t subdirectory.)
BEGIN { $| = 1; print "1..45\n"; }
END {print "not ok 1\n" unless $loaded;}
use Genezzo::Block::Std;
use Genezzo::Row::RSBlock;
$loaded = 1;
print "ok 1\n";
######################### End of black magic.
# Insert your test code below (better if it prints "ok 13"
# (correspondingly "not ok 13") depending on the success of chunk 13
# of the test code):
use Genezzo::Util;
use strict;
use warnings;
my $TEST_COUNT;
$TEST_COUNT = 2;
my $bufsize = $Genezzo::Util::DEFBLOCKSIZE + 1;
# loop contains 9? tests...
foreach my $phclass qw(
Genezzo::Row::RSBlock
)
{
# NOTE: add nometazero to rsblock tie to prevent default metadata
# for row zero
# basic push (insert) and fetch integrity test
my $insert_num = 100;
my $delete_num = 50;
my $buff = "\0" x $bufsize;
my %td_hash = ();
my $foo;
my $tiehash =
tie %td_hash, $phclass, (refbufstr => \$buff,
nometazero => 1) or
not_ok( "Couldn't create new PushHash" );
ok( );
my $icnt;
my (@tempo1, @tempo2);
for $icnt (1..$insert_num)
{
push @tempo1, $tiehash->HPush("foo1 $icnt");
push @tempo2, "foo1 $icnt";
}
if (scalar(@tempo1) != $insert_num)
{
not_ok( "Could not push into pushhash" );
}
else { ok(); }
if ($tiehash->HCount() != $insert_num)
{
not_ok( "Could not HCount pushhash" );
}
else { ok(); }
my $loopfail;
foreach $icnt (0..($insert_num - 1)) # array index starts at zero
{
# print $td_hash{$tempo1[$icnt]}, "\t", $tempo2[$icnt], "\n";
unless ($td_hash{$tempo1[$icnt]} eq $tempo2[$icnt])
{
$loopfail = 1;
last;
}
}
if ($loopfail)
{
not_ok( "mismatch between pushed and fetched values" );
}
else { ok(); }
foreach $icnt (0..($insert_num - 1)) # array index starts at zero
{
# print $td_hash{$tempo1[$icnt]}, "\t", $tempo2[$icnt], "\n";
unless ($tiehash->FETCH($tempo1[$icnt]) eq $tempo2[$icnt])
{
$loopfail = 1;
last;
}
}
if ($loopfail)
{
not_ok( "mismatch between pushed and fetched values" );
}
else { ok(); }
# print $phclass;
# print scalar(keys(%td_hash)), "\t", ($insert_num - $delete_num), "\n";
# XXX: reverse delete since PHArray can only delete last element
for $icnt (1..($delete_num ))
{
# use tied var to delete
my $d1 =
$tiehash->DELETE($tempo1[(-1 * $icnt)]);
my $d2 = pop @tempo2;
# print $tempo1[$icnt], "\t", $d1, "\t", $d2, "\n";
unless ($d1 eq $d2)
{
$loopfail = 1;
last;
}
}
if ($loopfail)
{
not_ok( "delete mismatch" );
}
else { ok(); }
if (scalar(keys(%td_hash)) != ($insert_num - $delete_num))
{
print $phclass;
print scalar(keys(%td_hash)), "\t", ($insert_num - $delete_num), "\n";
not_ok( "incomplete delete " );
}
else { ok(); }
# print $phclass;
# print scalar(keys(%td_hash)), "\t", ($insert_num - $delete_num), "\n";
# XXX: reverse delete since PHArray can only delete last element
for $icnt (1..($delete_num ))
{
# delete another $delete_num from the tied hash
my $d1 =
delete $td_hash{($tempo1[(-1 * ($icnt+ $delete_num ))])};
my $d2 = pop @tempo2;
# print $tempo1[$icnt], "\t", $d1, "\t", $d2, "\n";
unless ($d1 eq $d2)
{
$loopfail = 1;
last;
}
}
if ($loopfail)
{
not_ok( "delete mismatch" );
}
else { ok(); }
if (scalar(keys(%td_hash)) != ($insert_num - (2 * $delete_num)))
{
# print $phclass;
# print scalar(keys(%td_hash)), "\t", ($insert_num - (2 * $delete_num)), "\n";
not_ok( "incomplete delete " );
}
else { ok(); }
}
# loop contains 3 tests...
foreach my $phclass qw(
Genezzo::Row::RSBlock
)
{
# basic push (insert) and fetch integrity test
my $insert_num = 100;
my $delete_num = 50;
my $buff = "\0" x $bufsize;
my %td_hash = ();
my $foo;
my $tiehash =
tie %td_hash, $phclass, (refbufstr => \$buff,
nometazero => 1) or
not_ok( "Couldn't create new PushHash" );
ok( );
my $icnt;
my (@tempo1, @tempo2);
for $icnt (1..$insert_num)
{
push @tempo1, $tiehash->STORE("PUSH", "foo1 $icnt");
push @tempo2, "foo1 $icnt";
}
if (scalar(@tempo1) != $insert_num)
{
not_ok( "Could not push into pushhash" );
}
else { ok(); }
my $loopfail;
foreach $icnt (0..($insert_num - 1)) # array index starts at zero
{
# print $tempo1[$icnt], "\t", $tempo2[$icnt], "\n";
unless ($tempo1[$icnt] eq $tempo2[$icnt])
{
$loopfail = 1;
last;
}
}
if ($loopfail)
{
not_ok( "mismatch between pushed and fetched values" );
}
else { ok(); }
}
# loop contains 3 tests...
foreach my $phclass qw(
Genezzo::Row::RSBlock
)
{
# basic push (insert) and fetch integrity test
my $insert_num = 5;
my $buff = "\0" x $bufsize;
my %td_hash = ();
my $foo;
my $tiehash =
tie %td_hash, $phclass, (refbufstr => \$buff,
nometazero => 1) or
not_ok( "Couldn't create new PushHash" );
ok( );
my $icnt;
my (@tempo1, @tempo2);
for $icnt (1..$insert_num)
{
$td_hash{PUSH} = "foo1 $icnt";
push @tempo2, "foo1 $icnt";
}
if (scalar(keys(%td_hash)) != $insert_num)
{
not_ok( "Could not push into pushhash" );
}
else { ok(); }
# XXX: should work for these implementations if less than 10 values -
# problem with sorting of:
# 1048924128.0
# 1048924128.1
# 1048924128.11
# 1048924128.111
# 1048924128.2
@tempo1 = sort(keys(%td_hash)) ;
# print join ("\n", @tempo1), "\n";
my $loopfail;
foreach $icnt (0..($insert_num - 1)) # array index starts at zero
{
# print $phclass, $td_hash{$tempo1[$icnt]}, "\t", $tempo2[$icnt], "\n";
unless ($td_hash{$tempo1[$icnt]} eq $tempo2[$icnt])
{
$loopfail = 1;
last;
}
}
if ($loopfail)
{
not_ok( "mismatch between pushed and fetched values" );
}
else { ok(); }
}
# updates
foreach my $phclass qw(
Genezzo::Row::RSBlock
) # Genezzo::PushHash::PHNoUpdate
{
# basic push (insert) and fetch integrity test
my $insert_num = 100;
my $update_num = 5;
my $buff = "\0" x $bufsize;
my %td_hash = ();
my $foo;
my $tiehash =
tie %td_hash, $phclass, (refbufstr => \$buff,
nometazero => 1) or
not_ok( "Couldn't create new PushHash" );
ok( );
my $icnt;
my (@tempo1, @tempo2);
for $icnt (1..$insert_num)
{
push @tempo1, $tiehash->HPush("foo1 $icnt");
push @tempo2, "foo1 $icnt";
}
if (scalar(@tempo1) != $insert_num)
{
not_ok( "Could not push into pushhash" );
}
else { ok(); }
if ($tiehash->HCount() != $insert_num)
{
not_ok( "Could not HCount pushhash" );
}
else { ok(); }
my $loopfail;
foreach $icnt (0..($insert_num - 1)) # array index starts at zero
{
# print $td_hash{$tempo1[$icnt]}, "\t", $tempo2[$icnt], "\n";
unless ($td_hash{$tempo1[$icnt]} eq $tempo2[$icnt])
{
$loopfail = 1;
last;
}
}
if ($loopfail)
{
not_ok( "mismatch between pushed and fetched values" );
}
else { ok(); }
for $icnt (1..$update_num )
{
# use tied var to update
my $d1 =
$tiehash->STORE($tempo1[($icnt)], "baz1 $update_num");
my $d2 = $tempo2[$icnt] = "baz1 $update_num";
# print $tempo1[$icnt], "\t", $d1, "\t", $d2, "\n";
unless ($d1 eq $d2)
{
$loopfail = 1;
last;
}
}
if ($loopfail)
{
not_ok( "update mismatch" );
}
else { ok(); }
for $icnt (1..($update_num ))
{
# delete another $delete_num from the tied hash
my $d1 = $td_hash{($tempo1[$icnt + $update_num])} = "baz2 $update_num";
my $d2 = $tempo2[$icnt + $update_num] = "baz2 $update_num";
# print $tempo1[$icnt], "\t", $d1, "\t", $d2, "\n";
unless ($d1 eq $d2)
{
$loopfail = 1;
last;
}
}
if ($loopfail)
{
not_ok( "update mismatch" );
}
else { ok(); }
foreach $icnt (0..($insert_num - 1)) # array index starts at zero
{
# print $td_hash{$tempo1[$icnt]}, "\t", $tempo2[$icnt], "\n";
unless ($td_hash{$tempo1[$icnt]} eq $tempo2[$icnt])
{
$loopfail = 1;
last;
}
}
if ($loopfail)
{
not_ok( "mismatch between updated and fetched values" );
}
else { ok(); }
foreach $icnt (0..($insert_num - 1)) # array index starts at zero
{
# print $td_hash{$tempo1[$icnt]}, "\t", $tempo2[$icnt], "\n";
unless (exists $td_hash{$tempo1[$icnt]})
{
$loopfail = 1;
last;
}
}
if ($loopfail)
{
not_ok( "exists mismatch" );
}
else { ok(); }
#
# pharray?
# if (exists $td_hash{"no such value"})
# {
# print $phclass, $td_hash{"no such value"} , "\n";
# not_ok( "exists mismatch 2" );
# }
# else { ok(); }
#
# if ($tiehash->EXISTS("no such value"))
# {
# print $phclass, $td_hash{"no such value"} , "\n";
# not_ok( "exists mismatch 3" );
# }
# else { ok(); }
}
foreach my $phclass qw(
Genezzo::Row::RSBlock
)
{
# basic push (insert) and fetch integrity test
my $insert_num = 100;
my $delete_num = 50;
my $buff = "\0" x $bufsize;
my %td_hash = ();
my $foo;
my $tiehash =
tie %td_hash, $phclass, (refbufstr => \$buff,
nometazero => 1) or
not_ok( "Couldn't create new PushHash" );
ok( );
my $icnt;
my (@tempo1, @tempo2);
for $icnt (1..$insert_num)
{
push @tempo1, $tiehash->HPush("foo1 $icnt");
push @tempo2, "foo1 $icnt";
}
if (scalar(@tempo1) != $insert_num)
{
not_ok( "Could not push into pushhash" );
}
else { ok(); }
if ($tiehash->HCount() != $insert_num)
{
not_ok( "Could not HCount pushhash" );
}
else { ok(); }
%td_hash = (); # clear
if ($tiehash->HCount() != 0)
{
not_ok( "Could not clear pushhash" );
}
else { ok(); }
}
foreach my $phclass qw(
Genezzo::Row::RSBlock
)
{
# basic push (insert) and fetch integrity test
my $insert_num = 100;
my $delete_num = 50;
my $buff = "\0" x $bufsize;
my %td_hash = ();
my $foo;
my $tiehash =
tie %td_hash, $phclass, (refbufstr => \$buff,
nometazero => 1) or
not_ok( "Couldn't create new PushHash" );
ok( );
my $icnt;
my (@tempo1, @tempo2);
for $icnt (1..$insert_num)
{
push @tempo1, $tiehash->HPush("foo1 $icnt");
push @tempo2, "foo1 $icnt";
}
if (scalar(@tempo1) != $insert_num)
{
not_ok( "Could not push into pushhash" );
}
else { ok(); }
if ($tiehash->HCount() != $insert_num)
{
not_ok( "Could not HCount pushhash" );
}
else { ok(); }
$tiehash->CLEAR();
if ($tiehash->HCount() != 0)
{
not_ok( "Could not clear pushhash" );
}
else { ok(); }
}
{
my $buff = "\0" x $bufsize;
my %h1;
my $tie_thing = tie %h1, "Genezzo::Row::RSBlock", (refbufstr => \$buff,
nometazero => 1)
or
not_ok( "Couldn't create new RSBlock" );
ok();
my @plist = qw(alpha bravo charlie delta echo foxtrot golf hotel
india juliet kilo lima mike november oscar papa quebec
romeo sierra tango uniform victor whiskey xray
yankee zulu);
my $icnt;
my $loopfail;
foreach $icnt (@plist)
{
$h1{PUSH} = $icnt;
}
for $icnt (0..(scalar(@plist) - 1))
{
unless ($h1{$icnt} eq $plist[$icnt])
{
$loopfail = 1;
last;
}
}
if ($loopfail)
{
not_ok( "mismatch between pushed and fetched values" );
}
else { ok(); }
if ($tie_thing->HCount() == scalar(@plist))
{
ok();
}
else
{
not_ok( "hcount");
}
for $icnt (0..10)
{
my $vv = delete $h1{$icnt};
unless ($vv eq $plist[$icnt])
{
$loopfail = 1;
last;
}
}
if ($loopfail)
{
not_ok( "delete mismatch" );
}
else { ok(); }
if ($tie_thing->HCount() == (scalar(@plist) - 11))
{
ok();
}
else
{
not_ok( "HCount");
}
while ( my ($kk, $vv) = each(%h1))
{
# print "$kk: $vv\n";
unless ($vv eq $plist[$kk])
{
$loopfail = 1;
last;
}
}
if ($loopfail)
{
not_ok( "mismatch between pushed and fetched values" );
}
else { ok(); }
foreach $icnt ( "alpha2", "bravo2", "charlie2")
{
$h1{PUSH} = $icnt;
}
# XXX: assumption - don't reuse first slots in block even if they
# are deleted
push (@plist, "alpha2", "bravo2", "charlie2");
while ( my ($kk, $vv) = each(%h1))
{
# print "$kk: $vv\n";
unless ($vv eq $plist[$kk])
{
$loopfail = 1;
last;
}
}
if ($loopfail)
{
not_ok( "mismatch between pushed and fetched values" );
}
else { ok(); }
}
{
my $buff = "\0" x $bufsize;
my %h1;
my $tie_thing = tie %h1, "Genezzo::Row::RSBlock", (refbufstr => \$buff,
nometazero => 1)
or
not_ok( "Couldn't create new RSBlock" );
ok();
my @plist = qw(alpha bravo charlie delta echo foxtrot golf hotel
india juliet kilo lima mike november oscar papa quebec
romeo sierra tango uniform victor whiskey xray
yankee zulu);
my $icnt;
my $loopfail;
foreach $icnt (@plist)
{
$h1{PUSH} = $icnt;
}
for $icnt (0..(scalar(@plist) - 1))
{
unless ($h1{$icnt} eq $plist[$icnt])
{
$loopfail = 1;
last;
}
}
if ($loopfail)
{
not_ok( "mismatch between pushed and fetched values" );
}
else { ok(); }
if ($tie_thing->HCount() == scalar(@plist))
{
ok();
}
else
{
not_ok( "hcount");
}
# grow and shrink an entry and make sure it doesn't corrupt
# adjacent values and the freespace calculation is correct
$h1{1} = "A";
my $href = {};
$href->{bigbuf} = \$buff;
my ($blocktype, $numelts, $freespace) = GetStdHdr($href);
my $oldfreespace = $freespace;
($blocktype, $numelts, $freespace) = GetStdHdr($href);
# print "$blocktype, $numelts, $freespace \n";
my $cnt = 1;
# make sure that space differs by 1 -- need to add 2 to make compare work
my $oldspace = $freespace + 2;
for my $val ("A".."Z")
{
my $vv = $h1{1} = $val x $cnt;
# print $h1{0}, "\t";
# print $h1{1}, "\t";
# print $h1{2}, "\n";
my @foo = GetStdHdr($href);
# print join(" ",@foo), "\n";
unless (
($h1{0} eq $plist[0])
&& ($h1{2} eq $plist[2])
&& ($h1{1} eq $vv)
# && ($oldspace == ($foo[2] - 1))
)
{
$loopfail = 1;
last;
}
$oldspace = $foo[2];
$cnt++;
}
if ($loopfail)
{
not_ok( "mismatch between pushed and fetched values" );
}
else { ok(); }
my @foo = GetStdHdr($href);
# print join(" ",@foo), "\n";
$cnt--;
for my $val ("A".."Z")
{
my $vv = $h1{1} = $val x $cnt;
# print $h1{0}, "\t";
# print $h1{1}, "\t";
# print $h1{2}, "\n";
unless (
($h1{0} eq $plist[0])
&& ($h1{2} eq $plist[2])
&& ($h1{1} eq $vv)
)
{
$loopfail = 1;
last;
}
$cnt--;
}
if ($loopfail)
{
not_ok( "mismatch between pushed and fetched values" );
}
else { ok(); }
$href = {};
$href->{bigbuf} = \$buff;
$oldfreespace = $freespace;
($blocktype, $numelts, $freespace) = GetStdHdr($href);
# print "$blocktype, $numelts, $freespace \n";
# h1{2} should be original size so freespace should match
if ($oldfreespace == $freespace)
{
ok();
}
else
{
not_ok( "update freespace");
}
}
sub ok
{
print "ok $TEST_COUNT\n";
$TEST_COUNT++;
}
sub not_ok
{
my ( $message ) = @_;
print "not ok $TEST_COUNT # $message\n";
$TEST_COUNT++;
}
sub skip
{
my ( $message ) = @_;
print "ok $TEST_COUNT # skipped: $message\n";
$TEST_COUNT++;
}