Minor documentation updates
[szyfrow.git] / tests / test_playfair.py
1 import pytest
2 import string
3
4 from szyfrow.playfair import *
5 from szyfrow.support.utilities import *
6
7 def test_wrap():
8 assert playfair_wrap(3, 0, 4) == 3
9 assert playfair_wrap(0, 0, 4) == 0
10 assert playfair_wrap(4, 0, 4) == 4
11 assert playfair_wrap(7, 0, 4) == 2
12 assert playfair_wrap(-1, 0, 4) == 4
13
14 def test_encipher_bigram():
15 grid = polybius_grid('playfairexample', list(range(5)), list(range(5)))
16
17 plain_pairs = 'hi de th eg ol di nt he tr ex es tu mp'.split()
18 cipher_pairs = 'bm od zb xd na be ku dm ui xm mo uv if'.split()
19
20 for p, c in zip(plain_pairs, cipher_pairs):
21 assert playfair_encipher_bigram(p, grid) == c
22
23 def test_decipher_bigram():
24 grid = polybius_grid('playfairexample', list(range(5)), list(range(5)))
25
26 plain_pairs = 'hi de th eg ol di nt he tr ex es tu mp'.split()
27 cipher_pairs = 'bm od zb xd na be ku dm ui xm mo uv if'.split()
28
29 for p, c in zip(plain_pairs, cipher_pairs):
30 assert playfair_decipher_bigram(c, grid) == p
31
32 def test_playfair_bigrams():
33 txt = sanitise('hide the gold in the tree stumps')
34 f_bigrams = 'hi de th eg ol di nt he tr ex es tu mp sx'.split()
35 t_bigrams = 'hi de th eg ol di nt he tr ex st um ps'.split()
36 assert playfair_bigrams(txt, padding_replaces_repeat=True) == t_bigrams
37 assert playfair_bigrams(txt, padding_replaces_repeat=False) == f_bigrams
38
39
40
41 def test_encipher_message():
42 ct = playfair_encipher('hide the gold in the tree stump',
43 'playfairexample', wrap_alphabet=KeywordWrapAlphabet.from_a)
44 assert ct == 'bmodzbxdnabekudmuixmmouvif'
45
46 ct = playfair_encipher('this is a test message for the ' \
47 'playfair decipherment', 'elephant')
48 assert ct == 'clkrkrldhodghouhflovqbalhphzmerxnabkhapofatb'
49
50 ct = playfair_encipher('this is a test message for the ' \
51 'playfair decipherment', 'elephant',
52 wrap_alphabet=KeywordWrapAlphabet.from_last)
53 assert ct == 'vlkrkrlwamnoamawdpolovalhplcklrhmnbkhahmentu'
54
55 ct = playfair_encipher('''Whoever has made a voyage up the Hudson must
56 remember the Kaatskill mountains. They are a dismembered branch of
57 the great''', 'hudson')
58 assert ct == 'vuelznmscupnobnwszgpaoqmonudsohephortctnqnctmoclbwepcrkffthdembgchmoczcpnbbqhrntcntcbipcaeuhlmonkpnbqz'
59
60
61 def test_decipher_message():
62 plaintext = sanitise('''Whoever has made a voyage up the Hudson must
63 remember the Kaatskill mountains. They are a dismembered branch of
64 the great''')
65
66 trans_table = ''.maketrans('j', 'i')
67
68 for key in ['wink', 'elephant', 'swashbuckling']:
69 for prp in [True, False]:
70 expected = cat(playfair_bigrams(plaintext.translate(trans_table),
71 padding_replaces_repeat=prp))
72 for wrap in KeywordWrapAlphabet:
73 enciphered = playfair_encipher(plaintext, key,
74 padding_replaces_repeat=prp, wrap_alphabet=wrap)
75 deciphered = playfair_decipher(enciphered, key,
76 padding_replaces_repeat=prp, wrap_alphabet=wrap)
77 assert deciphered == expected
78
79
80 def test_playfair_break():
81 plaintext = sanitise('''You will rejoice to hear that no disaster has accompanied the
82 commencement of an enterprise which you have regarded with such evil
83 forebodings. I arrived here yesterday, and my first task is to assure
84 my dear sister of my welfare and increasing confidence in the success
85 of my undertaking.''')
86 expected_key = 'swashbuckling'
87 expected_wrap = KeywordWrapAlphabet.from_last
88 expected_letters_to_merge = {'j': 'i'}
89 expected_padding_letter = 'x'
90 expected_padding_replaces_repeat = False
91 ciphertext = playfair_encipher(plaintext, expected_key,
92 padding_letter=expected_padding_letter,
93 padding_replaces_repeat=expected_padding_replaces_repeat,
94 letters_to_merge=expected_letters_to_merge,
95 wrap_alphabet=expected_wrap)
96
97
98 exptected_text = playfair_decipher(ciphertext, expected_key,
99 padding_letter=expected_padding_letter,
100 padding_replaces_repeat=expected_padding_replaces_repeat,
101 letters_to_merge=expected_letters_to_merge,
102 wrap_alphabet=expected_wrap)
103
104 expected_score = Ptrigrams(exptected_text)
105
106 dictionary = ['clearinghouse', 'computerising', 'counterclaims',
107 'housewarmings', 'intravenously', 'liquefactions', 'somersaulting',
108 'sportsmanlike', 'swashbuckling']
109
110 # dictionary = ['swashbuckling']
111
112 (key, wrap, letters_to_merge, padding_letter, padding_replaces_repeat), score = playfair_break(
113 ciphertext,
114 letters_to_merge=expected_letters_to_merge,
115 padding_letter=expected_padding_letter,
116 wordlist=dictionary, fitness=Ptrigrams)
117
118 assert key == expected_key
119 assert wrap == expected_wrap
120 assert letters_to_merge == expected_letters_to_merge
121 assert padding_letter == expected_padding_letter
122 assert padding_replaces_repeat == expected_padding_replaces_repeat
123 assert score == pytest.approx(expected_score)