568c3c070bc4976e956b27928d68d901a241bc05
[migration-tools.git] / Equinox-Migration / t / 02-SubfieldMapper.t
1 #!perl -T
2
3 #use Test::More tests => 33;
4 use Test::More qw(no_plan);
5 use Equinox::Migration::SubfieldMapper;
6
7 # baseline object creation
8 eval { my $sm = Equinox::Migration::SubfieldMapper->new( file => "thefileisalie.txt" ) };
9 is ($@ =~ /^Can't open file:/, 1, 'cannot open that');
10
11 my $sm = Equinox::Migration::SubfieldMapper->new();
12 is(ref $sm, "Equinox::Migration::SubfieldMapper", "self is self");
13
14 # test validation death routines
15 my $tokens = {};
16 eval { $sm->validate($tokens) };
17 is ($@, "Required field missing (line 1)\n", 'nothing there');
18 $tokens = { field => 'foo' };
19 eval { $sm->validate($tokens) };
20 is ($@, "Required field missing (line 1)\n", 'only 1 field');
21 $tokens = { field => 'foo', tag => 99 };
22 eval { $sm->validate($tokens) };
23 is ($@, "Required field missing (line 1)\n", 'only 2 fields');
24
25 $tokens = { field => '9wm', tag => 650, sub => 'a' };
26 eval { $sm->validate($tokens) };
27 is ($@, "Fieldnames must start with letter (line 1)\n", 'field must start with letter');
28
29 $tokens = { field => 'foo', tag => 'q', sub => 'a' };
30 eval { $sm->validate($tokens) };
31 is ($@, "Invalid tag (line 1)\n", 'nonnumeric tag');
32 $tokens = { field => 'foo', tag => -1, sub => 'a' };
33 eval { $sm->validate($tokens) };
34 is ($@, "Invalid tag (line 1)\n", 'tag value < 0');
35 $tokens = { field => 'foo', tag => 1042, sub => 'a' };
36 eval { $sm->validate($tokens) };
37 is ($@, "Invalid tag (line 1)\n", 'tag value > 999');
38
39 $tokens = { field => 'foo', tag => 650, sub => '%' };
40 eval { $sm->validate($tokens) };
41 is ($@, "Invalid subfield code (line 1)\n", 'non-alphanum subfield');
42 $tokens = { field => 'foo', tag => 650, sub => '' };
43 eval { $sm->validate($tokens) };
44 is ($@, "Invalid subfield code (line 1)\n", 'zero-length subfield');
45 $tokens = { field => 'foo', tag => 650, sub => 'qq' };
46 eval { $sm->validate($tokens) };
47 is ($@, "Invalid subfield code (line 1)\n", 'over-length subfield');
48
49 $tokens = { field => 'foo', tag => 650, sub => 'a', mod => 'bar' };
50 eval { $sm->validate($tokens) };
51 is ($@, "Unknown chunk (line 1)\n", 'Extra, non-comment content');
52
53 # and some which should have no problems
54 $tokens = { field => 'foo', tag => 650, sub => 'a' };
55 eval { $sm->validate($tokens) };
56 is ($@, '', 'should be fine!');
57 $tokens = { field => 'foo', tag => 650, sub => 'a', mod => '#', 'this', 'is', 'a', 'comment' };
58 eval { $sm->validate($tokens) };
59 is ($@, '', 'should be fine!');
60
61 # two more death: dupes
62 $sm->{fields}{foo} = 1;
63 $tokens = { field => 'foo', tag => 650, sub => 'a', mod => '#', 'this', 'is', 'a', 'comment' };
64 eval { $sm->validate($tokens) };
65 is ($@, "Fieldnames must be unique (line 1)\n", 'dupe fieldname');
66 $sm->{tags}{650}{a} = 1;
67 $tokens = { field => 'bar', tag => 650, sub => 'a', mod => '#', 'this', 'is', 'a', 'comment' };
68 eval { $sm->validate($tokens) };
69 is ($@, "Subfields cannot be multimapped (line 1)\n", 'dupe fieldname');
70
71 # test load from file
72 $sm = Equinox::Migration::SubfieldMapper->new( file => "./t/corpus/sm0.txt" );
73 is(ref $sm, "Equinox::Migration::SubfieldMapper", "self is self");
74 is ($sm->{tags}{949}{a}, 'call_number');
75 is ($sm->{tags}{999}{a}, 'call_number_alt');
76
77 # has method tests
78 is ($sm->has, undef, 'has nothing');
79 is ($sm->has(949), 1, 'has tag');
80 is ($sm->has(959), 0, 'has not tag');
81 is ($sm->has(999, 'a'), 1, 'has tag and subfield');
82 is ($sm->has('call_number'), 1, 'has fieldname');
83 is ($sm->has('call_number', 949), 1, 'has tag');
84 is ($sm->has('call_number', 700), 0, 'does not has tag');
85 is ($sm->has('call_number', 949, 'a'), 1, 'has code');
86 is ($sm->has('call_number', 949, 'q'), 0, 'does not has code');
87
88 # field method tests
89 is ($sm->{fields}{call_number}{tag}, 949);
90 is ($sm->{fields}{call_number}{sub}, 'a');
91 is ($sm->field, undef, 'null mapping is undef');
92 is ($sm->field(650), undef, 'half-null mapping is undef');
93 is ($sm->field(650,'z'), undef, 'tag+code not mapped');
94 is ($sm->field(949,'a'), 'call_number', 'mapping returned');
95
96 # mod method tests
97 is ($sm->{fields}{type}{mod}, 0);
98 is ($sm->{fields}{note}{mod}, 'multi');
99 is ($sm->mod('zzz'), undef, 'nonexistant field');
100 is ($sm->mod('note'), 'multi', 'multi');