1 # SPDX-License-Identifier: GPL-2.0-only
3 # Copyright (C) 2019 EfficiOS Inc.
9 from utils
import create_const_field
, get_default_trace_class
12 def get_const_signed_integer_range(int_ranges
):
13 def range_setter(field
):
16 tc
= get_default_trace_class()
17 fc
= tc
.create_signed_enumeration_field_class(32)
18 fc
.add_mapping("something", bt2
.SignedIntegerRangeSet(int_ranges
))
20 return create_const_field(tc
, fc
, range_setter
).cls
["something"].ranges
23 def get_const_unsigned_integer_range(int_ranges
):
24 def range_setter(field
):
27 tc
= get_default_trace_class()
28 fc
= tc
.create_unsigned_enumeration_field_class(32)
29 fc
.add_mapping("something", bt2
.UnsignedIntegerRangeSet(int_ranges
))
31 return create_const_field(tc
, fc
, range_setter
).cls
["something"].ranges
34 class _IntegerRangeTestCase
:
36 self
._rg
= self
._CLS
(self
._def
_lower
, self
._def
_upper
)
37 self
._const
_rg
= list(
38 self
._GET
_CONST
_RANGE
_SET
([(self
._def
_lower
, self
._def
_upper
)])
41 def test_create(self
):
42 self
.assertEqual(self
._rg
.lower
, self
._def
_lower
)
43 self
.assertEqual(self
._rg
.upper
, self
._def
_upper
)
44 self
.assertIs(type(self
._rg
), self
._CLS
)
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
)
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
)
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
)
61 def test_create_wrong_type_lower(self
):
62 with self
.assertRaises(TypeError):
63 self
._CLS
(19.3, self
._def
_upper
)
65 def test_create_wrong_type_upper(self
):
66 with self
.assertRaises(TypeError):
67 self
._CLS
(self
._def
_lower
, 19.3)
69 def test_create_out_of_bound_lower(self
):
70 with self
.assertRaises(ValueError):
71 self
._CLS
(self
._oob
_lower
, self
._def
_upper
)
73 def test_create_out_of_bound_upper(self
):
74 with self
.assertRaises(ValueError):
75 self
._CLS
(self
._def
_lower
, self
._oob
_upper
)
77 def test_create_lower_gt_upper(self
):
78 with self
.assertRaises(ValueError):
79 self
._CLS
(self
._def
_lower
, self
._def
_lower
- 1)
81 def test_contains_lower(self
):
82 self
.assertTrue(self
._rg
.contains(self
._def
_lower
))
84 def test_contains_upper(self
):
85 self
.assertTrue(self
._rg
.contains(self
._def
_upper
))
87 def test_contains_avg(self
):
88 avg
= (self
._def
_lower
+ self
._def
_upper
) // 2
89 self
.assertTrue(self
._rg
.contains(avg
))
91 def test_contains_wrong_type(self
):
92 with self
.assertRaises(TypeError):
93 self
._rg
.contains("allo")
95 def test_contains_out_of_bound(self
):
96 with self
.assertRaises(ValueError):
97 self
._rg
.contains(self
._oob
_upper
)
100 rg
= self
._CLS
(self
._def
_lower
, self
._def
_upper
)
101 self
.assertEqual(rg
, self
._rg
)
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
)
107 def test_const_nonconst_eq(self
):
108 self
.assertEqual(self
._rg
, self
._const
_rg
)
111 rg
= self
._CLS
(self
._def
_lower
, self
._def
_upper
- 1)
112 self
.assertNotEqual(rg
, self
._rg
)
114 def test_const_ne(self
):
115 rg
= list(self
._GET
_CONST
_RANGE
_SET
([(self
._def
_lower
, self
._def
_upper
- 1)]))[
118 self
.assertNotEqual(rg
, self
._const
_rg
)
120 def test_ne_other_type(self
):
121 self
.assertNotEqual(self
._rg
, 48)
124 class UnsignedIntegerRangeTestCase(_IntegerRangeTestCase
, unittest
.TestCase
):
125 _CLS
= bt2
.UnsignedIntegerRange
126 _CONST_CLS
= bt2
._UnsignedIntegerRangeConst
127 _GET_CONST_RANGE_SET
= staticmethod(get_const_unsigned_integer_range
)
134 class SignedIntegerRangeTestCase(_IntegerRangeTestCase
, unittest
.TestCase
):
135 _CLS
= bt2
.SignedIntegerRange
136 _CONST_CLS
= bt2
._SignedIntegerRangeConst
137 _GET_CONST_RANGE_SET
= staticmethod(get_const_signed_integer_range
)
140 _oob_lower
= -(1 << 63) - 1
144 class _IntegerRangeSetTestCase
:
146 self
._rs
= self
._CLS
((self
._range
1, self
._range
2, self
._range
3))
147 self
._const
_rs
= self
._GET
_CONST
_RANGE
_SET
(
148 [self
._range
1, self
._range
2, self
._range
3]
151 def test_create(self
):
152 self
.assertEqual(len(self
._rs
), 3)
153 self
.assertIn(self
._range
1, self
._rs
)
154 self
.assertIn(self
._range
2, self
._rs
)
155 self
.assertIn(self
._range
3, self
._rs
)
156 self
.assertIs(type(self
._range
1), self
._RANGE
_CLS
)
158 def test_const_create(self
):
159 self
.assertEqual(len(self
._const
_rs
), 3)
160 self
.assertIn(self
._range
1, self
._const
_rs
)
161 self
.assertIn(self
._range
2, self
._const
_rs
)
162 self
.assertIn(self
._range
3, self
._const
_rs
)
163 self
.assertIs(type(self
._range
1), self
._RANGE
_CLS
)
165 def test_create_tuples(self
):
168 (self
._range
1.lower
, self
._range
1.upper
),
169 (self
._range
2.lower
, self
._range
2.upper
),
170 (self
._range
3.lower
, self
._range
3.upper
),
173 self
.assertEqual(len(rs
), 3)
174 self
.assertIn(self
._range
1, rs
)
175 self
.assertIn(self
._range
2, rs
)
176 self
.assertIn(self
._range
3, rs
)
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
)
183 def test_create_non_iter(self
):
184 with self
.assertRaises(TypeError):
185 self
._rs
= self
._CLS
(23)
187 def test_create_wrong_elem_type(self
):
188 with self
.assertRaises(TypeError):
189 self
._rs
= self
._CLS
((self
._range
1, self
._range
2, "lel"))
192 self
.assertEqual(len(self
._rs
), 3)
194 def test_contains(self
):
195 rs
= self
._CLS
((self
._range
1, self
._range
2))
196 self
.assertIn(self
._range
1, rs
)
197 self
.assertIn(self
._range
2, rs
)
198 self
.assertNotIn(self
._range
3, rs
)
200 def test_contains_value(self
):
201 rs
= self
._CLS
((self
._range
1, self
._range
2))
202 self
.assertTrue(rs
.contains_value(self
._range
1.upper
))
203 self
.assertTrue(rs
.contains_value(self
._range
2.lower
))
204 self
.assertFalse(rs
.contains_value(self
._range
3.upper
))
206 def test_contains_value_wrong_type(self
):
207 with self
.assertRaises(TypeError):
208 self
._rs
.contains_value("meow")
211 range_list
= list(self
._rs
)
212 self
.assertIn(self
._range
1, range_list
)
213 self
.assertIn(self
._range
2, range_list
)
214 self
.assertIn(self
._range
3, range_list
)
216 for rg
in range_list
:
217 self
.assertIs(type(rg
), self
._RANGE
_CLS
)
219 def test_const_iter(self
):
220 range_list
= list(self
._const
_rs
)
221 self
.assertIn(self
._range
1, range_list
)
222 self
.assertIn(self
._range
2, range_list
)
223 self
.assertIn(self
._range
3, range_list
)
225 for rg
in range_list
:
226 self
.assertIs(type(rg
), self
._CONST
_RANGE
_CLS
)
228 def test_empty(self
):
230 self
.assertEqual(len(rs
), 0)
231 self
.assertEqual(len(list(rs
)), 0)
233 def test_add_range_obj(self
):
234 rs
= self
._CLS
((self
._range
1,))
235 self
.assertEqual(len(rs
), 1)
237 self
.assertEqual(len(rs
), 2)
238 self
.assertIn(self
._range
2, rs
)
240 def test_const_add_range_obj(self
):
241 with self
.assertRaises(AttributeError):
242 self
._const
_rs
.add((12, 4434))
244 def test_discard_not_implemented(self
):
245 with self
.assertRaises(NotImplementedError):
246 self
._rs
.discard(self
._range
2)
248 def test_eq_same_order(self
):
249 rs
= self
._CLS
((self
._range
1, self
._range
2, self
._range
3))
250 self
.assertEqual(self
._rs
, rs
)
252 def test_eq_diff_order(self
):
253 rs
= self
._CLS
((self
._range
1, self
._range
3, self
._range
2))
254 self
.assertEqual(self
._rs
, rs
)
256 def test_eq_same_addr(self
):
257 self
.assertEqual(self
._rs
, self
._rs
)
259 def test_ne_diff_len(self
):
260 rs
= self
._CLS
((self
._range
1, self
._range
2))
261 self
.assertNotEqual(self
._rs
, rs
)
263 def test_ne_diff_values(self
):
264 rs1
= self
._CLS
((self
._range
1, self
._range
2))
265 rs2
= self
._CLS
((self
._range
1, self
._range
3))
266 self
.assertNotEqual(rs1
, rs2
)
268 def test_ne_incompatible_type(self
):
269 self
.assertNotEqual(self
._rs
, object())
272 class UnsignedIntegerRangeSetTestCase(_IntegerRangeSetTestCase
, unittest
.TestCase
):
273 _CLS
= bt2
.UnsignedIntegerRangeSet
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
)
280 self
._range
1 = bt2
.UnsignedIntegerRange(4, 192)
281 self
._range
2 = bt2
.UnsignedIntegerRange(17, 228)
282 self
._range
3 = bt2
.UnsignedIntegerRange(1000, 2000)
283 self
._range
_same
= bt2
.UnsignedIntegerRange(1300, 1300)
287 class SignedIntegerRangeSetTestCase(_IntegerRangeSetTestCase
, unittest
.TestCase
):
288 _CLS
= bt2
.SignedIntegerRangeSet
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
)
295 self
._range
1 = bt2
.SignedIntegerRange(-1484, -17)
296 self
._range
2 = bt2
.SignedIntegerRange(-101, 1500)
297 self
._range
3 = bt2
.SignedIntegerRange(1948, 2019)
298 self
._range
_same
= bt2
.SignedIntegerRange(-1300, -1300)
302 if __name__
== "__main__":