]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/perlmods/OpenILS/Utils/MFHD/test/mfhd.t
move test data into external file to prep for creating additional test files
[working/Evergreen.git] / Open-ILS / src / perlmods / OpenILS / Utils / MFHD / test / mfhd.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5 use Data::Dumper;
6 use Test::More 'no_plan';
7
8 use MARC::Record;
9 use OpenILS::Utils::MFHD;
10
11 my $testno = 0;
12
13 sub right_answer {
14     my $holding = shift;
15     my $answer  = {};
16
17     foreach my $subfield (split(/\|/, $holding->subfield('x'))) {
18         next unless $subfield;
19
20         my ($key, $val) = unpack('aa*', $subfield);
21         $answer->{$key} = $val;
22     }
23
24     return $answer;
25 }
26
27 sub load_MARC_rec {
28     my $fh = shift;
29     my $rec;
30     my $line;
31     my $marc = undef;
32
33     # skim to beginning of record (a non-blank, non comment line)
34     while ($line = <$fh>) {
35         chomp $line;
36         last if (!($line =~ /^\s*$/) && !($line =~ /^#/));
37     }
38
39     return undef if !$line;
40
41     $testno += 1;
42     $marc = MARC::Record->new();
43     carp('No record created!') unless $marc;
44
45     $marc->leader('01119nas  2200313 a 4500');
46     $marc->append_fields(
47         MARC::Field->new('008', '970701c18439999enkwr p       0   a0eng  '));
48     $marc->append_fields(
49         MARC::Field->new('035', '', '', a => sprintf('%04d', $testno)));
50
51     while ($line) {
52         next if $line =~ /^#/;    # allow embedded comments
53
54         return $marc if $line =~ /^\s*$/;
55
56         my ($fieldno, $indicators, $rest) = split(/ /, $line, 3);
57         my @inds = unpack('aa', $indicators);
58         my $field;
59         my @subfields;
60
61         @subfields = ();
62         foreach my $subfield (split(/\$/, $rest)) {
63             next unless $subfield;
64
65             my ($key, $val) = unpack('aa*', $subfield);
66             push @subfields, $key, $val;
67         }
68
69         $field = MARC::Field->new(
70             $fieldno, $inds[0], $inds[1],
71             a => 'scratch',
72             @subfields
73         );
74
75         $marc->append_fields($field);
76
77         $line = <$fh>;
78         chomp $line if $line;
79     }
80     return $marc;
81 }
82
83 my $rec;
84 my @captions;
85
86 open(my $testdata, "<mfhddata.txt") or die("Cannot open 'mfhddata.txt': $!");
87
88 while ($rec = load_MARC_rec($testdata)) {
89     $rec = MFHD->new($rec);
90
91     foreach my $cap (sort { $a->tag <=> $b->tag } $rec->field('85.')) {
92         my $htag;
93         my @holdings;
94
95         ($htag = $cap->tag) =~ s/^85/86/;
96         @holdings = $rec->holdings($htag, $cap->subfield('8'));
97
98         if (!ok(scalar @holdings, "holdings defined " . $cap->subfield('8'))) {
99             next;
100         }
101
102         foreach my $field (@holdings) {
103           TODO: {
104                 local $TODO = "unimplemented"
105                   if ($field->subfield('z') =~ /^TODO/);
106                 is_deeply($field->next, right_answer($field),
107                     $field->subfield('8') . ': ' . $field->subfield('z'));
108             }
109         }
110     }
111 }
112
113 1;