The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More qw( no_plan );
use Test::Exception;

use_ok( 'MARC::Detrans' );
use_ok( 'MARC::Batch' );

my $detrans = MARC::Detrans->new( config => 't/testconfig.xml' );
isa_ok( $detrans, 'MARC::Detrans' );

throws_ok { MARC::Detrans->new() } qr/must supply config parameter/, 
    'no config in constructor call';

throws_ok { MARC::Detrans->new( config => 'foo' ) } 
    qr/config file doesn't exist/,
    'non-existent xml config file'; 

my $batch = MARC::Batch->new( 'USMARC', 't/marc.dat' );
while ( my $record = $batch->next() ) {
    $record = $detrans->convert( $record );
    if ( !$record ) { print $detrans->error(); next; }
    isa_ok( $record, 'MARC::Record' );
    ok( $record->field( '880' ), 'found 880 fields' );
    ok( $record->field( '066' ), 'found 066 field' );

    ## examine each 880 field
    foreach my $field ( $record->field( '880' ) ) {

        ## unpack the subfield 6 
        my $sub6 = $field->subfield(6);
        my ( $tag, $count, $script, $orientation ) = 
            $sub6 =~ m{^(\d+)-(\d+)/(..)/(.)?};

        ## verify the script code and orientation
        is( $script, '(N', 'script code' );
        is( $orientation, 'r', 'script orientation' );

        ## look for the linked field
        my $linkedField = getLinkedField( $record, $count );
        if ( ! $linkedField ) {
            fail( "missing linked field" );
        } else {
            ok( $linkedField->tag() eq $tag, "found liked 880 field" );
        }

    }
}

sub getLinkedField {
    my ($r,$count) = @_;
    foreach my $f ( $r->fields() ) {
        next if $f->is_control_field();
        my $sub6 = $f->subfield('6');
        if ( $sub6 and $sub6 eq sprintf( "880-%02d", $count ) ) {
            return $f;
        }
    }
}