Many tests done, still more to come.
[szyfrow.git] / tests / test_cadenus.py
1 import pytest
2 import string
3
4 from szyfrow.cadenus import *
5 from szyfrow.support.utilities import *
6
7 def test_keycolumn():
8 assert make_cadenus_keycolumn()['a'] == 0
9 assert make_cadenus_keycolumn()['b'] == 1
10 assert make_cadenus_keycolumn()['c'] == 2
11 assert make_cadenus_keycolumn()['v'] == 21
12 assert make_cadenus_keycolumn()['w'] == 21
13 assert make_cadenus_keycolumn()['z'] == 24
14 assert make_cadenus_keycolumn(doubled_letters='ij', start='b',
15 reverse=True)['a'] == 1
16 assert make_cadenus_keycolumn(doubled_letters='ij', start='b',
17 reverse=True)['b'] == 0
18 assert make_cadenus_keycolumn(doubled_letters='ij', start='b',
19 reverse=True)['c'] == 24
20 assert make_cadenus_keycolumn(doubled_letters='ij', start='b',
21 reverse=True)['i'] == 18
22 assert make_cadenus_keycolumn(doubled_letters='ij', start='b',
23 reverse=True)['j'] == 18
24 assert make_cadenus_keycolumn(doubled_letters='ij', start='b',
25 reverse=True)['v'] == 6
26 assert make_cadenus_keycolumn(doubled_letters='ij', start='b',
27 reverse=True)['z'] == 2
28
29
30 def test_encipher_message():
31 plaintext = sanitise('''Whoever has made a voyage up the Hudson must
32 remember the Kaatskill mountains. They are a dismembered branch of
33 the great''')
34 keycol = make_cadenus_keycolumn(doubled_letters='vw', start='a', reverse=True)
35 ciphertext = cadenus_encipher(plaintext, 'wink', keycol)
36 expected = 'antodeleeeuhrsidrbhmhdrrhnimefmthgeaetakseomehetyaasuvoyegrastmmuuaeenabbtpchehtarorikswosmvaleatned'
37 assert ciphertext == expected
38
39 plaintext = sanitise('''a severe limitation on the usefulness of the
40 cadenus is that every message must be a multiple of twenty-five
41 letters long''')
42 ciphertext = cadenus_encipher(plaintext, 'easy', keycol)
43 expected = 'systretomtattlusoatleeesfiyheasdfnmschbhneuvsnpmtofarenuseieeieltarlmentieetogevesitfaisltngeeuvowul'
44 assert ciphertext == expected
45
46
47 def test_decipher_message():
48 plaintext = sanitise('''Whoever has made a voyage up the Hudson must
49 remember the Kaatskill mountains. They are a dismembered branch of
50 the great''')
51 keycol = make_cadenus_keycolumn(doubled_letters='vw', start='a', reverse=True)
52 for key in ['wink', 'easy']:
53 enciphered = cadenus_encipher(plaintext, key, keycol)
54 deciphered = cadenus_decipher(enciphered, key, keycol)
55 assert deciphered == plaintext
56
57
58 def test_cadenus_break():
59 plaintext = sanitise('''It is a truth universally acknowledged, that a single man in
60 possession of a good fortune, must be in want of a wife. However
61 little known the feelings or views of such a man may be on his
62 first entering a neighbourhood, this truth is so well fixed in
63 the minds of the surrounding families, that he is considered the
64 rightful property of some one or other of their daughters.''')
65 expected_key = 'swashbuckling'
66 expected_score = Ptrigrams(plaintext)
67 expected_keycol = make_cadenus_keycolumn(doubled_letters='vw', start='a',
68 reverse=True)
69
70 ciphertext = cadenus_encipher(plaintext, expected_key, expected_keycol)
71
72 # dictionary = ['clearinghouse', 'computerising', 'counterclaims',
73 # 'housewarmings', 'intravenously', 'liquefactions', 'somersaulting',
74 # 'sportsmanlike', 'swashbuckling']
75
76 dictionary = ['swashbuckling']
77
78 (key, keycol), score = cadenus_break(ciphertext, words=dictionary,
79 fitness=Ptrigrams)
80
81 assert key == expected_key
82 assert keycol == expected_keycol
83 assert score == pytest.approx(expected_score)