--- trunk/t/3-normalize.t 2006/07/02 21:17:54 566 +++ trunk/t/3-normalize.t 2006/09/29 18:55:41 725 @@ -2,7 +2,7 @@ use strict; -use Test::More tests => 107; +use Test::More tests => 309; use Test::Exception; use Cwd qw/abs_path/; use blib; @@ -32,8 +32,6 @@ $abs_path =~ s#/[^/]*$#/#; diag "abs_path: $abs_path" if ($debug); -#throws_ok { new WebPAC::Normalize::XML( lookup_regex => 'foo' ) } qr/pair/, "lookup_regex without lookup"; - my $rec1 = { '200' => [{ 'a' => '200a', @@ -109,18 +107,34 @@ }; -my $lookup1 = { - '00900' => [ - 'lookup 1', - 'lookup 2', - ], +my $lookup_hash1 = { + 'db1' => { + 'input1' => { + 'key1' => { 1 => 1 }, + 'key2' => { 2 => 1 }, + }, + 'input2' => { + 'key3' => { 3 => 1 }, + 'key4' => { 4 => 1 }, + }, + }, + 'db2' => { + 'input3' => { + 'key5' => { 5 => 1 }, + 'key6' => { 6 => 1 }, + }, + } }; -my $lookup2 = { - '00900' => 'lookup', +my $lookup_hash2 = { + 'db3' => { + 'input4' => { + 'key7' => { 7 => 1 }, + 'key8' => { 8 => 1 }, + }, + } }; - sub test { print dump( @_ ), ("-" x 78), "\n"; ok( defined(@_) ); @@ -150,9 +164,10 @@ $eval_t = substr($eval_t,0,$max_eval_output) . '...' if (length($eval_t) > $max_eval_output); $eval_t =~ s/\\/\\\\/gs; - my $v = eval "$t"; - ok(! $@, $@ ? dump_error($@, $t) : "eval: $eval_t"); - $v; + my @__ret; + eval "\@__ret = $t"; + ok(! $@, $@ ? dump_error($@, $t) : "eval: $eval_t = " . dump(@__ret)); + return \@__ret; } { @@ -179,18 +194,118 @@ cmp_ok( join('', suffix('xy', 'cd') ), 'eq', 'cdxy', 'suffix'); cmp_ok( join('', surround('->', '<-', 'a','b','c') ), 'eq', '->a<-->b<-->c<-', 'surround'); + # lookups + + throws_ok { _set_load_ds() } qr/CODE/, 'empty _set_load_ds()'; + + ok(_set_load_ds(sub { + my ($database,$input,$mfn) = @_; + diag "load_ds( $database, $input, $mfn )"; + cmp_ok( $#_, '==', 2, 'have 3 arguments'); + ok($database, '_load_ds database'); + ok($input, '_load_ds input'); + ok($mfn, '_load_ds mfn'); + return { + '900' => [{ x => '900x-' . $mfn , y => '900y-' . $mfn }], + } + + }), '_set_load_ds'); + + my @v = qw/foo bar baz aaa bbb ccc ddd/; + + my @accumulated; + + for my $i ( 0 .. $#v ) { + + my $mfn = 1000 + $i; + + ok(WebPAC::Normalize::_set_config({ '_mfn' => $mfn }), "_set_config _mfn=$mfn"); + + my $size = $#v + 1; + + cmp_ok( + save_into_lookup('db','input','key', sub { @v }), + '==', $size, "save_into_lookup $size values" + ); + + ok(my $l = WebPAC::Normalize::_get_lookup(), '_get_lookup'); + diag "_get_lookup = ", dump($l); + + my @lookup; + + ok(my @lookup = lookup( + sub { + diag "in show"; + rec('900','x'); + }, + 'db','input','key', + sub { + return @v; + } + ), + "lookup db/input/key"); + + push @accumulated, '900x-' . $mfn; + + is_deeply(\@lookup, \@accumulated, "lookup db/input/key"); + + shift @v; + + } + + ok(my $l = WebPAC::Normalize::_get_lookup(), '_get_lookup'); + diag "_get_lookup = ", dump($l); + + is_deeply( $l, { + db => { + input => { + key => { + foo => { 1000 => 1 }, + bar => { 1000 => 1, 1001 => 1 }, + baz => { 1000 => 1, 1001 => 1, 1002 => 1 }, + aaa => { 1000 => 1, 1001 => 1, 1002 => 1, 1003 => 1 }, + bbb => { 1000 => 1, 1001 => 1, 1002 => 1, 1003 => 1, 1004 => 1 }, + ccc => { 1000 => 1, 1001 => 1, 1002 => 1, 1003 => 1, 1004 => 1, 1005 => 1 }, + ddd => { 1000 => 1, 1001 => 1, 1002 => 1, 1003 => 1, 1004 => 1, 1005 => 1, 1006 => 1 }, + }, + }, + }, + }, 'lookup data'); + +####### + + diag "lookup_hash1 = ", dump($lookup_hash1); + ok(_set_lookup( $lookup_hash1 ), '_set_lookup $lookup_hash1'); + + throws_ok { _set_load_ds() } qr/CODE/, 'empty _set_load_ds()'; + + ok(_set_load_ds(sub { + my ($database,$input,$mfn) = @_; + diag "load_ds( $database, $input, $mfn )"; + cmp_ok( $#_, '==', 2, 'have 3 arguments'); + ok($database, 'database'); + ok($input, 'input'); + ok($mfn, 'mfn'); + + }), '_set_load_ds'); + + +# cmp_ok(lookup( +# sub { +# 'found' +# }, +# 'db1','input1','key1', +# sub { +# rec('200','a') +# } +# ), 'eq', 'found', 'lookup db1/input1/key1'); + - _set_lookup( $lookup1 ); - cmp_ok( - join_with(" i ", - lookup( - regex( 's/^/00/', - rec2('902','z') - ) - ) - ), - 'eq', 'lookup 1 i lookup 2', 'join lookup regex rec2'); +# cmp_ok( +# lookup( +# ), +# 'eq', 'lookup 1 i lookup 2', 'join lookup regex rec2'); # check join_with operations @@ -234,11 +349,13 @@ # test lookups - _set_lookup( $lookup2 ); + _set_lookup( $lookup_hash2 ); - is_deeply( \[ lookup( prefix( '00', rec('902') ) ) ], \[ 'lookup' ], 'lookup prefix' ); + throws_ok { lookup() } qr/need/, 'empty lookup'; - ok(! lookup('non-existent'), 'lookup non-existant' ); + #is_deeply( \[ lookup( prefix( '00', rec('902') ) ) ], \[ 'lookup' ], 'lookup prefix' ); + + #ok(! lookup('non-existent'), 'lookup non-existant' ); _set_rec( $rec2 ); @@ -359,14 +476,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'); @@ -374,10 +492,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'); @@ -399,10 +517,10 @@ test_s($r) if ($r); } - ok(my @marc = WebPAC::Normalize::_get_marc_fields(), "_get_marc_fields"); - diag dump( \@marc ) if ($debug); + 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 ); + is_deeply( $marc, $struct, $msg ); } test_rec_rules( @@ -477,6 +595,22 @@ ], ); + 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 # @@ -496,25 +630,25 @@ 'split_rec_on', { '200' => [{ a => 'foo ; bar', b => 42, c => 'baz' }] }, qq{ split_rec_on('200','a', qr/\\s*;\\s*/, 1) }, - 'foo', + [ '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', + [ 'bar' ], ); test_rule( 'split_rec_on no part', { '200' => [{ a => 'foo ; bar', b => 42, c => 'baz' }] }, - q! split_rec_on('200','a', qr/\\s*;\\s*/) !, + 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( @@ -543,5 +677,144 @@ 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++; + } + + test_rec_rules( + 'marc_original_order', + { + '200' => [ { + a => [ 'a1', 'a2' ], b => [ 'b1', 'b2' ], c => [ 'c1', 'c2' ], + subfields => [ qw/a 0 b 0 a 1 b 1 c 0 c 1/ ], + }, { + a => [ 'a3', 'a4', 'a5' ], b => 'b3', c => 'c3', + subfields => [ qw/a 0 a 1 b 0 c 0 a 2/ ], + } ], + }, + qq{ + marc_original_order(900,200); + }, + [ + [ '900', ' ', ' ', 'a', 'a1', 'b', 'b1', 'a', 'a2', 'b', 'b2', 'c', 'c1', 'c', 'c2', ], + [ '900', ' ', ' ', 'a', 'a3', 'a', 'a4', 'b', 'b3', 'c', 'c3', 'a', 'a5', ], + ], + ); + + test_rule( + 'rec1 skips subfields', + { + '200' => [ { + a => [ 'a1', 'a2' ], b => [ 'b1', 'b2' ], c => [ 'c1', 'c2' ], + subfields => [ qw/a 0 b 0 a 1 b 1 c 0 c 1/ ], + }, { + a => [ 'a3', 'a4', 'a5' ], b => 'b3', c => 'c3', + subfields => [ qw/a 0 a 1 b 0 c 0 a 2/ ], + } ], + }, + qq{ + rec1(200); + }, + ['a1', 'b1', 'a2', 'b2', 'c1', 'c2', 'a3', 'a4', 'b3', 'c3', 'a5' ], + ); + + is_deeply( + [ _pack_subfields_hash({ + a => [ 'a1', 'a2' ], b => [ 'b1', 'b2' ], c => [ 'c1', 'c2' ], + subfields => [ qw/a 0 b 0 a 1 b 1 c 0 c 1/ ], + }) ], + ['a1', 'b1', 'a2', 'b2', 'c1', 'c2'], + '_pack_subfields_hash( $h )' + ); + + cmp_ok( + _pack_subfields_hash({ + a => [ 'a1', 'a2' ], b => [ 'b1', 'b2' ], c => [ 'c1', 'c2' ], + subfields => [ qw/a 0 b 0 a 1 b 1 c 0 c 1/ ], + }, 1), + 'eq', + '^aa1^bb1^aa2^bb2^cc1^cc2', + '_pack_subfields_hash( $h, 1 )' + ); }