b60ed44d1c5a348f2017e0d66ef257f7ac31bbfd
[babeltrace.git] / tests / bindings / python / bt2 / test_fields.py
1 from functools import partial, partialmethod
2 import operator
3 import unittest
4 import numbers
5 import math
6 import copy
7 import bt2
8
9
10 class _TestCopySimple:
11 def test_copy(self):
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)
16
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)
22
23
24 _COMP_BINOPS = (
25 operator.eq,
26 operator.ne,
27 )
28
29
30 class _TestNumericField(_TestCopySimple):
31 def _binop(self, op, rhs):
32 rexc = None
33 rvexc = None
34 comp_value = rhs
35
36 if isinstance(rhs, (bt2.fields._IntegerField, bt2.fields._FloatingPointNumberField)):
37 comp_value = rhs.value
38
39 try:
40 r = op(self._def, rhs)
41 except Exception as e:
42 rexc = e
43
44 try:
45 rv = op(self._def_value, comp_value)
46 except Exception as e:
47 rvexc = e
48
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))
55 return None, None
56
57 return r, rv
58
59 def _unaryop(self, op):
60 rexc = None
61 rvexc = None
62
63 try:
64 r = op(self._def)
65 except Exception as e:
66 rexc = e
67
68 try:
69 rv = op(self._def_value)
70 except Exception as e:
71 rvexc = e
72
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))
79 return None, None
80
81 return r, rv
82
83 def _test_unaryop_type(self, op):
84 r, rv = self._unaryop(op)
85
86 if r is None:
87 return
88
89 self.assertIsInstance(r, type(rv))
90
91 def _test_unaryop_value(self, op):
92 r, rv = self._unaryop(op)
93
94 if r is None:
95 return
96
97 self.assertEqual(r, rv)
98
99 def _test_unaryop_addr_same(self, op):
100 addr_before = self._def.addr
101 self._unaryop(op)
102 self.assertEqual(self._def.addr, addr_before)
103
104 def _test_unaryop_value_same(self, op):
105 value_before = self._def.value
106 self._unaryop(op)
107 self.assertEqual(self._def.value, value_before)
108
109 def _test_binop_type(self, op, rhs):
110 r, rv = self._binop(op, rhs)
111
112 if r is None:
113 return
114
115 if op in _COMP_BINOPS:
116 # __eq__() and __ne__() always return a 'bool' object
117 self.assertIsInstance(r, bool)
118 else:
119 self.assertIsInstance(r, type(rv))
120
121 def _test_binop_value(self, op, rhs):
122 r, rv = self._binop(op, rhs)
123
124 if r is None:
125 return
126
127 self.assertEqual(r, rv)
128
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)
133
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)
138
139 def _test_binop_invalid_unknown(self, op):
140 if op in _COMP_BINOPS:
141 self.skipTest('not testing')
142
143 class A:
144 pass
145
146 with self.assertRaises(TypeError):
147 op(self._def, A())
148
149 def _test_binop_invalid_none(self, op):
150 if op in _COMP_BINOPS:
151 self.skipTest('not testing')
152
153 with self.assertRaises(TypeError):
154 op(self._def, None)
155
156 def _test_ibinop_value(self, op, rhs):
157 r, rv = self._binop(op, rhs)
158
159 if r is None:
160 return
161
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
169 # example:
170 #
171 # int_value_obj += 3.3
172 #
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):
181 rv = int(rv)
182
183 self.assertEqual(r, rv)
184
185 def _test_ibinop_type(self, op, rhs):
186 r, rv = self._binop(op, rhs)
187
188 if r is None:
189 return
190
191 self.assertIs(r, self._def)
192
193 def _test_ibinop_invalid_unknown(self, op):
194 class A:
195 pass
196
197 with self.assertRaises(TypeError):
198 op(self._def, A())
199
200 def _test_ibinop_invalid_none(self, op):
201 with self.assertRaises(TypeError):
202 op(self._def, None)
203
204 def _test_binop_rhs_false(self, test_cb, op):
205 test_cb(op, False)
206
207 def _test_binop_rhs_true(self, test_cb, op):
208 test_cb(op, True)
209
210 def _test_binop_rhs_pos_int(self, test_cb, op):
211 test_cb(op, 2)
212
213 def _test_binop_rhs_neg_int(self, test_cb, op):
214 test_cb(op, -23)
215
216 def _test_binop_rhs_zero_int(self, test_cb, op):
217 test_cb(op, 0)
218
219 def _test_binop_rhs_pos_vint(self, test_cb, op):
220 test_cb(op, bt2.create_value(2))
221
222 def _test_binop_rhs_neg_vint(self, test_cb, op):
223 test_cb(op, bt2.create_value(-23))
224
225 def _test_binop_rhs_zero_vint(self, test_cb, op):
226 test_cb(op, bt2.create_value(0))
227
228 def _test_binop_rhs_pos_float(self, test_cb, op):
229 test_cb(op, 2.2)
230
231 def _test_binop_rhs_neg_float(self, test_cb, op):
232 test_cb(op, -23.4)
233
234 def _test_binop_rhs_zero_float(self, test_cb, op):
235 test_cb(op, 0.0)
236
237 def _test_binop_rhs_pos_vfloat(self, test_cb, op):
238 test_cb(op, bt2.create_value(2.2))
239
240 def _test_binop_rhs_neg_vfloat(self, test_cb, op):
241 test_cb(op, bt2.create_value(-23.4))
242
243 def _test_binop_rhs_zero_vfloat(self, test_cb, op):
244 test_cb(op, bt2.create_value(0.0))
245
246 def _test_binop_type_false(self, op):
247 self._test_binop_rhs_false(self._test_binop_type, op)
248
249 def _test_binop_type_true(self, op):
250 self._test_binop_rhs_true(self._test_binop_type, op)
251
252 def _test_binop_type_pos_int(self, op):
253 self._test_binop_rhs_pos_int(self._test_binop_type, op)
254
255 def _test_binop_type_neg_int(self, op):
256 self._test_binop_rhs_neg_int(self._test_binop_type, op)
257
258 def _test_binop_type_zero_int(self, op):
259 self._test_binop_rhs_zero_int(self._test_binop_type, op)
260
261 def _test_binop_type_pos_vint(self, op):
262 self._test_binop_rhs_pos_vint(self._test_binop_type, op)
263
264 def _test_binop_type_neg_vint(self, op):
265 self._test_binop_rhs_neg_vint(self._test_binop_type, op)
266
267 def _test_binop_type_zero_vint(self, op):
268 self._test_binop_rhs_zero_vint(self._test_binop_type, op)
269
270 def _test_binop_type_pos_float(self, op):
271 self._test_binop_rhs_pos_float(self._test_binop_type, op)
272
273 def _test_binop_type_neg_float(self, op):
274 self._test_binop_rhs_neg_float(self._test_binop_type, op)
275
276 def _test_binop_type_zero_float(self, op):
277 self._test_binop_rhs_zero_float(self._test_binop_type, op)
278
279 def _test_binop_type_pos_vfloat(self, op):
280 self._test_binop_rhs_pos_vfloat(self._test_binop_type, op)
281
282 def _test_binop_type_neg_vfloat(self, op):
283 self._test_binop_rhs_neg_vfloat(self._test_binop_type, op)
284
285 def _test_binop_type_zero_vfloat(self, op):
286 self._test_binop_rhs_zero_vfloat(self._test_binop_type, op)
287
288 def _test_binop_value_false(self, op):
289 self._test_binop_rhs_false(self._test_binop_value, op)
290
291 def _test_binop_value_true(self, op):
292 self._test_binop_rhs_true(self._test_binop_value, op)
293
294 def _test_binop_value_pos_int(self, op):
295 self._test_binop_rhs_pos_int(self._test_binop_value, op)
296
297 def _test_binop_value_neg_int(self, op):
298 self._test_binop_rhs_neg_int(self._test_binop_value, op)
299
300 def _test_binop_value_zero_int(self, op):
301 self._test_binop_rhs_zero_int(self._test_binop_value, op)
302
303 def _test_binop_value_pos_vint(self, op):
304 self._test_binop_rhs_pos_vint(self._test_binop_value, op)
305
306 def _test_binop_value_neg_vint(self, op):
307 self._test_binop_rhs_neg_vint(self._test_binop_value, op)
308
309 def _test_binop_value_zero_vint(self, op):
310 self._test_binop_rhs_zero_vint(self._test_binop_value, op)
311
312 def _test_binop_value_pos_float(self, op):
313 self._test_binop_rhs_pos_float(self._test_binop_value, op)
314
315 def _test_binop_value_neg_float(self, op):
316 self._test_binop_rhs_neg_float(self._test_binop_value, op)
317
318 def _test_binop_value_zero_float(self, op):
319 self._test_binop_rhs_zero_float(self._test_binop_value, op)
320
321 def _test_binop_value_pos_vfloat(self, op):
322 self._test_binop_rhs_pos_vfloat(self._test_binop_value, op)
323
324 def _test_binop_value_neg_vfloat(self, op):
325 self._test_binop_rhs_neg_vfloat(self._test_binop_value, op)
326
327 def _test_binop_value_zero_vfloat(self, op):
328 self._test_binop_rhs_zero_vfloat(self._test_binop_value, op)
329
330 def _test_binop_lhs_addr_same_false(self, op):
331 self._test_binop_rhs_false(self._test_binop_lhs_addr_same, op)
332
333 def _test_binop_lhs_addr_same_true(self, op):
334 self._test_binop_rhs_true(self._test_binop_lhs_addr_same, op)
335
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)
338
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)
341
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)
344
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)
347
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)
350
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)
353
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)
356
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)
359
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)
362
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)
365
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)
368
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)
371
372 def _test_binop_lhs_value_same_false(self, op):
373 self._test_binop_rhs_false(self._test_binop_lhs_value_same, op)
374
375 def _test_binop_lhs_value_same_true(self, op):
376 self._test_binop_rhs_true(self._test_binop_lhs_value_same, op)
377
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)
380
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)
383
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)
386
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)
389
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)
392
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)
395
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)
398
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)
401
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)
404
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)
407
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)
410
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)
413
414 def _test_ibinop_type_false(self, op):
415 self._test_binop_rhs_false(self._test_ibinop_type, op)
416
417 def _test_ibinop_type_true(self, op):
418 self._test_binop_rhs_true(self._test_ibinop_type, op)
419
420 def _test_ibinop_type_pos_int(self, op):
421 self._test_binop_rhs_pos_int(self._test_ibinop_type, op)
422
423 def _test_ibinop_type_neg_int(self, op):
424 self._test_binop_rhs_neg_int(self._test_ibinop_type, op)
425
426 def _test_ibinop_type_zero_int(self, op):
427 self._test_binop_rhs_zero_int(self._test_ibinop_type, op)
428
429 def _test_ibinop_type_pos_vint(self, op):
430 self._test_binop_rhs_pos_vint(self._test_ibinop_type, op)
431
432 def _test_ibinop_type_neg_vint(self, op):
433 self._test_binop_rhs_neg_vint(self._test_ibinop_type, op)
434
435 def _test_ibinop_type_zero_vint(self, op):
436 self._test_binop_rhs_zero_vint(self._test_ibinop_type, op)
437
438 def _test_ibinop_type_pos_float(self, op):
439 self._test_binop_rhs_pos_float(self._test_ibinop_type, op)
440
441 def _test_ibinop_type_neg_float(self, op):
442 self._test_binop_rhs_neg_float(self._test_ibinop_type, op)
443
444 def _test_ibinop_type_zero_float(self, op):
445 self._test_binop_rhs_zero_float(self._test_ibinop_type, op)
446
447 def _test_ibinop_type_pos_vfloat(self, op):
448 self._test_binop_rhs_pos_vfloat(self._test_ibinop_type, op)
449
450 def _test_ibinop_type_neg_vfloat(self, op):
451 self._test_binop_rhs_neg_vfloat(self._test_ibinop_type, op)
452
453 def _test_ibinop_type_zero_vfloat(self, op):
454 self._test_binop_rhs_zero_vfloat(self._test_ibinop_type, op)
455
456 def _test_ibinop_value_false(self, op):
457 self._test_binop_rhs_false(self._test_ibinop_value, op)
458
459 def _test_ibinop_value_true(self, op):
460 self._test_binop_rhs_true(self._test_ibinop_value, op)
461
462 def _test_ibinop_value_pos_int(self, op):
463 self._test_binop_rhs_pos_int(self._test_ibinop_value, op)
464
465 def _test_ibinop_value_neg_int(self, op):
466 self._test_binop_rhs_neg_int(self._test_ibinop_value, op)
467
468 def _test_ibinop_value_zero_int(self, op):
469 self._test_binop_rhs_zero_int(self._test_ibinop_value, op)
470
471 def _test_ibinop_value_pos_vint(self, op):
472 self._test_binop_rhs_pos_vint(self._test_ibinop_value, op)
473
474 def _test_ibinop_value_neg_vint(self, op):
475 self._test_binop_rhs_neg_vint(self._test_ibinop_value, op)
476
477 def _test_ibinop_value_zero_vint(self, op):
478 self._test_binop_rhs_zero_vint(self._test_ibinop_value, op)
479
480 def _test_ibinop_value_pos_float(self, op):
481 self._test_binop_rhs_pos_float(self._test_ibinop_value, op)
482
483 def _test_ibinop_value_neg_float(self, op):
484 self._test_binop_rhs_neg_float(self._test_ibinop_value, op)
485
486 def _test_ibinop_value_zero_float(self, op):
487 self._test_binop_rhs_zero_float(self._test_ibinop_value, op)
488
489 def _test_ibinop_value_pos_vfloat(self, op):
490 self._test_binop_rhs_pos_vfloat(self._test_ibinop_value, op)
491
492 def _test_ibinop_value_neg_vfloat(self, op):
493 self._test_binop_rhs_neg_vfloat(self._test_ibinop_value, op)
494
495 def _test_ibinop_value_zero_vfloat(self, op):
496 self._test_binop_rhs_zero_vfloat(self._test_ibinop_value, op)
497
498 def test_bool_op(self):
499 self.assertEqual(bool(self._def), bool(self._def_value))
500
501 def test_int_op(self):
502 self.assertEqual(int(self._def), int(self._def_value))
503
504 def test_float_op(self):
505 self.assertEqual(float(self._def), float(self._def_value))
506
507 def test_complex_op(self):
508 self.assertEqual(complex(self._def), complex(self._def_value))
509
510 def test_str_op(self):
511 self.assertEqual(str(self._def), str(self._def_value))
512
513 def test_eq_none(self):
514 self.assertFalse(self._def == None)
515
516 def test_ne_none(self):
517 self.assertTrue(self._def != None)
518
519
520 _BINOPS = (
521 ('lt', operator.lt),
522 ('le', operator.le),
523 ('eq', operator.eq),
524 ('ne', operator.ne),
525 ('ge', operator.ge),
526 ('gt', operator.gt),
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)),
551 )
552
553
554 _IBINOPS = (
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),
567 )
568
569
570 _UNARYOPS = (
571 ('neg', operator.neg),
572 ('pos', operator.pos),
573 ('abs', operator.abs),
574 ('invert', operator.invert),
575 ('round', round),
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)),
580 ('ceil', math.ceil),
581 ('floor', math.floor),
582 ('trunc', math.trunc),
583 )
584
585
586 def _inject_numeric_testing_methods(cls):
587 def test_binop_name(suffix):
588 return 'test_binop_{}_{}'.format(name, suffix)
589
590 def test_ibinop_name(suffix):
591 return 'test_ibinop_{}_{}'.format(name, suffix)
592
593 def test_unaryop_name(suffix):
594 return 'test_unaryop_{}_{}'.format(name, suffix)
595
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))
656
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))
663
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))
696
697
698 class _TestIntegerFieldCommon(_TestNumericField):
699 def test_assign_true(self):
700 raw = True
701 self._def.value = raw
702 self.assertEqual(self._def, raw)
703 self.assertEqual(self._def.value, raw)
704
705 def test_assign_false(self):
706 raw = False
707 self._def.value = raw
708 self.assertEqual(self._def, raw)
709 self.assertEqual(self._def.value, raw)
710
711 def test_assign_pos_int(self):
712 raw = 477
713 self._def.value = raw
714 self.assertEqual(self._def, raw)
715 self.assertEqual(self._def.value, raw)
716
717 def test_assign_neg_int(self):
718 raw = -13
719 self._def.value = raw
720 self.assertEqual(self._def, raw)
721 self.assertEqual(self._def.value, raw)
722
723 def test_assign_int_field(self):
724 raw = 999
725 field = self._ft()
726 field.value = raw
727 self._def.value = field
728 self.assertEqual(self._def, raw)
729 self.assertEqual(self._def.value, raw)
730
731 def test_assign_float(self):
732 raw = 123.456
733 self._def.value = raw
734 self.assertEqual(self._def, int(raw))
735 self.assertEqual(self._def.value, int(raw))
736
737 def test_assign_invalid_type(self):
738 with self.assertRaises(TypeError):
739 self._def.value = 'yes'
740
741 def test_assign_uint(self):
742 ft = bt2.IntegerFieldType(size=32, is_signed=False)
743 field = ft()
744 raw = 1777
745 field.value = 1777
746 self.assertEqual(field, raw)
747 self.assertEqual(field.value, raw)
748
749 def test_assign_uint_invalid_neg(self):
750 ft = bt2.IntegerFieldType(size=32, is_signed=False)
751 field = ft()
752
753 with self.assertRaises(ValueError):
754 field.value = -23
755
756
757 _inject_numeric_testing_methods(_TestIntegerFieldCommon)
758
759
760 class IntegerFieldTestCase(_TestIntegerFieldCommon, unittest.TestCase):
761 def setUp(self):
762 self._ft = bt2.IntegerFieldType(25, is_signed=True)
763 self._field = self._ft()
764 self._def = self._ft()
765 self._def.value = 17
766 self._def_value = 17
767 self._def_new_value = -101
768
769 def tearDown(self):
770 del self._ft
771 del self._field
772 del self._def
773
774
775 class EnumerationFieldTestCase(_TestIntegerFieldCommon, unittest.TestCase):
776 def setUp(self):
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()
784 self._def.value = 17
785 self._def_value = 17
786 self._def_new_value = -101
787
788 def tearDown(self):
789 del self._ft
790 del self._def
791
792 def test_mappings(self):
793 mappings = (
794 ('whole range', -(2 ** 31), (2 ** 31) - 1),
795 ('something', 17, 17),
796 ('zip', -45, 1001),
797 )
798
799 total = 0
800 index_set = set()
801
802 for fm in self._def.mappings:
803 total += 1
804 for index, mapping in enumerate(mappings):
805 if fm.name == mapping[0] and fm.lower == mapping[1] and fm.upper == mapping[2]:
806 index_set.add(index)
807
808 self.assertEqual(total, 3)
809 self.assertTrue(0 in index_set and 1 in index_set and 2 in index_set)
810
811
812 class FloatingPointNumberFieldTestCase(_TestNumericField, unittest.TestCase):
813 def setUp(self):
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
820
821 def tearDown(self):
822 del self._ft
823 del self._field
824 del self._def
825
826 def _test_invalid_op(self, cb):
827 with self.assertRaises(TypeError):
828 cb()
829
830 def test_assign_true(self):
831 self._def.value = True
832 self.assertTrue(self._def)
833 self.assertTrue(self._def.value)
834
835 def test_assign_false(self):
836 self._def.value = False
837 self.assertFalse(self._def)
838 self.assertFalse(self._def.value)
839
840 def test_assign_pos_int(self):
841 raw = 477
842 self._def.value = raw
843 self.assertEqual(self._def, float(raw))
844 self.assertEqual(self._def.value, float(raw))
845
846 def test_assign_neg_int(self):
847 raw = -13
848 self._def.value = raw
849 self.assertEqual(self._def, float(raw))
850 self.assertEqual(self._def.value, float(raw))
851
852 def test_assign_int_field(self):
853 ft = bt2.IntegerFieldType(32)
854 field = ft()
855 raw = 999
856 field.value = raw
857 self._def.value = field
858 self.assertEqual(self._def, float(raw))
859 self.assertEqual(self._def.value, float(raw))
860
861 def test_assign_float(self):
862 raw = -19.23
863 self._def.value = raw
864 self.assertEqual(self._def, raw)
865 self.assertEqual(self._def.value, raw)
866
867 def test_assign_float_field(self):
868 ft = bt2.FloatingPointNumberFieldType(32)
869 field = ft()
870 raw = 101.32
871 field.value = raw
872 self._def.value = field
873 self.assertEqual(self._def, raw)
874 self.assertEqual(self._def.value, raw)
875
876 def test_assign_invalid_type(self):
877 with self.assertRaises(TypeError):
878 self._def.value = 'yes'
879
880 def test_invalid_lshift(self):
881 self._test_invalid_op(lambda: self._def << 23)
882
883 def test_invalid_rshift(self):
884 self._test_invalid_op(lambda: self._def >> 23)
885
886 def test_invalid_and(self):
887 self._test_invalid_op(lambda: self._def & 23)
888
889 def test_invalid_or(self):
890 self._test_invalid_op(lambda: self._def | 23)
891
892 def test_invalid_xor(self):
893 self._test_invalid_op(lambda: self._def ^ 23)
894
895 def test_invalid_invert(self):
896 self._test_invalid_op(lambda: ~self._def)
897
898
899 _inject_numeric_testing_methods(FloatingPointNumberFieldTestCase)
900
901
902 class StringFieldTestCase(_TestCopySimple, unittest.TestCase):
903 def setUp(self):
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!'
909
910 def tearDown(self):
911 del self._ft
912 del self._def
913
914 def test_assign_int(self):
915 with self.assertRaises(TypeError):
916 self._def.value = 283
917
918 def test_assign_string_field(self):
919 ft = bt2.StringFieldType()
920 field = ft()
921 raw = 'zorg'
922 field.value = raw
923 self.assertEqual(field, raw)
924
925 def test_eq(self):
926 self.assertEqual(self._def, self._def_value)
927
928 def test_eq(self):
929 self.assertNotEqual(self._def, 23)
930
931 def test_lt_vstring(self):
932 s1 = self._ft()
933 s1.value = 'allo'
934 s2 = self._ft()
935 s2.value = 'bateau'
936 self.assertLess(s1, s2)
937
938 def test_lt_string(self):
939 s1 = self._ft()
940 s1.value = 'allo'
941 self.assertLess(s1, 'bateau')
942
943 def test_le_vstring(self):
944 s1 = self._ft()
945 s1.value = 'allo'
946 s2 = self._ft()
947 s2.value = 'bateau'
948 self.assertLessEqual(s1, s2)
949
950 def test_le_string(self):
951 s1 = self._ft()
952 s1.value = 'allo'
953 self.assertLessEqual(s1, 'bateau')
954
955 def test_gt_vstring(self):
956 s1 = self._ft()
957 s1.value = 'allo'
958 s2 = self._ft()
959 s2.value = 'bateau'
960 self.assertGreater(s2, s1)
961
962 def test_gt_string(self):
963 s1 = self._ft()
964 s1.value = 'allo'
965 self.assertGreater('bateau', s1)
966
967 def test_ge_vstring(self):
968 s1 = self._ft()
969 s1.value = 'allo'
970 s2 = self._ft()
971 s2.value = 'bateau'
972 self.assertGreaterEqual(s2, s1)
973
974 def test_ge_string(self):
975 s1 = self._ft()
976 s1.value = 'allo'
977 self.assertGreaterEqual('bateau', s1)
978
979 def test_bool_op(self):
980 self.assertEqual(bool(self._def), bool(self._def_value))
981
982 def test_str_op(self):
983 self.assertEqual(str(self._def), str(self._def_value))
984
985 def test_len(self):
986 self.assertEqual(len(self._def), len(self._def_value))
987
988 def test_getitem(self):
989 self.assertEqual(self._def[5], self._def_value[5])
990
991 def test_append_str(self):
992 to_append = 'meow meow meow'
993 self._def += to_append
994 self._def_value += to_append
995 self.assertEqual(self._def, self._def_value)
996
997 def test_append_string_field(self):
998 ft = bt2.StringFieldType()
999 field = ft()
1000 to_append = 'meow meow meow'
1001 field.value = to_append
1002 self._def += field
1003 self._def_value += to_append
1004 self.assertEqual(self._def, self._def_value)
1005
1006
1007 class _TestArraySequenceFieldCommon(_TestCopySimple):
1008 def _modify_def(self):
1009 self._def[2] = 23
1010
1011 def test_bool_op_true(self):
1012 self.assertTrue(self._def)
1013
1014 def test_len(self):
1015 self.assertEqual(len(self._def), 3)
1016
1017 def test_getitem(self):
1018 field = self._def[1]
1019 self.assertIs(type(field), bt2.fields._IntegerField)
1020 self.assertEqual(field, 1847)
1021
1022 def test_eq(self):
1023 ft = bt2.ArrayFieldType(self._elem_ft, 3)
1024 field = ft()
1025 field[0] = 45
1026 field[1] = 1847
1027 field[2] = 1948754
1028 self.assertEqual(self._def, field)
1029
1030 def test_eq_invalid_type(self):
1031 self.assertNotEqual(self._def, 23)
1032
1033 def test_eq_diff_len(self):
1034 ft = bt2.ArrayFieldType(self._elem_ft, 2)
1035 field = ft()
1036 field[0] = 45
1037 field[1] = 1847
1038 self.assertNotEqual(self._def, field)
1039
1040 def test_eq_diff_content_same_len(self):
1041 ft = bt2.ArrayFieldType(self._elem_ft, 3)
1042 field = ft()
1043 field[0] = 45
1044 field[1] = 1846
1045 field[2] = 1948754
1046 self.assertNotEqual(self._def, field)
1047
1048 def test_setitem(self):
1049 self._def[2] = 24
1050 self.assertEqual(self._def[2], 24)
1051
1052 def test_setitem_int_field(self):
1053 int_field = self._elem_ft()
1054 int_field.value = 19487
1055 self._def[1] = int_field
1056 self.assertEqual(self._def[1], 19487)
1057
1058 def test_setitem_non_basic_field(self):
1059 elem_ft = bt2.StructureFieldType()
1060 array_ft = bt2.ArrayFieldType(elem_ft, 3)
1061 elem_field = elem_ft()
1062 array_field = array_ft()
1063
1064 with self.assertRaises(TypeError):
1065 array_field[1] = 23
1066
1067 def test_setitem_none(self):
1068 with self.assertRaises(TypeError):
1069 self._def[1] = None
1070
1071 def test_setitem_index_wrong_type(self):
1072 with self.assertRaises(TypeError):
1073 self._def['yes'] = 23
1074
1075 def test_setitem_index_neg(self):
1076 with self.assertRaises(IndexError):
1077 self._def[-2] = 23
1078
1079 def test_setitem_index_out_of_range(self):
1080 with self.assertRaises(IndexError):
1081 self._def[len(self._def)] = 134679
1082
1083 def test_iter(self):
1084 for field, value in zip(self._def, (45, 1847, 1948754)):
1085 self.assertEqual(field, value)
1086
1087 def test_value_int_field(self):
1088 values = [45646, 145, 12145]
1089 self._def.value = values
1090 self.assertEqual(values, self._def)
1091
1092 def test_value_unset(self):
1093 values = [45646, None, 12145]
1094 self._def.value = values
1095 self.assertFalse(self._def[1].is_set)
1096
1097 def test_value_rollback(self):
1098 values = [45, 1847, 1948754]
1099 # value is out of range, should not affect those we set previously
1100 with self.assertRaises(bt2.Error):
1101 self._def[2].value = 2**60
1102 self.assertEqual(values, self._def)
1103
1104 def test_value_check_sequence(self):
1105 values = 42
1106 with self.assertRaises(TypeError):
1107 self._def.value = values
1108
1109 def test_value_wrong_type_in_sequence(self):
1110 values = [32, 'hello', 11]
1111 with self.assertRaises(TypeError):
1112 self._def.value = values
1113
1114 def test_value_complex_type(self):
1115 struct_ft = bt2.StructureFieldType()
1116 int_ft = bt2.IntegerFieldType(32)
1117 str_ft = bt2.StringFieldType()
1118 struct_ft.append_field(field_type=int_ft, name='an_int')
1119 struct_ft.append_field(field_type=str_ft, name='a_string')
1120 struct_ft.append_field(field_type=int_ft, name='another_int')
1121 array_ft = bt2.ArrayFieldType(struct_ft, 3)
1122 values = [
1123 {
1124 'an_int': 42,
1125 'a_string': 'hello',
1126 'another_int': 66
1127 },
1128 {
1129 'an_int': 1,
1130 'a_string': 'goodbye',
1131 'another_int': 488
1132 },
1133 {
1134 'an_int': 156,
1135 'a_string': 'or not',
1136 'another_int': 4648
1137 },
1138 ]
1139
1140 array = array_ft()
1141 array.value = values
1142 self.assertEqual(values, array)
1143 values[0]['an_int'] = 'a string'
1144 with self.assertRaises(TypeError):
1145 array.value = values
1146
1147 class ArrayFieldTestCase(_TestArraySequenceFieldCommon, unittest.TestCase):
1148 def setUp(self):
1149 self._elem_ft = bt2.IntegerFieldType(32)
1150 self._ft = bt2.ArrayFieldType(self._elem_ft, 3)
1151 self._def = self._ft()
1152 self._def[0] = 45
1153 self._def[1] = 1847
1154 self._def[2] = 1948754
1155 self._def_value = [45, 1847, 1948754]
1156
1157 def tearDown(self):
1158 del self._elem_ft
1159 del self._ft
1160 del self._def
1161
1162 def test_value_wrong_len(self):
1163 values = [45, 1847]
1164 with self.assertRaises(ValueError):
1165 self._def.value = values
1166
1167
1168 class SequenceFieldTestCase(_TestArraySequenceFieldCommon, unittest.TestCase):
1169 def setUp(self):
1170 self._elem_ft = bt2.IntegerFieldType(32)
1171 self._ft = bt2.SequenceFieldType(self._elem_ft, 'the.length')
1172 self._def = self._ft()
1173 self._length_field = self._elem_ft(3)
1174 self._def.length_field = self._length_field
1175 self._def[0] = 45
1176 self._def[1] = 1847
1177 self._def[2] = 1948754
1178 self._def_value = [45, 1847, 1948754]
1179
1180 def tearDown(self):
1181 del self._elem_ft
1182 del self._ft
1183 del self._def
1184 del self._length_field
1185
1186 def test_value_resize(self):
1187 new_values = [1, 2, 3, 4]
1188 self._def.value = new_values
1189 self.assertCountEqual(self._def, new_values)
1190
1191 def test_value_resize_rollback(self):
1192 with self.assertRaises(TypeError):
1193 self._def.value = [1, 2, 3, 'unexpected string']
1194 self.assertEqual(self._def, self._def_value)
1195
1196 self._def.reset()
1197 with self.assertRaises(TypeError):
1198 self._def.value = [1, 2, 3, 'unexpected string']
1199 self.assertFalse(self._def.is_set)
1200
1201
1202 class StructureFieldTestCase(_TestCopySimple, unittest.TestCase):
1203 def setUp(self):
1204 self._ft0 = bt2.IntegerFieldType(32, is_signed=True)
1205 self._ft1 = bt2.StringFieldType()
1206 self._ft2 = bt2.FloatingPointNumberFieldType()
1207 self._ft3 = bt2.IntegerFieldType(17)
1208 self._ft = bt2.StructureFieldType()
1209 self._ft.append_field('A', self._ft0)
1210 self._ft.append_field('B', self._ft1)
1211 self._ft.append_field('C', self._ft2)
1212 self._ft.append_field('D', self._ft3)
1213 self._def = self._ft()
1214 self._def['A'] = -1872
1215 self._def['B'] = 'salut'
1216 self._def['C'] = 17.5
1217 self._def['D'] = 16497
1218
1219 def tearDown(self):
1220 del self._ft0
1221 del self._ft1
1222 del self._ft2
1223 del self._ft3
1224 del self._ft
1225 del self._def
1226
1227 def _modify_def(self):
1228 self._def['B'] = 'hola'
1229
1230 def test_bool_op_true(self):
1231 self.assertTrue(self._def)
1232
1233 def test_bool_op_false(self):
1234 ft = bt2.StructureFieldType()
1235 field = ft()
1236 self.assertFalse(field)
1237
1238 def test_len(self):
1239 self.assertEqual(len(self._def), 4)
1240
1241 def test_getitem(self):
1242 field = self._def['A']
1243 self.assertIs(type(field), bt2.fields._IntegerField)
1244 self.assertEqual(field, -1872)
1245
1246 def test_at_index_out_of_bounds_after(self):
1247 with self.assertRaises(IndexError):
1248 self._def.at_index(len(self._ft))
1249
1250 def test_eq(self):
1251 ft = bt2.StructureFieldType()
1252 ft.append_field('A', self._ft0)
1253 ft.append_field('B', self._ft1)
1254 ft.append_field('C', self._ft2)
1255 ft.append_field('D', self._ft3)
1256 field = ft()
1257 field['A'] = -1872
1258 field['B'] = 'salut'
1259 field['C'] = 17.5
1260 field['D'] = 16497
1261 self.assertEqual(self._def, field)
1262
1263 def test_eq_invalid_type(self):
1264 self.assertNotEqual(self._def, 23)
1265
1266 def test_eq_diff_len(self):
1267 ft = bt2.StructureFieldType()
1268 ft.append_field('A', self._ft0)
1269 ft.append_field('B', self._ft1)
1270 ft.append_field('C', self._ft2)
1271 field = ft()
1272 field['A'] = -1872
1273 field['B'] = 'salut'
1274 field['C'] = 17.5
1275 self.assertNotEqual(self._def, field)
1276
1277 def test_eq_diff_content_same_len(self):
1278 ft = bt2.StructureFieldType()
1279 ft.append_field('A', self._ft0)
1280 ft.append_field('B', self._ft1)
1281 ft.append_field('C', self._ft2)
1282 ft.append_field('D', self._ft3)
1283 field = ft()
1284 field['A'] = -1872
1285 field['B'] = 'salut'
1286 field['C'] = 17.4
1287 field['D'] = 16497
1288 self.assertNotEqual(self._def, field)
1289
1290 def test_eq_same_content_diff_keys(self):
1291 ft = bt2.StructureFieldType()
1292 ft.append_field('A', self._ft0)
1293 ft.append_field('B', self._ft1)
1294 ft.append_field('E', self._ft2)
1295 ft.append_field('D', self._ft3)
1296 field = ft()
1297 field['A'] = -1872
1298 field['B'] = 'salut'
1299 field['E'] = 17.4
1300 field['D'] = 16497
1301 self.assertNotEqual(self._def, field)
1302
1303 def test_setitem(self):
1304 self._def['C'] = -18.47
1305 self.assertEqual(self._def['C'], -18.47)
1306
1307 def test_setitem_int_field(self):
1308 int_ft = bt2.IntegerFieldType(16)
1309 int_field = int_ft()
1310 int_field.value = 19487
1311 self._def['D'] = int_field
1312 self.assertEqual(self._def['D'], 19487)
1313
1314 def test_setitem_non_basic_field(self):
1315 elem_ft = bt2.StructureFieldType()
1316 elem_field = elem_ft()
1317 struct_ft = bt2.StructureFieldType()
1318 struct_ft.append_field('A', elem_ft)
1319 struct_field = struct_ft()
1320
1321 with self.assertRaises(TypeError):
1322 struct_field['A'] = 23
1323
1324 def test_setitem_none(self):
1325 with self.assertRaises(TypeError):
1326 self._def['C'] = None
1327
1328 def test_setitem_key_wrong_type(self):
1329 with self.assertRaises(TypeError):
1330 self._def[3] = 23
1331
1332 def test_setitem_wrong_key(self):
1333 with self.assertRaises(KeyError):
1334 self._def['hi'] = 134679
1335
1336 def test_at_index(self):
1337 self.assertEqual(self._def.at_index(1), 'salut')
1338
1339 def test_iter(self):
1340 orig_values = {
1341 'A': -1872,
1342 'B': 'salut',
1343 'C': 17.5,
1344 'D': 16497,
1345 }
1346
1347 for vkey, vval in self._def.items():
1348 val = orig_values[vkey]
1349 self.assertEqual(vval, val)
1350
1351 def test_value(self):
1352 orig_values = {
1353 'A': -1872,
1354 'B': 'salut',
1355 'C': 17.5,
1356 'D': 16497,
1357 }
1358 self.assertEqual(self._def, orig_values)
1359
1360 def test_set_value(self):
1361 int_ft = bt2.IntegerFieldType(32)
1362 str_ft = bt2.StringFieldType()
1363 struct_ft = bt2.StructureFieldType()
1364 struct_ft.append_field(field_type=int_ft, name='an_int')
1365 struct_ft.append_field(field_type=str_ft, name='a_string')
1366 struct_ft.append_field(field_type=int_ft, name='another_int')
1367 values = {
1368 'an_int': 42,
1369 'a_string': 'hello',
1370 'another_int': 66
1371 }
1372
1373 struct = struct_ft()
1374 struct.value = values
1375 self.assertEqual(values, struct)
1376
1377 bad_type_values = copy.deepcopy(values)
1378 bad_type_values['an_int'] = 'a string'
1379 with self.assertRaises(TypeError):
1380 struct.value = bad_type_values
1381
1382 unknown_key_values = copy.deepcopy(values)
1383 unknown_key_values['unknown_key'] = 16546
1384 with self.assertRaises(KeyError):
1385 struct.value = unknown_key_values
1386
1387 def test_value_rollback(self):
1388 int_ft = bt2.IntegerFieldType(32)
1389 str_ft = bt2.StringFieldType()
1390 struct_ft = bt2.StructureFieldType()
1391 struct_ft.append_field(field_type=int_ft, name='an_int')
1392 struct_ft.append_field(field_type=str_ft, name='a_string')
1393 struct_ft.append_field(field_type=int_ft, name='another_int')
1394 values = {
1395 'an_int': 42,
1396 'a_string': 'hello',
1397 'another_int': 66
1398 }
1399
1400
1401
1402 class VariantFieldTestCase(_TestCopySimple, unittest.TestCase):
1403 def setUp(self):
1404 self._tag_ft = bt2.EnumerationFieldType(size=32)
1405 self._tag_ft.append_mapping('corner', 23)
1406 self._tag_ft.append_mapping('zoom', 17, 20)
1407 self._tag_ft.append_mapping('mellotron', 1001)
1408 self._tag_ft.append_mapping('giorgio', 2000, 3000)
1409 self._ft0 = bt2.IntegerFieldType(32, is_signed=True)
1410 self._ft1 = bt2.StringFieldType()
1411 self._ft2 = bt2.FloatingPointNumberFieldType()
1412 self._ft3 = bt2.IntegerFieldType(17)
1413 self._ft = bt2.VariantFieldType('salut', self._tag_ft)
1414 self._ft.append_field('corner', self._ft0)
1415 self._ft.append_field('zoom', self._ft1)
1416 self._ft.append_field('mellotron', self._ft2)
1417 self._ft.append_field('giorgio', self._ft3)
1418 self._def = self._ft()
1419
1420 def tearDown(self):
1421 del self._tag_ft
1422 del self._ft0
1423 del self._ft1
1424 del self._ft2
1425 del self._ft3
1426 del self._ft
1427 del self._def
1428
1429 def test_bool_op_true(self):
1430 tag_field = self._tag_ft(1001)
1431 self._def.field(tag_field).value = -17.34
1432 self.assertTrue(self._def)
1433
1434 def test_bool_op_false(self):
1435 self.assertFalse(self._def)
1436
1437 def test_tag_field_none(self):
1438 self.assertIsNone(self._def.tag_field)
1439
1440 def test_tag_field(self):
1441 tag_field = self._tag_ft(2800)
1442 self._def.field(tag_field).value = 1847
1443 self.assertEqual(self._def.tag_field, tag_field)
1444 self.assertEqual(self._def.tag_field.addr, tag_field.addr)
1445
1446 def test_selected_field_none(self):
1447 self.assertIsNone(self._def.selected_field)
1448
1449 def test_selected_field(self):
1450 var_field1 = self._ft()
1451 tag_field1 = self._tag_ft(1001)
1452 var_field1.field(tag_field1).value = -17.34
1453 self.assertEqual(var_field1.field(), -17.34)
1454 self.assertEqual(var_field1.selected_field, -17.34)
1455 var_field2 = self._ft()
1456 tag_field2 = self._tag_ft(2500)
1457 var_field2.field(tag_field2).value = 1921
1458 self.assertEqual(var_field2.field(), 1921)
1459 self.assertEqual(var_field2.selected_field, 1921)
1460
1461 def test_eq(self):
1462 tag_ft = bt2.EnumerationFieldType(size=32)
1463 tag_ft.append_mapping('corner', 23)
1464 tag_ft.append_mapping('zoom', 17, 20)
1465 tag_ft.append_mapping('mellotron', 1001)
1466 tag_ft.append_mapping('giorgio', 2000, 3000)
1467 ft0 = bt2.IntegerFieldType(32, is_signed=True)
1468 ft1 = bt2.StringFieldType()
1469 ft2 = bt2.FloatingPointNumberFieldType()
1470 ft3 = bt2.IntegerFieldType(17)
1471 ft = bt2.VariantFieldType('salut', tag_ft)
1472 ft.append_field('corner', ft0)
1473 ft.append_field('zoom', ft1)
1474 ft.append_field('mellotron', ft2)
1475 ft.append_field('giorgio', ft3)
1476 field = ft()
1477 field_tag = tag_ft(23)
1478 def_tag = self._tag_ft(23)
1479 field.field(field_tag).value = 1774
1480 self._def.field(def_tag).value = 1774
1481 self.assertEqual(self._def, field)
1482
1483 def test_eq_invalid_type(self):
1484 self.assertNotEqual(self._def, 23)
This page took 0.108674 seconds and 3 git commands to generate.