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),
|
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)
|