Commit | Line | Data |
---|---|---|
0235b0db | 1 | # SPDX-License-Identifier: GPL-2.0-only |
19bb8b5a PP |
2 | # |
3 | # Copyright (C) 2019 EfficiOS Inc. | |
4 | # | |
19bb8b5a PP |
5 | |
6 | import bt2 | |
7 | import unittest | |
8 | ||
1abe38eb | 9 | from utils import get_default_trace_class, create_const_field |
fc866000 FD |
10 | |
11 | ||
12 | def get_const_signed_integer_range(int_ranges): | |
13 | def range_setter(field): | |
14 | field.value = 12 | |
15 | ||
16 | tc = get_default_trace_class() | |
17 | fc = tc.create_signed_enumeration_field_class(32) | |
18 | fc.add_mapping('something', bt2.SignedIntegerRangeSet(int_ranges)) | |
19 | ||
20 | return create_const_field(tc, fc, range_setter).cls['something'].ranges | |
21 | ||
22 | ||
23 | def get_const_unsigned_integer_range(int_ranges): | |
24 | def range_setter(field): | |
25 | field.value = 12 | |
26 | ||
27 | tc = get_default_trace_class() | |
28 | fc = tc.create_unsigned_enumeration_field_class(32) | |
29 | fc.add_mapping('something', bt2.UnsignedIntegerRangeSet(int_ranges)) | |
30 | ||
31 | return create_const_field(tc, fc, range_setter).cls['something'].ranges | |
32 | ||
19bb8b5a PP |
33 | |
34 | class _IntegerRangeTestCase: | |
35 | def setUp(self): | |
36 | self._rg = self._CLS(self._def_lower, self._def_upper) | |
fc866000 FD |
37 | self._const_rg = list( |
38 | self._GET_CONST_RANGE_SET([(self._def_lower, self._def_upper)]) | |
39 | )[0] | |
19bb8b5a PP |
40 | |
41 | def test_create(self): | |
42 | self.assertEqual(self._rg.lower, self._def_lower) | |
43 | self.assertEqual(self._rg.upper, self._def_upper) | |
fc866000 FD |
44 | self.assertIs(type(self._rg), self._CLS) |
45 | ||
46 | def test_const_create(self): | |
47 | self.assertEqual(self._const_rg.lower, self._def_lower) | |
48 | self.assertEqual(self._const_rg.upper, self._def_upper) | |
49 | self.assertIs(type(self._const_rg), self._CONST_CLS) | |
19bb8b5a PP |
50 | |
51 | def test_create_same(self): | |
52 | rg = self._CLS(self._def_lower, self._def_lower) | |
53 | self.assertEqual(rg.lower, self._def_lower) | |
54 | self.assertEqual(rg.upper, self._def_lower) | |
55 | ||
7a2a2328 PP |
56 | def test_create_single(self): |
57 | rg = self._CLS(self._def_lower) | |
58 | self.assertEqual(rg.lower, self._def_lower) | |
59 | self.assertEqual(rg.upper, self._def_lower) | |
60 | ||
19bb8b5a PP |
61 | def test_create_wrong_type_lower(self): |
62 | with self.assertRaises(TypeError): | |
082db648 | 63 | self._CLS(19.3, self._def_upper) |
19bb8b5a | 64 | |
43ab0346 | 65 | def test_create_wrong_type_upper(self): |
19bb8b5a | 66 | with self.assertRaises(TypeError): |
082db648 | 67 | self._CLS(self._def_lower, 19.3) |
19bb8b5a PP |
68 | |
69 | def test_create_out_of_bound_lower(self): | |
70 | with self.assertRaises(ValueError): | |
082db648 | 71 | self._CLS(self._oob_lower, self._def_upper) |
19bb8b5a PP |
72 | |
73 | def test_create_out_of_bound_upper(self): | |
74 | with self.assertRaises(ValueError): | |
082db648 | 75 | self._CLS(self._def_lower, self._oob_upper) |
19bb8b5a PP |
76 | |
77 | def test_create_lower_gt_upper(self): | |
78 | with self.assertRaises(ValueError): | |
082db648 | 79 | self._CLS(self._def_lower, self._def_lower - 1) |
19bb8b5a PP |
80 | |
81 | def test_contains_lower(self): | |
82 | self.assertTrue(self._rg.contains(self._def_lower)) | |
83 | ||
84 | def test_contains_upper(self): | |
85 | self.assertTrue(self._rg.contains(self._def_upper)) | |
86 | ||
87 | def test_contains_avg(self): | |
88 | avg = (self._def_lower + self._def_upper) // 2 | |
89 | self.assertTrue(self._rg.contains(avg)) | |
90 | ||
91 | def test_contains_wrong_type(self): | |
92 | with self.assertRaises(TypeError): | |
93 | self._rg.contains('allo') | |
94 | ||
95 | def test_contains_out_of_bound(self): | |
96 | with self.assertRaises(ValueError): | |
97 | self._rg.contains(self._oob_upper) | |
98 | ||
99 | def test_eq(self): | |
100 | rg = self._CLS(self._def_lower, self._def_upper) | |
101 | self.assertEqual(rg, self._rg) | |
102 | ||
fc866000 FD |
103 | def test_const_eq(self): |
104 | rg = list(self._GET_CONST_RANGE_SET([(self._def_lower, self._def_upper)]))[0] | |
105 | self.assertEqual(rg, self._const_rg) | |
106 | ||
107 | def test_const_nonconst_eq(self): | |
108 | self.assertEqual(self._rg, self._const_rg) | |
109 | ||
19bb8b5a PP |
110 | def test_ne(self): |
111 | rg = self._CLS(self._def_lower, self._def_upper - 1) | |
112 | self.assertNotEqual(rg, self._rg) | |
113 | ||
fc866000 FD |
114 | def test_const_ne(self): |
115 | rg = list(self._GET_CONST_RANGE_SET([(self._def_lower, self._def_upper - 1)]))[ | |
116 | 0 | |
117 | ] | |
118 | self.assertNotEqual(rg, self._const_rg) | |
119 | ||
19bb8b5a PP |
120 | def test_ne_other_type(self): |
121 | self.assertNotEqual(self._rg, 48) | |
122 | ||
123 | ||
124 | class UnsignedIntegerRangeTestCase(_IntegerRangeTestCase, unittest.TestCase): | |
125 | _CLS = bt2.UnsignedIntegerRange | |
fc866000 FD |
126 | _CONST_CLS = bt2._UnsignedIntegerRangeConst |
127 | _GET_CONST_RANGE_SET = staticmethod(get_const_unsigned_integer_range) | |
19bb8b5a PP |
128 | _def_lower = 23 |
129 | _def_upper = 18293 | |
130 | _oob_lower = -1 | |
131 | _oob_upper = 1 << 64 | |
132 | ||
133 | ||
134 | class SignedIntegerRangeTestCase(_IntegerRangeTestCase, unittest.TestCase): | |
135 | _CLS = bt2.SignedIntegerRange | |
fc866000 FD |
136 | _CONST_CLS = bt2._SignedIntegerRangeConst |
137 | _GET_CONST_RANGE_SET = staticmethod(get_const_signed_integer_range) | |
19bb8b5a PP |
138 | _def_lower = -184 |
139 | _def_upper = 11547 | |
140 | _oob_lower = -(1 << 63) - 1 | |
141 | _oob_upper = 1 << 63 | |
142 | ||
143 | ||
144 | class _IntegerRangeSetTestCase: | |
145 | def setUp(self): | |
146 | self._rs = self._CLS((self._range1, self._range2, self._range3)) | |
fc866000 FD |
147 | self._const_rs = self._GET_CONST_RANGE_SET( |
148 | [self._range1, self._range2, self._range3] | |
149 | ) | |
19bb8b5a PP |
150 | |
151 | def test_create(self): | |
152 | self.assertEqual(len(self._rs), 3) | |
153 | self.assertIn(self._range1, self._rs) | |
154 | self.assertIn(self._range2, self._rs) | |
155 | self.assertIn(self._range3, self._rs) | |
fc866000 FD |
156 | self.assertIs(type(self._range1), self._RANGE_CLS) |
157 | ||
158 | def test_const_create(self): | |
159 | self.assertEqual(len(self._const_rs), 3) | |
160 | self.assertIn(self._range1, self._const_rs) | |
161 | self.assertIn(self._range2, self._const_rs) | |
162 | self.assertIn(self._range3, self._const_rs) | |
163 | self.assertIs(type(self._range1), self._RANGE_CLS) | |
19bb8b5a PP |
164 | |
165 | def test_create_tuples(self): | |
cfbd7cf3 FD |
166 | rs = self._CLS( |
167 | ( | |
168 | (self._range1.lower, self._range1.upper), | |
169 | (self._range2.lower, self._range2.upper), | |
170 | (self._range3.lower, self._range3.upper), | |
171 | ) | |
172 | ) | |
19bb8b5a PP |
173 | self.assertEqual(len(rs), 3) |
174 | self.assertIn(self._range1, rs) | |
175 | self.assertIn(self._range2, rs) | |
176 | self.assertIn(self._range3, rs) | |
177 | ||
7a2a2328 PP |
178 | def test_create_single(self): |
179 | rs = self._CLS((self._range_same.lower,)) | |
180 | self.assertEqual(len(rs), 1) | |
181 | self.assertIn(self._range_same, rs) | |
182 | ||
19bb8b5a PP |
183 | def test_create_non_iter(self): |
184 | with self.assertRaises(TypeError): | |
185 | self._rs = self._CLS(23) | |
186 | ||
187 | def test_create_wrong_elem_type(self): | |
188 | with self.assertRaises(TypeError): | |
7a2a2328 | 189 | self._rs = self._CLS((self._range1, self._range2, 'lel')) |
19bb8b5a PP |
190 | |
191 | def test_len(self): | |
192 | self.assertEqual(len(self._rs), 3) | |
193 | ||
194 | def test_contains(self): | |
195 | rs = self._CLS((self._range1, self._range2)) | |
196 | self.assertIn(self._range1, rs) | |
197 | self.assertIn(self._range2, rs) | |
198 | self.assertNotIn(self._range3, rs) | |
199 | ||
200 | def test_contains_value(self): | |
201 | rs = self._CLS((self._range1, self._range2)) | |
202 | self.assertTrue(rs.contains_value(self._range1.upper)) | |
203 | self.assertTrue(rs.contains_value(self._range2.lower)) | |
204 | self.assertFalse(rs.contains_value(self._range3.upper)) | |
205 | ||
206 | def test_contains_value_wrong_type(self): | |
207 | with self.assertRaises(TypeError): | |
208 | self._rs.contains_value('meow') | |
209 | ||
210 | def test_iter(self): | |
211 | range_list = list(self._rs) | |
212 | self.assertIn(self._range1, range_list) | |
213 | self.assertIn(self._range2, range_list) | |
214 | self.assertIn(self._range3, range_list) | |
215 | ||
fc866000 FD |
216 | for rg in range_list: |
217 | self.assertIs(type(rg), self._RANGE_CLS) | |
218 | ||
219 | def test_const_iter(self): | |
220 | range_list = list(self._const_rs) | |
221 | self.assertIn(self._range1, range_list) | |
222 | self.assertIn(self._range2, range_list) | |
223 | self.assertIn(self._range3, range_list) | |
224 | ||
225 | for rg in range_list: | |
226 | self.assertIs(type(rg), self._CONST_RANGE_CLS) | |
227 | ||
19bb8b5a PP |
228 | def test_empty(self): |
229 | rs = self._CLS() | |
230 | self.assertEqual(len(rs), 0) | |
231 | self.assertEqual(len(list(rs)), 0) | |
232 | ||
233 | def test_add_range_obj(self): | |
234 | rs = self._CLS((self._range1,)) | |
235 | self.assertEqual(len(rs), 1) | |
236 | rs.add(self._range2) | |
237 | self.assertEqual(len(rs), 2) | |
238 | self.assertIn(self._range2, rs) | |
239 | ||
fc866000 FD |
240 | def test_const_add_range_obj(self): |
241 | with self.assertRaises(AttributeError): | |
242 | self._const_rs.add((12, 4434)) | |
243 | ||
19bb8b5a PP |
244 | def test_discard_not_implemented(self): |
245 | with self.assertRaises(NotImplementedError): | |
246 | self._rs.discard(self._range2) | |
247 | ||
248 | def test_eq_same_order(self): | |
249 | rs = self._CLS((self._range1, self._range2, self._range3)) | |
250 | self.assertEqual(self._rs, rs) | |
251 | ||
252 | def test_eq_diff_order(self): | |
253 | rs = self._CLS((self._range1, self._range3, self._range2)) | |
254 | self.assertEqual(self._rs, rs) | |
255 | ||
256 | def test_eq_same_addr(self): | |
257 | self.assertEqual(self._rs, self._rs) | |
258 | ||
259 | def test_ne_diff_len(self): | |
260 | rs = self._CLS((self._range1, self._range2)) | |
261 | self.assertNotEqual(self._rs, rs) | |
262 | ||
263 | def test_ne_diff_values(self): | |
264 | rs1 = self._CLS((self._range1, self._range2)) | |
265 | rs2 = self._CLS((self._range1, self._range3)) | |
266 | self.assertNotEqual(rs1, rs2) | |
267 | ||
268 | def test_ne_incompatible_type(self): | |
269 | self.assertNotEqual(self._rs, object()) | |
270 | ||
271 | ||
272 | class UnsignedIntegerRangeSetTestCase(_IntegerRangeSetTestCase, unittest.TestCase): | |
273 | _CLS = bt2.UnsignedIntegerRangeSet | |
fc866000 FD |
274 | _CONST_CLS = bt2._UnsignedIntegerRangeSetConst |
275 | _RANGE_CLS = bt2.UnsignedIntegerRange | |
276 | _CONST_RANGE_CLS = bt2._UnsignedIntegerRangeConst | |
277 | _GET_CONST_RANGE_SET = staticmethod(get_const_unsigned_integer_range) | |
19bb8b5a PP |
278 | |
279 | def setUp(self): | |
280 | self._range1 = bt2.UnsignedIntegerRange(4, 192) | |
281 | self._range2 = bt2.UnsignedIntegerRange(17, 228) | |
282 | self._range3 = bt2.UnsignedIntegerRange(1000, 2000) | |
7a2a2328 | 283 | self._range_same = bt2.UnsignedIntegerRange(1300, 1300) |
19bb8b5a PP |
284 | super().setUp() |
285 | ||
286 | ||
287 | class SignedIntegerRangeSetTestCase(_IntegerRangeSetTestCase, unittest.TestCase): | |
288 | _CLS = bt2.SignedIntegerRangeSet | |
fc866000 FD |
289 | _CONST_CLS = bt2._SignedIntegerRangeSetConst |
290 | _RANGE_CLS = bt2.SignedIntegerRange | |
291 | _CONST_RANGE_CLS = bt2._SignedIntegerRangeConst | |
292 | _GET_CONST_RANGE_SET = staticmethod(get_const_signed_integer_range) | |
19bb8b5a PP |
293 | |
294 | def setUp(self): | |
295 | self._range1 = bt2.SignedIntegerRange(-1484, -17) | |
296 | self._range2 = bt2.SignedIntegerRange(-101, 1500) | |
297 | self._range3 = bt2.SignedIntegerRange(1948, 2019) | |
7a2a2328 | 298 | self._range_same = bt2.SignedIntegerRange(-1300, -1300) |
19bb8b5a | 299 | super().setUp() |
d14ddbba SM |
300 | |
301 | ||
302 | if __name__ == '__main__': | |
303 | unittest.main() |