More tests for the generators.

This commit is contained in:
Cédric Bonhomme 2017-03-09 08:54:13 +01:00
parent 0da9d9882e
commit 7c9530aa9d
No known key found for this signature in database
GPG key ID: A1CB94DE57B7A70D
3 changed files with 51 additions and 28 deletions

View file

@ -73,7 +73,8 @@ def mersenne() -> Iterator[int]:
y = 2*y + 1 y = 2*y + 1
def eratosthenes() -> Iterator[int]: def eratosthenes() -> Iterator[int]:
"""Generate the prime numbers with the sieve of Eratosthenes. """https://oeis.org/A000040
Generate the prime numbers with the sieve of Eratosthenes.
""" """
d = {} # type: dict[int, int] d = {} # type: dict[int, int]
for i in itertools.count(2): for i in itertools.count(2):
@ -85,8 +86,9 @@ def eratosthenes() -> Iterator[int]:
d[i * i] = [i] d[i * i] = [i]
yield i yield i
def eratosthenes_composite() -> Iterator[int]: def composite() -> Iterator[int]:
"""Generate the composite numbers with the sieve of Eratosthenes. """https://oeis.org/A002808
Generate the composite numbers using the sieve of Eratosthenes.
""" """
p1 = 3 p1 = 3
for p2 in eratosthenes(): for p2 in eratosthenes():

View file

