--- trunk/t/3-normalize.t 2006/06/26 16:39:51 536 +++ trunk/t/3-normalize.t 2006/07/03 14:30:22 571 @@ -2,19 +2,32 @@ use strict; -use Test::More tests => 67; +use Test::More tests => 112; use Test::Exception; use Cwd qw/abs_path/; use blib; use File::Slurp; - -use Data::Dumper; -my $debug = shift @ARGV; +use Getopt::Long; BEGIN { use_ok( 'WebPAC::Normalize' ); } +use Data::Dump qw/dump/; + +my $debug = 0; +GetOptions( + "debug+", \$debug +); + +cmp_ok(_debug(1), '==', 1, '_debug level'); +cmp_ok(_debug(0), '==', 0, '_debug level'); + +diag "debug level for $0 is $debug" if ($debug); +if ($debug > 2) { + diag "debug level for WebPAC::Normalize is ", _debug( $debug - 2 ); +} + ok(my $abs_path = abs_path($0), "abs_path"); $abs_path =~ s#/[^/]*$#/#; diag "abs_path: $abs_path" if ($debug); @@ -109,7 +122,7 @@ sub test { - print Dumper( @_ ), ("-" x 78), "\n"; + print dump( @_ ), ("-" x 78), "\n"; ok( defined(@_) ); } @@ -135,18 +148,21 @@ 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; } { no strict 'subs'; use WebPAC::Normalize; - ok(! set_lookup( undef ), "set_lookup(undef)"); + ok(! _set_lookup( undef ), "set_lookup(undef)"); - set_rec( $rec1 ); + _set_rec( $rec1 ); cmp_ok( join(",", rec2('200','a') ), 'eq', '200a,200a*2', 'join rec2' ); cmp_ok( join(",", rec2('200','a'), rec2('200','b') ), 'eq', '200a,200a*2,200b', 'join rec2 rec2' ); @@ -165,7 +181,7 @@ cmp_ok( join('', surround('->', '<-', 'a','b','c') ), 'eq', '->a<-->b<-->c<-', 'surround'); - set_lookup( $lookup1 ); + _set_lookup( $lookup1 ); cmp_ok( join_with(" i ", @@ -219,13 +235,13 @@ # test lookups - set_lookup( $lookup2 ); + _set_lookup( $lookup2 ); is_deeply( \[ lookup( prefix( '00', rec('902') ) ) ], \[ 'lookup' ], 'lookup prefix' ); ok(! lookup('non-existent'), 'lookup non-existant' ); - set_rec( $rec2 ); + _set_rec( $rec2 ); test_s(qq{ tag('Title', @@ -255,16 +271,16 @@ ) }); - ok(my $ds = get_ds(), "get_ds"); - diag "ds = ", Dumper($ds) if ($debug); + ok(my $ds = _get_ds(), "get_ds"); + diag "ds = ", dump($ds) if ($debug); sub test_check_ds { my $t = shift; - ok($ds = get_ds(), 'get_ds'); - diag Dumper( $ds ) if ($debug); + ok($ds = _get_ds(), 'get_ds'); + diag dump( $ds ) if ($debug); ok( $ds && $ds->{something}, 'get_ds->something exists' ); ok( $ds && $ds->{something}->{$t}, 'get_ds->something->'.$t.' exists') if ($t); @@ -273,30 +289,30 @@ return $ds; } - clean_ds(); + _clean_ds(); test_s(qq{ search('something', '42'); }); test_s(qq{ search('empty', ''); }); test_check_ds('search'); - clean_ds(); + _clean_ds(); test_s(qq{ display('something', '42'); }); test_s(qq{ display('empty', ''); }); test_check_ds('display'); - clean_ds(); + _clean_ds(); test_s(qq{ tag('something', '42'); }); test_s(qq{ tag('empty', ''); }); test_check_ds('search'); test_check_ds('display'); - clean_ds(); + _clean_ds(); my $n = read_file( "$abs_path/data/normalize.pl" ); $n .= "\n1;\n"; #diag "normalize code:\n$n\n"; test_s( $n ); - ok($ds = get_ds(), "get_ds"); - diag "ds = ", Dumper($ds) if ($debug); + ok($ds = _get_ds(), "get_ds"); + diag "ds = ", dump($ds) if ($debug); my $rec = { '200' => [{ @@ -306,10 +322,10 @@ }; my $rules = qq{ search('mixed', rec('200') ) }; - clean_ds(); - set_rec( $rec ); + _clean_ds(); + _set_rec( $rec ); test_s( $rules ); - ok($ds = get_ds(), "get_ds"); + ok($ds = _get_ds(), "get_ds"); is_deeply( $ds, { 'mixed' => { 'search' => [ '200a', '200b' ], @@ -324,8 +340,8 @@ is_deeply( $ds, $ds2, 'data_structure(s) same'); # wird and non-valid structure which is supported anyway - clean_ds(); - set_rec({ + _clean_ds(); + _set_rec({ '200' => [{ 'a' => '200a', }, @@ -333,7 +349,7 @@ ] }); test_s(qq{ search('mixed', rec('200') ) }); - ok($ds = get_ds(), "get_ds"); + ok($ds = _get_ds(), "get_ds"); is_deeply( $ds, { 'mixed' => { 'search' => [ '200a', '200-solo' ], @@ -341,5 +357,211 @@ } }, 'correct get_ds'); + # + # MARC + # + + 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); + + is_deeply( \@marc, [ + [ '900', 1, 2, 'a', '200a' ], + [ '900', 1, 2, 'a', '200-solo' ] + ], 'correct marc with indicators'); + + 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); + + is_deeply( \@marc, [ + [ '900', 1, 2, 'a', '200a', 'a', '200-solo' ], + [ '900', ' ', 9, 'a', '200a', 'a', '200-solo' ] + ], 'correct marc with repetable subfield'); + + # + # test magic re-ordering of input data + # + + sub test_rec_rules { + my ($msg, $rec, $rules, $struct) = @_; + + _clean_ds(); + _set_rec($rec); + + foreach my $r (split(/;/, $rules)) { + $r =~ s/[\s\n\r]+/ /gs; + $r =~ s/^\s+//gs; + $r =~ s/\s+$//gs; + test_s($r) if ($r); + } + + 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( + 'correct marc with repetable subfield', + { + '200' => [{ + 'a' => '200a-1', + 'b' => '200b-1', + 'c' => '200c-1', + }, { + 'a' => '200a-2', + 'b' => '200b-2', + }, { + 'a' => '200a-3', + }], + }, + qq{ + marc_indicators('900',1 ,0); + marc('900','a', rec('200','a') ); + marc('900','b', rec('200','b') ); + marc('900','c', rec('200','c') ); + }, + [ + [ '900', 1, 0, 'a', '200a-1', 'b', '200b-1', 'c', '200c-1' ], + [ '900', 1, 0, 'a', '200a-2', 'b', '200b-2' ], + [ '900', 1, 0, 'a', '200a-3' ], + ], + ); + + + test_rec_rules( + 'marc_repeatable_subfield', + { + '200' => [{ + 'a' => '200a-1', + 'b' => '200b-1', + 'c' => '200c-1', + }, { + 'a' => '200a-2', + 'b' => '200b-2', + 'c' => '200c-2', + }, { + 'a' => '200a-3', + 'c' => '200c-3', + }], + }, + qq{ + marc_indicators('900',1 ,0); + marc_repeatable_subfield('900','a', rec('200','a') ); + marc('900','b', rec('200','b') ); + marc('900','c', rec('200','c') ); + }, + [ + [ '900', 1, 0, 'a', '200a-1', 'a', '200a-2', 'a', '200a-3', 'b', '200b-1', 'c', '200c-1' ], + [ '900', 1, 0, 'b', '200b-2', 'c', '200c-2' ], + [ '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 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"); + + _debug(2); + test_rule( + 'rec1(000)', + { '000' => [ 42 ]}, + qq{ rec('000') }, + [ 42 ], + ); + + test_rec_rules( + 'marc_compose+split_rec_on', + { '000' => [ 42 ]}, + qq{ + marc('001', rec('000') ); + }, + [ + [ '001', ' ', ' ', 42, ] + ], + ); }