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;
use Catmandu;

my $mrc = <<'MRC';
<?xml version="1.0" encoding="UTF-8"?>
<marc:collection xmlns:marc="http://www.loc.gov/MARC21/slim">
    <marc:record>
        <marc:datafield ind1="0" ind2="1" tag="245">
            <marc:subfield code="a">Title / </marc:subfield>
            <marc:subfield code="c">Name</marc:subfield>
        </marc:datafield>
        <marc:datafield ind1=" " ind2=" " tag="500">
            <marc:subfield code="a">A</marc:subfield>
            <marc:subfield code="a">B</marc:subfield>
            <marc:subfield code="a">C</marc:subfield>
            <marc:subfield code="x">D</marc:subfield>
        </marc:datafield>
        <marc:datafield ind1=" " ind2=" " tag="650">
            <marc:subfield code="a">Alpha</marc:subfield>
        </marc:datafield>
        <marc:datafield ind1=" " ind2=" " tag="650">
            <marc:subfield code="a">Beta</marc:subfield>
        </marc:datafield>
        <marc:datafield ind1=" " ind2=" " tag="650">
            <marc:subfield code="a">Gamma</marc:subfield>
        </marc:datafield>
        <marc:datafield ind1=" " ind2=" " tag="999">
            <marc:subfield code="a">X</marc:subfield>
            <marc:subfield code="a">Y</marc:subfield>
        </marc:datafield>
        <marc:datafield ind1="1" ind2=" " tag="999">
            <marc:subfield code="a">Z</marc:subfield>
        </marc:datafield>
    </marc:record>
</marc:collection>
MRC

note 'marc_spec(650{$a=\Beta}, equals)     equals: "Beta"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("650{$a=\Beta}", equals); retain_field(equals)'
    );
    my $record = $importer->first;
    is_deeply $record->{equals}, 'Beta', 'marc_spec(650{$a=\Beta}, equals)';
}

note 'marc_spec(650{$a!=\Beta}, equals_not)     equals_not: "AlphaGamma"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("650{$a!=\Beta}", equals_not); retain_field(equals_not)'
    );
    my $record = $importer->first;
    is_deeply $record->{equals_not}, 'AlphaGamma', 'marc_spec(650{$a!=\Beta}, equals_not)';
}

note 'marc_spec(650{$a/0=\B}, equals)     equals: "Beta"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("650{$a/0=\B}", equals); retain_field(equals)'
    );
    my $record = $importer->first;
    is_deeply $record->{equals}, 'Beta', 'marc_spec(650{$a/0=\B}, equals)';
}

note 'marc_spec(650{$a/0!=\B}, equals_not)     equals_not: "AlphaGamma"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("650{$a/0!=\B}", equals_not); retain_field(equals_not)'
    );
    my $record = $importer->first;
    is_deeply $record->{equals_not}, 'AlphaGamma', 'marc_spec(650{$a/0!=\B}, equals_not)';
}

note 'marc_spec(650{$a~\ph}, includes)     includes: "Alpha"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("650{$a~\ph}", includes); retain_field(includes)'
    );
    my $record = $importer->first;
    is_deeply $record->{includes}, 'Alpha', 'marc_spec(650{$a~\ph}, includes)';
}

note 'marc_spec(650{$a!~\ph}, includes_not)     includes_not: "BetaGamma"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("650{$a!~\ph}", includes_not); retain_field(includes_not)'
    );
    my $record = $importer->first;
    is_deeply $record->{includes_not}, 'BetaGamma', 'marc_spec(650{$a!~\ph}, includes_not)';
}

note 'marc_spec(650[#]{$a!~\ph}, includes_not)     includes_not: "Gamma"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("650[#]{$a!~\ph}", includes_not); retain_field(includes_not)'
    );
    my $record = $importer->first;
    is_deeply $record->{includes_not}, 'Gamma', 'marc_spec(650[#]{$a!~\ph}, includes_not)';
}

note 'marc_spec(245{500$a}, exists)     exists: "Title / Name"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("245{500$a}", exists); retain_field(exists)'
    );
    my $record = $importer->first;
    is_deeply $record->{exists}, 'Title / Name', 'marc_spec(245{500$a}, exists)';
}

note 'marc_spec(245{!500$a}, exists_not)     exists_not: undef';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("245{!500$a}", exists_not); retain_field(exists_not)'
    );
    my $record = $importer->first;
    ok !$record->{exists_not}, 'marc_spec(245{!500$a}, exists_not)';
}

note 'marc_spec(245$a{500$a=\C}, equals)     equals: "Title / "';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("245$a{500$a=\C}", equals); retain_field(equals)'
    );
    my $record = $importer->first;
    is_deeply $record->{equals}, 'Title / ', 'marc_spec(245$a{500$a=\C}, equals)';
}

note 'marc_spec(245$a{500$a!=\C}, equals_not)     equals_not: undef';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("245$a{500$a!=\C}", equals_not); retain_field(equals_not)'
    );
    my $record = $importer->first;
    ok !$record->{equals_not}, 'marc_spec(245$a{500$a!=\C}, equals_not)';
}

note 'marc_spec(245{500$a!=\F}, equals_not)     equals: "Title / Name"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("245{500$a!=\F}", equals_not); retain_field(equals_not)'
    );
    my $record = $importer->first;
    is_deeply $record->{equals_not}, 'Title / Name', 'marc_spec(245{500$a!=\F}, equals_not)';
}

note 'marc_spec(500$a[1]{$x}, exists)     exists: "B"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("500$a[1]{$x}", exists); retain_field(exists)'
    );
    my $record = $importer->first;
    is_deeply $record->{exists}, 'B', 'marc_spec(500$a[1]{$x}, exists)';
}

