use DAKKAR::p 'test';
use List::Util 'shuffle';
use Test::Enigmatic;
use Enigmatic::Rotor;
use Enigmatic::RotorBox;
subtest 'identity rotor' => sub {
my @in = 'A'..'Z';
my $r = Enigmatic::Rotor->new(@in->join);
Test::Enigmatic::test_static_map($r,\@in,'identity');
};
subtest 'scramble rotor' => sub {
my @out = shuffle 'A'..'Z';
my $r = Enigmatic::Rotor->new(@out->join);
Test::Enigmatic::test_static_map($r,\@out,'shuffle');
};
subtest 'constraints' => sub {
my @bad_params = (
'ABCD',
'ABCDEFGHIJKLMNOPQRSTUVWXYZABCD',
'AACDEFGHIJKLMNOPQRSTUVWXYZ',
'12CDEFGHIJKLMNOPQRSTUVWXYZABCD',
);
for my $bad_param (@bad_params) {
dies_ok {
Enigmatic::Rotor->new($bad_param);
} "bad parameter $bad_param";
}
};
subtest 'rotor box' => sub {
my %rotors = (
I => 'EKMFLGDQVZNTOWYHXUSPAIBRCJ',
II => 'AJDKSIRUXBLHWTMCQGZNPYFVOE',
III => 'BDFHJLCPRTXVZNYEIWGAKMUSQO',
IV => 'ESOVPZJAYQUIRHXLNFTGKDCMWB',
V => 'VZBRGITYUPSDNHLXAWMJQOFECK',
VI => 'JPGVOUMFYQBENHZRDKASXLICTW',
VII => 'NZJHGRCXMYSWBOUFAIVLPEKQDT',
VIII => 'FKQHTLXOCBJSPDZRAMEWNIUYGV',
Beta => 'LEYJVCNIXWPBQMDRTAKZGFUHOS',
Gamma => 'FSOKANUERHMBTIYCWLQPZXVGJD',
);
my %notch_at = (
I => ['Q'],
II => ['E'],
III => ['V'],
IV => ['J'],
V => ['Z'],
VI => ['Z','M'],
VII => ['Z','M'],
VIII => ['Z','M'],
Beta => [],
Gamma => [],
);
my $box = Enigmatic::RotorBox->new();
%rotors->each(sub {
my ($rotor,$wiring) = @_;
my $r = $box->get($rotor);
my $out = $wiring->split(qr//);
Test::Enigmatic::test_static_map(
$r,$out,
"rotor $rotor from box");
my @notches = $notch_at{$rotor}->flatten;
my @not_notches = do {
my %tmp;@tmp{'A'..'Z'}=();
delete @tmp{@notches};
keys %tmp;
};
for my $l (@notches) {
ok($r->has_notch_at($l),
"rotor $rotor has notch at $l");
}
for my $l (@not_notches) {
ok(! $r->has_notch_at($l),
"rotor $rotor has no notch at $l");
}
});
};
subtest 'ring-setting on real rotor' => sub {
my $r = Enigmatic::RotorBox->new->get('I');
$r->ring_setting(1);
my $out = 'EKMFLGDQVZNTOWYHXUSPAIBRCJ'->split(qr//);
$out->unshift($out->pop);
$out->each_value(sub{$_[0] =~ tr[A-Z][B-ZA]});
Test::Enigmatic::test_static_map($r,$out,'ring I moved to 1');
};
done_testing();