1 from functools
import partial
, partialmethod
10 class _TestCopySimple
:
12 cpy
= copy
.copy(self
._def
)
13 self
.assertIsNot(cpy
, self
._def
)
14 self
.assertNotEqual(cpy
.addr
, self
._def
.addr
)
15 self
.assertEqual(cpy
, self
._def
)
17 def test_deepcopy(self
):
18 cpy
= copy
.deepcopy(self
._def
)
19 self
.assertIsNot(cpy
, self
._def
)
20 self
.assertNotEqual(cpy
.addr
, self
._def
.addr
)
21 self
.assertEqual(cpy
, self
._def
)
30 class _TestNumericField(_TestCopySimple
):
31 def _binop(self
, op
, rhs
):
36 if isinstance(rhs
, (bt2
.fields
._IntegerField
, bt2
.fields
._FloatingPointNumberField
)):
37 comp_value
= rhs
.value
40 r
= op(self
._def
, rhs
)
41 except Exception as e
:
45 rv
= op(self
._def
_value
, comp_value
)
46 except Exception as e
:
49 if rexc
is not None or rvexc
is not None:
50 # at least one of the operations raised an exception: in
51 # this case both operations should have raised the same
52 # type of exception (division by zero, bit shift with a
53 # floating point number operand, etc.)
54 self
.assertIs(type(rexc
), type(rvexc
))
59 def _unaryop(self
, op
):
65 except Exception as e
:
69 rv
= op(self
._def
_value
)
70 except Exception as e
:
73 if rexc
is not None or rvexc
is not None:
74 # at least one of the operations raised an exception: in
75 # this case both operations should have raised the same
76 # type of exception (division by zero, bit shift with a
77 # floating point number operand, etc.)
78 self
.assertIs(type(rexc
), type(rvexc
))
83 def _test_unaryop_type(self
, op
):
84 r
, rv
= self
._unaryop
(op
)
89 self
.assertIsInstance(r
, type(rv
))
91 def _test_unaryop_value(self
, op
):
92 r
, rv
= self
._unaryop
(op
)
97 self
.assertEqual(r
, rv
)
99 def _test_unaryop_addr_same(self
, op
):
100 addr_before
= self
._def
.addr
102 self
.assertEqual(self
._def
.addr
, addr_before
)
104 def _test_unaryop_value_same(self
, op
):
105 value_before
= self
._def
.value
107 self
.assertEqual(self
._def
.value
, value_before
)
109 def _test_binop_type(self
, op
, rhs
):
110 r
, rv
= self
._binop
(op
, rhs
)
115 if op
in _COMP_BINOPS
:
116 # __eq__() and __ne__() always return a 'bool' object
117 self
.assertIsInstance(r
, bool)
119 self
.assertIsInstance(r
, type(rv
))
121 def _test_binop_value(self
, op
, rhs
):
122 r
, rv
= self
._binop
(op
, rhs
)
127 self
.assertEqual(r
, rv
)
129 def _test_binop_lhs_addr_same(self
, op
, rhs
):
130 addr_before
= self
._def
.addr
131 r
, rv
= self
._binop
(op
, rhs
)
132 self
.assertEqual(self
._def
.addr
, addr_before
)
134 def _test_binop_lhs_value_same(self
, op
, rhs
):
135 value_before
= self
._def
.value
136 r
, rv
= self
._binop
(op
, rhs
)
137 self
.assertEqual(self
._def
.value
, value_before
)
139 def _test_binop_invalid_unknown(self
, op
):
140 if op
in _COMP_BINOPS
:
141 self
.skipTest('not testing')
146 with self
.assertRaises(TypeError):
149 def _test_binop_invalid_none(self
, op
):
150 if op
in _COMP_BINOPS
:
151 self
.skipTest('not testing')
153 with self
.assertRaises(TypeError):
156 def _test_ibinop_value(self
, op
, rhs
):
157 r
, rv
= self
._binop
(op
, rhs
)
162 # The inplace operators are special for field objects because
163 # they do not return a new, immutable object like it's the case
164 # for Python numbers. In Python, `a += 2`, where `a` is a number
165 # object, assigns a new number object reference to `a`, dropping
166 # the old reference. Since BT's field objects are mutable, we
167 # modify their internal value with the inplace operators. This
168 # means however that we can lose data in the process, for
171 # int_value_obj += 3.3
173 # Here, if `int_value_obj` is a Python `int` with the value 2,
174 # it would be a `float` object after this, holding the value
175 # 5.3. In our case, if `int_value_obj` is an integer field
176 # object, 3.3 is converted to an `int` object (3) and added to
177 # the current value of `int_value_obj`, so after this the value
178 # of the object is 5. This does not compare to 5.3, which is
179 # why we also use the `int()` type here.
180 if isinstance(self
._def
, bt2
.fields
._IntegerField
):
183 self
.assertEqual(r
, rv
)
185 def _test_ibinop_type(self
, op
, rhs
):
186 r
, rv
= self
._binop
(op
, rhs
)
191 self
.assertIs(r
, self
._def
)
193 def _test_ibinop_invalid_unknown(self
, op
):
197 with self
.assertRaises(TypeError):
200 def _test_ibinop_invalid_none(self
, op
):
201 with self
.assertRaises(TypeError):
204 def _test_binop_rhs_false(self
, test_cb
, op
):
207 def _test_binop_rhs_true(self
, test_cb
, op
):
210 def _test_binop_rhs_pos_int(self
, test_cb
, op
):
213 def _test_binop_rhs_neg_int(self
, test_cb
, op
):
216 def _test_binop_rhs_zero_int(self
, test_cb
, op
):
219 def _test_binop_rhs_pos_vint(self
, test_cb
, op
):
220 test_cb(op
, bt2
.create_value(2))
222 def _test_binop_rhs_neg_vint(self
, test_cb
, op
):
223 test_cb(op
, bt2
.create_value(-23))
225 def _test_binop_rhs_zero_vint(self
, test_cb
, op
):
226 test_cb(op
, bt2
.create_value(0))
228 def _test_binop_rhs_pos_float(self
, test_cb
, op
):
231 def _test_binop_rhs_neg_float(self
, test_cb
, op
):
234 def _test_binop_rhs_zero_float(self
, test_cb
, op
):
237 def _test_binop_rhs_pos_vfloat(self
, test_cb
, op
):
238 test_cb(op
, bt2
.create_value(2.2))
240 def _test_binop_rhs_neg_vfloat(self
, test_cb
, op
):
241 test_cb(op
, bt2
.create_value(-23.4))
243 def _test_binop_rhs_zero_vfloat(self
, test_cb
, op
):
244 test_cb(op
, bt2
.create_value(0.0))
246 def _test_binop_type_false(self
, op
):
247 self
._test
_binop
_rhs
_false
(self
._test
_binop
_type
, op
)
249 def _test_binop_type_true(self
, op
):
250 self
._test
_binop
_rhs
_true
(self
._test
_binop
_type
, op
)
252 def _test_binop_type_pos_int(self
, op
):
253 self
._test
_binop
_rhs
_pos
_int
(self
._test
_binop
_type
, op
)
255 def _test_binop_type_neg_int(self
, op
):
256 self
._test
_binop
_rhs
_neg
_int
(self
._test
_binop
_type
, op
)
258 def _test_binop_type_zero_int(self
, op
):
259 self
._test
_binop
_rhs
_zero
_int
(self
._test
_binop
_type
, op
)
261 def _test_binop_type_pos_vint(self
, op
):
262 self
._test
_binop
_rhs
_pos
_vint
(self
._test
_binop
_type
, op
)
264 def _test_binop_type_neg_vint(self
, op
):
265 self
._test
_binop
_rhs
_neg
_vint
(self
._test
_binop
_type
, op
)
267 def _test_binop_type_zero_vint(self
, op
):
268 self
._test
_binop
_rhs
_zero
_vint
(self
._test
_binop
_type
, op
)
270 def _test_binop_type_pos_float(self
, op
):
271 self
._test
_binop
_rhs
_pos
_float
(self
._test
_binop
_type
, op
)
273 def _test_binop_type_neg_float(self
, op
):
274 self
._test
_binop
_rhs
_neg
_float
(self
._test
_binop
_type
, op
)
276 def _test_binop_type_zero_float(self
, op
):
277 self
._test
_binop
_rhs
_zero
_float
(self
._test
_binop
_type
, op
)
279 def _test_binop_type_pos_vfloat(self
, op
):
280 self
._test
_binop
_rhs
_pos
_vfloat
(self
._test
_binop
_type
, op
)
282 def _test_binop_type_neg_vfloat(self
, op
):
283 self
._test
_binop
_rhs
_neg
_vfloat
(self
._test
_binop
_type
, op
)
285 def _test_binop_type_zero_vfloat(self
, op
):
286 self
._test
_binop
_rhs
_zero
_vfloat
(self
._test
_binop
_type
, op
)
288 def _test_binop_value_false(self
, op
):
289 self
._test
_binop
_rhs
_false
(self
._test
_binop
_value
, op
)
291 def _test_binop_value_true(self
, op
):
292 self
._test
_binop
_rhs
_true
(self
._test
_binop
_value
, op
)
294 def _test_binop_value_pos_int(self
, op
):
295 self
._test
_binop
_rhs
_pos
_int
(self
._test
_binop
_value
, op
)
297 def _test_binop_value_neg_int(self
, op
):
298 self
._test
_binop
_rhs
_neg
_int
(self
._test
_binop
_value
, op
)
300 def _test_binop_value_zero_int(self
, op
):
301 self
._test
_binop
_rhs
_zero
_int
(self
._test
_binop
_value
, op
)
303 def _test_binop_value_pos_vint(self
, op
):
304 self
._test
_binop
_rhs
_pos
_vint
(self
._test
_binop
_value
, op
)
306 def _test_binop_value_neg_vint(self
, op
):
307 self
._test
_binop
_rhs
_neg
_vint
(self
._test
_binop
_value
, op
)
309 def _test_binop_value_zero_vint(self
, op
):
310 self
._test
_binop
_rhs
_zero
_vint
(self
._test
_binop
_value
, op
)
312 def _test_binop_value_pos_float(self
, op
):
313 self
._test
_binop
_rhs
_pos
_float
(self
._test
_binop
_value
, op
)
315 def _test_binop_value_neg_float(self
, op
):
316 self
._test
_binop
_rhs
_neg
_float
(self
._test
_binop
_value
, op
)
318 def _test_binop_value_zero_float(self
, op
):
319 self
._test
_binop
_rhs
_zero
_float
(self
._test
_binop
_value
, op
)
321 def _test_binop_value_pos_vfloat(self
, op
):
322 self
._test
_binop
_rhs
_pos
_vfloat
(self
._test
_binop
_value
, op
)
324 def _test_binop_value_neg_vfloat(self
, op
):
325 self
._test
_binop
_rhs
_neg
_vfloat
(self
._test
_binop
_value
, op
)
327 def _test_binop_value_zero_vfloat(self
, op
):
328 self
._test
_binop
_rhs
_zero
_vfloat
(self
._test
_binop
_value
, op
)
330 def _test_binop_lhs_addr_same_false(self
, op
):
331 self
._test
_binop
_rhs
_false
(self
._test
_binop
_lhs
_addr
_same
, op
)
333 def _test_binop_lhs_addr_same_true(self
, op
):
334 self
._test
_binop
_rhs
_true
(self
._test
_binop
_lhs
_addr
_same
, op
)
336 def _test_binop_lhs_addr_same_pos_int(self
, op
):
337 self
._test
_binop
_rhs
_pos
_int
(self
._test
_binop
_lhs
_addr
_same
, op
)
339 def _test_binop_lhs_addr_same_neg_int(self
, op
):
340 self
._test
_binop
_rhs
_neg
_int
(self
._test
_binop
_lhs
_addr
_same
, op
)
342 def _test_binop_lhs_addr_same_zero_int(self
, op
):
343 self
._test
_binop
_rhs
_zero
_int
(self
._test
_binop
_lhs
_addr
_same
, op
)
345 def _test_binop_lhs_addr_same_pos_vint(self
, op
):
346 self
._test
_binop
_rhs
_pos
_vint
(self
._test
_binop
_lhs
_addr
_same
, op
)
348 def _test_binop_lhs_addr_same_neg_vint(self
, op
):
349 self
._test
_binop
_rhs
_neg
_vint
(self
._test
_binop
_lhs
_addr
_same
, op
)
351 def _test_binop_lhs_addr_same_zero_vint(self
, op
):
352 self
._test
_binop
_rhs
_zero
_vint
(self
._test
_binop
_lhs
_addr
_same
, op
)
354 def _test_binop_lhs_addr_same_pos_float(self
, op
):
355 self
._test
_binop
_rhs
_pos
_float
(self
._test
_binop
_lhs
_addr
_same
, op
)
357 def _test_binop_lhs_addr_same_neg_float(self
, op
):
358 self
._test
_binop
_rhs
_neg
_float
(self
._test
_binop
_lhs
_addr
_same
, op
)
360 def _test_binop_lhs_addr_same_zero_float(self
, op
):
361 self
._test
_binop
_rhs
_zero
_float
(self
._test
_binop
_lhs
_addr
_same
, op
)
363 def _test_binop_lhs_addr_same_pos_vfloat(self
, op
):
364 self
._test
_binop
_rhs
_pos
_vfloat
(self
._test
_binop
_lhs
_addr
_same
, op
)
366 def _test_binop_lhs_addr_same_neg_vfloat(self
, op
):
367 self
._test
_binop
_rhs
_neg
_vfloat
(self
._test
_binop
_lhs
_addr
_same
, op
)
369 def _test_binop_lhs_addr_same_zero_vfloat(self
, op
):
370 self
._test
_binop
_rhs
_zero
_vfloat
(self
._test
_binop
_lhs
_addr
_same
, op
)
372 def _test_binop_lhs_value_same_false(self
, op
):
373 self
._test
_binop
_rhs
_false
(self
._test
_binop
_lhs
_value
_same
, op
)
375 def _test_binop_lhs_value_same_true(self
, op
):
376 self
._test
_binop
_rhs
_true
(self
._test
_binop
_lhs
_value
_same
, op
)
378 def _test_binop_lhs_value_same_pos_int(self
, op
):
379 self
._test
_binop
_rhs
_pos
_int
(self
._test
_binop
_lhs
_value
_same
, op
)
381 def _test_binop_lhs_value_same_neg_int(self
, op
):
382 self
._test
_binop
_rhs
_neg
_int
(self
._test
_binop
_lhs
_value
_same
, op
)
384 def _test_binop_lhs_value_same_zero_int(self
, op
):
385 self
._test
_binop
_rhs
_zero
_int
(self
._test
_binop
_lhs
_value
_same
, op
)
387 def _test_binop_lhs_value_same_pos_vint(self
, op
):
388 self
._test
_binop
_rhs
_pos
_vint
(self
._test
_binop
_lhs
_value
_same
, op
)
390 def _test_binop_lhs_value_same_neg_vint(self
, op
):
391 self
._test
_binop
_rhs
_neg
_vint
(self
._test
_binop
_lhs
_value
_same
, op
)
393 def _test_binop_lhs_value_same_zero_vint(self
, op
):
394 self
._test
_binop
_rhs
_zero
_vint
(self
._test
_binop
_lhs
_value
_same
, op
)
396 def _test_binop_lhs_value_same_pos_float(self
, op
):
397 self
._test
_binop
_rhs
_pos
_float
(self
._test
_binop
_lhs
_value
_same
, op
)
399 def _test_binop_lhs_value_same_neg_float(self
, op
):
400 self
._test
_binop
_rhs
_neg
_float
(self
._test
_binop
_lhs
_value
_same
, op
)
402 def _test_binop_lhs_value_same_zero_float(self
, op
):
403 self
._test
_binop
_rhs
_zero
_float
(self
._test
_binop
_lhs
_value
_same
, op
)
405 def _test_binop_lhs_value_same_pos_vfloat(self
, op
):
406 self
._test
_binop
_rhs
_pos
_vfloat
(self
._test
_binop
_lhs
_value
_same
, op
)
408 def _test_binop_lhs_value_same_neg_vfloat(self
, op
):
409 self
._test
_binop
_rhs
_neg
_vfloat
(self
._test
_binop
_lhs
_value
_same
, op
)
411 def _test_binop_lhs_value_same_zero_vfloat(self
, op
):
412 self
._test
_binop
_rhs
_zero
_vfloat
(self
._test
_binop
_lhs
_value
_same
, op
)
414 def _test_ibinop_type_false(self
, op
):
415 self
._test
_binop
_rhs
_false
(self
._test
_ibinop
_type
, op
)
417 def _test_ibinop_type_true(self
, op
):
418 self
._test
_binop
_rhs
_true
(self
._test
_ibinop
_type
, op
)
420 def _test_ibinop_type_pos_int(self
, op
):
421 self
._test
_binop
_rhs
_pos
_int
(self
._test
_ibinop
_type
, op
)
423 def _test_ibinop_type_neg_int(self
, op
):
424 self
._test
_binop
_rhs
_neg
_int
(self
._test
_ibinop
_type
, op
)
426 def _test_ibinop_type_zero_int(self
, op
):
427 self
._test
_binop
_rhs
_zero
_int
(self
._test
_ibinop
_type
, op
)
429 def _test_ibinop_type_pos_vint(self
, op
):
430 self
._test
_binop
_rhs
_pos
_vint
(self
._test
_ibinop
_type
, op
)
432 def _test_ibinop_type_neg_vint(self
, op
):
433 self
._test
_binop
_rhs
_neg
_vint
(self
._test
_ibinop
_type
, op
)
435 def _test_ibinop_type_zero_vint(self
, op
):
436 self
._test
_binop
_rhs
_zero
_vint
(self
._test
_ibinop
_type
, op
)
438 def _test_ibinop_type_pos_float(self
, op
):
439 self
._test
_binop
_rhs
_pos
_float
(self
._test
_ibinop
_type
, op
)
441 def _test_ibinop_type_neg_float(self
, op
):
442 self
._test
_binop
_rhs
_neg
_float
(self
._test
_ibinop
_type
, op
)
444 def _test_ibinop_type_zero_float(self
, op
):
445 self
._test
_binop
_rhs
_zero
_float
(self
._test
_ibinop
_type
, op
)
447 def _test_ibinop_type_pos_vfloat(self
, op
):
448 self
._test
_binop
_rhs
_pos
_vfloat
(self
._test
_ibinop
_type
, op
)
450 def _test_ibinop_type_neg_vfloat(self
, op
):
451 self
._test
_binop
_rhs
_neg
_vfloat
(self
._test
_ibinop
_type
, op
)
453 def _test_ibinop_type_zero_vfloat(self
, op
):
454 self
._test
_binop
_rhs
_zero
_vfloat
(self
._test
_ibinop
_type
, op
)
456 def _test_ibinop_value_false(self
, op
):
457 self
._test
_binop
_rhs
_false
(self
._test
_ibinop
_value
, op
)
459 def _test_ibinop_value_true(self
, op
):
460 self
._test
_binop
_rhs
_true
(self
._test
_ibinop
_value
, op
)
462 def _test_ibinop_value_pos_int(self
, op
):
463 self
._test
_binop
_rhs
_pos
_int
(self
._test
_ibinop
_value
, op
)
465 def _test_ibinop_value_neg_int(self
, op
):
466 self
._test
_binop
_rhs
_neg
_int
(self
._test
_ibinop
_value
, op
)
468 def _test_ibinop_value_zero_int(self
, op
):
469 self
._test
_binop
_rhs
_zero
_int
(self
._test
_ibinop
_value
, op
)
471 def _test_ibinop_value_pos_vint(self
, op
):
472 self
._test
_binop
_rhs
_pos
_vint
(self
._test
_ibinop
_value
, op
)
474 def _test_ibinop_value_neg_vint(self
, op
):
475 self
._test
_binop
_rhs
_neg
_vint
(self
._test
_ibinop
_value
, op
)
477 def _test_ibinop_value_zero_vint(self
, op
):
478 self
._test
_binop
_rhs
_zero
_vint
(self
._test
_ibinop
_value
, op
)
480 def _test_ibinop_value_pos_float(self
, op
):
481 self
._test
_binop
_rhs
_pos
_float
(self
._test
_ibinop
_value
, op
)
483 def _test_ibinop_value_neg_float(self
, op
):
484 self
._test
_binop
_rhs
_neg
_float
(self
._test
_ibinop
_value
, op
)
486 def _test_ibinop_value_zero_float(self
, op
):
487 self
._test
_binop
_rhs
_zero
_float
(self
._test
_ibinop
_value
, op
)
489 def _test_ibinop_value_pos_vfloat(self
, op
):
490 self
._test
_binop
_rhs
_pos
_vfloat
(self
._test
_ibinop
_value
, op
)
492 def _test_ibinop_value_neg_vfloat(self
, op
):
493 self
._test
_binop
_rhs
_neg
_vfloat
(self
._test
_ibinop
_value
, op
)
495 def _test_ibinop_value_zero_vfloat(self
, op
):
496 self
._test
_binop
_rhs
_zero
_vfloat
(self
._test
_ibinop
_value
, op
)
498 def test_bool_op(self
):
499 self
.assertEqual(bool(self
._def
), bool(self
._def
_value
))
501 def test_int_op(self
):
502 self
.assertEqual(int(self
._def
), int(self
._def
_value
))
504 def test_float_op(self
):
505 self
.assertEqual(float(self
._def
), float(self
._def
_value
))
507 def test_complex_op(self
):
508 self
.assertEqual(complex(self
._def
), complex(self
._def
_value
))
510 def test_str_op(self
):
511 self
.assertEqual(str(self
._def
), str(self
._def
_value
))
513 def test_eq_none(self
):
514 self
.assertFalse(self
._def
== None)
516 def test_ne_none(self
):
517 self
.assertTrue(self
._def
!= None)
519 def test_is_set(self
):
520 raw
= self
._def
_value
522 self
.assertFalse(field
.is_set
)
524 self
.assertTrue(field
.is_set
)
526 def test_reset(self
):
527 raw
= self
._def
_value
530 self
.assertTrue(field
.is_set
)
532 self
.assertFalse(field
.is_set
)
534 self
.assertEqual(other
, field
)
544 ('add', operator
.add
),
545 ('radd', lambda a
, b
: operator
.add(b
, a
)),
546 ('and', operator
.and_
),
547 ('rand', lambda a
, b
: operator
.and_(b
, a
)),
548 ('floordiv', operator
.floordiv
),
549 ('rfloordiv', lambda a
, b
: operator
.floordiv(b
, a
)),
550 ('lshift', operator
.lshift
),
551 ('rlshift', lambda a
, b
: operator
.lshift(b
, a
)),
552 ('mod', operator
.mod
),
553 ('rmod', lambda a
, b
: operator
.mod(b
, a
)),
554 ('mul', operator
.mul
),
555 ('rmul', lambda a
, b
: operator
.mul(b
, a
)),
556 ('or', operator
.or_
),
557 ('ror', lambda a
, b
: operator
.or_(b
, a
)),
558 ('pow', operator
.pow),
559 ('rpow', lambda a
, b
: operator
.pow(b
, a
)),
560 ('rshift', operator
.rshift
),
561 ('rrshift', lambda a
, b
: operator
.rshift(b
, a
)),
562 ('sub', operator
.sub
),
563 ('rsub', lambda a
, b
: operator
.sub(b
, a
)),
564 ('truediv', operator
.truediv
),
565 ('rtruediv', lambda a
, b
: operator
.truediv(b
, a
)),
566 ('xor', operator
.xor
),
567 ('rxor', lambda a
, b
: operator
.xor(b
, a
)),
572 ('iadd', operator
.iadd
),
573 ('iand', operator
.iand
),
574 ('ifloordiv', operator
.ifloordiv
),
575 ('ilshift', operator
.ilshift
),
576 ('imod', operator
.imod
),
577 ('imul', operator
.imul
),
578 ('ior', operator
.ior
),
579 ('ipow', operator
.ipow
),
580 ('irshift', operator
.irshift
),
581 ('isub', operator
.isub
),
582 ('itruediv', operator
.itruediv
),
583 ('ixor', operator
.ixor
),
588 ('neg', operator
.neg
),
589 ('pos', operator
.pos
),
590 ('abs', operator
.abs),
591 ('invert', operator
.invert
),
593 ('round_0', partial(round, ndigits
=0)),
594 ('round_1', partial(round, ndigits
=1)),
595 ('round_2', partial(round, ndigits
=2)),
596 ('round_3', partial(round, ndigits
=3)),
598 ('floor', math
.floor
),
599 ('trunc', math
.trunc
),
603 def _inject_numeric_testing_methods(cls
):
604 def test_binop_name(suffix
):
605 return 'test_binop_{}_{}'.format(name
, suffix
)
607 def test_ibinop_name(suffix
):
608 return 'test_ibinop_{}_{}'.format(name
, suffix
)
610 def test_unaryop_name(suffix
):
611 return 'test_unaryop_{}_{}'.format(name
, suffix
)
613 # inject testing methods for each binary operation
614 for name
, binop
in _BINOPS
:
615 setattr(cls
, test_binop_name('invalid_unknown'), partialmethod(_TestNumericField
._test
_binop
_invalid
_unknown
, op
=binop
))
616 setattr(cls
, test_binop_name('invalid_none'), partialmethod(_TestNumericField
._test
_binop
_invalid
_none
, op
=binop
))
617 setattr(cls
, test_binop_name('type_true'), partialmethod(_TestNumericField
._test
_binop
_type
_true
, op
=binop
))
618 setattr(cls
, test_binop_name('type_pos_int'), partialmethod(_TestNumericField
._test
_binop
_type
_pos
_int
, op
=binop
))
619 setattr(cls
, test_binop_name('type_pos_vint'), partialmethod(_TestNumericField
._test
_binop
_type
_pos
_vint
, op
=binop
))
620 setattr(cls
, test_binop_name('value_true'), partialmethod(_TestNumericField
._test
_binop
_value
_true
, op
=binop
))
621 setattr(cls
, test_binop_name('value_pos_int'), partialmethod(_TestNumericField
._test
_binop
_value
_pos
_int
, op
=binop
))
622 setattr(cls
, test_binop_name('value_pos_vint'), partialmethod(_TestNumericField
._test
_binop
_value
_pos
_vint
, op
=binop
))
623 setattr(cls
, test_binop_name('lhs_addr_same_true'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_true
, op
=binop
))
624 setattr(cls
, test_binop_name('lhs_addr_same_pos_int'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_pos
_int
, op
=binop
))
625 setattr(cls
, test_binop_name('lhs_addr_same_pos_vint'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_pos
_vint
, op
=binop
))
626 setattr(cls
, test_binop_name('lhs_value_same_true'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_true
, op
=binop
))
627 setattr(cls
, test_binop_name('lhs_value_same_pos_int'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_pos
_int
, op
=binop
))
628 setattr(cls
, test_binop_name('lhs_value_same_pos_vint'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_pos
_vint
, op
=binop
))
629 setattr(cls
, test_binop_name('type_neg_int'), partialmethod(_TestNumericField
._test
_binop
_type
_neg
_int
, op
=binop
))
630 setattr(cls
, test_binop_name('type_neg_vint'), partialmethod(_TestNumericField
._test
_binop
_type
_neg
_vint
, op
=binop
))
631 setattr(cls
, test_binop_name('value_neg_int'), partialmethod(_TestNumericField
._test
_binop
_value
_neg
_int
, op
=binop
))
632 setattr(cls
, test_binop_name('value_neg_vint'), partialmethod(_TestNumericField
._test
_binop
_value
_neg
_vint
, op
=binop
))
633 setattr(cls
, test_binop_name('lhs_addr_same_neg_int'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_neg
_int
, op
=binop
))
634 setattr(cls
, test_binop_name('lhs_addr_same_neg_vint'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_neg
_vint
, op
=binop
))
635 setattr(cls
, test_binop_name('lhs_value_same_neg_int'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_neg
_int
, op
=binop
))
636 setattr(cls
, test_binop_name('lhs_value_same_neg_vint'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_neg
_vint
, op
=binop
))
637 setattr(cls
, test_binop_name('type_false'), partialmethod(_TestNumericField
._test
_binop
_type
_false
, op
=binop
))
638 setattr(cls
, test_binop_name('type_zero_int'), partialmethod(_TestNumericField
._test
_binop
_type
_zero
_int
, op
=binop
))
639 setattr(cls
, test_binop_name('type_zero_vint'), partialmethod(_TestNumericField
._test
_binop
_type
_zero
_vint
, op
=binop
))
640 setattr(cls
, test_binop_name('value_false'), partialmethod(_TestNumericField
._test
_binop
_value
_false
, op
=binop
))
641 setattr(cls
, test_binop_name('value_zero_int'), partialmethod(_TestNumericField
._test
_binop
_value
_zero
_int
, op
=binop
))
642 setattr(cls
, test_binop_name('value_zero_vint'), partialmethod(_TestNumericField
._test
_binop
_value
_zero
_vint
, op
=binop
))
643 setattr(cls
, test_binop_name('lhs_addr_same_false'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_false
, op
=binop
))
644 setattr(cls
, test_binop_name('lhs_addr_same_zero_int'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_zero
_int
, op
=binop
))
645 setattr(cls
, test_binop_name('lhs_addr_same_zero_vint'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_zero
_vint
, op
=binop
))
646 setattr(cls
, test_binop_name('lhs_value_same_false'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_false
, op
=binop
))
647 setattr(cls
, test_binop_name('lhs_value_same_zero_int'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_zero
_int
, op
=binop
))
648 setattr(cls
, test_binop_name('lhs_value_same_zero_vint'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_zero
_vint
, op
=binop
))
649 setattr(cls
, test_binop_name('type_pos_float'), partialmethod(_TestNumericField
._test
_binop
_type
_pos
_float
, op
=binop
))
650 setattr(cls
, test_binop_name('type_neg_float'), partialmethod(_TestNumericField
._test
_binop
_type
_neg
_float
, op
=binop
))
651 setattr(cls
, test_binop_name('type_pos_vfloat'), partialmethod(_TestNumericField
._test
_binop
_type
_pos
_vfloat
, op
=binop
))
652 setattr(cls
, test_binop_name('type_neg_vfloat'), partialmethod(_TestNumericField
._test
_binop
_type
_neg
_vfloat
, op
=binop
))
653 setattr(cls
, test_binop_name('value_pos_float'), partialmethod(_TestNumericField
._test
_binop
_value
_pos
_float
, op
=binop
))
654 setattr(cls
, test_binop_name('value_neg_float'), partialmethod(_TestNumericField
._test
_binop
_value
_neg
_float
, op
=binop
))
655 setattr(cls
, test_binop_name('value_pos_vfloat'), partialmethod(_TestNumericField
._test
_binop
_value
_pos
_vfloat
, op
=binop
))
656 setattr(cls
, test_binop_name('value_neg_vfloat'), partialmethod(_TestNumericField
._test
_binop
_value
_neg
_vfloat
, op
=binop
))
657 setattr(cls
, test_binop_name('lhs_addr_same_pos_float'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_pos
_float
, op
=binop
))
658 setattr(cls
, test_binop_name('lhs_addr_same_neg_float'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_neg
_float
, op
=binop
))
659 setattr(cls
, test_binop_name('lhs_addr_same_pos_vfloat'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_pos
_vfloat
, op
=binop
))
660 setattr(cls
, test_binop_name('lhs_addr_same_neg_vfloat'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_neg
_vfloat
, op
=binop
))
661 setattr(cls
, test_binop_name('lhs_value_same_pos_float'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_pos
_float
, op
=binop
))
662 setattr(cls
, test_binop_name('lhs_value_same_neg_float'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_neg
_float
, op
=binop
))
663 setattr(cls
, test_binop_name('lhs_value_same_pos_vfloat'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_pos
_vfloat
, op
=binop
))
664 setattr(cls
, test_binop_name('lhs_value_same_neg_vfloat'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_neg
_vfloat
, op
=binop
))
665 setattr(cls
, test_binop_name('type_zero_float'), partialmethod(_TestNumericField
._test
_binop
_type
_zero
_float
, op
=binop
))
666 setattr(cls
, test_binop_name('type_zero_vfloat'), partialmethod(_TestNumericField
._test
_binop
_type
_zero
_vfloat
, op
=binop
))
667 setattr(cls
, test_binop_name('value_zero_float'), partialmethod(_TestNumericField
._test
_binop
_value
_zero
_float
, op
=binop
))
668 setattr(cls
, test_binop_name('value_zero_vfloat'), partialmethod(_TestNumericField
._test
_binop
_value
_zero
_vfloat
, op
=binop
))
669 setattr(cls
, test_binop_name('lhs_addr_same_zero_float'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_zero
_float
, op
=binop
))
670 setattr(cls
, test_binop_name('lhs_addr_same_zero_vfloat'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_zero
_vfloat
, op
=binop
))
671 setattr(cls
, test_binop_name('lhs_value_same_zero_float'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_zero
_float
, op
=binop
))
672 setattr(cls
, test_binop_name('lhs_value_same_zero_vfloat'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_zero
_vfloat
, op
=binop
))
674 # inject testing methods for each unary operation
675 for name
, unaryop
in _UNARYOPS
:
676 setattr(cls
, test_unaryop_name('type'), partialmethod(_TestNumericField
._test
_unaryop
_type
, op
=unaryop
))
677 setattr(cls
, test_unaryop_name('value'), partialmethod(_TestNumericField
._test
_unaryop
_value
, op
=unaryop
))
678 setattr(cls
, test_unaryop_name('addr_same'), partialmethod(_TestNumericField
._test
_unaryop
_addr
_same
, op
=unaryop
))
679 setattr(cls
, test_unaryop_name('value_same'), partialmethod(_TestNumericField
._test
_unaryop
_value
_same
, op
=unaryop
))
681 # inject testing methods for each inplace binary operation
682 for name
, ibinop
in _IBINOPS
:
683 setattr(cls
, test_ibinop_name('invalid_unknown'), partialmethod(_TestNumericField
._test
_ibinop
_invalid
_unknown
, op
=ibinop
))
684 setattr(cls
, test_ibinop_name('invalid_none'), partialmethod(_TestNumericField
._test
_ibinop
_invalid
_none
, op
=ibinop
))
685 setattr(cls
, test_ibinop_name('type_true'), partialmethod(_TestNumericField
._test
_ibinop
_type
_true
, op
=ibinop
))
686 setattr(cls
, test_ibinop_name('value_true'), partialmethod(_TestNumericField
._test
_ibinop
_value
_true
, op
=ibinop
))
687 setattr(cls
, test_ibinop_name('type_pos_int'), partialmethod(_TestNumericField
._test
_ibinop
_type
_pos
_int
, op
=ibinop
))
688 setattr(cls
, test_ibinop_name('type_pos_vint'), partialmethod(_TestNumericField
._test
_ibinop
_type
_pos
_vint
, op
=ibinop
))
689 setattr(cls
, test_ibinop_name('value_pos_int'), partialmethod(_TestNumericField
._test
_ibinop
_value
_pos
_int
, op
=ibinop
))
690 setattr(cls
, test_ibinop_name('value_pos_vint'), partialmethod(_TestNumericField
._test
_ibinop
_value
_pos
_vint
, op
=ibinop
))
691 setattr(cls
, test_ibinop_name('type_neg_int'), partialmethod(_TestNumericField
._test
_ibinop
_type
_neg
_int
, op
=ibinop
))
692 setattr(cls
, test_ibinop_name('type_neg_vint'), partialmethod(_TestNumericField
._test
_ibinop
_type
_neg
_vint
, op
=ibinop
))
693 setattr(cls
, test_ibinop_name('value_neg_int'), partialmethod(_TestNumericField
._test
_ibinop
_value
_neg
_int
, op
=ibinop
))
694 setattr(cls
, test_ibinop_name('value_neg_vint'), partialmethod(_TestNumericField
._test
_ibinop
_value
_neg
_vint
, op
=ibinop
))
695 setattr(cls
, test_ibinop_name('type_false'), partialmethod(_TestNumericField
._test
_ibinop
_type
_false
, op
=ibinop
))
696 setattr(cls
, test_ibinop_name('value_false'), partialmethod(_TestNumericField
._test
_ibinop
_value
_false
, op
=ibinop
))
697 setattr(cls
, test_ibinop_name('type_zero_int'), partialmethod(_TestNumericField
._test
_ibinop
_type
_zero
_int
, op
=ibinop
))
698 setattr(cls
, test_ibinop_name('type_zero_vint'), partialmethod(_TestNumericField
._test
_ibinop
_type
_zero
_vint
, op
=ibinop
))
699 setattr(cls
, test_ibinop_name('value_zero_int'), partialmethod(_TestNumericField
._test
_ibinop
_value
_zero
_int
, op
=ibinop
))
700 setattr(cls
, test_ibinop_name('value_zero_vint'), partialmethod(_TestNumericField
._test
_ibinop
_value
_zero
_vint
, op
=ibinop
))
701 setattr(cls
, test_ibinop_name('type_pos_float'), partialmethod(_TestNumericField
._test
_ibinop
_type
_pos
_float
, op
=ibinop
))
702 setattr(cls
, test_ibinop_name('type_neg_float'), partialmethod(_TestNumericField
._test
_ibinop
_type
_neg
_float
, op
=ibinop
))
703 setattr(cls
, test_ibinop_name('type_pos_vfloat'), partialmethod(_TestNumericField
._test
_ibinop
_type
_pos
_vfloat
, op
=ibinop
))
704 setattr(cls
, test_ibinop_name('type_neg_vfloat'), partialmethod(_TestNumericField
._test
_ibinop
_type
_neg
_vfloat
, op
=ibinop
))
705 setattr(cls
, test_ibinop_name('value_pos_float'), partialmethod(_TestNumericField
._test
_ibinop
_value
_pos
_float
, op
=ibinop
))
706 setattr(cls
, test_ibinop_name('value_neg_float'), partialmethod(_TestNumericField
._test
_ibinop
_value
_neg
_float
, op
=ibinop
))
707 setattr(cls
, test_ibinop_name('value_pos_vfloat'), partialmethod(_TestNumericField
._test
_ibinop
_value
_pos
_vfloat
, op
=ibinop
))
708 setattr(cls
, test_ibinop_name('value_neg_vfloat'), partialmethod(_TestNumericField
._test
_ibinop
_value
_neg
_vfloat
, op
=ibinop
))
709 setattr(cls
, test_ibinop_name('type_zero_float'), partialmethod(_TestNumericField
._test
_ibinop
_type
_zero
_float
, op
=ibinop
))
710 setattr(cls
, test_ibinop_name('type_zero_vfloat'), partialmethod(_TestNumericField
._test
_ibinop
_type
_zero
_vfloat
, op
=ibinop
))
711 setattr(cls
, test_ibinop_name('value_zero_float'), partialmethod(_TestNumericField
._test
_ibinop
_value
_zero
_float
, op
=ibinop
))
712 setattr(cls
, test_ibinop_name('value_zero_vfloat'), partialmethod(_TestNumericField
._test
_ibinop
_value
_zero
_vfloat
, op
=ibinop
))
715 class _TestIntegerFieldCommon(_TestNumericField
):
716 def test_assign_true(self
):
718 self
._def
.value
= raw
719 self
.assertEqual(self
._def
, raw
)
720 self
.assertEqual(self
._def
.value
, raw
)
722 def test_assign_false(self
):
724 self
._def
.value
= raw
725 self
.assertEqual(self
._def
, raw
)
726 self
.assertEqual(self
._def
.value
, raw
)
728 def test_assign_pos_int(self
):
730 self
._def
.value
= raw
731 self
.assertEqual(self
._def
, raw
)
732 self
.assertEqual(self
._def
.value
, raw
)
734 def test_assign_neg_int(self
):
736 self
._def
.value
= raw
737 self
.assertEqual(self
._def
, raw
)
738 self
.assertEqual(self
._def
.value
, raw
)
740 def test_assign_int_field(self
):
744 self
._def
.value
= field
745 self
.assertEqual(self
._def
, raw
)
746 self
.assertEqual(self
._def
.value
, raw
)
748 def test_assign_float(self
):
750 self
._def
.value
= raw
751 self
.assertEqual(self
._def
, int(raw
))
752 self
.assertEqual(self
._def
.value
, int(raw
))
754 def test_assign_invalid_type(self
):
755 with self
.assertRaises(TypeError):
756 self
._def
.value
= 'yes'
758 def test_assign_uint(self
):
759 ft
= bt2
.IntegerFieldType(size
=32, is_signed
=False)
763 self
.assertEqual(field
, raw
)
764 self
.assertEqual(field
.value
, raw
)
766 def test_assign_uint_invalid_neg(self
):
767 ft
= bt2
.IntegerFieldType(size
=32, is_signed
=False)
770 with self
.assertRaises(ValueError):
774 _inject_numeric_testing_methods(_TestIntegerFieldCommon
)
777 class IntegerFieldTestCase(_TestIntegerFieldCommon
, unittest
.TestCase
):
779 self
._ft
= bt2
.IntegerFieldType(25, is_signed
=True)
780 self
._field
= self
._ft
()
781 self
._def
= self
._ft
()
784 self
._def
_new
_value
= -101
792 class EnumerationFieldTestCase(_TestIntegerFieldCommon
, unittest
.TestCase
):
794 self
._ft
= bt2
.EnumerationFieldType(size
=32, is_signed
=True)
795 self
._ft
.append_mapping('whole range', -(2 ** 31), (2 ** 31) - 1)
796 self
._ft
.append_mapping('something', 17)
797 self
._ft
.append_mapping('speaker', 12, 16)
798 self
._ft
.append_mapping('can', 18, 2540)
799 self
._ft
.append_mapping('zip', -45, 1001)
800 self
._def
= self
._ft
()
803 self
._def
_new
_value
= -101
809 def test_mappings(self
):
811 ('whole range', -(2 ** 31), (2 ** 31) - 1),
812 ('something', 17, 17),
819 for fm
in self
._def
.mappings
:
821 for index
, mapping
in enumerate(mappings
):
822 if fm
.name
== mapping
[0] and fm
.lower
== mapping
[1] and fm
.upper
== mapping
[2]:
825 self
.assertEqual(total
, 3)
826 self
.assertTrue(0 in index_set
and 1 in index_set
and 2 in index_set
)
829 class FloatingPointNumberFieldTestCase(_TestNumericField
, unittest
.TestCase
):
831 self
._ft
= bt2
.FloatingPointNumberFieldType()
832 self
._field
= self
._ft
()
833 self
._def
= self
._ft
()
834 self
._def
.value
= 52.7
835 self
._def
_value
= 52.7
836 self
._def
_new
_value
= -17.164857
843 def _test_invalid_op(self
, cb
):
844 with self
.assertRaises(TypeError):
847 def test_assign_true(self
):
848 self
._def
.value
= True
849 self
.assertTrue(self
._def
)
850 self
.assertTrue(self
._def
.value
)
852 def test_assign_false(self
):
853 self
._def
.value
= False
854 self
.assertFalse(self
._def
)
855 self
.assertFalse(self
._def
.value
)
857 def test_assign_pos_int(self
):
859 self
._def
.value
= raw
860 self
.assertEqual(self
._def
, float(raw
))
861 self
.assertEqual(self
._def
.value
, float(raw
))
863 def test_assign_neg_int(self
):
865 self
._def
.value
= raw
866 self
.assertEqual(self
._def
, float(raw
))
867 self
.assertEqual(self
._def
.value
, float(raw
))
869 def test_assign_int_field(self
):
870 ft
= bt2
.IntegerFieldType(32)
874 self
._def
.value
= field
875 self
.assertEqual(self
._def
, float(raw
))
876 self
.assertEqual(self
._def
.value
, float(raw
))
878 def test_assign_float(self
):
880 self
._def
.value
= raw
881 self
.assertEqual(self
._def
, raw
)
882 self
.assertEqual(self
._def
.value
, raw
)
884 def test_assign_float_field(self
):
885 ft
= bt2
.FloatingPointNumberFieldType(32)
889 self
._def
.value
= field
890 self
.assertEqual(self
._def
, raw
)
891 self
.assertEqual(self
._def
.value
, raw
)
893 def test_assign_invalid_type(self
):
894 with self
.assertRaises(TypeError):
895 self
._def
.value
= 'yes'
897 def test_invalid_lshift(self
):
898 self
._test
_invalid
_op
(lambda: self
._def
<< 23)
900 def test_invalid_rshift(self
):
901 self
._test
_invalid
_op
(lambda: self
._def
>> 23)
903 def test_invalid_and(self
):
904 self
._test
_invalid
_op
(lambda: self
._def
& 23)
906 def test_invalid_or(self
):
907 self
._test
_invalid
_op
(lambda: self
._def |
23)
909 def test_invalid_xor(self
):
910 self
._test
_invalid
_op
(lambda: self
._def ^
23)
912 def test_invalid_invert(self
):
913 self
._test
_invalid
_op
(lambda: ~self
._def
)
916 _inject_numeric_testing_methods(FloatingPointNumberFieldTestCase
)
919 class StringFieldTestCase(_TestCopySimple
, unittest
.TestCase
):
921 self
._ft
= bt2
.StringFieldType()
922 self
._def
_value
= 'Hello, World!'
923 self
._def
= self
._ft
()
924 self
._def
.value
= self
._def
_value
925 self
._def
_new
_value
= 'Yes!'
931 def test_assign_int(self
):
932 with self
.assertRaises(TypeError):
933 self
._def
.value
= 283
935 def test_assign_string_field(self
):
936 ft
= bt2
.StringFieldType()
940 self
.assertEqual(field
, raw
)
943 self
.assertEqual(self
._def
, self
._def
_value
)
946 self
.assertNotEqual(self
._def
, 23)
948 def test_lt_vstring(self
):
953 self
.assertLess(s1
, s2
)
955 def test_lt_string(self
):
958 self
.assertLess(s1
, 'bateau')
960 def test_le_vstring(self
):
965 self
.assertLessEqual(s1
, s2
)
967 def test_le_string(self
):
970 self
.assertLessEqual(s1
, 'bateau')
972 def test_gt_vstring(self
):
977 self
.assertGreater(s2
, s1
)
979 def test_gt_string(self
):
982 self
.assertGreater('bateau', s1
)
984 def test_ge_vstring(self
):
989 self
.assertGreaterEqual(s2
, s1
)
991 def test_ge_string(self
):
994 self
.assertGreaterEqual('bateau', s1
)
996 def test_bool_op(self
):
997 self
.assertEqual(bool(self
._def
), bool(self
._def
_value
))
999 def test_str_op(self
):
1000 self
.assertEqual(str(self
._def
), str(self
._def
_value
))
1003 self
.assertEqual(len(self
._def
), len(self
._def
_value
))
1005 def test_getitem(self
):
1006 self
.assertEqual(self
._def
[5], self
._def
_value
[5])
1008 def test_append_str(self
):
1009 to_append
= 'meow meow meow'
1010 self
._def
+= to_append
1011 self
._def
_value
+= to_append
1012 self
.assertEqual(self
._def
, self
._def
_value
)
1014 def test_append_string_field(self
):
1015 ft
= bt2
.StringFieldType()
1017 to_append
= 'meow meow meow'
1018 field
.value
= to_append
1020 self
._def
_value
+= to_append
1021 self
.assertEqual(self
._def
, self
._def
_value
)
1023 def test_is_set(self
):
1024 raw
= self
._def
_value
1026 self
.assertFalse(field
.is_set
)
1028 self
.assertTrue(field
.is_set
)
1030 def test_reset(self
):
1031 raw
= self
._def
_value
1034 self
.assertTrue(field
.is_set
)
1036 self
.assertFalse(field
.is_set
)
1038 self
.assertEqual(other
, field
)
1041 class _TestArraySequenceFieldCommon(_TestCopySimple
):
1042 def _modify_def(self
):
1045 def test_bool_op_true(self
):
1046 self
.assertTrue(self
._def
)
1049 self
.assertEqual(len(self
._def
), 3)
1051 def test_getitem(self
):
1052 field
= self
._def
[1]
1053 self
.assertIs(type(field
), bt2
.fields
._IntegerField
)
1054 self
.assertEqual(field
, 1847)
1057 ft
= bt2
.ArrayFieldType(self
._elem
_ft
, 3)
1062 self
.assertEqual(self
._def
, field
)
1064 def test_eq_invalid_type(self
):
1065 self
.assertNotEqual(self
._def
, 23)
1067 def test_eq_diff_len(self
):
1068 ft
= bt2
.ArrayFieldType(self
._elem
_ft
, 2)
1072 self
.assertNotEqual(self
._def
, field
)
1074 def test_eq_diff_content_same_len(self
):
1075 ft
= bt2
.ArrayFieldType(self
._elem
_ft
, 3)
1080 self
.assertNotEqual(self
._def
, field
)
1082 def test_setitem(self
):
1084 self
.assertEqual(self
._def
[2], 24)
1086 def test_setitem_int_field(self
):
1087 int_field
= self
._elem
_ft
()
1088 int_field
.value
= 19487
1089 self
._def
[1] = int_field
1090 self
.assertEqual(self
._def
[1], 19487)
1092 def test_setitem_non_basic_field(self
):
1093 elem_ft
= bt2
.StructureFieldType()
1094 array_ft
= bt2
.ArrayFieldType(elem_ft
, 3)
1095 elem_field
= elem_ft()
1096 array_field
= array_ft()
1098 with self
.assertRaises(TypeError):
1101 def test_setitem_none(self
):
1102 with self
.assertRaises(TypeError):
1105 def test_setitem_index_wrong_type(self
):
1106 with self
.assertRaises(TypeError):
1107 self
._def
['yes'] = 23
1109 def test_setitem_index_neg(self
):
1110 with self
.assertRaises(IndexError):
1113 def test_setitem_index_out_of_range(self
):
1114 with self
.assertRaises(IndexError):
1115 self
._def
[len(self
._def
)] = 134679
1117 def test_iter(self
):
1118 for field
, value
in zip(self
._def
, (45, 1847, 1948754)):
1119 self
.assertEqual(field
, value
)
1121 def test_value_int_field(self
):
1122 values
= [45646, 145, 12145]
1123 self
._def
.value
= values
1124 self
.assertEqual(values
, self
._def
)
1126 def test_value_unset(self
):
1127 values
= [45646, None, 12145]
1128 self
._def
.value
= values
1129 self
.assertFalse(self
._def
[1].is_set
)
1131 def test_value_rollback(self
):
1132 values
= [45, 1847, 1948754]
1133 # value is out of range, should not affect those we set previously
1134 with self
.assertRaises(bt2
.Error
):
1135 self
._def
[2].value
= 2**60
1136 self
.assertEqual(values
, self
._def
)
1138 def test_value_check_sequence(self
):
1140 with self
.assertRaises(TypeError):
1141 self
._def
.value
= values
1143 def test_value_wrong_type_in_sequence(self
):
1144 values
= [32, 'hello', 11]
1145 with self
.assertRaises(TypeError):
1146 self
._def
.value
= values
1148 def test_value_complex_type(self
):
1149 struct_ft
= bt2
.StructureFieldType()
1150 int_ft
= bt2
.IntegerFieldType(32)
1151 str_ft
= bt2
.StringFieldType()
1152 struct_ft
.append_field(field_type
=int_ft
, name
='an_int')
1153 struct_ft
.append_field(field_type
=str_ft
, name
='a_string')
1154 struct_ft
.append_field(field_type
=int_ft
, name
='another_int')
1155 array_ft
= bt2
.ArrayFieldType(struct_ft
, 3)
1159 'a_string': 'hello',
1164 'a_string': 'goodbye',
1169 'a_string': 'or not',
1175 array
.value
= values
1176 self
.assertEqual(values
, array
)
1177 values
[0]['an_int'] = 'a string'
1178 with self
.assertRaises(TypeError):
1179 array
.value
= values
1181 def test_is_set(self
):
1182 raw
= self
._def
_value
1184 self
.assertFalse(field
.is_set
)
1186 self
.assertTrue(field
.is_set
)
1188 def test_reset(self
):
1189 raw
= self
._def
_value
1192 self
.assertTrue(field
.is_set
)
1194 self
.assertFalse(field
.is_set
)
1196 self
.assertEqual(other
, field
)
1199 class ArrayFieldTestCase(_TestArraySequenceFieldCommon
, unittest
.TestCase
):
1201 self
._elem
_ft
= bt2
.IntegerFieldType(32)
1202 self
._ft
= bt2
.ArrayFieldType(self
._elem
_ft
, 3)
1203 self
._def
= self
._ft
()
1206 self
._def
[2] = 1948754
1207 self
._def
_value
= [45, 1847, 1948754]
1214 def test_value_wrong_len(self
):
1216 with self
.assertRaises(ValueError):
1217 self
._def
.value
= values
1220 class SequenceFieldTestCase(_TestArraySequenceFieldCommon
, unittest
.TestCase
):
1222 self
._elem
_ft
= bt2
.IntegerFieldType(32)
1223 self
._ft
= bt2
.SequenceFieldType(self
._elem
_ft
, 'the.length')
1224 self
._def
= self
._ft
()
1225 self
._length
_field
= self
._elem
_ft
(3)
1226 self
._def
.length_field
= self
._length
_field
1229 self
._def
[2] = 1948754
1230 self
._def
_value
= [45, 1847, 1948754]
1236 del self
._length
_field
1238 def test_value_resize(self
):
1239 new_values
= [1, 2, 3, 4]
1240 self
._def
.value
= new_values
1241 self
.assertCountEqual(self
._def
, new_values
)
1243 def test_value_resize_rollback(self
):
1244 with self
.assertRaises(TypeError):
1245 self
._def
.value
= [1, 2, 3, 'unexpected string']
1246 self
.assertEqual(self
._def
, self
._def
_value
)
1249 with self
.assertRaises(TypeError):
1250 self
._def
.value
= [1, 2, 3, 'unexpected string']
1251 self
.assertFalse(self
._def
.is_set
)
1254 class StructureFieldTestCase(_TestCopySimple
, unittest
.TestCase
):
1256 self
._ft
0 = bt2
.IntegerFieldType(32, is_signed
=True)
1257 self
._ft
1 = bt2
.StringFieldType()
1258 self
._ft
2 = bt2
.FloatingPointNumberFieldType()
1259 self
._ft
3 = bt2
.IntegerFieldType(17)
1260 self
._ft
= bt2
.StructureFieldType()
1261 self
._ft
.append_field('A', self
._ft
0)
1262 self
._ft
.append_field('B', self
._ft
1)
1263 self
._ft
.append_field('C', self
._ft
2)
1264 self
._ft
.append_field('D', self
._ft
3)
1265 self
._def
= self
._ft
()
1266 self
._def
['A'] = -1872
1267 self
._def
['B'] = 'salut'
1268 self
._def
['C'] = 17.5
1269 self
._def
['D'] = 16497
1279 def _modify_def(self
):
1280 self
._def
['B'] = 'hola'
1282 def test_bool_op_true(self
):
1283 self
.assertTrue(self
._def
)
1285 def test_bool_op_false(self
):
1286 ft
= bt2
.StructureFieldType()
1288 self
.assertFalse(field
)
1291 self
.assertEqual(len(self
._def
), 4)
1293 def test_getitem(self
):
1294 field
= self
._def
['A']
1295 self
.assertIs(type(field
), bt2
.fields
._IntegerField
)
1296 self
.assertEqual(field
, -1872)
1298 def test_at_index_out_of_bounds_after(self
):
1299 with self
.assertRaises(IndexError):
1300 self
._def
.at_index(len(self
._ft
))
1303 ft
= bt2
.StructureFieldType()
1304 ft
.append_field('A', self
._ft
0)
1305 ft
.append_field('B', self
._ft
1)
1306 ft
.append_field('C', self
._ft
2)
1307 ft
.append_field('D', self
._ft
3)
1310 field
['B'] = 'salut'
1313 self
.assertEqual(self
._def
, field
)
1315 def test_eq_invalid_type(self
):
1316 self
.assertNotEqual(self
._def
, 23)
1318 def test_eq_diff_len(self
):
1319 ft
= bt2
.StructureFieldType()
1320 ft
.append_field('A', self
._ft
0)
1321 ft
.append_field('B', self
._ft
1)
1322 ft
.append_field('C', self
._ft
2)
1325 field
['B'] = 'salut'
1327 self
.assertNotEqual(self
._def
, field
)
1329 def test_eq_diff_content_same_len(self
):
1330 ft
= bt2
.StructureFieldType()
1331 ft
.append_field('A', self
._ft
0)
1332 ft
.append_field('B', self
._ft
1)
1333 ft
.append_field('C', self
._ft
2)
1334 ft
.append_field('D', self
._ft
3)
1337 field
['B'] = 'salut'
1340 self
.assertNotEqual(self
._def
, field
)
1342 def test_eq_same_content_diff_keys(self
):
1343 ft
= bt2
.StructureFieldType()
1344 ft
.append_field('A', self
._ft
0)
1345 ft
.append_field('B', self
._ft
1)
1346 ft
.append_field('E', self
._ft
2)
1347 ft
.append_field('D', self
._ft
3)
1350 field
['B'] = 'salut'
1353 self
.assertNotEqual(self
._def
, field
)
1355 def test_setitem(self
):
1356 self
._def
['C'] = -18.47
1357 self
.assertEqual(self
._def
['C'], -18.47)
1359 def test_setitem_int_field(self
):
1360 int_ft
= bt2
.IntegerFieldType(16)
1361 int_field
= int_ft()
1362 int_field
.value
= 19487
1363 self
._def
['D'] = int_field
1364 self
.assertEqual(self
._def
['D'], 19487)
1366 def test_setitem_non_basic_field(self
):
1367 elem_ft
= bt2
.StructureFieldType()
1368 elem_field
= elem_ft()
1369 struct_ft
= bt2
.StructureFieldType()
1370 struct_ft
.append_field('A', elem_ft
)
1371 struct_field
= struct_ft()
1373 with self
.assertRaises(TypeError):
1374 struct_field
['A'] = 23
1376 def test_setitem_none(self
):
1377 with self
.assertRaises(TypeError):
1378 self
._def
['C'] = None
1380 def test_setitem_key_wrong_type(self
):
1381 with self
.assertRaises(TypeError):
1384 def test_setitem_wrong_key(self
):
1385 with self
.assertRaises(KeyError):
1386 self
._def
['hi'] = 134679
1388 def test_at_index(self
):
1389 self
.assertEqual(self
._def
.at_index(1), 'salut')
1391 def test_iter(self
):
1399 for vkey
, vval
in self
._def
.items():
1400 val
= orig_values
[vkey
]
1401 self
.assertEqual(vval
, val
)
1403 def test_value(self
):
1410 self
.assertEqual(self
._def
, orig_values
)
1412 def test_set_value(self
):
1413 int_ft
= bt2
.IntegerFieldType(32)
1414 str_ft
= bt2
.StringFieldType()
1415 struct_ft
= bt2
.StructureFieldType()
1416 struct_ft
.append_field(field_type
=int_ft
, name
='an_int')
1417 struct_ft
.append_field(field_type
=str_ft
, name
='a_string')
1418 struct_ft
.append_field(field_type
=int_ft
, name
='another_int')
1421 'a_string': 'hello',
1425 struct
= struct_ft()
1426 struct
.value
= values
1427 self
.assertEqual(values
, struct
)
1429 bad_type_values
= copy
.deepcopy(values
)
1430 bad_type_values
['an_int'] = 'a string'
1431 with self
.assertRaises(TypeError):
1432 struct
.value
= bad_type_values
1434 unknown_key_values
= copy
.deepcopy(values
)
1435 unknown_key_values
['unknown_key'] = 16546
1436 with self
.assertRaises(KeyError):
1437 struct
.value
= unknown_key_values
1439 def test_value_rollback(self
):
1440 int_ft
= bt2
.IntegerFieldType(32)
1441 str_ft
= bt2
.StringFieldType()
1442 struct_ft
= bt2
.StructureFieldType()
1443 struct_ft
.append_field(field_type
=int_ft
, name
='an_int')
1444 struct_ft
.append_field(field_type
=str_ft
, name
='a_string')
1445 struct_ft
.append_field(field_type
=int_ft
, name
='another_int')
1448 'a_string': 'hello',
1452 def test_is_set(self
):
1455 'a_string': 'hello',
1459 int_ft
= bt2
.IntegerFieldType(32)
1460 str_ft
= bt2
.StringFieldType()
1461 struct_ft
= bt2
.StructureFieldType()
1462 struct_ft
.append_field(field_type
=int_ft
, name
='an_int')
1463 struct_ft
.append_field(field_type
=str_ft
, name
='a_string')
1464 struct_ft
.append_field(field_type
=int_ft
, name
='another_int')
1466 struct
= struct_ft()
1467 self
.assertFalse(struct
.is_set
)
1468 struct
.value
= values
1469 self
.assertTrue(struct
.is_set
)
1471 struct
= struct_ft()
1472 struct
['an_int'].value
= 42
1473 self
.assertFalse(struct
.is_set
)
1475 def test_reset(self
):
1478 'a_string': 'hello',
1482 int_ft
= bt2
.IntegerFieldType(32)
1483 str_ft
= bt2
.StringFieldType()
1484 struct_ft
= bt2
.StructureFieldType()
1485 struct_ft
.append_field(field_type
=int_ft
, name
='an_int')
1486 struct_ft
.append_field(field_type
=str_ft
, name
='a_string')
1487 struct_ft
.append_field(field_type
=int_ft
, name
='another_int')
1489 struct
= struct_ft()
1490 struct
.value
= values
1491 self
.assertTrue(struct
.is_set
)
1493 self
.assertEqual(struct_ft(), struct
)
1496 class VariantFieldTestCase(_TestCopySimple
, unittest
.TestCase
):
1498 self
._tag
_ft
= bt2
.EnumerationFieldType(size
=32)
1499 self
._tag
_ft
.append_mapping('corner', 23)
1500 self
._tag
_ft
.append_mapping('zoom', 17, 20)
1501 self
._tag
_ft
.append_mapping('mellotron', 1001)
1502 self
._tag
_ft
.append_mapping('giorgio', 2000, 3000)
1503 self
._ft
0 = bt2
.IntegerFieldType(32, is_signed
=True)
1504 self
._ft
1 = bt2
.StringFieldType()
1505 self
._ft
2 = bt2
.FloatingPointNumberFieldType()
1506 self
._ft
3 = bt2
.IntegerFieldType(17)
1507 self
._ft
= bt2
.VariantFieldType('salut', self
._tag
_ft
)
1508 self
._ft
.append_field('corner', self
._ft
0)
1509 self
._ft
.append_field('zoom', self
._ft
1)
1510 self
._ft
.append_field('mellotron', self
._ft
2)
1511 self
._ft
.append_field('giorgio', self
._ft
3)
1512 self
._def
= self
._ft
()
1523 def test_bool_op_true(self
):
1524 tag_field
= self
._tag
_ft
(1001)
1525 self
._def
.field(tag_field
).value
= -17.34
1526 self
.assertTrue(self
._def
)
1528 def test_bool_op_false(self
):
1529 self
.assertFalse(self
._def
)
1531 def test_tag_field_none(self
):
1532 self
.assertIsNone(self
._def
.tag_field
)
1534 def test_tag_field(self
):
1535 tag_field
= self
._tag
_ft
(2800)
1536 self
._def
.field(tag_field
).value
= 1847
1537 self
.assertEqual(self
._def
.tag_field
, tag_field
)
1538 self
.assertEqual(self
._def
.tag_field
.addr
, tag_field
.addr
)
1540 def test_selected_field_none(self
):
1541 self
.assertIsNone(self
._def
.selected_field
)
1543 def test_selected_field(self
):
1544 var_field1
= self
._ft
()
1545 tag_field1
= self
._tag
_ft
(1001)
1546 var_field1
.field(tag_field1
).value
= -17.34
1547 self
.assertEqual(var_field1
.field(), -17.34)
1548 self
.assertEqual(var_field1
.selected_field
, -17.34)
1549 var_field2
= self
._ft
()
1550 tag_field2
= self
._tag
_ft
(2500)
1551 var_field2
.field(tag_field2
).value
= 1921
1552 self
.assertEqual(var_field2
.field(), 1921)
1553 self
.assertEqual(var_field2
.selected_field
, 1921)
1556 tag_ft
= bt2
.EnumerationFieldType(size
=32)
1557 tag_ft
.append_mapping('corner', 23)
1558 tag_ft
.append_mapping('zoom', 17, 20)
1559 tag_ft
.append_mapping('mellotron', 1001)
1560 tag_ft
.append_mapping('giorgio', 2000, 3000)
1561 ft0
= bt2
.IntegerFieldType(32, is_signed
=True)
1562 ft1
= bt2
.StringFieldType()
1563 ft2
= bt2
.FloatingPointNumberFieldType()
1564 ft3
= bt2
.IntegerFieldType(17)
1565 ft
= bt2
.VariantFieldType('salut', tag_ft
)
1566 ft
.append_field('corner', ft0
)
1567 ft
.append_field('zoom', ft1
)
1568 ft
.append_field('mellotron', ft2
)
1569 ft
.append_field('giorgio', ft3
)
1571 field_tag
= tag_ft(23)
1572 def_tag
= self
._tag
_ft
(23)
1573 field
.field(field_tag
).value
= 1774
1574 self
._def
.field(def_tag
).value
= 1774
1575 self
.assertEqual(self
._def
, field
)
1577 def test_eq_invalid_type(self
):
1578 self
.assertNotEqual(self
._def
, 23)
1580 def test_is_set(self
):
1581 self
.assertFalse(self
._def
.is_set
)
1582 tag_field
= self
._tag
_ft
(2800)
1583 self
._def
.field(tag_field
).value
= 684
1584 self
.assertTrue(self
._def
.is_set
)
1586 def test_reset(self
):
1587 tag_field
= self
._tag
_ft
(2800)
1588 self
._def
.field(tag_field
).value
= 684
1590 self
.assertFalse(self
._def
.is_set
)
1591 self
.assertIsNone(self
._def
.selected_field
)
1592 self
.assertIsNone(self
._def
.tag_field
)