summaryrefslogtreecommitdiff
path: root/t/reflectors.t
blob: 107ff9f9e9c5f5f275ffd700433b83b78085b65a (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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!perl 
use DAKKAR::p 'test';
use List::Util 'shuffle';
use Test::Enigmatic;
 
use Enigmatic::Reflector;
use Enigmatic::ReflectorBox;
 
subtest 'identity reflector' => sub {
    my @in = 'A'..'Z';
    my $r = Enigmatic::Reflector->new(@in->join);
    Test::Enigmatic::test_static_map($r,\@in,'identity');
};
 
subtest 'scramble reflector' => sub {
    my %map;my @letters='A'..'Z';
    my %unused;@unused{@letters}=();
    for my $letter (@letters) {
        next if not exists $unused{$letter};
        my @usable = keys %unused;
        my $image = @usable[rand @usable];
        $map{$letter} = $image;
        $map{$image} = $letter;
        delete $unused{$letter};
        delete $unused{$image};
    }
 
    my $wiring = join '',@map{@letters};
    note "scramble reflector: $wiring";
 
    my $r = Enigmatic::Reflector->new($wiring);
    Test::Enigmatic::test_static_map($r,[@map{@letters}],'shuffle');
};
 
subtest 'constraints' => sub {
    my @bad_params = (
        'ABCD',
        'ABCDEFGHIJKLMNOPQRSTUVWXYZABCD',
        'AACDEFGHIJKLMNOPQRSTUVWXYZ',
        '12CDEFGHIJKLMNOPQRSTUVWXYZABCD',
        'EKMFLGDQVZNTOWYHXUSPAIBRCJ',
    );
 
    for my $bad_param (@bad_params) {
        dies_ok {
            Enigmatic::Reflector->new($bad_param);
        "bad parameter $bad_param";
    }
};
 
subtest 'reflector box' => sub {
    my %reflectors = (
        => 'YRUHQSLDPXNGOKMIEBFZCWVJAT',
        => 'FVPJIAOYEDRZXWGCTKUQSBNMHL',
        'B_thin' => 'ENKQAUYWJICOPBLMDXZVFTHRGS',
        'C_thin' => 'RDOBJNTKVEHMLFCWZAXGYIPSUQ',
    );
 
    my $box = Enigmatic::ReflectorBox->new();
 
    %reflectors->each(sub {
                      my ($reflector,$wiring) = @_;
                      my $r = $box->get($reflector);
                      my $out = $wiring->split(qr//);
                      Test::Enigmatic::test_static_map(
                          $r,$out,
                          "reflector $reflector from box");
                  });
};
 
done_testing();