The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;
use Test::More qw( no_plan );

use_ok( 'MARC::Detrans::Rules' );
use_ok( 'MARC::Detrans::Rule' );

my $rules = MARC::Detrans::Rules->new();
isa_ok( $rules, 'MARC::Detrans::Rules' );

$rules->addRule( MARC::Detrans::Rule->new( from=>'a', to=>'A', escape=>'g' ) );
$rules->addRule( MARC::Detrans::Rule->new( from=>'b', to=>'B', escape=>'h' ) );
$rules->addRule( MARC::Detrans::Rule->new( from=>'ac', to=>'Z', escape=>'i' ) );
$rules->addRule( MARC::Detrans::Rule->new( from=>'|*+', to=>'X', escape=>'j' ) );

my $esc = chr(0x1B);
my $ascii = chr(0x1B).chr(0x28).chr(0x42);

is( $rules->convert('a'), "${esc}gA${ascii}", 'convert() 1' );
is( $rules->convert('ab'), "${esc}gA${esc}hB${ascii}", 'convert() 2' );
is( $rules->convert('aab'), "${esc}gAA${esc}hB${ascii}", 'convert() 3' );
is( $rules->convert('aac'), "${esc}gA${esc}iZ${ascii}", 'convert() 4' );
is( $rules->convert('|*+'), "${esc}jX${ascii}", "convert() 5" );

## non-existant mapping
ok( ! $rules->convert('acw'), 'non-existant mapping' );
is( $rules->error(), 'no matching rule found for "w" [0x77] at position 3',
    'non-existant mapping error message' );
ok( ! $rules->error(), 'error message erased on retrieval' );

$rules->addRule( MARC::Detrans::Rule->new( from => 'z', to => '^ESCz' ) );
is( $rules->convert('z'), chr(0x1B).'z', 'rule with ^ESC' );