tmap updates
[migration-tools.git] / Equinox-Migration / t / 03-MapDrivenMARCXMLProc.t
1 #!perl -T
2
3 #use Test::More tests => 39;
4 use Test::More qw(no_plan);
5 use Equinox::Migration::MapDrivenMARCXMLProc;
6
7 # fails
8 eval { my $mp =
9          Equinox::Migration::MapDrivenMARCXMLProc->new(marcfile => 't/corpus/mdmp-0.txt') };
10 is ($@, "Argument 'mapfile' must be specified\n", 'no mapfile');
11
12 eval { my $mp =
13          Equinox::Migration::MapDrivenMARCXMLProc->new(mapfile => 't/corpus/mdmpmap-00.txt') };
14 is ($@, "Argument 'marcfile' must be specified\n", 'no marcfile');
15
16 eval { my $mp = Equinox::Migration::MapDrivenMARCXMLProc->new };
17 is ($@, "Argument 'mapfile' must be specified\n", 'no mapfile');
18
19
20 # baseline object creation
21 my $mp = Equinox::Migration::MapDrivenMARCXMLProc->new( marcfile => 't/corpus/mdmp-0.txt',
22                                                         mapfile  => 't/corpus/mdmpmap-00.txt',
23                                                       );
24 is(ref $mp, "Equinox::Migration::MapDrivenMARCXMLProc", "self is self");
25 # parsing
26 #
27 # with map-00, only the 999$a should be captured
28 # 903$a will *always* be captured, of course
29 my $rec = $mp->parse_record;
30 is (defined $rec, 1);
31 is ($rec->{egid}, 9000000, '903 captured');
32 is ($rec->{tags}[0]{tag}, 999, 'first (only) tag should be 999');
33 is ($rec->{tags}[0]{uni}{a}, "MYS DEM", 'single-ocurrance subfield "a" should be "MYS DEM"');
34 is ($rec->{tags}[0]{uni}{b}, undef, 'only one uni subfield defined');
35 is ($rec->{tags}[0]{multi},  undef, 'no multi subfields were defined');
36 is ($rec->{tags}[1],         undef, 'Only one tag in map');
37 # let's go ahead and look at the rest of the file
38 $rec = $mp->parse_record;
39 is ($rec->{egid}, 9000001, '903 #2');
40 is ($rec->{tags}[0]{tag}, 999, 'tag id 2');
41 is ($rec->{tags}[0]{uni}{a}, "MYS 2", 'subfield value 2');
42 $rec = $mp->parse_record;
43 is ($rec->{egid}, 9000002, '903 #3');
44 is ($rec->{tags}[0]{tag}, 999, 'tag id 3');
45 is ($rec->{tags}[0]{uni}{a}, "FOO BAR", 'subfield value 3');
46 $rec = $mp->parse_record;
47 is ($rec->{egid}, 9000003, '903 #4');
48 is ($rec->{tags}[0]{tag}, 999, 'tag id 4');
49 is ($rec->{tags}[0]{uni}{a}, "FIC DEV", 'subfield value 4');
50 $rec = $mp->parse_record;
51 is ($rec, 0, 'no more records');
52
53 # with map-01,  999$a and 999$q are captured. q only exists on the second
54 # record; the others should the placeholder value of ''
55 $mp = Equinox::Migration::MapDrivenMARCXMLProc->new( marcfile => 't/corpus/mdmp-0.txt',
56                                                      mapfile  => 't/corpus/mdmpmap-01.txt'
57                                                    );
58 $rec = $mp->parse_record;
59 is ($rec->{tags}[0]{uni}{a}, "MYS DEM", '999$a');
60 is ($rec->{tags}[0]{uni}{q}, "", '999$q doesnt exist here');
61 is ($rec->{tags}[0]{uni}{j}, undef, 'we shouldnt have captured this, even if it does exist');
62 $rec = $mp->parse_record;
63 is ($rec->{tags}[0]{uni}{a}, "MYS 2", '999$a');
64 is ($rec->{tags}[0]{uni}{q}, "TEST", '999$q does exist here');
65
66 # map-02 adds 999$x *not* as multi, producing a fatal error on the last record
67 $mp = Equinox::Migration::MapDrivenMARCXMLProc->new( marcfile => 't/corpus/mdmp-0.txt',
68                                                      mapfile  => 't/corpus/mdmpmap-02.txt');
69 $rec = $mp->parse_record;
70 $rec = $mp->parse_record;
71 $rec = $mp->parse_record;
72 eval { $rec = $mp->parse_record };
73 is ($@, "Multiple occurances of a non-multi field: 999x at rec 4\n", '999$x not declared multi, but is');
74
75 # map-03 has 999$s as required, producing a fatal on record X
76 $mp = Equinox::Migration::MapDrivenMARCXMLProc->new( marcfile => 't/corpus/mdmp-0.txt',
77                                                      mapfile  => 't/corpus/mdmpmap-03.txt');
78 eval { $rec = $mp->parse_record };
79 is ($@, "Required mapping 999s not found in rec 1\n", '999$s removed from this record');
80 eval { $rec = $mp->parse_record };
81 is ($@, "", '999$s exists here tho');
82
83 # map-04 has fields in 999 and 250, and multi data
84 $mp = Equinox::Migration::MapDrivenMARCXMLProc->new( marcfile => 't/corpus/mdmp-0.txt',
85                                                      mapfile  => 't/corpus/mdmpmap-04.txt');
86 $rec = $mp->parse_record;
87 is ($rec->{tags}[0]{tag}, 250, 'should be 250');
88 is ($rec->{tags}[0]{uni}{a}, "1st ed.", '999$a');
89 is ($rec->{tags}[1]{tag}, 999, 'should be 999');
90 is ($rec->{tags}[1]{uni}{a}, "MYS DEM", '999$a');
91 is_deeply ($rec->{tags}[1]{multi}{'999x'}, ['MYSTERY'], '999$x - multi');
92 is_deeply ($rec->{tmap}{250}, [0], 'tag map test 1a');
93 is_deeply ($rec->{tmap}{999}, [1], 'tag map test 1b');
94 $rec = $mp->parse_record;
95 $rec = $mp->parse_record;
96 $rec = $mp->parse_record;
97 is ($rec->{tags}[0]{tag}, 999, '250 doesnt exist in this record');
98 is ($rec->{tags}[0]{uni}{a}, "FIC DEV", 'subfield value 4');
99 is_deeply ($rec->{tags}[0]{multi}{'999x'}, ['FICTION','FICTION2','FICTION3','FICTION4'],
100            '999$x - multi');
101 is ($rec->{tmap}{250}, undef, 'tag map test 2a');
102 is_deeply ($rec->{tmap}{999}, [0], 'tag map test 2b');
103
104 # map-05 is map-04 with a "no digits" filter on 999$x
105 $mp = Equinox::Migration::MapDrivenMARCXMLProc->new( marcfile => 't/corpus/mdmp-0.txt',
106                                                      mapfile  => 't/corpus/mdmpmap-05.txt');
107 is_deeply ($mp->{map}->filters('multi_field'), ['\d']);
108 $rec = $mp->parse_record;
109 $rec = $mp->parse_record;
110 $rec = $mp->parse_record;
111 $rec = $mp->parse_record;
112 is_deeply ($rec->{tags}[0]{multi}{'999x'}, ['FICTION'], '999$x - multi no digits');