6e05ad2a2a6d8de341a84dc8257911e21538c64e
Marco Ricci Add unit tests, both new an...

Marco Ricci authored 5 months ago

1) # SPDX-FileCopyrightText: 2024 Marco Ricci <m@the13thletter.info>
2) #
3) # SPDX-License-Identifier: MIT
4) 
5) """Test sequin.Sequin."""
6) 
7) import pytest
8) 
9) import sequin
10) 
11) import collections
12) 
13) benum = sequin.Sequin._big_endian_number
14) 
15) @pytest.mark.parametrize(['sequence', 'base', 'expected'], [
16)     ([1, 2, 3, 4, 5, 6], 10, 123456),
17)     ([1, 2, 3, 4, 5, 6], 100, 10203040506),
18)     ([0, 0, 1, 4, 9, 7], 10, 1497),
19)     ([1, 0, 0, 1, 0, 0, 0, 0], 2, 144),
20)     ([1, 7, 5, 5], 8, 0o1755),
21) ])
22) def test_big_endian_number(sequence, base, expected):
23)     assert benum(sequence, base=base) == expected
24) 
25) @pytest.mark.parametrize(['exc_type', 'exc_pattern', 'sequence' , 'base'], [
26)     (ValueError, 'invalid base 3 digit:', [-1], 3),
27)     (ValueError, 'invalid base:', [0], 1),
Marco Ricci Add finished command-line i...

Marco Ricci authored 4 months ago

28)     (TypeError, 'not an integer:', [0.0, 1.0, 0.0, 1.0], 2),
Marco Ricci Add unit tests, both new an...

Marco Ricci authored 5 months ago

29) ])
30) def test_big_endian_number_exceptions(exc_type, exc_pattern, sequence, base):
31)     with pytest.raises(exc_type, match=exc_pattern):
32)         benum(sequence, base=base)
33) 
34) @pytest.mark.parametrize(['sequence', 'is_bitstring', 'expected'], [
35)     ([1, 0, 0, 1, 0, 1], False, [0, 0, 0, 0, 0, 0, 0, 1,
36)                                  0, 0, 0, 0, 0, 0, 0, 0,
37)                                  0, 0, 0, 0, 0, 0, 0, 0,
38)                                  0, 0, 0, 0, 0, 0, 0, 1,
39)                                  0, 0, 0, 0, 0, 0, 0, 0,
40)                                  0, 0, 0, 0, 0, 0, 0, 1]),
41)     ([1, 0, 0, 1, 0, 1], True, [1, 0, 0, 1, 0, 1]),
42)     (b'OK', False, [0, 1, 0, 0, 1, 1, 1, 1,
43)                     0, 1, 0, 0, 1, 0, 1, 1]),
44)     ('OK', False, [0, 1, 0, 0, 1, 1, 1, 1,
45)                    0, 1, 0, 0, 1, 0, 1, 1]),
46) ])
47) def test_constructor(sequence, is_bitstring, expected):
48)     seq = sequin.Sequin(sequence, is_bitstring=is_bitstring)
49)     assert seq.bases == {2: collections.deque(expected)}
50) 
51) @pytest.mark.parametrize(
52)     ['sequence', 'is_bitstring', 'exc_type', 'exc_pattern'],
53)     [
54)         ([0, 1, 2, 3, 4, 5, 6, 7], True,
55)          ValueError, 'sequence item out of range'),
56)         (u'こんにちは。', False,
57)          ValueError, 'sequence item out of range'),
58)     ]
59) )
60) def test_constructor_exceptions(sequence, is_bitstring, exc_type, exc_pattern):
61)     with pytest.raises(exc_type, match=exc_pattern):
62)         sequin.Sequin(sequence, is_bitstring=is_bitstring)
63) 
64) def test_shifting():
65)     seq = sequin.Sequin([1, 0, 1, 0, 0, 1, 0, 0, 0, 1], is_bitstring=True)
66)     assert seq.bases == {2: collections.deque([1, 0, 1, 0, 0, 1, 0, 0, 0, 1])}
67)     #
68)     assert seq._all_or_nothing_shift(3) == (1, 0, 1)
69)     assert seq._all_or_nothing_shift(3) == (0, 0, 1)
70)     assert seq.bases[2] == collections.deque([0, 0, 0, 1])
71)     #
72)     assert seq._all_or_nothing_shift(5) == ()
73)     assert seq.bases[2] == collections.deque([0, 0, 0, 1])
74)     #
75)     assert seq._all_or_nothing_shift(4), (0, 0, 0, 1)
76)     assert 2 not in seq.bases
77) 
78) def test_generating():
79)     seq = sequin.Sequin([1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1],
80)                         is_bitstring=True)
81)     assert seq.generate(1) == 0
82)     assert seq.generate(5) == 3
83)     assert seq.generate(5) == 3
84)     assert seq.generate(5) == 1
85)     with pytest.raises(sequin.SequinExhaustedException):
86)         seq.generate(5)
87)     with pytest.raises(sequin.SequinExhaustedException):
88)         seq.generate(1)
89)     seq = sequin.Sequin([1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1],
90)                         is_bitstring=True)
91)     with pytest.raises(ValueError, match='invalid target range'):
92)         seq.generate(0)
93) 
94) def test_internal_generating():
95)     seq = sequin.Sequin([1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1],
96)                         is_bitstring=True)
97)     assert seq._generate_inner(5) == 3
98)     assert seq._generate_inner(5) == 3
99)     assert seq._generate_inner(5) == 1
100)     assert seq._generate_inner(5) == 5
101)     assert seq._generate_inner(1) == 0
102)     seq = sequin.Sequin([1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1],
103)                         is_bitstring=True)
104)     assert seq._generate_inner(1) == 0
105)     with pytest.raises(ValueError, match='invalid target range'):
106)         seq._generate_inner(0)