# 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..34\n"; } END {print "not ok 1\n" unless $loaded;} use Genezzo::Block::Std; use Genezzo::Block::RowDir; use Genezzo::Block::RDBlock; $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 strict; use warnings; local $Genezzo::Block::Std::xtraHdr = ""; # XXX XXX: no fancy system headers local $Genezzo::Block::Std::LenFtrTemplate = 0; my $TEST_COUNT; $TEST_COUNT = 2; { my $href = {}; my $buf = "G" x $Genezzo::Block::Std::DEFBLOCKSIZE; $href->{bigbuf} = \$buf; my $insert_num = 100; if (SetHdr(href => $href, BlockType => 1, NumElts => 2, FreeSpace => 3)) { ok(); } else { not_ok( "SetHdr: could not set" ); } my ($blocktype, $numelts, $freespace) = GetStdHdr($href); if (($blocktype == 1) && ($numelts == 2) && ($freespace == 3)) { ok(); } else { not_ok( "StdHdr: $blocktype $numelts $freespace versus 1 2 3" ); } if (ClearStdBlock($href)) { ok(); } else { not_ok( "ClearStdBlock"); } ($blocktype, $numelts, $freespace) = GetStdHdr($href); if (($blocktype == 0) && ($numelts == 0) && ($freespace == 0)) { ok(); } else { not_ok( "StdHdr: $blocktype $numelts $freespace versus 0 0 0" ); } my $icnt; my @tempo = (); for $icnt (0..$insert_num) { push @tempo, [$icnt, $icnt, $icnt]; SetRDEntry($href, $icnt, $icnt, $icnt, $icnt); } my $loopfail; for $icnt (0..$insert_num) { my $rd1 = $tempo[$icnt]; # print GetRDEntry($href, $icnt), "\n"; my ($status, $posn, $len) = GetRDEntry($href, $icnt); unless ( ($status == $rd1->[0]) && ($posn == $rd1->[1]) && ($len == $rd1->[2]) ) { $loopfail = 1; last; } } if ($loopfail) { not_ok( "mismatch between pushed and fetched values" ); } else { ok(); } } { # NOTE: add nometazero to rdblock tie to prevent default metadata # for row zero local $Genezzo::Block::Std::DEFBLOCKSIZE = 50; my $buff = "\0" x 5000; my %h1; my $tie_thing = tie %h1, "Genezzo::Block::RDBlock", (refbufstr => \$buff, nometazero => 1) or not_ok( "Couldn't create new RDBlock" ); ok(); my @plist = qw(foo bar baz ); # only room for two in small block if ($tie_thing->PUSH (@plist) == 2) { ok(); } else { not_ok( "push"); } my $icnt; my $loopfail; for $icnt (0..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->FETCHSIZE() == 2) { ok(); } else { not_ok( "fetchsize"); } %h1 = (); if ($tie_thing->FETCHSIZE() == 0) { ok(); } else { not_ok( "fetchsize"); } } { local $Genezzo::Block::Std::DEFBLOCKSIZE = 1000; my $buff = "\0" x 5000; my %h1; my $tie_thing = tie %h1, "Genezzo::Block::RDBlock", (refbufstr => \$buff, nometazero => 1) or not_ok( "Couldn't create new RDBlock" ); 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); # only room for two in small block if ($tie_thing->PUSH (@plist) == scalar(@plist)) { ok(); } else { not_ok( "push"); } my $icnt; my $loopfail; 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->FETCHSIZE() == scalar(@plist)) { ok(); } else { not_ok( "fetchsize"); } 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->FETCHSIZE() == (scalar(@plist) - 11)) { ok(); } else { not_ok( "fetchsize"); } 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(); } if ($tie_thing->PUSH( "alpha2", "bravo2", "charlie2") == 3) { ok(); } else { not_ok( "push"); } # 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(); } # get the std header info to see freespace savings for pack delete my $href = {}; $href->{bigbuf} = \$buff; my ($blocktype, $numelts, $freespace) = GetStdHdr($href); # print "$blocktype, $numelts, $freespace \n"; # should be able to pack the 11 deleted rows and save 57 bytes if ($tie_thing->_packdeleted() == 11) { ok(); } else { not_ok( "pack delete 1"); } $href = {}; $href->{bigbuf} = \$buff; my $oldfreespace = $freespace; ($blocktype, $numelts, $freespace) = GetStdHdr($href); # print "$blocktype, $numelts, $freespace \n"; if ($oldfreespace < $freespace) { ok(); } else { not_ok( "pack delete freespace"); } # no more rows to pack if ($tie_thing->_packdeleted() == 0) { ok(); } else { not_ok( "pack delete 2"); } } { local $Genezzo::Block::Std::DEFBLOCKSIZE = 1000; my $buff = "\0" x 5000; my %h1; my $tie_thing = tie %h1, "Genezzo::Block::RDBlock", (refbufstr => \$buff, nometazero => 1) or not_ok( "Couldn't create new RDBlock" ); 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); # only room for two in small block if ($tie_thing->PUSH (@plist) == scalar(@plist)) { ok(); } else { not_ok( "push"); } my $icnt; my $loopfail; 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->FETCHSIZE() == scalar(@plist)) { ok(); } else { not_ok( "fetchsize"); } for $icnt (10..(scalar(@plist) - 1)) { my $vv = delete $h1{$icnt}; unless ($vv eq $plist[$icnt]) { $loopfail = 1; last; } } if ($loopfail) { not_ok( "delete mismatch" ); } else { ok(); } 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(); } # get the std header info to see freespace savings for pack delete my $href = {}; $href->{bigbuf} = \$buff; my ($blocktype, $numelts, $freespace) = GetStdHdr($href); # print "$blocktype, $numelts, $freespace \n"; # deleting from the end of the block should not require packing if ($tie_thing->_packdeleted() == 0) { ok(); } else { not_ok( "pack delete 1"); } $href = {}; $href->{bigbuf} = \$buff; my $oldfreespace = $freespace; ($blocktype, $numelts, $freespace) = GetStdHdr($href); # print "$blocktype, $numelts, $freespace \n"; if ($oldfreespace == $freespace) { ok(); } else { not_ok( "pack delete freespace"); } # grow and shrink an entry and make sure it doesn't corrupt # adjacent values and the freespace calculation is correct $h1{1} = "A"; $href = {}; $href->{bigbuf} = \$buff; ($blocktype, $numelts, $freespace) = GetStdHdr($href); $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++; }