Coverage for tests/test_frame_data.py: 100%
40 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-08-31 04:18 +0200
« prev ^ index » next coverage.py v7.15.2, created at 2026-08-31 04:18 +0200
1"""Test Frame building."""
3from unittest import TestCase
5from galaxy_beep_frame.exception.frame import (
6 AboveRangeError,
7 BelowRangeError,
8 InvalidContinuationIndicatorError,
9 AnswerNumberError,
10 MissingAnswerNumberError,
11)
12from galaxy_beep_frame.frame import ContinuationIndicator, Frame
13from galaxy_beep_frame.header_type import PossibleHeaderType
16class TestFrameBuilding(TestCase):
17 """Test BEEP Frame building."""
19 def test_frame_state(self) -> None:
20 """Test bad values in frame state."""
21 header_type = PossibleHeaderType.MSG
22 bad_channel_numbers = [-1, 2147483648]
23 bad_message_numbers = [-1, 2147483648]
24 bad_answer_numbers = [-1, 2147483648]
25 bad_sequence_numbers = [-1, 4294967296]
27 good_channel_numbers = [0, 2147483647]
28 good_message_numbers = [0, 2147483647]
29 good_answer_numbers = [0, 1247482647]
30 good_sequence_numbers = [0, 4294967295]
32 for bad_channel_number in bad_channel_numbers:
33 with (
34 self.subTest(
35 msg="bad channel number",
36 channel_number=bad_channel_number,
37 ),
38 self.assertRaises((BelowRangeError, AboveRangeError)),
39 ):
40 Frame(
41 payload=b"",
42 channel_number=bad_channel_number,
43 message_number=0,
44 sequence_number=0,
45 answer_number=None,
46 continuation_indicator=ContinuationIndicator.COMPLETE,
47 header_type=header_type,
48 )
49 for bad_message_number in bad_message_numbers:
50 with (
51 self.subTest(
52 msg="bad message number",
53 message_number=bad_message_number,
54 ),
55 self.assertRaises((BelowRangeError, AboveRangeError)),
56 ):
57 Frame(
58 payload=b"",
59 channel_number=0,
60 message_number=bad_message_number,
61 sequence_number=0,
62 answer_number=None,
63 continuation_indicator=ContinuationIndicator.COMPLETE,
64 header_type=header_type,
65 )
66 for bad_sequence_number in bad_sequence_numbers:
67 with (
68 self.subTest(
69 msg="bad sequence number",
70 sequence_number=bad_sequence_number,
71 ),
72 self.assertRaises((BelowRangeError, AboveRangeError)),
73 ):
74 Frame(
75 payload=b"",
76 channel_number=0,
77 message_number=0,
78 sequence_number=bad_sequence_number,
79 answer_number=None,
80 continuation_indicator=ContinuationIndicator.COMPLETE,
81 header_type=header_type,
82 )
84 for bad_answer_number in bad_answer_numbers:
85 with (
86 self.subTest(
87 msg="bad answer number",
88 answer_number=bad_answer_number,
89 ),
90 self.assertRaises((BelowRangeError, AboveRangeError)),
91 ):
92 Frame(
93 payload=b"",
94 channel_number=0,
95 message_number=0,
96 sequence_number=0,
97 answer_number=bad_answer_number,
98 continuation_indicator=ContinuationIndicator.COMPLETE,
99 header_type=PossibleHeaderType.ANS,
100 )
102 for (
103 good_channel_number,
104 good_message_number,
105 good_sequence_number,
106 ) in zip(
107 good_channel_numbers,
108 good_message_numbers,
109 good_sequence_numbers,
110 strict=True,
111 ):
112 with self.subTest(
113 msg="All numbers should be valid.",
114 channel_number=good_channel_number,
115 message_number=good_message_number,
116 sequence_number=good_sequence_number,
117 ):
118 Frame(
119 payload=b"",
120 channel_number=good_channel_number,
121 message_number=good_message_number,
122 sequence_number=good_sequence_number,
123 answer_number=None,
124 continuation_indicator=ContinuationIndicator.COMPLETE,
125 header_type=header_type,
126 )
128 for good_answer_number in good_answer_numbers:
129 with self.subTest(
130 msg="Answer number should be valid.",
131 answer_number=good_answer_number,
132 ):
133 Frame(
134 payload=b"",
135 channel_number=0,
136 message_number=0,
137 sequence_number=0,
138 answer_number=good_answer_number,
139 continuation_indicator=ContinuationIndicator.COMPLETE,
140 header_type=PossibleHeaderType.ANS,
141 )
143 with self.assertRaises(InvalidContinuationIndicatorError):
144 Frame(
145 payload=b"",
146 channel_number=0,
147 message_number=0,
148 sequence_number=0,
149 answer_number=None,
150 continuation_indicator=ContinuationIndicator.INTERMEDIATE,
151 header_type=PossibleHeaderType.NUL,
152 )
154 Frame(
155 payload=b"",
156 channel_number=0,
157 message_number=0,
158 sequence_number=0,
159 answer_number=None,
160 continuation_indicator=ContinuationIndicator.COMPLETE,
161 header_type=PossibleHeaderType.NUL,
162 )
164 with self.assertRaises(AnswerNumberError):
165 Frame(
166 payload=b"",
167 channel_number=0,
168 message_number=0,
169 sequence_number=0,
170 answer_number=0,
171 continuation_indicator=ContinuationIndicator.INTERMEDIATE,
172 header_type=PossibleHeaderType.MSG,
173 )
175 with self.assertRaises(MissingAnswerNumberError):
176 Frame(
177 payload=b"",
178 channel_number=0,
179 message_number=0,
180 sequence_number=0,
181 answer_number=None,
182 continuation_indicator=ContinuationIndicator.COMPLETE,
183 header_type=PossibleHeaderType.ANS,
184 )