summaryrefslogtreecommitdiff
path: root/t/plugboard.t
blob: 3e1b5dc14ce9b2b8d437d8cc9fbd7fd86e11d0eb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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();