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)
527 ('add', operator
.add
),
528 ('radd', lambda a
, b
: operator
.add(b
, a
)),
529 ('and', operator
.and_
),
530 ('rand', lambda a
, b
: operator
.and_(b
, a
)),
531 ('floordiv', operator
.floordiv
),
532 ('rfloordiv', lambda a
, b
: operator
.floordiv(b
, a
)),
533 ('lshift', operator
.lshift
),
534 ('rlshift', lambda a
, b
: operator
.lshift(b
, a
)),
535 ('mod', operator
.mod
),
536 ('rmod', lambda a
, b
: operator
.mod(b
, a
)),
537 ('mul', operator
.mul
),
538 ('rmul', lambda a
, b
: operator
.mul(b
, a
)),
539 ('or', operator
.or_
),
540 ('ror', lambda a
, b
: operator
.or_(b
, a
)),
541 ('pow', operator
.pow),
542 ('rpow', lambda a
, b
: operator
.pow(b
, a
)),
543 ('rshift', operator
.rshift
),
544 ('rrshift', lambda a
, b
: operator
.rshift(b
, a
)),
545 ('sub', operator
.sub
),
546 ('rsub', lambda a
, b
: operator
.sub(b
, a
)),
547 ('truediv', operator
.truediv
),
548 ('rtruediv', lambda a
, b
: operator
.truediv(b
, a
)),
549 ('xor', operator
.xor
),
550 ('rxor', lambda a
, b
: operator
.xor(b
, a
)),
555 ('iadd', operator
.iadd
),
556 ('iand', operator
.iand
),
557 ('ifloordiv', operator
.ifloordiv
),
558 ('ilshift', operator
.ilshift
),
559 ('imod', operator
.imod
),
560 ('imul', operator
.imul
),
561 ('ior', operator
.ior
),
562 ('ipow', operator
.ipow
),
563 ('irshift', operator
.irshift
),
564 ('isub', operator
.isub
),
565 ('itruediv', operator
.itruediv
),
566 ('ixor', operator
.ixor
),
571 ('neg', operator
.neg
),
572 ('pos', operator
.pos
),
573 ('abs', operator
.abs),
574 ('invert', operator
.invert
),
576 ('round_0', partial(round, ndigits
=0)),
577 ('round_1', partial(round, ndigits
=1)),
578 ('round_2', partial(round, ndigits
=2)),
579 ('round_3', partial(round, ndigits
=3)),
581 ('floor', math
.floor
),
582 ('trunc', math
.trunc
),
586 def _inject_numeric_testing_methods(cls
):
587 def test_binop_name(suffix
):
588 return 'test_binop_{}_{}'.format(name
, suffix
)
590 def test_ibinop_name(suffix
):
591 return 'test_ibinop_{}_{}'.format(name
, suffix
)
593 def test_unaryop_name(suffix
):
594 return 'test_unaryop_{}_{}'.format(name
, suffix
)
596 # inject testing methods for each binary operation
597 for name
, binop
in _BINOPS
:
598 setattr(cls
, test_binop_name('invalid_unknown'), partialmethod(_TestNumericField
._test
_binop
_invalid
_unknown
, op
=binop
))
599 setattr(cls
, test_binop_name('invalid_none'), partialmethod(_TestNumericField
._test
_binop
_invalid
_none
, op
=binop
))
600 setattr(cls
, test_binop_name('type_true'), partialmethod(_TestNumericField
._test
_binop
_type
_true
, op
=binop
))
601 setattr(cls
, test_binop_name('type_pos_int'), partialmethod(_TestNumericField
._test
_binop
_type
_pos
_int
, op
=binop
))
602 setattr(cls
, test_binop_name('type_pos_vint'), partialmethod(_TestNumericField
._test
_binop
_type
_pos
_vint
, op
=binop
))
603 setattr(cls
, test_binop_name('value_true'), partialmethod(_TestNumericField
._test
_binop
_value
_true
, op
=binop
))
604 setattr(cls
, test_binop_name('value_pos_int'), partialmethod(_TestNumericField
._test
_binop
_value
_pos
_int
, op
=binop
))
605 setattr(cls
, test_binop_name('value_pos_vint'), partialmethod(_TestNumericField
._test
_binop
_value
_pos
_vint
, op
=binop
))
606 setattr(cls
, test_binop_name('lhs_addr_same_true'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_true
, op
=binop
))
607 setattr(cls
, test_binop_name('lhs_addr_same_pos_int'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_pos
_int
, op
=binop
))
608 setattr(cls
, test_binop_name('lhs_addr_same_pos_vint'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_pos
_vint
, op
=binop
))
609 setattr(cls
, test_binop_name('lhs_value_same_true'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_true
, op
=binop
))
610 setattr(cls
, test_binop_name('lhs_value_same_pos_int'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_pos
_int
, op
=binop
))
611 setattr(cls
, test_binop_name('lhs_value_same_pos_vint'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_pos
_vint
, op
=binop
))
612 setattr(cls
, test_binop_name('type_neg_int'), partialmethod(_TestNumericField
._test
_binop
_type
_neg
_int
, op
=binop
))
613 setattr(cls
, test_binop_name('type_neg_vint'), partialmethod(_TestNumericField
._test
_binop
_type
_neg
_vint
, op
=binop
))
614 setattr(cls
, test_binop_name('value_neg_int'), partialmethod(_TestNumericField
._test
_binop
_value
_neg
_int
, op
=binop
))
615 setattr(cls
, test_binop_name('value_neg_vint'), partialmethod(_TestNumericField
._test
_binop
_value
_neg
_vint
, op
=binop
))
616 setattr(cls
, test_binop_name('lhs_addr_same_neg_int'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_neg
_int
, op
=binop
))
617 setattr(cls
, test_binop_name('lhs_addr_same_neg_vint'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_neg
_vint
, op
=binop
))
618 setattr(cls
, test_binop_name('lhs_value_same_neg_int'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_neg
_int
, op
=binop
))
619 setattr(cls
, test_binop_name('lhs_value_same_neg_vint'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_neg
_vint
, op
=binop
))
620 setattr(cls
, test_binop_name('type_false'), partialmethod(_TestNumericField
._test
_binop
_type
_false
, op
=binop
))
621 setattr(cls
, test_binop_name('type_zero_int'), partialmethod(_TestNumericField
._test
_binop
_type
_zero
_int
, op
=binop
))
622 setattr(cls
, test_binop_name('type_zero_vint'), partialmethod(_TestNumericField
._test
_binop
_type
_zero
_vint
, op
=binop
))
623 setattr(cls
, test_binop_name('value_false'), partialmethod(_TestNumericField
._test
_binop
_value
_false
, op
=binop
))
624 setattr(cls
, test_binop_name('value_zero_int'), partialmethod(_TestNumericField
._test
_binop
_value
_zero
_int
, op
=binop
))
625 setattr(cls
, test_binop_name('value_zero_vint'), partialmethod(_TestNumericField
._test
_binop
_value
_zero
_vint
, op
=binop
))
626 setattr(cls
, test_binop_name('lhs_addr_same_false'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_false
, op
=binop
))
627 setattr(cls
, test_binop_name('lhs_addr_same_zero_int'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_zero
_int
, op
=binop
))
628 setattr(cls
, test_binop_name('lhs_addr_same_zero_vint'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_zero
_vint
, op
=binop
))
629 setattr(cls
, test_binop_name('lhs_value_same_false'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_false
, op
=binop
))
630 setattr(cls
, test_binop_name('lhs_value_same_zero_int'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_zero
_int
, op
=binop
))
631 setattr(cls
, test_binop_name('lhs_value_same_zero_vint'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_zero
_vint
, op
=binop
))
632 setattr(cls
, test_binop_name('type_pos_float'), partialmethod(_TestNumericField
._test
_binop
_type
_pos
_float
, op
=binop
))
633 setattr(cls
, test_binop_name('type_neg_float'), partialmethod(_TestNumericField
._test
_binop
_type
_neg
_float
, op
=binop
))
634 setattr(cls
, test_binop_name('type_pos_vfloat'), partialmethod(_TestNumericField
._test
_binop
_type
_pos
_vfloat
, op
=binop
))
635 setattr(cls
, test_binop_name('type_neg_vfloat'), partialmethod(_TestNumericField
._test
_binop
_type
_neg
_vfloat
, op
=binop
))
636 setattr(cls
, test_binop_name('value_pos_float'), partialmethod(_TestNumericField
._test
_binop
_value
_pos
_float
, op
=binop
))
637 setattr(cls
, test_binop_name('value_neg_float'), partialmethod(_TestNumericField
._test
_binop
_value
_neg
_float
, op
=binop
))
638 setattr(cls
, test_binop_name('value_pos_vfloat'), partialmethod(_TestNumericField
._test
_binop
_value
_pos
_vfloat
, op
=binop
))
639 setattr(cls
, test_binop_name('value_neg_vfloat'), partialmethod(_TestNumericField
._test
_binop
_value
_neg
_vfloat
, op
=binop
))
640 setattr(cls
, test_binop_name('lhs_addr_same_pos_float'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_pos
_float
, op
=binop
))
641 setattr(cls
, test_binop_name('lhs_addr_same_neg_float'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_neg
_float
, op
=binop
))
642 setattr(cls
, test_binop_name('lhs_addr_same_pos_vfloat'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_pos
_vfloat
, op
=binop
))
643 setattr(cls
, test_binop_name('lhs_addr_same_neg_vfloat'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_neg
_vfloat
, op
=binop
))
644 setattr(cls
, test_binop_name('lhs_value_same_pos_float'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_pos
_float
, op
=binop
))
645 setattr(cls
, test_binop_name('lhs_value_same_neg_float'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_neg
_float
, op
=binop
))
646 setattr(cls
, test_binop_name('lhs_value_same_pos_vfloat'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_pos
_vfloat
, op
=binop
))
647 setattr(cls
, test_binop_name('lhs_value_same_neg_vfloat'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_neg
_vfloat
, op
=binop
))
648 setattr(cls
, test_binop_name('type_zero_float'), partialmethod(_TestNumericField
._test
_binop
_type
_zero
_float
, op
=binop
))
649 setattr(cls
, test_binop_name('type_zero_vfloat'), partialmethod(_TestNumericField
._test
_binop
_type
_zero
_vfloat
, op
=binop
))
650 setattr(cls
, test_binop_name('value_zero_float'), partialmethod(_TestNumericField
._test
_binop
_value
_zero
_float
, op
=binop
))
651 setattr(cls
, test_binop_name('value_zero_vfloat'), partialmethod(_TestNumericField
._test
_binop
_value
_zero
_vfloat
, op
=binop
))
652 setattr(cls
, test_binop_name('lhs_addr_same_zero_float'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_zero
_float
, op
=binop
))
653 setattr(cls
, test_binop_name('lhs_addr_same_zero_vfloat'), partialmethod(_TestNumericField
._test
_binop
_lhs
_addr
_same
_zero
_vfloat
, op
=binop
))
654 setattr(cls
, test_binop_name('lhs_value_same_zero_float'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_zero
_float
, op
=binop
))
655 setattr(cls
, test_binop_name('lhs_value_same_zero_vfloat'), partialmethod(_TestNumericField
._test
_binop
_lhs
_value
_same
_zero
_vfloat
, op
=binop
))
657 # inject testing methods for each unary operation
658 for name
, unaryop
in _UNARYOPS
:
659 setattr(cls
, test_unaryop_name('type'), partialmethod(_TestNumericField
._test
_unaryop
_type
, op
=unaryop
))
660 setattr(cls
, test_unaryop_name('value'), partialmethod(_TestNumericField
._test
_unaryop
_value
, op
=unaryop
))
661 setattr(cls
, test_unaryop_name('addr_same'), partialmethod(_TestNumericField
._test
_unaryop
_addr
_same
, op
=unaryop
))
662 setattr(cls
, test_unaryop_name('value_same'), partialmethod(_TestNumericField
._test
_unaryop
_value
_same
, op
=unaryop
))
664 # inject testing methods for each inplace binary operation
665 for name
, ibinop
in _IBINOPS
:
666 setattr(cls
, test_ibinop_name('invalid_unknown'), partialmethod(_TestNumericField
._test
_ibinop
_invalid
_unknown
, op
=ibinop
))
667 setattr(cls
, test_ibinop_name('invalid_none'), partialmethod(_TestNumericField
._test
_ibinop
_invalid
_none
, op
=ibinop
))
668 setattr(cls
, test_ibinop_name('type_true'), partialmethod(_TestNumericField
._test
_ibinop
_type
_true
, op
=ibinop
))
669 setattr(cls
, test_ibinop_name('value_true'), partialmethod(_TestNumericField
._test
_ibinop
_value
_true
, op
=ibinop
))
670 setattr(cls
, test_ibinop_name('type_pos_int'), partialmethod(_TestNumericField
._test
_ibinop
_type
_pos
_int
, op
=ibinop
))
671 setattr(cls
, test_ibinop_name('type_pos_vint'), partialmethod(_TestNumericField
._test
_ibinop
_type
_pos
_vint
, op
=ibinop
))
672 setattr(cls
, test_ibinop_name('value_pos_int'), partialmethod(_TestNumericField
._test
_ibinop
_value
_pos
_int
, op
=ibinop
))
673 setattr(cls
, test_ibinop_name('value_pos_vint'), partialmethod(_TestNumericField
._test
_ibinop
_value
_pos
_vint
, op
=ibinop
))
674 setattr(cls
, test_ibinop_name('type_neg_int'), partialmethod(_TestNumericField
._test
_ibinop
_type
_neg
_int
, op
=ibinop
))
675 setattr(cls
, test_ibinop_name('type_neg_vint'), partialmethod(_TestNumericField
._test
_ibinop
_type
_neg
_vint
, op
=ibinop
))
676 setattr(cls
, test_ibinop_name('value_neg_int'), partialmethod(_TestNumericField
._test
_ibinop
_value
_neg
_int
, op
=ibinop
))
677 setattr(cls
, test_ibinop_name('value_neg_vint'), partialmethod(_TestNumericField
._test
_ibinop
_value
_neg
_vint
, op
=ibinop
))
678 setattr(cls
, test_ibinop_name('type_false'), partialmethod(_TestNumericField
._test
_ibinop
_type
_false
, op
=ibinop
))
679 setattr(cls
, test_ibinop_name('value_false'), partialmethod(_TestNumericField
._test
_ibinop
_value
_false
, op
=ibinop
))
680 setattr(cls
, test_ibinop_name('type_zero_int'), partialmethod(_TestNumericField
._test
_ibinop
_type
_zero
_int
, op
=ibinop
))
681 setattr(cls
, test_ibinop_name('type_zero_vint'), partialmethod(_TestNumericField
._test
_ibinop
_type
_zero
_vint
, op
=ibinop
))
682 setattr(cls
, test_ibinop_name('value_zero_int'), partialmethod(_TestNumericField
._test
_ibinop
_value
_zero
_int
, op
=ibinop
))
683 setattr(cls
, test_ibinop_name('value_zero_vint'), partialmethod(_TestNumericField
._test
_ibinop
_value
_zero
_vint
, op
=ibinop
))
684 setattr(cls
, test_ibinop_name('type_pos_float'), partialmethod(_TestNumericField
._test
_ibinop
_type
_pos
_float
, op
=ibinop
))
685 setattr(cls
, test_ibinop_name('type_neg_float'), partialmethod(_TestNumericField
._test
_ibinop
_type
_neg
_float
, op
=ibinop
))
686 setattr(cls
, test_ibinop_name('type_pos_vfloat'), partialmethod(_TestNumericField
._test
_ibinop
_type
_pos
_vfloat
, op
=ibinop
))
687 setattr(cls
, test_ibinop_name('type_neg_vfloat'), partialmethod(_TestNumericField
._test
_ibinop
_type
_neg
_vfloat
, op
=ibinop
))
688 setattr(cls
, test_ibinop_name('value_pos_float'), partialmethod(_TestNumericField
._test
_ibinop
_value
_pos
_float
, op
=ibinop
))
689 setattr(cls
, test_ibinop_name('value_neg_float'), partialmethod(_TestNumericField
._test
_ibinop
_value
_neg
_float
, op
=ibinop
))
690 setattr(cls
, test_ibinop_name('value_pos_vfloat'), partialmethod(_TestNumericField
._test
_ibinop
_value
_pos
_vfloat
, op
=ibinop
))
691 setattr(cls
, test_ibinop_name('value_neg_vfloat'), partialmethod(_TestNumericField
._test
_ibinop
_value
_neg
_vfloat
, op
=ibinop
))
692 setattr(cls
, test_ibinop_name('type_zero_float'), partialmethod(_TestNumericField
._test
_ibinop
_type
_zero
_float
, op
=ibinop
))
693 setattr(cls
, test_ibinop_name('type_zero_vfloat'), partialmethod(_TestNumericField
._test
_ibinop
_type
_zero
_vfloat
, op
=ibinop
))
694 setattr(cls
, test_ibinop_name('value_zero_float'), partialmethod(_TestNumericField
._test
_ibinop
_value
_zero
_float
, op
=ibinop
))
695 setattr(cls
, test_ibinop_name('value_zero_vfloat'), partialmethod(_TestNumericField
._test
_ibinop
_value
_zero
_vfloat
, op
=ibinop
))
698 class _TestIntegerFieldCommon(_TestNumericField
):
699 def test_assign_true(self
):
701 self
._def
.value
= raw
702 self
.assertEqual(self
._def
, raw
)
703 self
.assertEqual(self
._def
.value
, raw
)
705 def test_assign_false(self
):
707 self
._def
.value
= raw
708 self
.assertEqual(self
._def
, raw
)
709 self
.assertEqual(self
._def
.value
, raw
)
711 def test_assign_pos_int(self
):
713 self
._def
.value
= raw
714 self
.assertEqual(self
._def
, raw
)
715 self
.assertEqual(self
._def
.value
, raw
)
717 def test_assign_neg_int(self
):
719 self
._def
.value
= raw
720 self
.assertEqual(self
._def
, raw
)
721 self
.assertEqual(self
._def
.value
, raw
)
723 def test_assign_int_field(self
):
727 self
._def
.value
= field
728 self
.assertEqual(self
._def
, raw
)
729 self
.assertEqual(self
._def
.value
, raw
)
731 def test_assign_float(self
):
733 self
._def
.value
= raw
734 self
.assertEqual(self
._def
, int(raw
))
735 self
.assertEqual(self
._def
.value
, int(raw
))
737 def test_assign_invalid_type(self
):
738 with self
.assertRaises(TypeError):
739 self
._def
.value
= 'yes'
741 def test_assign_uint(self
):
742 ft
= bt2
.IntegerFieldType(size
=32, is_signed
=False)
746 self
.assertEqual(field
, raw
)
747 self
.assertEqual(field
.value
, raw
)
749 def test_assign_uint_invalid_neg(self
):
750 ft
= bt2
.IntegerFieldType(size
=32, is_signed
=False)
753 with self
.assertRaises(ValueError):
757 _inject_numeric_testing_methods(_TestIntegerFieldCommon
)
760 class IntegerFieldTestCase(_TestIntegerFieldCommon
, unittest
.TestCase
):
762 self
._ft
= bt2
.IntegerFieldType(25, is_signed
=True)
763 self
._field
= self
._ft
()
764 self
._def
= self
._ft
()
767 self
._def
_new
_value
= -101
775 class EnumerationFieldTestCase(_TestIntegerFieldCommon
, unittest
.TestCase
):
777 self
._ft
= bt2
.EnumerationFieldType(size
=32, is_signed
=True)
778 self
._ft
.append_mapping('whole range', -(2 ** 31), (2 ** 31) - 1)
779 self
._ft
.append_mapping('something', 17)
780 self
._ft
.append_mapping('speaker', 12, 16)
781 self
._ft
.append_mapping('can', 18, 2540)
782 self
._ft
.append_mapping('zip', -45, 1001)
783 self
._def
= self
._ft
()
786 self
._def
_new
_value
= -101
792 def test_mappings(self
):
794 ('whole range', -(2 ** 31), (2 ** 31) - 1),
795 ('something', 17, 17),
802 for fm
in self
._def
.mappings
:
804 for index
, mapping
in enumerate(mappings
):
805 if fm
.name
== mapping
[0] and fm
.lower
== mapping
[1] and fm
.upper
== mapping
[2]:
808 self
.assertEqual(total
, 3)
809 self
.assertTrue(0 in index_set
and 1 in index_set
and 2 in index_set
)
812 class FloatingPointNumberFieldTestCase(_TestNumericField
, unittest
.TestCase
):
814 self
._ft
= bt2
.FloatingPointNumberFieldType()
815 self
._field
= self
._ft
()
816 self
._def
= self
._ft
()
817 self
._def
.value
= 52.7
818 self
._def
_value
= 52.7
819 self
._def
_new
_value
= -17.164857
826 def _test_invalid_op(self
, cb
):
827 with self
.assertRaises(TypeError):
830 def test_assign_true(self
):
831 self
._def
.value
= True
832 self
.assertTrue(self
._def
)
833 self
.assertTrue(self
._def
.value
)
835 def test_assign_false(self
):
836 self
._def
.value
= False
837 self
.assertFalse(self
._def
)
838 self
.assertFalse(self
._def
.value
)
840 def test_assign_pos_int(self
):
842 self
._def
.value
= raw
843 self
.assertEqual(self
._def
, float(raw
))
844 self
.assertEqual(self
._def
.value
, float(raw
))
846 def test_assign_neg_int(self
):
848 self
._def
.value
= raw
849 self
.assertEqual(self
._def
, float(raw
))
850 self
.assertEqual(self
._def
.value
, float(raw
))
852 def test_assign_int_field(self
):
853 ft
= bt2
.IntegerFieldType(32)
857 self
._def
.value
= field
858 self
.assertEqual(self
._def
, float(raw
))
859 self
.assertEqual(self
._def
.value
, float(raw
))
861 def test_assign_float(self
):
863 self
._def
.value
= raw
864 self
.assertEqual(self
._def
, raw
)
865 self
.assertEqual(self
._def
.value
, raw
)
867 def test_assign_float_field(self
):
868 ft
= bt2
.FloatingPointNumberFieldType(32)
872 self
._def
.value
= field
873 self
.assertEqual(self
._def
, raw
)
874 self
.assertEqual(self
._def
.value
, raw
)
876 def test_assign_invalid_type(self
):
877 with self
.assertRaises(TypeError):
878 self
._def
.value
= 'yes'
880 def test_invalid_lshift(self
):
881 self
._test
_invalid
_op
(lambda: self
._def
<< 23)
883 def test_invalid_rshift(self
):
884 self
._test
_invalid
_op
(lambda: self
._def
>> 23)
886 def test_invalid_and(self
):
887 self
._test
_invalid
_op
(lambda: self
._def
& 23)
889 def test_invalid_or(self
):
890 self
._test
_invalid
_op
(lambda: self
._def |
23)
892 def test_invalid_xor(self
):
893 self
._test
_invalid
_op
(lambda: self
._def ^
23)
895 def test_invalid_invert(self
):
896 self
._test
_invalid
_op
(lambda: ~self
._def
)
899 _inject_numeric_testing_methods(FloatingPointNumberFieldTestCase
)
902 class StringFieldTestCase(_TestCopySimple
, unittest
.TestCase
):
904 self
._ft
= bt2
.StringFieldType()
905 self
._def
_value
= 'Hello, World!'
906 self
._def
= self
._ft
()
907 self
._def
.value
= self
._def
_value
908 self
._def
_new
_value
= 'Yes!'
914 def test_assign_int(self
):
915 with self
.assertRaises(TypeError):
916 self
._def
.value
= 283
918 def test_assign_str(self
):
921 self
.assertEqual(self
._def
, raw
)
923 def test_assign_string_field(self
):
924 ft
= bt2
.StringFieldType()
928 self
.assertEqual(field
, raw
)
931 self
.assertEqual(self
._def
, self
._def
_value
)
934 self
.assertNotEqual(self
._def
, 23)
936 def test_lt_vstring(self
):
941 self
.assertLess(s1
, s2
)
943 def test_lt_string(self
):
946 self
.assertLess(s1
, 'bateau')
948 def test_le_vstring(self
):
953 self
.assertLessEqual(s1
, s2
)
955 def test_le_string(self
):
958 self
.assertLessEqual(s1
, 'bateau')
960 def test_gt_vstring(self
):
965 self
.assertGreater(s2
, s1
)
967 def test_gt_string(self
):
970 self
.assertGreater('bateau', s1
)
972 def test_ge_vstring(self
):
977 self
.assertGreaterEqual(s2
, s1
)
979 def test_ge_string(self
):
982 self
.assertGreaterEqual('bateau', s1
)
984 def test_bool_op(self
):
985 self
.assertEqual(bool(self
._def
), bool(self
._def
_value
))
987 def test_str_op(self
):
988 self
.assertEqual(str(self
._def
), str(self
._def
_value
))
991 self
.assertEqual(len(self
._def
), len(self
._def
_value
))
993 def test_getitem(self
):
994 self
.assertEqual(self
._def
[5], self
._def
_value
[5])
996 def test_append_str(self
):
997 to_append
= 'meow meow meow'
998 self
._def
+= to_append
999 self
._def
_value
+= to_append
1000 self
.assertEqual(self
._def
, self
._def
_value
)
1002 def test_append_string_field(self
):
1003 ft
= bt2
.StringFieldType()
1005 to_append
= 'meow meow meow'
1006 field
.value
= to_append
1008 self
._def
_value
+= to_append
1009 self
.assertEqual(self
._def
, self
._def
_value
)
1012 class _TestArraySequenceFieldCommon(_TestCopySimple
):
1013 def _modify_def(self
):
1016 def test_bool_op_true(self
):
1017 self
.assertTrue(self
._def
)
1020 self
.assertEqual(len(self
._def
), 3)
1022 def test_getitem(self
):
1023 field
= self
._def
[1]
1024 self
.assertIs(type(field
), bt2
.fields
._IntegerField
)
1025 self
.assertEqual(field
, 1847)
1028 ft
= bt2
.ArrayFieldType(self
._elem
_ft
, 3)
1033 self
.assertEqual(self
._def
, field
)
1035 def test_eq_invalid_type(self
):
1036 self
.assertNotEqual(self
._def
, 23)
1038 def test_eq_diff_len(self
):
1039 ft
= bt2
.ArrayFieldType(self
._elem
_ft
, 2)
1043 self
.assertNotEqual(self
._def
, field
)
1045 def test_eq_diff_content_same_len(self
):
1046 ft
= bt2
.ArrayFieldType(self
._elem
_ft
, 3)
1051 self
.assertNotEqual(self
._def
, field
)
1053 def test_setitem(self
):
1055 self
.assertEqual(self
._def
[2], 24)
1057 def test_setitem_int_field(self
):
1058 int_field
= self
._elem
_ft
()
1059 int_field
.value
= 19487
1060 self
._def
[1] = int_field
1061 self
.assertEqual(self
._def
[1], 19487)
1063 def test_setitem_non_basic_field(self
):
1064 elem_ft
= bt2
.StructureFieldType()
1065 array_ft
= bt2
.ArrayFieldType(elem_ft
, 3)
1066 elem_field
= elem_ft()
1067 array_field
= array_ft()
1069 with self
.assertRaises(TypeError):
1072 def test_setitem_none(self
):
1073 with self
.assertRaises(TypeError):
1076 def test_setitem_index_wrong_type(self
):
1077 with self
.assertRaises(TypeError):
1078 self
._def
['yes'] = 23
1080 def test_setitem_index_neg(self
):
1081 with self
.assertRaises(IndexError):
1084 def test_setitem_index_out_of_range(self
):
1085 with self
.assertRaises(IndexError):
1086 self
._def
[len(self
._def
)] = 134679
1088 def test_iter(self
):
1089 for field
, value
in zip(self
._def
, (45, 1847, 1948754)):
1090 self
.assertEqual(field
, value
)
1092 def test_value_int_field(self
):
1093 values
= [45646, 145, 12145]
1094 self
._def
.value
= values
1095 self
.assertEqual(values
, self
._def
)
1097 def test_value_unset(self
):
1098 values
= [45646, None, 12145]
1099 self
._def
.value
= values
1100 self
.assertFalse(self
._def
[1].is_set
)
1102 def test_value_rollback(self
):
1103 values
= [45, 1847, 1948754]
1104 # value is out of range, should not affect those we set previously
1105 with self
.assertRaises(bt2
.Error
):
1106 self
._def
[2].value
= 2**60
1107 self
.assertEqual(values
, self
._def
)
1109 def test_value_check_sequence(self
):
1111 with self
.assertRaises(TypeError):
1112 self
._def
.value
= values
1114 def test_value_wrong_type_in_sequence(self
):
1115 values
= [32, 'hello', 11]
1116 with self
.assertRaises(TypeError):
1117 self
._def
.value
= values
1119 def test_value_complex_type(self
):
1120 struct_ft
= bt2
.StructureFieldType()
1121 int_ft
= bt2
.IntegerFieldType(32)
1122 str_ft
= bt2
.StringFieldType()
1123 struct_ft
.append_field(field_type
=int_ft
, name
='an_int')
1124 struct_ft
.append_field(field_type
=str_ft
, name
='a_string')
1125 struct_ft
.append_field(field_type
=int_ft
, name
='another_int')
1126 array_ft
= bt2
.ArrayFieldType(struct_ft
, 3)
1130 'a_string': 'hello',
1135 'a_string': 'goodbye',
1140 'a_string': 'or not',
1146 array
.value
= values
1147 self
.assertEqual(values
, array
)
1148 values
[0]['an_int'] = 'a string'
1149 with self
.assertRaises(TypeError):
1150 array
.value
= values
1152 class ArrayFieldTestCase(_TestArraySequenceFieldCommon
, unittest
.TestCase
):
1154 self
._elem
_ft
= bt2
.IntegerFieldType(32)
1155 self
._ft
= bt2
.ArrayFieldType(self
._elem
_ft
, 3)
1156 self
._def
= self
._ft
()
1159 self
._def
[2] = 1948754
1160 self
._def
_value
= [45, 1847, 1948754]
1167 def test_value_wrong_len(self
):
1169 with self
.assertRaises(ValueError):
1170 self
._def
.value
= values
1173 class SequenceFieldTestCase(_TestArraySequenceFieldCommon
, unittest
.TestCase
):
1175 self
._elem
_ft
= bt2
.IntegerFieldType(32)
1176 self
._ft
= bt2
.SequenceFieldType(self
._elem
_ft
, 'the.length')
1177 self
._def
= self
._ft
()
1178 self
._length
_field
= self
._elem
_ft
(3)
1179 self
._def
.length_field
= self
._length
_field
1182 self
._def
[2] = 1948754
1183 self
._def
_value
= [45, 1847, 1948754]
1189 del self
._length
_field
1191 def test_value_resize(self
):
1192 new_values
= [1, 2, 3, 4]
1193 self
._def
.value
= new_values
1194 self
.assertCountEqual(self
._def
, new_values
)
1196 def test_value_resize_rollback(self
):
1197 with self
.assertRaises(TypeError):
1198 self
._def
.value
= [1, 2, 3, 'unexpected string']
1199 self
.assertEqual(self
._def
, self
._def
_value
)
1202 with self
.assertRaises(TypeError):
1203 self
._def
.value
= [1, 2, 3, 'unexpected string']
1204 self
.assertFalse(self
._def
.is_set
)
1207 class StructureFieldTestCase(_TestCopySimple
, unittest
.TestCase
):
1209 self
._ft
0 = bt2
.IntegerFieldType(32, is_signed
=True)
1210 self
._ft
1 = bt2
.StringFieldType()
1211 self
._ft
2 = bt2
.FloatingPointNumberFieldType()
1212 self
._ft
3 = bt2
.IntegerFieldType(17)
1213 self
._ft
= bt2
.StructureFieldType()
1214 self
._ft
.append_field('A', self
._ft
0)
1215 self
._ft
.append_field('B', self
._ft
1)
1216 self
._ft
.append_field('C', self
._ft
2)
1217 self
._ft
.append_field('D', self
._ft
3)
1218 self
._def
= self
._ft
()
1219 self
._def
['A'] = -1872
1220 self
._def
['B'] = 'salut'
1221 self
._def
['C'] = 17.5
1222 self
._def
['D'] = 16497
1232 def _modify_def(self
):
1233 self
._def
['B'] = 'hola'
1235 def test_bool_op_true(self
):
1236 self
.assertTrue(self
._def
)
1238 def test_bool_op_false(self
):
1239 ft
= bt2
.StructureFieldType()
1241 self
.assertFalse(field
)
1244 self
.assertEqual(len(self
._def
), 4)
1246 def test_getitem(self
):
1247 field
= self
._def
['A']
1248 self
.assertIs(type(field
), bt2
.fields
._IntegerField
)
1249 self
.assertEqual(field
, -1872)
1251 def test_at_index_out_of_bounds_after(self
):
1252 with self
.assertRaises(IndexError):
1253 self
._def
.at_index(len(self
._ft
))
1256 ft
= bt2
.StructureFieldType()
1257 ft
.append_field('A', self
._ft
0)
1258 ft
.append_field('B', self
._ft
1)
1259 ft
.append_field('C', self
._ft
2)
1260 ft
.append_field('D', self
._ft
3)
1263 field
['B'] = 'salut'
1266 self
.assertEqual(self
._def
, field
)
1268 def test_eq_invalid_type(self
):
1269 self
.assertNotEqual(self
._def
, 23)
1271 def test_eq_diff_len(self
):
1272 ft
= bt2
.StructureFieldType()
1273 ft
.append_field('A', self
._ft
0)
1274 ft
.append_field('B', self
._ft
1)
1275 ft
.append_field('C', self
._ft
2)
1278 field
['B'] = 'salut'
1280 self
.assertNotEqual(self
._def
, field
)
1282 def test_eq_diff_content_same_len(self
):
1283 ft
= bt2
.StructureFieldType()
1284 ft
.append_field('A', self
._ft
0)
1285 ft
.append_field('B', self
._ft
1)
1286 ft
.append_field('C', self
._ft
2)
1287 ft
.append_field('D', self
._ft
3)
1290 field
['B'] = 'salut'
1293 self
.assertNotEqual(self
._def
, field
)
1295 def test_eq_same_content_diff_keys(self
):
1296 ft
= bt2
.StructureFieldType()
1297 ft
.append_field('A', self
._ft
0)
1298 ft
.append_field('B', self
._ft
1)
1299 ft
.append_field('E', self
._ft
2)
1300 ft
.append_field('D', self
._ft
3)
1303 field
['B'] = 'salut'
1306 self
.assertNotEqual(self
._def
, field
)
1308 def test_setitem(self
):
1309 self
._def
['C'] = -18.47
1310 self
.assertEqual(self
._def
['C'], -18.47)
1312 def test_setitem_int_field(self
):
1313 int_ft
= bt2
.IntegerFieldType(16)
1314 int_field
= int_ft()
1315 int_field
.value
= 19487
1316 self
._def
['D'] = int_field
1317 self
.assertEqual(self
._def
['D'], 19487)
1319 def test_setitem_non_basic_field(self
):
1320 elem_ft
= bt2
.StructureFieldType()
1321 elem_field
= elem_ft()
1322 struct_ft
= bt2
.StructureFieldType()
1323 struct_ft
.append_field('A', elem_ft
)
1324 struct_field
= struct_ft()
1326 with self
.assertRaises(TypeError):
1327 struct_field
['A'] = 23
1329 def test_setitem_none(self
):
1330 with self
.assertRaises(TypeError):
1331 self
._def
['C'] = None
1333 def test_setitem_key_wrong_type(self
):
1334 with self
.assertRaises(TypeError):
1337 def test_setitem_wrong_key(self
):
1338 with self
.assertRaises(KeyError):
1339 self
._def
['hi'] = 134679
1341 def test_at_index(self
):
1342 self
.assertEqual(self
._def
.at_index(1), 'salut')
1344 def test_iter(self
):
1352 for vkey
, vval
in self
._def
.items():
1353 val
= orig_values
[vkey
]
1354 self
.assertEqual(vval
, val
)
1356 def test_value(self
):
1363 self
.assertEqual(self
._def
, orig_values
)
1365 def test_set_value(self
):
1366 int_ft
= bt2
.IntegerFieldType(32)
1367 str_ft
= bt2
.StringFieldType()
1368 struct_ft
= bt2
.StructureFieldType()
1369 struct_ft
.append_field(field_type
=int_ft
, name
='an_int')
1370 struct_ft
.append_field(field_type
=str_ft
, name
='a_string')
1371 struct_ft
.append_field(field_type
=int_ft
, name
='another_int')
1374 'a_string': 'hello',
1378 struct
= struct_ft()
1379 struct
.value
= values
1380 self
.assertEqual(values
, struct
)
1382 bad_type_values
= copy
.deepcopy(values
)
1383 bad_type_values
['an_int'] = 'a string'
1384 with self
.assertRaises(TypeError):
1385 struct
.value
= bad_type_values
1387 unknown_key_values
= copy
.deepcopy(values
)
1388 unknown_key_values
['unknown_key'] = 16546
1389 with self
.assertRaises(KeyError):
1390 struct
.value
= unknown_key_values
1392 def test_value_rollback(self
):
1393 int_ft
= bt2
.IntegerFieldType(32)
1394 str_ft
= bt2
.StringFieldType()
1395 struct_ft
= bt2
.StructureFieldType()
1396 struct_ft
.append_field(field_type
=int_ft
, name
='an_int')
1397 struct_ft
.append_field(field_type
=str_ft
, name
='a_string')
1398 struct_ft
.append_field(field_type
=int_ft
, name
='another_int')
1401 'a_string': 'hello',
1407 class VariantFieldTestCase(_TestCopySimple
, unittest
.TestCase
):
1409 self
._tag
_ft
= bt2
.EnumerationFieldType(size
=32)
1410 self
._tag
_ft
.append_mapping('corner', 23)
1411 self
._tag
_ft
.append_mapping('zoom', 17, 20)
1412 self
._tag
_ft
.append_mapping('mellotron', 1001)
1413 self
._tag
_ft
.append_mapping('giorgio', 2000, 3000)
1414 self
._ft
0 = bt2
.IntegerFieldType(32, is_signed
=True)
1415 self
._ft
1 = bt2
.StringFieldType()
1416 self
._ft
2 = bt2
.FloatingPointNumberFieldType()
1417 self
._ft
3 = bt2
.IntegerFieldType(17)
1418 self
._ft
= bt2
.VariantFieldType('salut', self
._tag
_ft
)
1419 self
._ft
.append_field('corner', self
._ft
0)
1420 self
._ft
.append_field('zoom', self
._ft
1)
1421 self
._ft
.append_field('mellotron', self
._ft
2)
1422 self
._ft
.append_field('giorgio', self
._ft
3)
1423 self
._def
= self
._ft
()
1434 def test_bool_op_true(self
):
1435 tag_field
= self
._tag
_ft
(1001)
1436 self
._def
.field(tag_field
).value
= -17.34
1437 self
.assertTrue(self
._def
)
1439 def test_bool_op_false(self
):
1440 self
.assertFalse(self
._def
)
1442 def test_tag_field_none(self
):
1443 self
.assertIsNone(self
._def
.tag_field
)
1445 def test_tag_field(self
):
1446 tag_field
= self
._tag
_ft
(2800)
1447 self
._def
.field(tag_field
).value
= 1847
1448 self
.assertEqual(self
._def
.tag_field
, tag_field
)
1449 self
.assertEqual(self
._def
.tag_field
.addr
, tag_field
.addr
)
1451 def test_selected_field_none(self
):
1452 self
.assertIsNone(self
._def
.selected_field
)
1454 def test_selected_field(self
):
1455 var_field1
= self
._ft
()
1456 tag_field1
= self
._tag
_ft
(1001)
1457 var_field1
.field(tag_field1
).value
= -17.34
1458 self
.assertEqual(var_field1
.field(), -17.34)
1459 self
.assertEqual(var_field1
.selected_field
, -17.34)
1460 var_field2
= self
._ft
()
1461 tag_field2
= self
._tag
_ft
(2500)
1462 var_field2
.field(tag_field2
).value
= 1921
1463 self
.assertEqual(var_field2
.field(), 1921)
1464 self
.assertEqual(var_field2
.selected_field
, 1921)
1467 tag_ft
= bt2
.EnumerationFieldType(size
=32)
1468 tag_ft
.append_mapping('corner', 23)
1469 tag_ft
.append_mapping('zoom', 17, 20)
1470 tag_ft
.append_mapping('mellotron', 1001)
1471 tag_ft
.append_mapping('giorgio', 2000, 3000)
1472 ft0
= bt2
.IntegerFieldType(32, is_signed
=True)
1473 ft1
= bt2
.StringFieldType()
1474 ft2
= bt2
.FloatingPointNumberFieldType()
1475 ft3
= bt2
.IntegerFieldType(17)
1476 ft
= bt2
.VariantFieldType('salut', tag_ft
)
1477 ft
.append_field('corner', ft0
)
1478 ft
.append_field('zoom', ft1
)
1479 ft
.append_field('mellotron', ft2
)
1480 ft
.append_field('giorgio', ft3
)
1482 field_tag
= tag_ft(23)
1483 def_tag
= self
._tag
_ft
(23)
1484 field
.field(field_tag
).value
= 1774
1485 self
._def
.field(def_tag
).value
= 1774
1486 self
.assertEqual(self
._def
, field
)
1488 def test_eq_invalid_type(self
):
1489 self
.assertNotEqual(self
._def
, 23)