note 'marc_spec(500$a[1]{!$x}, exists_not)     exists_not: undef';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("500$a[1]{!$x}", exists_not); retain_field(exists_not)'
    );
    my $record = $importer->first;
    ok !$record->{exists_not}, 'marc_spec(500$a[1]{!$x}, exists_not)';
}

note 'marc_spec(500$a[1]{!$c}, exists_not)     exists_not: "B"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("500$a[1]{!$c}", exists_not); retain_field(exists_not)'
    );
    my $record = $importer->first;
    is_deeply $record->{exists_not}, 'B', 'marc_spec(500$a[1]{!$c}, exists_not)';
}

note 'marc_spec(650[1]{300}, exists)     exists: undef';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("650[1]{300}", exists); retain_field(exists)'
    );
    my $record = $importer->first;
    ok !$record->{exists}, 'marc_spec(650[1]{300}, exists)';
}

note 'marc_spec(650[1-#]{!300}, exists_not)     exists_not: "BetaGamma"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("650[1-#]{!300}", exists_not); retain_field(exists_not)'
    );
    my $record = $importer->first;
    is_deeply $record->{exists_not}, 'BetaGamma', 'marc_spec(650[1-#]{!300}, exists_not)';
}

note 'marc_spec(650[0]{!300}, exists_not)     exists_not: "Alpha"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("650[0]{!300}", exists_not); retain_field(exists_not)'
    );
    my $record = $importer->first;
    is_deeply $record->{exists_not}, 'Alpha', 'marc_spec(650[0]{!300}, exists_not)';
}

note 'marc_spec(650[1]{245_0}, indicator1)     indicator1: "Beta"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("650[1]{245_0}", indicator1); retain_field(indicator1)'
    );
    my $record = $importer->first;
    is_deeply $record->{indicator1}, 'Beta', 'marc_spec(650[1]{245_0}, indicator1)';
}

note 'marc_spec(999$a{_1}, indicator1)     indicator1: "Z"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("999$a{999_1}", indicator1); retain_field(indicator1)'
    );
    my $record = $importer->first;
    is_deeply $record->{indicator1}, 'Z', 'marc_spec(999$a{_1}, indicator1)';
}

note 'marc_spec(650[1]{245_1}, indicator1)     indicator1: undef';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("650[1]{245_1}", indicator1); retain_field(indicator1)'
    );
    my $record = $importer->first;
    ok !$record->{indicator1}, 'marc_spec(650[1]{245_1}, indicator1)';
}

note 'marc_spec(650[1]{245__1}, indicator2)     indicator1: "Beta"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("650[1]{245__1}", indicator2); retain_field(indicator2)'
    );
    my $record = $importer->first;
    is_deeply $record->{indicator2}, 'Beta', 'marc_spec(650[1]{245__1}, indicator2)';
}

note 'marc_spec(650[1]{245__0}, indicator2)     indicator2: undef';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("650[1]{245__0}", indicator2); retain_field(indicator2)'
    );
    my $record = $importer->first;
    ok !$record->{indicator2}, 'marc_spec(650[1]{245__0}, indicator2)';
}

note 'marc_spec(650[1]{245_01}, indicators)     indicator1: "Beta"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("650[1]{245_01}", indicators); retain_field(indicators)'
    );
    my $record = $importer->first;
    is_deeply $record->{indicators}, 'Beta', 'marc_spec(650[1]{245_01}, indicators)';
}

note 'marc_spec(650[1]{245_00}, indicators)     indicator2: undef';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("650[1]{245_00}", indicators); retain_field(indicators)'
    );
    my $record = $importer->first;
    ok !$record->{indicators}, 'marc_spec(650[1]{245_00}, indicators)';
}


note 'marc_spec(999{245_00|$a=\Y}, or)     or: "XY"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("999{245_00|$a=\Y}", or); retain_field(or)'
    );
    my $record = $importer->first;
    is_deeply $record->{or}, 'XY', 'marc_spec(999{245_00|$a=\Y}, or)';
}

note 'marc_spec(999$a[#]{245_00|$a=\Y}, or)     or: "Y"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("999$a[#]{245_00|$a=\Y}", or); retain_field(or)'
    );
    my $record = $importer->first;
    is_deeply $record->{or}, 'Y', 'marc_spec(999$a[#]{245_00|$a=\Y}, or)';
}

note 'marc_spec(999$a[#]{245_00}{$a=\Y}, and)     and: undef';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("999$a[#]{245_00}{$a=\Y}", and); retain_field(and)'
    );
    my $record = $importer->first;
    ok !$record->{and}, 'marc_spec(999$a[#]{245_00}{$a=\Y}, and)';
}

note 'marc_spec(999$a[#]{245_01}{$a=\Y}, and)     and: "Y"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("999$a[#]{245_01}{$a=\Y}", and); retain_field(and)'
    );
    my $record = $importer->first;
    is_deeply $record->{and}, 'Y', 'marc_spec(999$a[#]{245_01}{$a=\Y}, and)';
}

note 'marc_spec(999$a[#]{245_01}{$a=\Foo|$a=\Y}, and)     and: "Y"';
{
    my $importer = Catmandu->importer(
        'MARC',
        file => \$mrc,
        type => 'XML',
        fix  => 'marc_spec("999$a[#]{245_01}{$a=\Foo|$a=\Y}", and); retain_field(and)'
    );
    my $record = $importer->first;
    is_deeply $record->{and}, 'Y', 'marc_spec(999$a[#]{245_01}{$a=\Foo|$a=\Y}, and)';
}


done_testing;