The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use strict;
use warnings;
use Test::More qw( no_plan );
use File::Temp qw( tempfile );

use_ok( 'MARC::SubjectMap' );
use_ok( 'MARC::SubjectMap::Field' );
use_ok( 'MARC::SubjectMap::Rule' );

CONSTRUCTOR: {
    my $map = MARC::SubjectMap->new();
    isa_ok( $map, 'MARC::SubjectMap' );
}

ADD_FIELD: {
    my $map = MARC::SubjectMap->new();
    $map->addField(
        MARC::SubjectMap::Field->new({
            tag         => '650',
            translate   => ['a','z'],
            copy        => ['c','d'],
        })
    );
    $map->addField(
        MARC::SubjectMap::Field->new({
            tag         => '600',
            translate   => ['f','g'],
            copy        => ['w','o'],
        })
    );
    my @fields = $map->fields();
    is( @fields, 2, 'fields() found 2 fields' );
    is( $fields[0]->tag(), '650', 'field 1' );
    is( $fields[1]->tag(), '600', 'field 2' );
}

SET_RULES: {
    my $map = MARC::SubjectMap->new();
    ok( ! $map->rules(), 'no rules yet' );
    $map->rules( MARC::SubjectMap::Rules->new() );
    ok( $map->rules(), 'got rules' );
}

XML: {
    my $map = MARC::SubjectMap->new();

    $map->sourceLanguage( 'en' );

    ## add some fields to the config
    $map->addField(
        MARC::SubjectMap::Field->new({
            tag         => '650',
            translate   => ['a','z'],
            copy        => ['c','d'],
        })
    );
    $map->addField(
        MARC::SubjectMap::Field->new({
            tag         => '600',
            translate   => ['f','g'],
            copy        => ['w','o'],
        })
    );

    ## add some rules to the config
    my $rules = MARC::SubjectMap::Rules->new();
    $rules->addRule( 
        MARC::SubjectMap::Rule->new({
            field       => '650',
            subfield    => 'a',
            original    => 'hello',
            translation => 'hola',
            source      => 'bogus',
        })
    );
    $rules->addRule(
        MARC::SubjectMap::Rule->new({
            field       => '650',
            subfield    => 'a',
            original    => 'goodbye',
            translation => 'adios',
            source      => 'bogus',
        })
    );
    $map->rules($rules);

    ## capture xml
    my ($fh,$file) = tempfile();
    $map->toXML( $fh );
    close($fh);

    ## check the XML
    open(XML,$file);
    my $xml = join('',<XML>);
    my $expected = join('',<DATA>);
    is( $xml, $expected, 'toXML()' );

}

__DATA__
<?xml version="1.0" encoding="ISO-8859-1"?>
<config>

<!-- the original language -->
<sourceLanguage>en</sourceLanguage>

<!-- the fields and subfields to be processed -->
<fields>

<field tag="650">
<copy>c</copy>
<copy>d</copy>
<translate>a</translate>
<translate>z</translate>
<sourceSubfield>a</sourceSubfield>
</field>

<field tag="600">
<copy>w</copy>
<copy>o</copy>
<translate>f</translate>
<translate>g</translate>
<sourceSubfield>a</sourceSubfield>
</field>

</fields>

<!-- the rule mappings themselves -->
<rules>

<rule field="650" subfield="a">
<original>goodbye</original>
<translation>adios</translation>
<source>bogus</source>
</rule>

<rule field="650" subfield="a">
<original>hello</original>
<translation>hola</translation>
<source>bogus</source>
</rule>

</rules>

</config>