mirror of
https://github.com/cedricbonhomme/Stegano.git
synced 2025-05-12 09:08:31 +02:00
More tests for the generators.
This commit is contained in:
parent
0da9d9882e
commit
7c9530aa9d
3 changed files with 51 additions and 28 deletions
|
@ -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():
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Add table
Reference in a new issue