--- trunk/t/3-normalize.t 2006/07/01 10:19:39 555 +++ trunk/t/3-normalize.t 2006/07/23 20:19:56 603 @@ -2,7 +2,7 @@ use strict; -use Test::More tests => 89; +use Test::More tests => 150; use Test::Exception; use Cwd qw/abs_path/; use blib; @@ -148,9 +148,12 @@ my $eval_t = $t; $eval_t =~ s/[\n\r\s]+/ /gs; $eval_t = substr($eval_t,0,$max_eval_output) . '...' if (length($eval_t) > $max_eval_output); + $eval_t =~ s/\\/\\\\/gs; - eval "$t"; - ok(! $@, $@ ? dump_error($@, $t) : "eval: $eval_t"); + my @__ret; + eval "\@__ret = $t"; + ok(! $@, $@ ? dump_error($@, $t) : "eval: $eval_t = " . dump(@__ret)); + return \@__ret; } { @@ -357,14 +360,15 @@ # # MARC # + _debug( 4 ); test_s(qq{ marc_indicators('900',1,2) }); test_s(qq{ marc('900','a', rec('200') ) }); - my @marc; - ok(@marc = WebPAC::Normalize::_get_marc_fields(), "_get_marc_fields"); - diag dump( \@marc ) if ($debug); + my $marc; + ok($marc = WebPAC::Normalize::_get_marc_fields(), "_get_marc_fields"); + diag dump( $marc ) if ($debug); - is_deeply( \@marc, [ + is_deeply( $marc, [ [ '900', 1, 2, 'a', '200a' ], [ '900', 1, 2, 'a', '200-solo' ] ], 'correct marc with indicators'); @@ -372,10 +376,10 @@ test_s(qq{ marc_indicators('900',' ',9) }); test_s(qq{ marc_repeatable_subfield('900','a', rec('200') ) }); - ok(@marc = WebPAC::Normalize::_get_marc_fields(), "_get_marc_fields"); - diag dump( \@marc ) if ($debug); + ok($marc = WebPAC::Normalize::_get_marc_fields(), "_get_marc_fields"); + diag dump( $marc ) if ($debug); - is_deeply( \@marc, [ + is_deeply( $marc, [ [ '900', 1, 2, 'a', '200a', 'a', '200-solo' ], [ '900', ' ', 9, 'a', '200a', 'a', '200-solo' ] ], 'correct marc with repetable subfield'); @@ -397,10 +401,10 @@ test_s($r) if ($r); } - ok(@marc = WebPAC::Normalize::_get_marc_fields(), "_get_marc_fields"); - diag dump( \@marc ) if ($debug); - - is_deeply( \@marc, $struct, $msg ); + ok(my $marc = WebPAC::Normalize::_get_marc_fields(), "_get_marc_fields"); + diag dump( $marc ) if ($debug); + diag "expects:\n", dump($struct) if ($debug > 1); + is_deeply( $marc, $struct, $msg ); } test_rec_rules( @@ -459,5 +463,186 @@ [ '900', 1, 0, 'c', '200c-3' ], ], ); + + test_rec_rules( + 'marc_compose', + { '200' => [{ a => 'foo ; bar', b => 42, c => 'baz' }] }, + qq{ + marc_compose('900', + 'c', rec(200,'b'), + 'b', rec(200,'a'), + 'a', rec(200,'c'), + ); + }, + [ + [ '900', ' ', ' ', 'c', 42, 'b', 'foo ; bar', 'a', 'baz' ] + ], + ); + + test_rec_rules( + 'marc_compose with + subfields', + { '200' => [{ a => 'foo ; bar', b => 42, c => 'baz' }] }, + qq{ + marc_compose('900', + 'a', rec(200,'a'), + '+', prefix(" * ", rec(200,'c')), + 'b', rec(200,'b'), + '+', prefix(" : ", rec(200,'c')), + ); + }, + [ + [ '900', ' ', ' ', 'a', 'foo ; bar * baz', 'b', '42 : baz' ] + ], + ); + + # + # test rules + # + sub test_rule { + my ($msg, $rec, $rule, $struct) = @_; + _clean_ds(); + _set_rec( $rec ); + $rule =~ s/\\/\\/gs; + my $r = test_s( $rule ); + diag "for ", dump($rec), " got:\n", dump($r), "\nexpect:\n" if ($debug > 1); + diag dump($struct) if ($debug); + is_deeply( $r, $struct, $msg ); + } + + # test split_rec_on + test_rule( + 'split_rec_on', + { '200' => [{ a => 'foo ; bar', b => 42, c => 'baz' }] }, + qq{ split_rec_on('200','a', qr/\\s*;\\s*/, 1) }, + [ 'foo' ], + ); + test_rule( + 'split_rec_on', + { '200' => [{ a => 'foo ; bar', b => 42, c => 'baz' }] }, + qq{ split_rec_on('200','a', qr/\\s*;\\s*/, 2) }, + [ 'bar' ], + ); + test_rule( + 'split_rec_on no part', + { '200' => [{ a => 'foo ; bar', b => 42, c => 'baz' }] }, + qq{ split_rec_on('200','a', qr/\\s*;\\s*/) }, + [ 'foo', 'bar' ], + ); + test_rule( + 'split_rec_on no record', + {}, + qq{ split_rec_on('200','a', qr/\\s*;\\s*/) }, + [ '' ], + ); + + test_rec_rules( + 'marc_compose+split_rec_on', + { '200' => [{ a => 'foo ! bar', b => 42, c => 'baz' }] }, + qq{ + marc_compose('900', + 'a', split_rec_on(200,'a', qr/\\s*!\\s*/, 1), + 'c', rec(200,'c'), + 'a', split_rec_on(200,'a', qr/\\s*!\\s*/, 2), + 'b', rec(200,'b'), + ); + }, + [ + [ '900', ' ', ' ', + 'a', 'foo', + 'c', 'baz', + 'a', 'bar', + 'b', 42, + ] + ], + ); + + cmp_ok(marc_leader('06',42), '==', 42, 'marc_leader'); + cmp_ok(marc_leader('11',5), '==', 5, 'marc_leader'); + ok(marc_leader(), 'marc_leader get'); + diag "leader: ", dump(marc_leader()) if ($debug); + is_deeply(marc_leader(), { '06' => 42, 11 => 5 }, "marc_leader full"); + + test_rule( + 'rec1(000)', + { '000' => [ 42 ]}, + qq{ rec('000') }, + [ 42 ], + ); + + test_rec_rules( + 'marc(001,rec(000))', + { '000' => [ 42 ]}, + qq{ + marc('001', rec('000') ); + }, + [ + [ '001', 42, ] + ], + ); + + test_rec_rules( + 'marc_remove subfield', + { '200' => [{ a => 42, b => 'bar', c => 'baz' }] }, + qq{ + marc('900', 'a', rec('200','a') ); + marc('900', 'b', rec('200','b') ); + marc_remove('900','b'); + marc('900', 'b', rec('200','c') ); + marc_remove('900','a'); + }, + [ + [ '900', ' ', ' ', 'b', 'baz' ], + ], + ); + + test_rec_rules( + 'marc_remove field', + { '200' => [{ a => 42, b => 'bar', c => 'baz' }] }, + qq{ + marc('900', 'a', rec('200','a') ); + marc('900', 'b', rec('200','b') ); + marc('901', 'b', rec('200','b') ); + marc('901', 'c', rec('200','c') ); + marc_remove('900'); + }, + [ + [ '901', ' ', ' ', 'b', 'bar', 'c', 'baz' ], + ], + ); + test_rec_rules( + 'marc_duplicate', + { '200' => [{ a => 42, b => 'bar', c => 'baz', d => 'bing', e => 'bong' }] }, + qq{ + marc('900', 'a', rec('200','a') ); + marc('900', 'b', rec('200','b') ); + marc_duplicate; + marc_remove('900','b'); + marc('900', 'b', rec('200','c') ); + marc_duplicate; + marc_remove('900','b'); + marc('900', 'b', rec('200','d') ); + marc_duplicate; + marc_remove('900','b'); + marc('900', 'b', rec('200','e') ); + }, + [ + # this will return FIRST record + [ '900', ' ', ' ', 'a', 42, 'b', 'bar' ], + ], + ); + + my $i = 0; + foreach my $v ( qw/bar baz bing bong/ ) { + + ok($marc = WebPAC::Normalize::_get_marc_fields( offset => $i ), + "_get_marc_fields( offset => $i )" + ); + diag "marc $i = ", dump( $marc ) if ($debug); + is_deeply( $marc, + [ [ '900', ' ', ' ', 'a', 42, 'b', $v ] ], + "MARC copy $i has $v", + ); + $i++; + } }