On Wed, Aug 18, 2004 at 12:56:17PM -0500, Bryan Baldus wrote:
> Ok, I'll try to provide a test file. However, since I've been using MacPerl
> (and Windows), I don't usually deal with test files (the usual
> perl Makefile.PL
> make
> make test
> make install
> doesn't usually work for me, though occasionally I will run the tests
> one-by-one).
How do you typically do the install? MARC::Record is included at the
ActiveState PPM Repository, so it should do these things on a Windows
platform...assuming nmake or some sort of make variant is being used.
> So, this .t file, should it just be a raw USMARC/MARC21 format
> record exhibiting one of the problems that generates a warning during the
> decode process (probably not, since you said .t rather than .usmarc), or
> does the .t file need to include calling code, and if so, is the Test module
> tutorial (Test::Tutorial) the best place to look for creating such a .t
> file?
Take a look in the t/ subdirectory of the MARC::Record package. These
are the tests that get run automatically during a 'make test'. There are
lots of resources available for learning how to write perl unit tests
[1,2,3].
After your email this morning I added some tests to expose the bug in
MARC::Batch::next().
## create a batch object for a file that contains a record
## with a bad indicator.
my $batch = MARC::Batch->new( 'USMARC', 't/badind.usmarc' );
$batch->warnings_off();
$batch->strict_off();
my $r = $batch->next();
## check the warnings on the batch
my @warnings = $batch->warnings();
is( @warnings, 1, 'got expected amt of warnings off the batch' );
like( $warnings[0], qr/^Invalid indicator/,
'got expected err msg off the batch' );
## same exact warning should be available on the record
@warnings = $r->warnings();
is( @warnings, 1, 'got expected amt of warnings off the record' );
like( $warnings[0], qr/^Invalid indicator/,
'got expected err msg off the record' );
Basically just read in a record with some messed up indicators, and made
sure that it could get the warning from the batch object AND the record
object. Sure enough it failed, and after I applied my change it worked
fine. Then I ran the entire test suite and it ran fine as well. Having a
test suite like this lets you make changes without losing too much sleep
worrying about the rippling effects of changes.
//Ed
[1] http://www.wgz.com/chromatic/perl/IntroTestMore.pdf
[2] http://magnonel.guild.net/~schwern/talks/Test_Tutorial/Test-Tutorial.pdf
[3] http://www.petdance.com/perl/automated-testing/