#!perl
#This tests check_020() called separately
#See lint.t for testing through check_record()
use strict;
use warnings;
use Test::More tests=>28;
BEGIN { use_ok( 'MARC::Field' ); }
BEGIN { use_ok( 'MARC::Lint' ); }
my $lint = new MARC::Lint;
isa_ok( $lint, 'MARC::Lint' );
my @fields = (
['020', "","",
a => "154879473", #too few digits
],
['020', "","",
a => "1548794743", #invalid checksum
],
['020', "","",
a => "15487947443", #11 digits
],
['020', "","",
a => "15487947443324", #14 digits
],
['020', "","",
a => "9781548794743", #13 digit valid
],
['020', "","",
a => "9781548794745", #13 digit invalid
],
['020', "","",
a => "1548794740 (10 : good checksum)", #10 digit valid with qualifier
],
['020', "","",
a => "1548794745 (10 : bad checksum)", #10 digit invalid with qualifier
],
['020', "","",
a => "1-54879-474-0 (hyphens and good checksum)", #10 digit invalid with hyphens and qualifier
],
['020', "","",
a => "1-54879-474-5 (hyphens and bad checksum)", #10 digit invalid with hyphens and qualifier
],
['020', "","",
a => "1548794740(10 : unspaced qualifier)", #10 valid without space before qualifier
],
['020', "","",
a => "1548794745(10 : unspaced qualifier : bad checksum)", #10 invalid without space before qualifier
],
['020', "","",
z => "1548794743", #subfield z
],
);
my @expected = (
q{020: Subfield a has the wrong number of digits, 154879473.},
q{020: Subfield a has bad checksum, 1548794743.},
q{020: Subfield a has the wrong number of digits, 15487947443.},
q{020: Subfield a has the wrong number of digits, 15487947443324.},
q{020: Subfield a has bad checksum (13 digit), 9781548794745.},
q{020: Subfield a has bad checksum, 1548794745 (10 : bad checksum).},
q{020: Subfield a may have invalid characters.},
q{020: Subfield a may have invalid characters.},
q{020: Subfield a has bad checksum, 1-54879-474-5 (hyphens and bad checksum).},
q{020: Subfield a qualifier must be preceded by space, 1548794740(10 : unspaced qualifier).},
q{020: Subfield a qualifier must be preceded by space, 1548794745(10 : unspaced qualifier : bad checksum).},
q{020: Subfield a has bad checksum, 1548794745(10 : unspaced qualifier : bad checksum).},
);
foreach my $field (@fields) {
my $field_object = MARC::Field->new( @$field );
isa_ok( $field_object, 'MARC::Field', (join "", "MARC field, ", $field_object->subfield('a')) ) if $field_object->subfield('a');
my $check_tag = "check_".$field_object->tag();
$lint->$check_tag( $field_object );
my @warnings = $lint->warnings;
$lint->clear_warnings();
while ( @warnings ) {
my $expected = shift @expected;
my $actual = shift @warnings;
is( $actual, $expected, "Checking expected messages, $expected" );
}
} #foreach field
is( scalar @expected, 0, "All expected messages exhausted." );