From 7c9530aa9d1d73cf3b14673060fc4c7440ca00a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Bonhomme?= Date: Thu, 9 Mar 2017 08:54:13 +0100 Subject: [PATCH] More tests for the generators. --- stegano/lsbset/generators.py | 8 +++--- stegano/tools.py | 21 +++++---------- tests/test_generators.py | 50 ++++++++++++++++++++++++++++-------- 3 files changed, 51 insertions(+), 28 deletions(-) diff --git a/stegano/lsbset/generators.py b/stegano/lsbset/generators.py index 59093c1..4980d9e 100644 --- a/stegano/lsbset/generators.py +++ b/stegano/lsbset/generators.py @@ -73,7 +73,8 @@ def mersenne() -> Iterator[int]: y = 2*y + 1 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] for i in itertools.count(2): @@ -85,8 +86,9 @@ def eratosthenes() -> Iterator[int]: d[i * i] = [i] yield i -def eratosthenes_composite() -> Iterator[int]: - """Generate the composite numbers with the sieve of Eratosthenes. +def composite() -> Iterator[int]: + """https://oeis.org/A002808 + Generate the composite numbers using the sieve of Eratosthenes. """ p1 = 3 for p2 in eratosthenes(): diff --git a/stegano/tools.py b/stegano/tools.py index b573fe7..acb9693 100755 --- a/stegano/tools.py +++ b/stegano/tools.py @@ -31,8 +31,7 @@ from typing import List, Iterator, Tuple, Union from functools import reduce 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!") '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:] 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!") ['01001000', @@ -62,21 +60,18 @@ def a2bits_list(chars: str) -> List[str]: return [bin(ord(x))[2:].rjust(8,"0") for x in chars] 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) 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) def n_at_a_time(items: List[int], n: int, fillvalue: 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 >>> 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) 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. """ # Use mode = "rb" to read binary file @@ -96,8 +90,7 @@ def binary2base64(binary_file: str) -> str: return encoded_string.decode() def base642binary(b64_fname: str) -> bytes: - """ - Convert a printable file to a binary file. + """Convert a printable string to a binary file. """ b64_fname += '===' return base64.b64decode(b64_fname) diff --git a/tests/test_generators.py b/tests/test_generators.py index e91f127..143eb42 100644 --- a/tests/test_generators.py +++ b/tests/test_generators.py @@ -33,23 +33,54 @@ from stegano.lsbset import generators class TestGenerators(unittest.TestCase): def test_identity(self): - """ - Test the identity generator. + """Test the identity generator. """ self.assertEqual(tuple(itertools.islice(generators.identity(), 15)), (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)) def test_fibonacci(self): - """ - Test the Fibonacci generator. + """Test the Fibonacci generator. """ self.assertEqual(tuple(itertools.islice(generators.fibonacci(), 20)), (1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 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)), (3, 5, 17, 257, 65537, 4294967297, 18446744073709551617, @@ -57,8 +88,7 @@ class TestGenerators(unittest.TestCase): 115792089237316195423570985008687907853269984665640564039457584007913129639937)) def test_triangular_numbers(self): - """ - Test the Triangular numbers generator. + """Test the Triangular numbers generator. """ self.assertEqual(tuple(itertools.islice(generators.triangular_numbers(), 54)), (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)) # def test_mersenne(self): - # """ - # Test the Mersenne generator. + # """Test the Mersenne generator. # """ # self.assertEqual(tuple(itertools.islice(generators.mersenne(), 20)), # (3, 7, 31, 127, 2047, 8191, 131071, 524287, 8388607, @@ -79,6 +108,5 @@ class TestGenerators(unittest.TestCase): # 147573952589676412927, 2361183241434822606847)) - if __name__ == '__main__': unittest.main()