summaryrefslogtreecommitdiff
path: root/t/plugboard.t
diff options
context:
space:
mode:
Diffstat (limited to 't/plugboard.t')
-rw-r--r--t/plugboard.t54
1 files changed, 54 insertions, 0 deletions
diff --git a/t/plugboard.t b/t/plugboard.t
new file mode 100644
index 0000000..3e1b5dc
--- /dev/null
+++ b/t/plugboard.t
@@ -0,0 +1,54 @@
+#!perl
+use DAKKAR::p 'test';
+use Test::Enigmatic;
+
+use Enigmatic::Plugboard;
+
+# yes, a plugboard is just like a reflector, but it uses a different input
+
+subtest 'identity plugboard' => sub {
+ my @in = 'A'..'Z';
+ my $p = Enigmatic::Plugboard->new();
+ Test::Enigmatic::test_static_map($p,\@in,'identity');
+};
+
+subtest 'scramble plugboard' => sub {
+ my %map;my @letters='A'..'Z';my %fullmap;
+ my %unused;@unused{@letters}=();
+ for my $letter (@letters) {
+ next if not exists $unused{$letter};
+ delete $unused{$letter};
+ my @usable = keys %unused;
+ my $image = @usable[rand @usable];
+ $map{$letter} = $image;
+ $fullmap{$letter} = $image;
+ $fullmap{$image} = $letter;
+ delete $unused{$image};
+ }
+
+ my $wiring = '';
+ %map->each(sub {
+ $wiring .= @_->join(''). ' ';
+ });
+ note "scramble plugboard: $wiring";
+
+ my $p = Enigmatic::Plugboard->new($wiring);
+ Test::Enigmatic::test_static_map($p,[@fullmap{@letters}],'shuffle');
+};
+
+subtest 'constraints' => sub {
+ my @bad_params = (
+ 'AB CD EF GH IJ KL MN OP QR ST UV WX YZ AB CD',
+ 'AA',
+ '12',
+ 'AB BC',
+ );
+
+ for my $bad_param (@bad_params) {
+ dies_ok {
+ Enigmatic::Plugboard->new($bad_param);
+ } "bad parameter $bad_param";
+ }
+};
+
+done_testing();