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 'identity rotor, non-default ring setting' => sub {
my @out = (('B'..'Z'),'A');
my $r = Enigmatic::Rotor->new(
wiring => ['A'..'Z']->join,
ring_setting => 1,
);
Test::Enigmatic::test_static_map($r,\@out,'ring=1');
};
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 $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");
});
};
done_testing();