+
+subtest '_get_match_keys() tests' => sub {
+
+ plan tests => 20;
+
+ my $matchpoint = get_title_matchpoint({
+ length => 0,
+ norms => [ 'legacy_default' ],
+ offset => 0
+ });
+
+ my $record = MARC::Record->new();
+ $record->append_fields(
+ MARC::Field->new('020', '1', ' ',
+ a => '978-1451697216 (alk. paper)'),
+ MARC::Field->new('020', '1', ' ',
+ a => '145169721X (alk. paper)'),
+ MARC::Field->new('020', '1', ' ',
+ a => '1NOTISBN3'),
+ MARC::Field->new('100', '1', ' ',
+ a => 'King, Stephen',
+ d => 'd1947-'),
+ MARC::Field->new('245', ' ', ' ',
+ a => ' .; thE t[]:,aliS(m)/An\'"',
+ c => 'Stephen King, Peter Straub.' ),
+ MARC::Field->new('700', ' ', ' ',
+ a => 'Straub, Peter',
+ d => '1943-')
+ );
+
+ my @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+
+ is( $keys[0], 'THE TALISMAN STEPHEN KING PETER STRAUB',
+ 'Match key correctly calculated with no $norms');
+
+ $matchpoint = get_title_matchpoint({
+ length => 9,
+ norms => [ 'legacy_default' ],
+ offset => 0
+ });
+ @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+ is( $keys[0], 'THE',
+ 'Match key correctly calculated with length 9');
+
+ $matchpoint = get_title_matchpoint({
+ length => 9,
+ norms => [ 'legacy_default' ],
+ offset => 1
+ });
+ @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+ is( $keys[0], 'THE T',
+ 'Match key correctly calculated with length 9 and offset 1');
+
+ $matchpoint = get_title_matchpoint({
+ length => 9,
+ norms => [ 'legacy_default' ],
+ offset => 2
+ });
+ @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+ is( $keys[0], 'THE T',
+ 'Match key correctly calculated with length 9 and offset 2, should not remove space');
+
+ $matchpoint = get_authors_matchpoint({
+ length => 0,
+ norms => [ 'legacy_default' ],
+ offset => 0
+ });
+ @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+ is( $keys[0], 'STRAUB PETER KING STEPHEN',
+ 'Match key correctly calculated with multiple components');
+
+ $matchpoint = get_authors_matchpoint({
+ length => 9,
+ norms => [ 'legacy_default' ],
+ offset => 0
+ });
+ @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+ is( $keys[0], 'STRAUB P KING STE',
+ 'Match key correctly calculated with multiple components, length 9');
+
+ $matchpoint = get_authors_matchpoint({
+ length => 10,
+ norms => [ 'legacy_default' ],
+ offset => 0
+ });
+ @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+ is( $keys[0], 'STRAUB PE KING STEP',
+ 'Match key correctly calculated with multiple components, length 10');
+
+ $matchpoint = get_authors_matchpoint({
+ length => 10,
+ norms => [ 'legacy_default' ],
+ offset => 2
+ });
+ @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+ is( $keys[0], 'RAUB PETE NG STEPHE',
+ 'Match key correctly calculated with multiple components, length 10, offset 1');
+
+ $matchpoint = get_title_matchpoint({
+ length => 0,
+ norms => [ 'none', 'none' ],
+ offset => 0
+ });
+ @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+ is( $keys[0], ' .; thE t[]:,aliS(m)/An\'" Stephen King, Peter Straub.',
+ 'Match key intact if \'none\' specified, length 0 and offset 0' );
+
+ $matchpoint = get_authors_matchpoint({
+ length => 0,
+ norms => [ 'upper_case' ],
+ offset => 0
+ });
+ @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+ is( $keys[0], 'STRAUB, PETER KING, STEPHEN',
+ 'Match key correctly calculated with multiple components, \'upper_case\' norm');
+
+ $matchpoint = get_authors_matchpoint({
+ length => 0,
+ norms => [ 'lower_case' ],
+ offset => 0
+ });
+ @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+ is( $keys[0], 'straub, peter king, stephen',
+ 'Match key correctly calculated with multiple components, \'lower_case\' norm');
+
+ $matchpoint = get_authors_matchpoint({
+ length => 0,
+ norms => [ 'remove_spaces' ],
+ offset => 0
+ });
+ @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+ is( $keys[0], 'Straub,Peter King,Stephen',
+ 'Match key correctly calculated with multiple components, \'remove_spaces\' norm');
+
+ $matchpoint = get_authors_matchpoint({
+ length => 0,
+ norms => [ 'remove_spaces', 'lower_case' ],
+ offset => 0
+ });
+ @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+ is( $keys[0], 'straub,peter king,stephen',
+ 'Match key correctly calculated with multiple components, \'remove_spaces\' and \'lower_case\' norm');
+
+ my $norm = 'unknown_norm';
+ $matchpoint = get_title_matchpoint({
+ length => 0,
+ norms => [ $norm ],
+ offset => 0
+ });
+ warning_is
+ { @keys = C4::Matcher::_get_match_keys( $record, $matchpoint ) }
+ qq{Invalid normalization routine required ($norm)},
+ 'Passing an invalid normalization routine name raises a warning';
+
+ is( $keys[0], ' .; thE t[]:,aliS(m)/An\'" Stephen King, Peter Straub.',
+ 'Match key intact if invalid normalization routine specified' );
+
+ $matchpoint = get_title_matchpoint({
+ length => 0,
+ norms => [ $norm, 'upper_case' ],
+ offset => 0
+ });
+ warning_is
+ { @keys = C4::Matcher::_get_match_keys( $record, $matchpoint ) }
+ qq{Invalid normalization routine required ($norm)},
+ 'Passing an invalid normalization routine name raises a warning';
+
+ is( $keys[0], ' .; THE T[]:,ALIS(M)/AN\'" STEPHEN KING, PETER STRAUB.',
+ 'Match key correctly normalized if invalid normalization routine specified' );
+
+ $matchpoint = get_isbn_matchpoint({
+ length => 0,
+ norms => [ 'ISBN' ],
+ offset => 0
+ });
+ @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+ is( $keys[0], '9781451697216',
+ 'Match key correctly calculated as ISBN13 when ISBN normalizer used');
+ is( $keys[1], '9781451697216',
+ 'Match key correctly calculated as ISBN13 when ISBN normalizer used');
+ is( $keys[2], '1NOTISBN3',
+ 'Match key passed through if not an isbn when ISBN normalizer used');
+
+};
+
+subtest '_get_match_keys() leader tests' => sub {
+ plan tests => 2;
+ my $record = MARC::Record->new();
+ my $matchpoint = get_leader_matchpoint({
+ length => 1,
+ offset => 6,
+ });
+
+ my @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+ is( $keys[0], ' ', 'Match key correctly calculated as " " from LDR6 when no leader available');
+
+ $record->leader('01344cam a22003014a 4500');
+
+ @keys = C4::Matcher::_get_match_keys( $record, $matchpoint );
+ is( $keys[0], 'a', 'Match key correctly calculated as "a" from LDR6');
+};
+
+sub get_title_matchpoint {
+
+ my $params = shift;
+
+ my $length = $params->{length} // 0;
+ my $norms = $params->{norms} // [];
+ my $offset = $params->{offset} // 0;
+
+ my $matchpoint = {
+ components => [
+ {
+ length => $length,
+ norms => $norms,
+ offset => $offset,
+ subfields =>
+ {
+ a => 1,
+ c => 1
+ },
+ tag => '245'
+ }
+ ],
+ index => "title",
+ score => 1000
+ };
+
+ return $matchpoint;
+}
+
+sub get_authors_matchpoint {
+
+ my $params = shift;
+
+ my $length = $params->{length} // 0;
+ my $norms = $params->{norms} // [];
+ my $offset = $params->{offset} // 0;
+
+ my $matchpoint = {
+ components => [
+ {
+ length => $length,
+ norms => $norms,
+ offset => $offset,
+ subfields =>
+ {
+ a => 1
+ },
+ tag => '700'
+ },
+ {
+ length => $length,
+ norms => $norms,
+ offset => $offset,
+ subfields =>
+ {
+ a => 1
+ },
+ tag => '100'
+ }
+ ],
+ index => "author",
+ score => 1000
+ };
+
+ return $matchpoint;
+}
+
+sub get_isbn_matchpoint {
+
+ my $params = shift;
+
+ my $length = $params->{length} // 0;
+ my $norms = $params->{norms} // [];
+ my $offset = $params->{offset} // 0;
+
+ my $matchpoint = {
+ components => [
+ {
+ length => $length,
+ norms => $norms,
+ offset => $offset,
+ subfields =>
+ {
+ a => 1
+ },
+ tag => '020'
+ },
+ ],
+ index => "isbn",
+ score => 1000
+ };
+
+ return $matchpoint;
+}
+
+sub get_leader_matchpoint {
+ my $params = shift;
+ my $length = $params->{length} // 0;
+ my $norms = $params->{norms} // [];
+ my $offset = $params->{offset} // 0;
+
+ my $matchpoint = {
+ components => [
+ {
+ length => $length,
+ norms => $norms,
+ offset => $offset,
+ tag => 'LDR'
+ },
+ ],
+ };
+
+ return $matchpoint;
+}