@ -31,8 +31,7 @@ from typing import List, Iterator, Tuple, Union
from functools import reduce from functools import reduce
def a2bits(chars: str) -> str: def a2bits(chars: str) -> str:
""" """Converts a string to its bits representation as a string of 0's and 1's.
Converts a string to its bits representation as a string of 0's and 1's.
>>> a2bits("Hello World!") >>> a2bits("Hello World!")
'010010000110010101101100011011000110111100100000010101110110111101110010011011000110010000100001' '010010000110010101101100011011000110111100100000010101110110111101110010011011000110010000100001'
@ -40,8 +39,7 @@ def a2bits(chars: str) -> str:
return bin(reduce(lambda x, y : (x<<8)+y, (ord(c) for c in chars), 1))[3:] return bin(reduce(lambda x, y : (x<<8)+y, (ord(c) for c in chars), 1))[3:]
def a2bits_list(chars: str) -> List[str]: def a2bits_list(chars: str) -> List[str]:
""" """Convert a string to its bits representation as a list of 0's and 1's.
Convert a string to its bits representation as a list of 0's and 1's.
>>> a2bits_list("Hello World!") >>> a2bits_list("Hello World!")
['01001000', ['01001000',
@ -62,21 +60,18 @@ def a2bits_list(chars: str) -> List[str]:
return [bin(ord(x))[2:].rjust(8,"0") for x in chars] return [bin(ord(x))[2:].rjust(8,"0") for x in chars]
def bs(s: int) -> str: def bs(s: int) -> str:
""" """Converts an int to its bits representation as a string of 0's and 1's.
Converts an int to its bits representation as a string of 0's and 1's.
""" """
return str(s) if s<=1 else bs(s>>1) + str(s&1) return str(s) if s<=1 else bs(s>>1) + str(s&1)
def setlsb(component: int, bit: str) -> int: def setlsb(component: int, bit: str) -> int:
""" """Set Least Significant Bit of a colour component.
Set Least Significant Bit of a colour component.
""" """
return component & ~1 | int(bit) return component & ~1 | int(bit)
def n_at_a_time(items: List[int], n: int, fillvalue: str) \ def n_at_a_time(items: List[int], n: int, fillvalue: str) \
-> Iterator[Tuple[Union[int, str]]]: -> Iterator[Tuple[Union[int, str]]]:
""" """Returns an iterator which groups n items at a time.
Returns an iterator which groups n items at a time.
Any final partial tuple will be padded with the fillvalue Any final partial tuple will be padded with the fillvalue
>>> list(n_at_a_time([1, 2, 3, 4, 5], 2, 'X')) >>> list(n_at_a_time([1, 2, 3, 4, 5], 2, 'X'))
@ -86,8 +81,7 @@ def n_at_a_time(items: List[int], n: int, fillvalue: str) \
return itertools.zip_longest(*[it] * n, fillvalue=fillvalue) return itertools.zip_longest(*[it] * n, fillvalue=fillvalue)
def binary2base64(binary_file: str) -> str: def binary2base64(binary_file: str) -> str:
""" """Convert a binary file (OGG, executable, etc.) to a
Convert a binary file (OGG, executable, etc.) to a
printable string. printable string.
""" """
# Use mode = "rb" to read binary file # Use mode = "rb" to read binary file
@ -96,8 +90,7 @@ def binary2base64(binary_file: str) -> str:
return encoded_string.decode() return encoded_string.decode()
def base642binary(b64_fname: str) -> bytes: def base642binary(b64_fname: str) -> bytes:
""" """Convert a printable string to a binary file.
Convert a printable file to a binary file.
""" """
b64_fname += '===' b64_fname += '==='
return base64.b64decode(b64_fname) return base64.b64decode(b64_fname)

View file

@ -33,23 +33,54 @@ from stegano.lsbset import generators
class TestGenerators(unittest.TestCase): class TestGenerators(unittest.TestCase):
def test_identity(self): def test_identity(self):
""" """Test the identity generator.
Test the identity generator.
""" """
self.assertEqual(tuple(itertools.islice(generators.identity(), 15)), self.assertEqual(tuple(itertools.islice(generators.identity(), 15)),
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)) (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14))
def test_fibonacci(self): def test_fibonacci(self):
""" """Test the Fibonacci generator.
Test the Fibonacci generator.
""" """
self.assertEqual(tuple(itertools.islice(generators.fibonacci(), 20)), self.assertEqual(tuple(itertools.islice(generators.fibonacci(), 20)),
(1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, (1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610,
987, 1597, 2584, 4181, 6765, 10946)) 987, 1597, 2584, 4181, 6765, 10946))
def test_fermat(self): def test_eratosthenes(self):
"""Test the Eratosthenes sieve.
""" """
Test the Fermat generator. self.assertEqual(tuple(itertools.islice(generators.eratosthenes(), 168)),
(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,
53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107,
109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167,
173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229,
233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283,
293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359,
367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431,
433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491,
499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571,
577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641,
643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709,
719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787,
797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859,
863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941,
947, 953, 967, 971, 977, 983, 991, 997))
def test_composite(self):
"""Test the composite sieve.
"""
self.assertEqual(tuple(itertools.islice(generators.composite(), 114)),
(4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25,
26, 27, 28, 30, 32, 33, 34, 35, 36, 38, 39, 40, 42, 44,
45, 46, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 60, 62,
63, 64, 65, 66, 68, 69, 70, 72, 74, 75, 76, 77, 78, 80,
81, 82, 84, 85, 86, 87, 88, 90, 91, 92, 93, 94, 95, 96,
98, 99, 100, 102, 104, 105, 106, 108, 110, 111, 112,
114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
125, 126, 128, 129, 130, 132, 133, 134, 135, 136, 138,
140, 141, 142, 143, 144, 145, 146, 147, 148, 150))
def test_fermat(self):
"""Test the Fermat generator.
""" """
self.assertEqual(tuple(itertools.islice(generators.fermat(), 9)), self.assertEqual(tuple(itertools.islice(generators.fermat(), 9)),
(3, 5, 17, 257, 65537, 4294967297, 18446744073709551617, (3, 5, 17, 257, 65537, 4294967297, 18446744073709551617,
@ -57,8 +88,7 @@ class TestGenerators(unittest.TestCase):
115792089237316195423570985008687907853269984665640564039457584007913129639937)) 115792089237316195423570985008687907853269984665640564039457584007913129639937))
def test_triangular_numbers(self): def test_triangular_numbers(self):
""" """Test the Triangular numbers generator.
Test the Triangular numbers generator.
""" """
self.assertEqual(tuple(itertools.islice(generators.triangular_numbers(), 54)), self.assertEqual(tuple(itertools.islice(generators.triangular_numbers(), 54)),
(0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, (0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91,
@ -68,8 +98,7 @@ class TestGenerators(unittest.TestCase):
1128, 1176, 1225, 1275, 1326, 1378, 1431)) 1128, 1176, 1225, 1275, 1326, 1378, 1431))
# def test_mersenne(self): # def test_mersenne(self):
# """ # """Test the Mersenne generator.
# Test the Mersenne generator.
# """ # """
# self.assertEqual(tuple(itertools.islice(generators.mersenne(), 20)), # self.assertEqual(tuple(itertools.islice(generators.mersenne(), 20)),
# (3, 7, 31, 127, 2047, 8191, 131071, 524287, 8388607, # (3, 7, 31, 127, 2047, 8191, 131071, 524287, 8388607,
@ -79,6 +108,5 @@ class TestGenerators(unittest.TestCase):
# 147573952589676412927, 2361183241434822606847)) # 147573952589676412927, 2361183241434822606847))
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()