starting to implement a pad filler + tests

cat-town
Dan Buch 15 years ago
parent 1b94d6a463
commit 998bb596ef

@ -12,7 +12,7 @@ def decode(msg, pad):
def create_pad(length, width=72): def create_pad(length, width=72):
chars = _create_chars_for_pad(length) chars = _create_chars_for_pad(length)
lines = _chunk_chars_into_lines(chars, width=width) lines = _chunk_chars_into_lines(chars, width=width)
return lines return '\n\n\n'.join(lines)
def _create_chars_for_pad(length): def _create_chars_for_pad(length):
@ -26,7 +26,7 @@ def _chunk_chars_into_lines(chars, width=72):
lines = [] lines = []
for chunk in _as_line_chunks(chars, width=width): for chunk in _as_line_chunks(chars, width=width):
lines.append(chunk) lines.append(chunk)
return '\n\n\n'.join(lines) return lines
def _as_line_chunks(chars, width=72): def _as_line_chunks(chars, width=72):
@ -41,6 +41,33 @@ def _as_line_chunks(chars, width=72):
yield ''.join(chunk) yield ''.join(chunk)
def _padfill(text, pad):
padlines = pad.splitlines()
textlines = _chunk_chars_into_lines(text, _get_textwidth(pad))
for lineno, padline in enumerate(padlines[:]):
if _is_padline(lineno) or _is_cypherline(lineno):
continue
else:
padlines[lineno] = textlines.pop(0) if textlines[1:] else ''
return '\n'.join(padlines)
def _get_textwidth(text):
return max([len(line) for line in text.splitlines()])
def _is_padline(lineno):
return not lineno % 3
def _is_txtline(lineno):
return (lineno % 2 and not lineno % 3)
def _is_cypherline(lineno):
return lineno % 3
def _mk_as_alpha(): def _mk_as_alpha():
as_alpha = dict() as_alpha = dict()
a_chr = ord('A') a_chr = ord('A')

@ -1,10 +1,10 @@
import random
import unittest import unittest
import onetimepad as OT import onetimepad as OT
class TestOneTimePad(unittest.TestCase): class TestOneTimePad(unittest.TestCase):
msg = ('HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFA'
'WOODCHUCKCOULDCHUCKWOOD' * 50)
def test_mk_as_alpha_excludes_j(self): def test_mk_as_alpha_excludes_j(self):
self.assertTrue('J' not in OT._AS_ALPHA.values()) self.assertTrue('J' not in OT._AS_ALPHA.values())
@ -20,14 +20,40 @@ class TestOneTimePad(unittest.TestCase):
def test_two_out_of_every_three_lines_are_empty_on_new_pad(self): def test_two_out_of_every_three_lines_are_empty_on_new_pad(self):
pad = OT.create_pad(2000) pad = OT.create_pad(2000)
for i, line in enumerate(pad.splitlines()): for lineno, line in enumerate(pad.splitlines()):
lineno = i + 3 line = line.strip()
if not lineno % 3: if OT._is_padline(lineno):
self.assertTrue(bool(len(line)), self.assertTrue(bool(len(line)),
'line {0} is non-empty'.format(lineno)) 'pad line {0} is non-empty'.format(lineno))
elif OT._is_txtline(lineno):
self.assertFalse(bool(len(line)),
'text line {0} is empty'.format(lineno))
elif OT._is_cypherline(lineno):
self.assertFalse(bool(len(line)),
'cypher line {0} is empty'.format(lineno))
else: else:
raise NotImplementedError(lineno)
def test_padfill_leaves_every_third_line_empty(self):
msg = self.msg[:]
pad = OT.create_pad(len(msg))
filled = OT._padfill(msg, pad)
# print filled
# raise Exception
self.assertTrue(bool(filled))
for lineno, line in enumerate(filled.splitlines()):
line = line.strip()
if OT._is_cypherline(lineno):
self.assertFalse(bool(len(line)), self.assertFalse(bool(len(line)),
'line {0} is empty'.format(lineno)) 'line {0} is empty'.format(lineno))
elif OT._is_txtline(lineno):
self.assertTrue(bool(len(line)),
'text line {0} is non-empty'.format(lineno))
elif OT._is_padline(lineno):
self.assertTrue(bool(len(line)),
'pad line {0} is non-empty'.format(lineno))
else:
raise NotImplementedError(lineno)
if __name__ == '__main__': if __name__ == '__main__':

Loading…
Cancel
Save