lib: split real FC/field into single and double prec FC/field
[babeltrace.git] / tests / bindings / python / bt2 / test_field.py
CommitLineData
d2d857a8
MJ
1#
2# Copyright (C) 2019 EfficiOS Inc.
3#
4# This program is free software; you can redistribute it and/or
5# modify it under the terms of the GNU General Public License
6# as published by the Free Software Foundation; only version 2
7# of the License.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program; if not, write to the Free Software
16# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17#
18
9cf643d1
PP
19from functools import partial, partialmethod
20import operator
21import unittest
9cf643d1
PP
22import math
23import copy
b0bdda42 24import itertools
73051d46 25import collections
9cf643d1 26import bt2
f0a42b33 27from utils import get_default_trace_class, TestOutputPortMessageIterator
9cf643d1
PP
28
29
cfbd7cf3 30_COMP_BINOPS = (operator.eq, operator.ne)
9cf643d1
PP
31
32
1eccc498
SM
33# Create and return a stream with the field classes part of its stream packet
34# context.
35#
36# The stream is part of a dummy trace created from trace class `tc`.
37
cfbd7cf3 38
1eccc498
SM
39def _create_stream(tc, ctx_field_classes):
40 packet_context_fc = tc.create_structure_field_class()
41 for name, fc in ctx_field_classes:
42 packet_context_fc.append_member(name, fc)
43
44 trace = tc()
cfbd7cf3
FD
45 stream_class = tc.create_stream_class(
46 packet_context_field_class=packet_context_fc, supports_packets=True
47 )
1eccc498
SM
48
49 stream = trace.create_stream(stream_class)
50 return stream
51
52
53# Create a field of the given field class.
54#
55# The field is part of a dummy stream, itself part of a dummy trace created
56# from trace class `tc`.
57
cfbd7cf3 58
1eccc498
SM
59def _create_field(tc, field_class):
60 field_name = 'field'
61 stream = _create_stream(tc, [(field_name, field_class)])
62 packet = stream.create_packet()
63 return packet.context_field[field_name]
64
65
f0a42b33
FD
66# Create a const field of the given field class.
67#
68# The field is part of a dummy stream, itself part of a dummy trace created
69# from trace class `tc`.
70
71
72def _create_const_field(tc, field_class, field_value_setter_fn):
73 field_name = 'const field'
74
75 class MyIter(bt2._UserMessageIterator):
8d8b141d 76 def __init__(self, config, self_port_output):
f0a42b33
FD
77 nonlocal field_class
78 nonlocal field_value_setter_fn
79 stream = _create_stream(tc, [(field_name, field_class)])
80 packet = stream.create_packet()
81
82 field_value_setter_fn(packet.context_field[field_name])
83
84 self._msgs = [
85 self._create_stream_beginning_message(stream),
86 self._create_packet_beginning_message(packet),
87 ]
88
89 def __next__(self):
90 if len(self._msgs) == 0:
91 raise StopIteration
92
93 return self._msgs.pop(0)
94
95 class MySrc(bt2._UserSourceComponent, message_iterator_class=MyIter):
59225a3e 96 def __init__(self, config, params, obj):
f0a42b33
FD
97 self._add_output_port('out', params)
98
99 graph = bt2.Graph()
100 src_comp = graph.add_component(MySrc, 'my_source', None)
101 msg_iter = TestOutputPortMessageIterator(graph, src_comp.output_ports['out'])
102
103 # Ignore first message, stream beginning
104 _ = next(msg_iter)
105 packet_beg_msg = next(msg_iter)
106
107 return packet_beg_msg.packet.context_field[field_name]
108
109
1eccc498
SM
110# Create a field of type string.
111#
112# The field is part of a dummy stream, itself part of a dummy trace created
113# from trace class `tc`. It is made out of a dummy string field class.
114
cfbd7cf3 115
1eccc498
SM
116def _create_string_field(tc):
117 field_name = 'string_field'
118 stream = _create_stream(tc, [(field_name, tc.create_string_field_class())])
119 packet = stream.create_packet()
120 return packet.context_field[field_name]
121
122
123# Create a field of type static array of ints.
124#
125# The field is part of a dummy stream, itself part of a dummy trace created
126# from trace class `tc`. It is made out of a dummy static array field class,
127# with a dummy integer field class as element class.
128
cfbd7cf3 129
1eccc498
SM
130def _create_int_array_field(tc, length):
131 elem_fc = tc.create_signed_integer_field_class(32)
132 fc = tc.create_static_array_field_class(elem_fc, length)
133 field_name = 'int_array'
134 stream = _create_stream(tc, [(field_name, fc)])
135 packet = stream.create_packet()
136 return packet.context_field[field_name]
137
138
139# Create a field of type dynamic array of ints.
140#
141# The field is part of a dummy stream, itself part of a dummy trace created
142# from trace class `tc`. It is made out of a dummy static array field class,
143# with a dummy integer field class as element and length classes.
144
cfbd7cf3 145
1eccc498
SM
146def _create_dynamic_array(tc):
147 elem_fc = tc.create_signed_integer_field_class(32)
148 len_fc = tc.create_signed_integer_field_class(32)
149 fc = tc.create_dynamic_array_field_class(elem_fc)
150 field_name = 'int_dyn_array'
151 stream = _create_stream(tc, [('thelength', len_fc), (field_name, fc)])
152 packet = stream.create_packet()
153 packet.context_field[field_name].length = 3
154 return packet.context_field[field_name]
155
156
157# Create a field of type array of (empty) structures.
158#
159# The field is part of a dummy stream, itself part of a dummy trace created
160# from trace class `tc`. It is made out of a dummy static array field class,
161# with a dummy struct field class as element class.
162
cfbd7cf3 163
1eccc498
SM
164def _create_struct_array_field(tc, length):
165 elem_fc = tc.create_structure_field_class()
166 fc = tc.create_static_array_field_class(elem_fc, length)
167 field_name = 'struct_array'
168 stream = _create_stream(tc, [(field_name, fc)])
169 packet = stream.create_packet()
170 return packet.context_field[field_name]
171
172
ead8c3d4
PP
173class BitArrayFieldTestCase(unittest.TestCase):
174 def _create_field(self):
175 return _create_field(self._tc, self._tc.create_bit_array_field_class(24))
176
177 def setUp(self):
178 self._tc = get_default_trace_class()
179 self._def_value = 15497
180 self._def = self._create_field()
181 self._def.value_as_integer = self._def_value
182 self._def_new_value = 101542
183
184 def test_assign_invalid_type(self):
185 with self.assertRaises(TypeError):
186 self._def.value_as_integer = 'onze'
187
188 def test_assign(self):
189 self._def.value_as_integer = 199
190 self.assertEqual(self._def.value_as_integer, 199)
191
192 def test_assign_masked(self):
193 self._def.value_as_integer = 0xE1549BB
194 self.assertEqual(self._def.value_as_integer, 0xE1549BB & ((1 << 24) - 1))
195
196 def test_eq(self):
197 other = self._create_field()
198 other.value_as_integer = self._def_value
199 self.assertEqual(self._def, other)
200
201 def test_ne_same_type(self):
202 other = self._create_field()
203 other.value_as_integer = self._def_value - 1
204 self.assertNotEqual(self._def, other)
205
206 def test_ne_diff_type(self):
207 self.assertNotEqual(self._def, self._def_value)
208
209 def test_len(self):
210 self.assertEqual(len(self._def), 24)
211
212 def test_str(self):
213 self.assertEqual(str(self._def), str(self._def_value))
214
215 def test_repr(self):
216 self.assertEqual(repr(self._def), repr(self._def_value))
217
218
21368027
PP
219# Base class for numeric field test cases.
220#
221# To be compatible with this base class, a derived class must, in its
222# setUp() method:
223#
224# * Set `self._def` to a field object with an arbitrary value.
225# * Set `self._def_value` to the equivalent value of `self._def`.
1eccc498 226class _TestNumericField:
21368027
PP
227 # Tries the binary operation `op`:
228 #
229 # 1. Between `self._def`, which is a field object, and `rhs`.
230 # 2. Between `self._def_value`, which is the raw value of
231 # `self._def`, and `rhs`.
232 #
233 # Returns the results of 1. and 2.
234 #
235 # If there's an exception while performing 1. or 2., asserts that
236 # both operations raised exceptions, that both exceptions have the
237 # same type, and returns `None` for both results.
9cf643d1 238 def _binop(self, op, rhs):
21368027
PP
239 type_rexc = None
240 type_rvexc = None
9cf643d1
PP
241 comp_value = rhs
242
21368027 243 # try with field object
9cf643d1
PP
244 try:
245 r = op(self._def, rhs)
246 except Exception as e:
21368027 247 type_rexc = type(e)
9cf643d1 248
21368027 249 # try with value
9cf643d1
PP
250 try:
251 rv = op(self._def_value, comp_value)
252 except Exception as e:
21368027 253 type_rvexc = type(e)
9cf643d1 254
21368027 255 if type_rexc is not None or type_rvexc is not None:
9cf643d1
PP
256 # at least one of the operations raised an exception: in
257 # this case both operations should have raised the same
258 # type of exception (division by zero, bit shift with a
259 # floating point number operand, etc.)
21368027 260 self.assertIs(type_rexc, type_rvexc)
9cf643d1
PP
261 return None, None
262
263 return r, rv
264
21368027
PP
265 # Tries the unary operation `op`:
266 #
267 # 1. On `self._def`, which is a field object.
268 # 2. On `self._def_value`, which is the value of `self._def`.
269 #
270 # Returns the results of 1. and 2.
271 #
272 # If there's an exception while performing 1. or 2., asserts that
273 # both operations raised exceptions, that both exceptions have the
274 # same type, and returns `None` for both results.
9cf643d1 275 def _unaryop(self, op):
21368027
PP
276 type_rexc = None
277 type_rvexc = None
9cf643d1 278
21368027 279 # try with field object
9cf643d1
PP
280 try:
281 r = op(self._def)
282 except Exception as e:
21368027 283 type_rexc = type(e)
9cf643d1 284
21368027 285 # try with value
9cf643d1
PP
286 try:
287 rv = op(self._def_value)
288 except Exception as e:
21368027 289 type_rvexc = type(e)
9cf643d1 290
21368027 291 if type_rexc is not None or type_rvexc is not None:
9cf643d1
PP
292 # at least one of the operations raised an exception: in
293 # this case both operations should have raised the same
294 # type of exception (division by zero, bit shift with a
295 # floating point number operand, etc.)
21368027 296 self.assertIs(type_rexc, type_rvexc)
9cf643d1
PP
297 return None, None
298
299 return r, rv
300
21368027
PP
301 # Tests that the unary operation `op` gives results with the same
302 # type for both `self._def` and `self._def_value`.
9cf643d1
PP
303 def _test_unaryop_type(self, op):
304 r, rv = self._unaryop(op)
305
306 if r is None:
307 return
308
309 self.assertIsInstance(r, type(rv))
310
21368027
PP
311 # Tests that the unary operation `op` gives results with the same
312 # value for both `self._def` and `self._def_value`. This uses the
313 # __eq__() operator of `self._def`.
9cf643d1
PP
314 def _test_unaryop_value(self, op):
315 r, rv = self._unaryop(op)
316
317 if r is None:
318 return
319
320 self.assertEqual(r, rv)
321
21368027
PP
322 # Tests that the unary operation `op`, when applied to `self._def`,
323 # does not change its underlying BT object address.
9cf643d1
PP
324 def _test_unaryop_addr_same(self, op):
325 addr_before = self._def.addr
326 self._unaryop(op)
327 self.assertEqual(self._def.addr, addr_before)
328
21368027
PP
329 # Tests that the unary operation `op`, when applied to `self._def`,
330 # does not change its value.
9cf643d1 331 def _test_unaryop_value_same(self, op):
e1c6bebd 332 value_before = copy.copy(self._def_value)
9cf643d1 333 self._unaryop(op)
e1c6bebd 334 self.assertEqual(self._def, value_before)
9cf643d1 335
21368027
PP
336 # Tests that the binary operation `op` gives results with the same
337 # type for both `self._def` and `self._def_value`.
9cf643d1
PP
338 def _test_binop_type(self, op, rhs):
339 r, rv = self._binop(op, rhs)
340
341 if r is None:
342 return
343
344 if op in _COMP_BINOPS:
345 # __eq__() and __ne__() always return a 'bool' object
346 self.assertIsInstance(r, bool)
347 else:
348 self.assertIsInstance(r, type(rv))
349
21368027
PP
350 # Tests that the binary operation `op` gives results with the same
351 # value for both `self._def` and `self._def_value`. This uses the
352 # __eq__() operator of `self._def`.
9cf643d1
PP
353 def _test_binop_value(self, op, rhs):
354 r, rv = self._binop(op, rhs)
355
356 if r is None:
357 return
358
359 self.assertEqual(r, rv)
360
21368027
PP
361 # Tests that the binary operation `op`, when applied to `self._def`,
362 # does not change its underlying BT object address.
9cf643d1
PP
363 def _test_binop_lhs_addr_same(self, op, rhs):
364 addr_before = self._def.addr
365 r, rv = self._binop(op, rhs)
366 self.assertEqual(self._def.addr, addr_before)
367
21368027
PP
368 # Tests that the binary operation `op`, when applied to `self._def`,
369 # does not change its value.
1eccc498 370 @unittest.skip('copy is not implemented')
9cf643d1 371 def _test_binop_lhs_value_same(self, op, rhs):
e1c6bebd 372 value_before = copy.copy(self._def)
9cf643d1 373 r, rv = self._binop(op, rhs)
e1c6bebd 374 self.assertEqual(self._def, value_before)
9cf643d1 375
21368027
PP
376 # The methods below which take the `test_cb` and/or `op` parameters
377 # are meant to be used with one of the _test_binop_*() functions
378 # above as `test_cb` and a binary operator function as `op`.
379 #
380 # For example:
381 #
382 # self._test_binop_rhs_pos_int(self._test_binop_value,
383 # operator.add)
384 #
385 # This tests that a numeric field object added to a positive integer
386 # value gives a result with the expected value.
387 #
388 # `vint` and `vfloat` mean a signed integer value object and a real
389 # value object.
390
9cf643d1
PP
391 def _test_binop_invalid_unknown(self, op):
392 if op in _COMP_BINOPS:
393 self.skipTest('not testing')
394
395 class A:
396 pass
397
398 with self.assertRaises(TypeError):
399 op(self._def, A())
400
401 def _test_binop_invalid_none(self, op):
402 if op in _COMP_BINOPS:
403 self.skipTest('not testing')
404
405 with self.assertRaises(TypeError):
406 op(self._def, None)
407
9cf643d1
PP
408 def _test_binop_rhs_false(self, test_cb, op):
409 test_cb(op, False)
410
411 def _test_binop_rhs_true(self, test_cb, op):
412 test_cb(op, True)
413
414 def _test_binop_rhs_pos_int(self, test_cb, op):
415 test_cb(op, 2)
416
417 def _test_binop_rhs_neg_int(self, test_cb, op):
418 test_cb(op, -23)
419
420 def _test_binop_rhs_zero_int(self, test_cb, op):
421 test_cb(op, 0)
422
423 def _test_binop_rhs_pos_vint(self, test_cb, op):
424 test_cb(op, bt2.create_value(2))
425
426 def _test_binop_rhs_neg_vint(self, test_cb, op):
427 test_cb(op, bt2.create_value(-23))
428
429 def _test_binop_rhs_zero_vint(self, test_cb, op):
430 test_cb(op, bt2.create_value(0))
431
432 def _test_binop_rhs_pos_float(self, test_cb, op):
433 test_cb(op, 2.2)
434
435 def _test_binop_rhs_neg_float(self, test_cb, op):
436 test_cb(op, -23.4)
437
438 def _test_binop_rhs_zero_float(self, test_cb, op):
439 test_cb(op, 0.0)
440
441 def _test_binop_rhs_pos_vfloat(self, test_cb, op):
442 test_cb(op, bt2.create_value(2.2))
443
444 def _test_binop_rhs_neg_vfloat(self, test_cb, op):
445 test_cb(op, bt2.create_value(-23.4))
446
447 def _test_binop_rhs_zero_vfloat(self, test_cb, op):
448 test_cb(op, bt2.create_value(0.0))
449
00512c97 450 def _test_binop_rhs_complex(self, test_cb, op):
cfbd7cf3 451 test_cb(op, -23 + 19j)
00512c97
PP
452
453 def _test_binop_rhs_zero_complex(self, test_cb, op):
454 test_cb(op, 0j)
455
9cf643d1
PP
456 def _test_binop_type_false(self, op):
457 self._test_binop_rhs_false(self._test_binop_type, op)
458
459 def _test_binop_type_true(self, op):
460 self._test_binop_rhs_true(self._test_binop_type, op)
461
462 def _test_binop_type_pos_int(self, op):
463 self._test_binop_rhs_pos_int(self._test_binop_type, op)
464
465 def _test_binop_type_neg_int(self, op):
466 self._test_binop_rhs_neg_int(self._test_binop_type, op)
467
468 def _test_binop_type_zero_int(self, op):
469 self._test_binop_rhs_zero_int(self._test_binop_type, op)
470
471 def _test_binop_type_pos_vint(self, op):
472 self._test_binop_rhs_pos_vint(self._test_binop_type, op)
473
474 def _test_binop_type_neg_vint(self, op):
475 self._test_binop_rhs_neg_vint(self._test_binop_type, op)
476
477 def _test_binop_type_zero_vint(self, op):
478 self._test_binop_rhs_zero_vint(self._test_binop_type, op)
479
480 def _test_binop_type_pos_float(self, op):
481 self._test_binop_rhs_pos_float(self._test_binop_type, op)
482
483 def _test_binop_type_neg_float(self, op):
484 self._test_binop_rhs_neg_float(self._test_binop_type, op)
485
486 def _test_binop_type_zero_float(self, op):
487 self._test_binop_rhs_zero_float(self._test_binop_type, op)
488
489 def _test_binop_type_pos_vfloat(self, op):
490 self._test_binop_rhs_pos_vfloat(self._test_binop_type, op)
491
492 def _test_binop_type_neg_vfloat(self, op):
493 self._test_binop_rhs_neg_vfloat(self._test_binop_type, op)
494
495 def _test_binop_type_zero_vfloat(self, op):
496 self._test_binop_rhs_zero_vfloat(self._test_binop_type, op)
497
00512c97
PP
498 def _test_binop_type_complex(self, op):
499 self._test_binop_rhs_complex(self._test_binop_type, op)
500
501 def _test_binop_type_zero_complex(self, op):
502 self._test_binop_rhs_zero_complex(self._test_binop_type, op)
503
9cf643d1
PP
504 def _test_binop_value_false(self, op):
505 self._test_binop_rhs_false(self._test_binop_value, op)
506
507 def _test_binop_value_true(self, op):
508 self._test_binop_rhs_true(self._test_binop_value, op)
509
510 def _test_binop_value_pos_int(self, op):
511 self._test_binop_rhs_pos_int(self._test_binop_value, op)
512
513 def _test_binop_value_neg_int(self, op):
514 self._test_binop_rhs_neg_int(self._test_binop_value, op)
515
516 def _test_binop_value_zero_int(self, op):
517 self._test_binop_rhs_zero_int(self._test_binop_value, op)
518
519 def _test_binop_value_pos_vint(self, op):
520 self._test_binop_rhs_pos_vint(self._test_binop_value, op)
521
522 def _test_binop_value_neg_vint(self, op):
523 self._test_binop_rhs_neg_vint(self._test_binop_value, op)
524
525 def _test_binop_value_zero_vint(self, op):
526 self._test_binop_rhs_zero_vint(self._test_binop_value, op)
527
528 def _test_binop_value_pos_float(self, op):
529 self._test_binop_rhs_pos_float(self._test_binop_value, op)
530
531 def _test_binop_value_neg_float(self, op):
532 self._test_binop_rhs_neg_float(self._test_binop_value, op)
533
534 def _test_binop_value_zero_float(self, op):
535 self._test_binop_rhs_zero_float(self._test_binop_value, op)
536
537 def _test_binop_value_pos_vfloat(self, op):
538 self._test_binop_rhs_pos_vfloat(self._test_binop_value, op)
539
540 def _test_binop_value_neg_vfloat(self, op):
541 self._test_binop_rhs_neg_vfloat(self._test_binop_value, op)
542
543 def _test_binop_value_zero_vfloat(self, op):
544 self._test_binop_rhs_zero_vfloat(self._test_binop_value, op)
545
00512c97
PP
546 def _test_binop_value_complex(self, op):
547 self._test_binop_rhs_complex(self._test_binop_value, op)
548
549 def _test_binop_value_zero_complex(self, op):
550 self._test_binop_rhs_zero_complex(self._test_binop_value, op)
551
9cf643d1
PP
552 def _test_binop_lhs_addr_same_false(self, op):
553 self._test_binop_rhs_false(self._test_binop_lhs_addr_same, op)
554
555 def _test_binop_lhs_addr_same_true(self, op):
556 self._test_binop_rhs_true(self._test_binop_lhs_addr_same, op)
557
558 def _test_binop_lhs_addr_same_pos_int(self, op):
559 self._test_binop_rhs_pos_int(self._test_binop_lhs_addr_same, op)
560
561 def _test_binop_lhs_addr_same_neg_int(self, op):
562 self._test_binop_rhs_neg_int(self._test_binop_lhs_addr_same, op)
563
564 def _test_binop_lhs_addr_same_zero_int(self, op):
565 self._test_binop_rhs_zero_int(self._test_binop_lhs_addr_same, op)
566
567 def _test_binop_lhs_addr_same_pos_vint(self, op):
568 self._test_binop_rhs_pos_vint(self._test_binop_lhs_addr_same, op)
569
570 def _test_binop_lhs_addr_same_neg_vint(self, op):
571 self._test_binop_rhs_neg_vint(self._test_binop_lhs_addr_same, op)
572
573 def _test_binop_lhs_addr_same_zero_vint(self, op):
574 self._test_binop_rhs_zero_vint(self._test_binop_lhs_addr_same, op)
575
576 def _test_binop_lhs_addr_same_pos_float(self, op):
577 self._test_binop_rhs_pos_float(self._test_binop_lhs_addr_same, op)
578
579 def _test_binop_lhs_addr_same_neg_float(self, op):
580 self._test_binop_rhs_neg_float(self._test_binop_lhs_addr_same, op)
581
582 def _test_binop_lhs_addr_same_zero_float(self, op):
583 self._test_binop_rhs_zero_float(self._test_binop_lhs_addr_same, op)
584
585 def _test_binop_lhs_addr_same_pos_vfloat(self, op):
586 self._test_binop_rhs_pos_vfloat(self._test_binop_lhs_addr_same, op)
587
588 def _test_binop_lhs_addr_same_neg_vfloat(self, op):
589 self._test_binop_rhs_neg_vfloat(self._test_binop_lhs_addr_same, op)
590
591 def _test_binop_lhs_addr_same_zero_vfloat(self, op):
592 self._test_binop_rhs_zero_vfloat(self._test_binop_lhs_addr_same, op)
593
00512c97
PP
594 def _test_binop_lhs_addr_same_complex(self, op):
595 self._test_binop_rhs_complex(self._test_binop_lhs_addr_same, op)
596
597 def _test_binop_lhs_addr_same_zero_complex(self, op):
598 self._test_binop_rhs_zero_complex(self._test_binop_lhs_addr_same, op)
599
9cf643d1
PP
600 def _test_binop_lhs_value_same_false(self, op):
601 self._test_binop_rhs_false(self._test_binop_lhs_value_same, op)
602
603 def _test_binop_lhs_value_same_true(self, op):
604 self._test_binop_rhs_true(self._test_binop_lhs_value_same, op)
605
606 def _test_binop_lhs_value_same_pos_int(self, op):
607 self._test_binop_rhs_pos_int(self._test_binop_lhs_value_same, op)
608
609 def _test_binop_lhs_value_same_neg_int(self, op):
610 self._test_binop_rhs_neg_int(self._test_binop_lhs_value_same, op)
611
612 def _test_binop_lhs_value_same_zero_int(self, op):
613 self._test_binop_rhs_zero_int(self._test_binop_lhs_value_same, op)
614
615 def _test_binop_lhs_value_same_pos_vint(self, op):
616 self._test_binop_rhs_pos_vint(self._test_binop_lhs_value_same, op)
617
618 def _test_binop_lhs_value_same_neg_vint(self, op):
619 self._test_binop_rhs_neg_vint(self._test_binop_lhs_value_same, op)
620
621 def _test_binop_lhs_value_same_zero_vint(self, op):
622 self._test_binop_rhs_zero_vint(self._test_binop_lhs_value_same, op)
623
624 def _test_binop_lhs_value_same_pos_float(self, op):
625 self._test_binop_rhs_pos_float(self._test_binop_lhs_value_same, op)
626
627 def _test_binop_lhs_value_same_neg_float(self, op):
628 self._test_binop_rhs_neg_float(self._test_binop_lhs_value_same, op)
629
630 def _test_binop_lhs_value_same_zero_float(self, op):
631 self._test_binop_rhs_zero_float(self._test_binop_lhs_value_same, op)
632
633 def _test_binop_lhs_value_same_pos_vfloat(self, op):
634 self._test_binop_rhs_pos_vfloat(self._test_binop_lhs_value_same, op)
635
636 def _test_binop_lhs_value_same_neg_vfloat(self, op):
637 self._test_binop_rhs_neg_vfloat(self._test_binop_lhs_value_same, op)
638
639 def _test_binop_lhs_value_same_zero_vfloat(self, op):
640 self._test_binop_rhs_zero_vfloat(self._test_binop_lhs_value_same, op)
641
00512c97
PP
642 def _test_binop_lhs_value_same_complex(self, op):
643 self._test_binop_rhs_complex(self._test_binop_lhs_value_same, op)
644
645 def _test_binop_lhs_value_same_zero_complex(self, op):
646 self._test_binop_rhs_zero_complex(self._test_binop_lhs_value_same, op)
647
9cf643d1
PP
648 def test_bool_op(self):
649 self.assertEqual(bool(self._def), bool(self._def_value))
650
651 def test_int_op(self):
652 self.assertEqual(int(self._def), int(self._def_value))
653
654 def test_float_op(self):
655 self.assertEqual(float(self._def), float(self._def_value))
656
657 def test_complex_op(self):
658 self.assertEqual(complex(self._def), complex(self._def_value))
659
660 def test_str_op(self):
661 self.assertEqual(str(self._def), str(self._def_value))
662
dda659b3
FD
663 def test_hash_op(self):
664 with self.assertRaises(TypeError):
665 hash(self._def)
666
667 def test_const_hash_op(self):
668 self.assertEqual(hash(self._def_const), hash(self._def_value))
669
670 def test_const_hash_dict(self):
671 my_dict = {}
672 my_dict[self._def_const] = 'my_value'
673 self.assertEqual(my_dict[self._def_value], 'my_value')
674
9cf643d1 675 def test_eq_none(self):
1eccc498
SM
676 # Ignore this lint error:
677 # E711 comparison to None should be 'if cond is None:'
678 # since this is what we want to test (even though not good practice).
cfbd7cf3 679 self.assertFalse(self._def == None) # noqa: E711
9cf643d1
PP
680
681 def test_ne_none(self):
1eccc498
SM
682 # Ignore this lint error:
683 # E711 comparison to None should be 'if cond is not None:'
684 # since this is what we want to test (even though not good practice).
cfbd7cf3 685 self.assertTrue(self._def != None) # noqa: E711
742e4747 686
9cf643d1 687
21368027
PP
688# This is a list of binary operators used for
689# _inject_numeric_testing_methods().
690#
691# Each entry is a pair of binary operator name (used as part of the
692# created testing method's name) and operator function.
9cf643d1
PP
693_BINOPS = (
694 ('lt', operator.lt),
695 ('le', operator.le),
696 ('eq', operator.eq),
697 ('ne', operator.ne),
698 ('ge', operator.ge),
699 ('gt', operator.gt),
700 ('add', operator.add),
701 ('radd', lambda a, b: operator.add(b, a)),
702 ('and', operator.and_),
703 ('rand', lambda a, b: operator.and_(b, a)),
704 ('floordiv', operator.floordiv),
705 ('rfloordiv', lambda a, b: operator.floordiv(b, a)),
706 ('lshift', operator.lshift),
707 ('rlshift', lambda a, b: operator.lshift(b, a)),
708 ('mod', operator.mod),
709 ('rmod', lambda a, b: operator.mod(b, a)),
710 ('mul', operator.mul),
711 ('rmul', lambda a, b: operator.mul(b, a)),
712 ('or', operator.or_),
713 ('ror', lambda a, b: operator.or_(b, a)),
714 ('pow', operator.pow),
715 ('rpow', lambda a, b: operator.pow(b, a)),
716 ('rshift', operator.rshift),
717 ('rrshift', lambda a, b: operator.rshift(b, a)),
718 ('sub', operator.sub),
719 ('rsub', lambda a, b: operator.sub(b, a)),
720 ('truediv', operator.truediv),
721 ('rtruediv', lambda a, b: operator.truediv(b, a)),
722 ('xor', operator.xor),
723 ('rxor', lambda a, b: operator.xor(b, a)),
724)
725
726
21368027
PP
727# This is a list of unary operators used for
728# _inject_numeric_testing_methods().
729#
730# Each entry is a pair of unary operator name (used as part of the
731# created testing method's name) and operator function.
9cf643d1
PP
732_UNARYOPS = (
733 ('neg', operator.neg),
734 ('pos', operator.pos),
735 ('abs', operator.abs),
736 ('invert', operator.invert),
737 ('round', round),
738 ('round_0', partial(round, ndigits=0)),
739 ('round_1', partial(round, ndigits=1)),
740 ('round_2', partial(round, ndigits=2)),
741 ('round_3', partial(round, ndigits=3)),
742 ('ceil', math.ceil),
743 ('floor', math.floor),
744 ('trunc', math.trunc),
745)
746
747
21368027
PP
748# This function injects a bunch of testing methods to a numeric
749# field test case.
750#
751# It is meant to be used like this:
752#
753# _inject_numeric_testing_methods(MyNumericFieldTestCase)
754#
755# This function injects:
756#
757# * One testing method for each _TestNumericField._test_binop_*()
758# method, for each binary operator in the _BINOPS tuple.
759#
760# * One testing method for each _TestNumericField._test_unaryop*()
761# method, for each unary operator in the _UNARYOPS tuple.
9cf643d1
PP
762def _inject_numeric_testing_methods(cls):
763 def test_binop_name(suffix):
764 return 'test_binop_{}_{}'.format(name, suffix)
765
9cf643d1
PP
766 def test_unaryop_name(suffix):
767 return 'test_unaryop_{}_{}'.format(name, suffix)
768
769 # inject testing methods for each binary operation
770 for name, binop in _BINOPS:
cfbd7cf3
FD
771 setattr(
772 cls,
773 test_binop_name('invalid_unknown'),
774 partialmethod(_TestNumericField._test_binop_invalid_unknown, op=binop),
775 )
776 setattr(
777 cls,
778 test_binop_name('invalid_none'),
779 partialmethod(_TestNumericField._test_binop_invalid_none, op=binop),
780 )
781 setattr(
782 cls,
783 test_binop_name('type_true'),
784 partialmethod(_TestNumericField._test_binop_type_true, op=binop),
785 )
786 setattr(
787 cls,
788 test_binop_name('type_pos_int'),
789 partialmethod(_TestNumericField._test_binop_type_pos_int, op=binop),
790 )
791 setattr(
792 cls,
793 test_binop_name('type_pos_vint'),
794 partialmethod(_TestNumericField._test_binop_type_pos_vint, op=binop),
795 )
796 setattr(
797 cls,
798 test_binop_name('value_true'),
799 partialmethod(_TestNumericField._test_binop_value_true, op=binop),
800 )
801 setattr(
802 cls,
803 test_binop_name('value_pos_int'),
804 partialmethod(_TestNumericField._test_binop_value_pos_int, op=binop),
805 )
806 setattr(
807 cls,
808 test_binop_name('value_pos_vint'),
809 partialmethod(_TestNumericField._test_binop_value_pos_vint, op=binop),
810 )
811 setattr(
812 cls,
813 test_binop_name('lhs_addr_same_true'),
814 partialmethod(_TestNumericField._test_binop_lhs_addr_same_true, op=binop),
815 )
816 setattr(
817 cls,
818 test_binop_name('lhs_addr_same_pos_int'),
819 partialmethod(
820 _TestNumericField._test_binop_lhs_addr_same_pos_int, op=binop
821 ),
822 )
823 setattr(
824 cls,
825 test_binop_name('lhs_addr_same_pos_vint'),
826 partialmethod(
827 _TestNumericField._test_binop_lhs_addr_same_pos_vint, op=binop
828 ),
829 )
830 setattr(
831 cls,
832 test_binop_name('lhs_value_same_true'),
833 partialmethod(_TestNumericField._test_binop_lhs_value_same_true, op=binop),
834 )
835 setattr(
836 cls,
837 test_binop_name('lhs_value_same_pos_int'),
838 partialmethod(
839 _TestNumericField._test_binop_lhs_value_same_pos_int, op=binop
840 ),
841 )
842 setattr(
843 cls,
844 test_binop_name('lhs_value_same_pos_vint'),
845 partialmethod(
846 _TestNumericField._test_binop_lhs_value_same_pos_vint, op=binop
847 ),
848 )
849 setattr(
850 cls,
851 test_binop_name('type_neg_int'),
852 partialmethod(_TestNumericField._test_binop_type_neg_int, op=binop),
853 )
854 setattr(
855 cls,
856 test_binop_name('type_neg_vint'),
857 partialmethod(_TestNumericField._test_binop_type_neg_vint, op=binop),
858 )
859 setattr(
860 cls,
861 test_binop_name('value_neg_int'),
862 partialmethod(_TestNumericField._test_binop_value_neg_int, op=binop),
863 )
864 setattr(
865 cls,
866 test_binop_name('value_neg_vint'),
867 partialmethod(_TestNumericField._test_binop_value_neg_vint, op=binop),
868 )
869 setattr(
870 cls,
871 test_binop_name('lhs_addr_same_neg_int'),
872 partialmethod(
873 _TestNumericField._test_binop_lhs_addr_same_neg_int, op=binop
874 ),
875 )
876 setattr(
877 cls,
878 test_binop_name('lhs_addr_same_neg_vint'),
879 partialmethod(
880 _TestNumericField._test_binop_lhs_addr_same_neg_vint, op=binop
881 ),
882 )
883 setattr(
884 cls,
885 test_binop_name('lhs_value_same_neg_int'),
886 partialmethod(
887 _TestNumericField._test_binop_lhs_value_same_neg_int, op=binop
888 ),
889 )
890 setattr(
891 cls,
892 test_binop_name('lhs_value_same_neg_vint'),
893 partialmethod(
894 _TestNumericField._test_binop_lhs_value_same_neg_vint, op=binop
895 ),
896 )
897 setattr(
898 cls,
899 test_binop_name('type_false'),
900 partialmethod(_TestNumericField._test_binop_type_false, op=binop),
901 )
902 setattr(
903 cls,
904 test_binop_name('type_zero_int'),
905 partialmethod(_TestNumericField._test_binop_type_zero_int, op=binop),
906 )
907 setattr(
908 cls,
909 test_binop_name('type_zero_vint'),
910 partialmethod(_TestNumericField._test_binop_type_zero_vint, op=binop),
911 )
912 setattr(
913 cls,
914 test_binop_name('value_false'),
915 partialmethod(_TestNumericField._test_binop_value_false, op=binop),
916 )
917 setattr(
918 cls,
919 test_binop_name('value_zero_int'),
920 partialmethod(_TestNumericField._test_binop_value_zero_int, op=binop),
921 )
922 setattr(
923 cls,
924 test_binop_name('value_zero_vint'),
925 partialmethod(_TestNumericField._test_binop_value_zero_vint, op=binop),
926 )
927 setattr(
928 cls,
929 test_binop_name('lhs_addr_same_false'),
930 partialmethod(_TestNumericField._test_binop_lhs_addr_same_false, op=binop),
931 )
932 setattr(
933 cls,
934 test_binop_name('lhs_addr_same_zero_int'),
935 partialmethod(
936 _TestNumericField._test_binop_lhs_addr_same_zero_int, op=binop
937 ),
938 )
939 setattr(
940 cls,
941 test_binop_name('lhs_addr_same_zero_vint'),
942 partialmethod(
943 _TestNumericField._test_binop_lhs_addr_same_zero_vint, op=binop
944 ),
945 )
946 setattr(
947 cls,
948 test_binop_name('lhs_value_same_false'),
949 partialmethod(_TestNumericField._test_binop_lhs_value_same_false, op=binop),
950 )
951 setattr(
952 cls,
953 test_binop_name('lhs_value_same_zero_int'),
954 partialmethod(
955 _TestNumericField._test_binop_lhs_value_same_zero_int, op=binop
956 ),
957 )
958 setattr(
959 cls,
960 test_binop_name('lhs_value_same_zero_vint'),
961 partialmethod(
962 _TestNumericField._test_binop_lhs_value_same_zero_vint, op=binop
963 ),
964 )
965 setattr(
966 cls,
967 test_binop_name('type_pos_float'),
968 partialmethod(_TestNumericField._test_binop_type_pos_float, op=binop),
969 )
970 setattr(
971 cls,
972 test_binop_name('type_neg_float'),
973 partialmethod(_TestNumericField._test_binop_type_neg_float, op=binop),
974 )
975 setattr(
976 cls,
977 test_binop_name('type_pos_vfloat'),
978 partialmethod(_TestNumericField._test_binop_type_pos_vfloat, op=binop),
979 )
980 setattr(
981 cls,
982 test_binop_name('type_neg_vfloat'),
983 partialmethod(_TestNumericField._test_binop_type_neg_vfloat, op=binop),
984 )
985 setattr(
986 cls,
987 test_binop_name('value_pos_float'),
988 partialmethod(_TestNumericField._test_binop_value_pos_float, op=binop),
989 )
990 setattr(
991 cls,
992 test_binop_name('value_neg_float'),
993 partialmethod(_TestNumericField._test_binop_value_neg_float, op=binop),
994 )
995 setattr(
996 cls,
997 test_binop_name('value_pos_vfloat'),
998 partialmethod(_TestNumericField._test_binop_value_pos_vfloat, op=binop),
999 )
1000 setattr(
1001 cls,
1002 test_binop_name('value_neg_vfloat'),
1003 partialmethod(_TestNumericField._test_binop_value_neg_vfloat, op=binop),
1004 )
1005 setattr(
1006 cls,
1007 test_binop_name('lhs_addr_same_pos_float'),
1008 partialmethod(
1009 _TestNumericField._test_binop_lhs_addr_same_pos_float, op=binop
1010 ),
1011 )
1012 setattr(
1013 cls,
1014 test_binop_name('lhs_addr_same_neg_float'),
1015 partialmethod(
1016 _TestNumericField._test_binop_lhs_addr_same_neg_float, op=binop
1017 ),
1018 )
1019 setattr(
1020 cls,
1021 test_binop_name('lhs_addr_same_pos_vfloat'),
1022 partialmethod(
1023 _TestNumericField._test_binop_lhs_addr_same_pos_vfloat, op=binop
1024 ),
1025 )
1026 setattr(
1027 cls,
1028 test_binop_name('lhs_addr_same_neg_vfloat'),
1029 partialmethod(
1030 _TestNumericField._test_binop_lhs_addr_same_neg_vfloat, op=binop
1031 ),
1032 )
1033 setattr(
1034 cls,
1035 test_binop_name('lhs_value_same_pos_float'),
1036 partialmethod(
1037 _TestNumericField._test_binop_lhs_value_same_pos_float, op=binop
1038 ),
1039 )
1040 setattr(
1041 cls,
1042 test_binop_name('lhs_value_same_neg_float'),
1043 partialmethod(
1044 _TestNumericField._test_binop_lhs_value_same_neg_float, op=binop
1045 ),
1046 )
1047 setattr(
1048 cls,
1049 test_binop_name('lhs_value_same_pos_vfloat'),
1050 partialmethod(
1051 _TestNumericField._test_binop_lhs_value_same_pos_vfloat, op=binop
1052 ),
1053 )
1054 setattr(
1055 cls,
1056 test_binop_name('lhs_value_same_neg_vfloat'),
1057 partialmethod(
1058 _TestNumericField._test_binop_lhs_value_same_neg_vfloat, op=binop
1059 ),
1060 )
1061 setattr(
1062 cls,
1063 test_binop_name('type_zero_float'),
1064 partialmethod(_TestNumericField._test_binop_type_zero_float, op=binop),
1065 )
1066 setattr(
1067 cls,
1068 test_binop_name('type_zero_vfloat'),
1069 partialmethod(_TestNumericField._test_binop_type_zero_vfloat, op=binop),
1070 )
1071 setattr(
1072 cls,
1073 test_binop_name('value_zero_float'),
1074 partialmethod(_TestNumericField._test_binop_value_zero_float, op=binop),
1075 )
1076 setattr(
1077 cls,
1078 test_binop_name('value_zero_vfloat'),
1079 partialmethod(_TestNumericField._test_binop_value_zero_vfloat, op=binop),
1080 )
1081 setattr(
1082 cls,
1083 test_binop_name('lhs_addr_same_zero_float'),
1084 partialmethod(
1085 _TestNumericField._test_binop_lhs_addr_same_zero_float, op=binop
1086 ),
1087 )
1088 setattr(
1089 cls,
1090 test_binop_name('lhs_addr_same_zero_vfloat'),
1091 partialmethod(
1092 _TestNumericField._test_binop_lhs_addr_same_zero_vfloat, op=binop
1093 ),
1094 )
1095 setattr(
1096 cls,
1097 test_binop_name('lhs_value_same_zero_float'),
1098 partialmethod(
1099 _TestNumericField._test_binop_lhs_value_same_zero_float, op=binop
1100 ),
1101 )
1102 setattr(
1103 cls,
1104 test_binop_name('lhs_value_same_zero_vfloat'),
1105 partialmethod(
1106 _TestNumericField._test_binop_lhs_value_same_zero_vfloat, op=binop
1107 ),
1108 )
1109 setattr(
1110 cls,
1111 test_binop_name('type_complex'),
1112 partialmethod(_TestNumericField._test_binop_type_complex, op=binop),
1113 )
1114 setattr(
1115 cls,
1116 test_binop_name('type_zero_complex'),
1117 partialmethod(_TestNumericField._test_binop_type_zero_complex, op=binop),
1118 )
1119 setattr(
1120 cls,
1121 test_binop_name('value_complex'),
1122 partialmethod(_TestNumericField._test_binop_value_complex, op=binop),
1123 )
1124 setattr(
1125 cls,
1126 test_binop_name('value_zero_complex'),
1127 partialmethod(_TestNumericField._test_binop_value_zero_complex, op=binop),
1128 )
1129 setattr(
1130 cls,
1131 test_binop_name('lhs_addr_same_complex'),
1132 partialmethod(
1133 _TestNumericField._test_binop_lhs_addr_same_complex, op=binop
1134 ),
1135 )
1136 setattr(
1137 cls,
1138 test_binop_name('lhs_addr_same_zero_complex'),
1139 partialmethod(
1140 _TestNumericField._test_binop_lhs_addr_same_zero_complex, op=binop
1141 ),
1142 )
1143 setattr(
1144 cls,
1145 test_binop_name('lhs_value_same_complex'),
1146 partialmethod(
1147 _TestNumericField._test_binop_lhs_value_same_complex, op=binop
1148 ),
1149 )
1150 setattr(
1151 cls,
1152 test_binop_name('lhs_value_same_zero_complex'),
1153 partialmethod(
1154 _TestNumericField._test_binop_lhs_value_same_zero_complex, op=binop
1155 ),
1156 )
9cf643d1
PP
1157
1158 # inject testing methods for each unary operation
1159 for name, unaryop in _UNARYOPS:
cfbd7cf3
FD
1160 setattr(
1161 cls,
1162 test_unaryop_name('type'),
1163 partialmethod(_TestNumericField._test_unaryop_type, op=unaryop),
1164 )
1165 setattr(
1166 cls,
1167 test_unaryop_name('value'),
1168 partialmethod(_TestNumericField._test_unaryop_value, op=unaryop),
1169 )
1170 setattr(
1171 cls,
1172 test_unaryop_name('addr_same'),
1173 partialmethod(_TestNumericField._test_unaryop_addr_same, op=unaryop),
1174 )
1175 setattr(
1176 cls,
1177 test_unaryop_name('value_same'),
1178 partialmethod(_TestNumericField._test_unaryop_value_same, op=unaryop),
1179 )
9cf643d1 1180
9cf643d1 1181
aae30e61 1182class BoolFieldTestCase(_TestNumericField, unittest.TestCase):
f0a42b33
FD
1183 @staticmethod
1184 def _const_value_setter(field):
1185 field.value = True
1186
aae30e61
PP
1187 def _create_fc(self, tc):
1188 return tc.create_bool_field_class()
1189
1190 def setUp(self):
1191 self._tc = get_default_trace_class()
1192 self._def = _create_field(self._tc, self._create_fc(self._tc))
1193 self._def.value = True
1194 self._def_value = True
f0a42b33
FD
1195 self._def_const = _create_const_field(
1196 self._tc, self._tc.create_bool_field_class(), self._const_value_setter
1197 )
aae30e61
PP
1198 self._def_new_value = False
1199
f0a42b33
FD
1200 def test_classes(self):
1201 self.assertIs(type(self._def), bt2._BoolField)
1202 self.assertIs(type(self._def_const), bt2._BoolFieldConst)
1203
aae30e61
PP
1204 def test_assign_true(self):
1205 raw = True
1206 self._def.value = raw
1207 self.assertEqual(self._def, raw)
1208
1209 def test_assign_false(self):
1210 raw = False
1211 self._def.value = raw
1212 self.assertEqual(self._def, raw)
1213
1214 def test_assign_field_true(self):
1215 field = _create_field(self._tc, self._create_fc(self._tc))
1216 raw = True
1217 field.value = raw
1218 self._def.value = field
1219 self.assertEqual(self._def, raw)
1220
1221 def test_assign_field_false(self):
1222 field = _create_field(self._tc, self._create_fc(self._tc))
1223 raw = False
1224 field.value = raw
1225 self._def.value = field
1226 self.assertEqual(self._def, raw)
1227
1228 def test_assign_invalid_type(self):
1229 with self.assertRaises(TypeError):
1230 self._def.value = 17
1231
1232 def test_str_op(self):
1233 self.assertEqual(str(self._def), str(self._def_value))
1234
1235
1236_inject_numeric_testing_methods(BoolFieldTestCase)
1237
1238
9cf643d1
PP
1239class _TestIntegerFieldCommon(_TestNumericField):
1240 def test_assign_true(self):
1241 raw = True
1242 self._def.value = raw
1243 self.assertEqual(self._def, raw)
9cf643d1
PP
1244
1245 def test_assign_false(self):
1246 raw = False
1247 self._def.value = raw
1248 self.assertEqual(self._def, raw)
9cf643d1
PP
1249
1250 def test_assign_pos_int(self):
1251 raw = 477
1252 self._def.value = raw
1253 self.assertEqual(self._def, raw)
9cf643d1
PP
1254
1255 def test_assign_neg_int(self):
1256 raw = -13
1257 self._def.value = raw
1258 self.assertEqual(self._def, raw)
9cf643d1
PP
1259
1260 def test_assign_int_field(self):
1261 raw = 999
1eccc498 1262 field = _create_field(self._tc, self._create_fc(self._tc))
9cf643d1
PP
1263 field.value = raw
1264 self._def.value = field
1265 self.assertEqual(self._def, raw)
9cf643d1 1266
9cf643d1
PP
1267 def test_assign_invalid_type(self):
1268 with self.assertRaises(TypeError):
1269 self._def.value = 'yes'
1270
1271 def test_assign_uint(self):
1eccc498
SM
1272 uint_fc = self._tc.create_unsigned_integer_field_class(32)
1273 field = _create_field(self._tc, uint_fc)
9cf643d1
PP
1274 raw = 1777
1275 field.value = 1777
1276 self.assertEqual(field, raw)
9cf643d1 1277
7bb4180f
FD
1278 def test_assign_big_uint(self):
1279 uint_fc = self._tc.create_unsigned_integer_field_class(64)
1280 field = _create_field(self._tc, uint_fc)
1281 # Larger than the IEEE 754 double-precision exact representation of
1282 # integers.
cfbd7cf3
FD
1283 raw = (2 ** 53) + 1
1284 field.value = (2 ** 53) + 1
7bb4180f
FD
1285 self.assertEqual(field, raw)
1286
1198c635
FD
1287 def test_assign_uint_out_of_range(self):
1288 uint_fc = self._tc.create_unsigned_integer_field_class(8)
1eccc498 1289 field = _create_field(self._tc, uint_fc)
9cf643d1 1290
1198c635
FD
1291 with self.assertRaises(ValueError) as ctx:
1292 field.value = 256
1293 self.assertEqual(
1294 str(ctx.exception), 'Value 256 is outside valid range [0, 255]'
1295 )
1296
1297 with self.assertRaises(ValueError) as ctx:
1298 field.value = -1
1299 self.assertEqual(str(ctx.exception), 'Value -1 is outside valid range [0, 255]')
1300
1301 def test_assign_int_out_of_range(self):
1302 int_fc = self._tc.create_signed_integer_field_class(8)
1303 field = _create_field(self._tc, int_fc)
1304
1305 with self.assertRaises(ValueError) as ctx:
1306 field.value = 128
1307 self.assertEqual(
1308 str(ctx.exception), 'Value 128 is outside valid range [-128, 127]'
1309 )
1310
1311 with self.assertRaises(ValueError) as ctx:
1312 field.value = -129
1313 self.assertEqual(
1314 str(ctx.exception), 'Value -129 is outside valid range [-128, 127]'
1315 )
9cf643d1 1316
b0bdda42
JG
1317 def test_str_op(self):
1318 self.assertEqual(str(self._def), str(self._def_value))
1319
9cf643d1
PP
1320
1321_inject_numeric_testing_methods(_TestIntegerFieldCommon)
1322
1323
1eccc498 1324class SignedIntegerFieldTestCase(_TestIntegerFieldCommon, unittest.TestCase):
dda659b3
FD
1325 @staticmethod
1326 def _const_value_setter(field):
1327 field.value = 17
1328
1eccc498
SM
1329 def _create_fc(self, tc):
1330 return tc.create_signed_integer_field_class(25)
1331
9cf643d1 1332 def setUp(self):
1eccc498
SM
1333 self._tc = get_default_trace_class()
1334 self._field = _create_field(self._tc, self._create_fc(self._tc))
1335 self._field.value = 17
1336 self._def = _create_field(self._tc, self._create_fc(self._tc))
9cf643d1
PP
1337 self._def.value = 17
1338 self._def_value = 17
dda659b3
FD
1339 self._def_const = _create_const_field(
1340 self._tc, self._create_fc(self._tc), self._const_value_setter
1341 )
9cf643d1
PP
1342 self._def_new_value = -101
1343
811644b8 1344
1eccc498 1345class SignedEnumerationFieldTestCase(_TestIntegerFieldCommon, unittest.TestCase):
dda659b3
FD
1346 @staticmethod
1347 def _const_value_setter(field):
1348 field.value = 17
1349
1eccc498
SM
1350 def _create_fc(self, tc):
1351 fc = tc.create_signed_enumeration_field_class(32)
45c51519
PP
1352 fc.add_mapping('something', bt2.SignedIntegerRangeSet([(17, 17)]))
1353 fc.add_mapping('speaker', bt2.SignedIntegerRangeSet([(12, 16)]))
1354 fc.add_mapping('can', bt2.SignedIntegerRangeSet([(18, 2540)]))
cfbd7cf3
FD
1355 fc.add_mapping(
1356 'whole range', bt2.SignedIntegerRangeSet([(-(2 ** 31), (2 ** 31) - 1)])
1357 )
45c51519 1358 fc.add_mapping('zip', bt2.SignedIntegerRangeSet([(-45, 1001)]))
1eccc498 1359 return fc
9cf643d1 1360
9cf643d1 1361 def setUp(self):
1eccc498
SM
1362 self._tc = get_default_trace_class()
1363 self._field = _create_field(self._tc, self._create_fc(self._tc))
1364 self._def = _create_field(self._tc, self._create_fc(self._tc))
9cf643d1
PP
1365 self._def.value = 17
1366 self._def_value = 17
dda659b3
FD
1367 self._def_const = _create_const_field(
1368 self._tc, self._create_fc(self._tc), self._const_value_setter
1369 )
9cf643d1
PP
1370 self._def_new_value = -101
1371
b0bdda42
JG
1372 def test_str_op(self):
1373 expected_string_found = False
1374 s = str(self._def)
1375
1376 # Establish all permutations of the three expected matches since
1377 # the order in which mappings are enumerated is not explicitly part of
1378 # the API.
cfbd7cf3 1379 for p in itertools.permutations(['whole range', 'something', 'zip']):
b0bdda42
JG
1380 candidate = '{} ({})'.format(self._def_value, ', '.join(p))
1381 if candidate == s:
1382 expected_string_found = True
1383 break
1384
1385 self.assertTrue(expected_string_found)
1386
1eccc498
SM
1387 def test_labels(self):
1388 self._field.value = 17
1389 labels = sorted(self._field.labels)
1390 self.assertEqual(labels, ['something', 'whole range', 'zip'])
1391
b0bdda42 1392
fe4df857
FD
1393class SingleRealFieldTestCase(_TestNumericField, unittest.TestCase):
1394 @staticmethod
1395 def _const_value_setter(field):
1396 field.value = 52.0
1397
1398 def _create_fc(self, tc):
1399 return tc.create_single_precision_real_field_class()
1400
1401 def setUp(self):
1402 self._tc = get_default_trace_class()
1403 self._field = _create_field(self._tc, self._create_fc(self._tc))
1404 self._def = _create_field(self._tc, self._create_fc(self._tc))
1405 self._def_const = _create_const_field(
1406 self._tc,
1407 self._tc.create_single_precision_real_field_class(),
1408 self._const_value_setter,
1409 )
1410 self._def.value = 52.0
1411 self._def_value = 52.0
1412 self._def_new_value = -17.0
1413
1414 def _test_invalid_op(self, cb):
1415 with self.assertRaises(TypeError):
1416 cb()
1417
1418 def test_assign_true(self):
1419 self._def.value = True
1420 self.assertTrue(self._def)
1421
1422 def test_assign_false(self):
1423 self._def.value = False
1424 self.assertFalse(self._def)
1425
1426 def test_assign_pos_int(self):
1427 raw = 477
1428 self._def.value = raw
1429 self.assertEqual(self._def, float(raw))
1430
1431 def test_assign_neg_int(self):
1432 raw = -13
1433 self._def.value = raw
1434 self.assertEqual(self._def, float(raw))
1435
1436 def test_assign_int_field(self):
1437 int_fc = self._tc.create_signed_integer_field_class(32)
1438 int_field = _create_field(self._tc, int_fc)
1439 raw = 999
1440 int_field.value = raw
1441 self._def.value = int_field
1442 self.assertEqual(self._def, float(raw))
1443
1444 def test_assign_float(self):
1445 raw = -19.23
1446 self._def.value = raw
1447 # It's expected to have some lost of precision because of the field
1448 # that is in single precision.
1449 self.assertEqual(round(self._def, 5), raw)
1450
1451 def test_assign_float_field(self):
1452 field = _create_field(self._tc, self._create_fc(self._tc))
1453 raw = 101.32
1454 field.value = raw
1455 self._def.value = field
1456 # It's expected to have some lost of precision because of the field
1457 # that is in single precision.
1458 self.assertEqual(round(self._def, 5), raw)
1459
1460 def test_assign_invalid_type(self):
1461 with self.assertRaises(TypeError):
1462 self._def.value = 'yes'
1463
1464 def test_invalid_lshift(self):
1465 self._test_invalid_op(lambda: self._def << 23)
1466
1467 def test_invalid_rshift(self):
1468 self._test_invalid_op(lambda: self._def >> 23)
1469
1470 def test_invalid_and(self):
1471 self._test_invalid_op(lambda: self._def & 23)
1472
1473 def test_invalid_or(self):
1474 self._test_invalid_op(lambda: self._def | 23)
1475
1476 def test_invalid_xor(self):
1477 self._test_invalid_op(lambda: self._def ^ 23)
1478
1479 def test_invalid_invert(self):
1480 self._test_invalid_op(lambda: ~self._def)
1481
1482 def test_str_op(self):
1483 self.assertEqual(str(round(self._def, 5)), str(self._def_value))
1484
1485
1486_inject_numeric_testing_methods(SingleRealFieldTestCase)
1487
1488
1489class DoubleRealFieldTestCase(_TestNumericField, unittest.TestCase):
dda659b3
FD
1490 @staticmethod
1491 def _const_value_setter(field):
1492 field.value = 52.7
1493
1eccc498 1494 def _create_fc(self, tc):
fe4df857 1495 return tc.create_double_precision_real_field_class()
9cf643d1 1496
9cf643d1 1497 def setUp(self):
1eccc498
SM
1498 self._tc = get_default_trace_class()
1499 self._field = _create_field(self._tc, self._create_fc(self._tc))
1500 self._def = _create_field(self._tc, self._create_fc(self._tc))
dda659b3 1501 self._def_const = _create_const_field(
fe4df857
FD
1502 self._tc,
1503 self._tc.create_double_precision_real_field_class(),
1504 self._const_value_setter,
dda659b3 1505 )
9cf643d1
PP
1506 self._def.value = 52.7
1507 self._def_value = 52.7
1508 self._def_new_value = -17.164857
1509
1510 def _test_invalid_op(self, cb):
1511 with self.assertRaises(TypeError):
1512 cb()
1513
1514 def test_assign_true(self):
1515 self._def.value = True
1516 self.assertTrue(self._def)
9cf643d1
PP
1517
1518 def test_assign_false(self):
1519 self._def.value = False
1520 self.assertFalse(self._def)
9cf643d1
PP
1521
1522 def test_assign_pos_int(self):
1523 raw = 477
1524 self._def.value = raw
1525 self.assertEqual(self._def, float(raw))
9cf643d1
PP
1526
1527 def test_assign_neg_int(self):
1528 raw = -13
1529 self._def.value = raw
1530 self.assertEqual(self._def, float(raw))
9cf643d1
PP
1531
1532 def test_assign_int_field(self):
1eccc498
SM
1533 int_fc = self._tc.create_signed_integer_field_class(32)
1534 int_field = _create_field(self._tc, int_fc)
9cf643d1 1535 raw = 999
1eccc498
SM
1536 int_field.value = raw
1537 self._def.value = int_field
9cf643d1 1538 self.assertEqual(self._def, float(raw))
9cf643d1
PP
1539
1540 def test_assign_float(self):
1541 raw = -19.23
1542 self._def.value = raw
1543 self.assertEqual(self._def, raw)
9cf643d1
PP
1544
1545 def test_assign_float_field(self):
1eccc498 1546 field = _create_field(self._tc, self._create_fc(self._tc))
9cf643d1
PP
1547 raw = 101.32
1548 field.value = raw
1549 self._def.value = field
1550 self.assertEqual(self._def, raw)
9cf643d1
PP
1551
1552 def test_assign_invalid_type(self):
1553 with self.assertRaises(TypeError):
1554 self._def.value = 'yes'
1555
1556 def test_invalid_lshift(self):
1557 self._test_invalid_op(lambda: self._def << 23)
1558
1559 def test_invalid_rshift(self):
1560 self._test_invalid_op(lambda: self._def >> 23)
1561
1562 def test_invalid_and(self):
1563 self._test_invalid_op(lambda: self._def & 23)
1564
1565 def test_invalid_or(self):
1566 self._test_invalid_op(lambda: self._def | 23)
1567
1568 def test_invalid_xor(self):
1569 self._test_invalid_op(lambda: self._def ^ 23)
1570
1571 def test_invalid_invert(self):
1572 self._test_invalid_op(lambda: ~self._def)
1573
b0bdda42
JG
1574 def test_str_op(self):
1575 self.assertEqual(str(self._def), str(self._def_value))
1576
9cf643d1 1577
fe4df857 1578_inject_numeric_testing_methods(DoubleRealFieldTestCase)
9cf643d1
PP
1579
1580
1eccc498 1581class StringFieldTestCase(unittest.TestCase):
f0a42b33
FD
1582 @staticmethod
1583 def _const_value_setter(field):
1584 field.value = 'Hello, World!'
1585
9cf643d1 1586 def setUp(self):
1eccc498 1587 self._tc = get_default_trace_class()
9cf643d1 1588 self._def_value = 'Hello, World!'
1eccc498 1589 self._def = _create_string_field(self._tc)
f0a42b33
FD
1590 self._def_const = _create_const_field(
1591 self._tc, self._tc.create_string_field_class(), self._const_value_setter
1592 )
9cf643d1
PP
1593 self._def.value = self._def_value
1594 self._def_new_value = 'Yes!'
1595
1596 def test_assign_int(self):
1597 with self.assertRaises(TypeError):
1598 self._def.value = 283
1599
9cf643d1 1600 def test_assign_string_field(self):
1eccc498 1601 field = _create_string_field(self._tc)
9cf643d1
PP
1602 raw = 'zorg'
1603 field.value = raw
1604 self.assertEqual(field, raw)
1605
1606 def test_eq(self):
1607 self.assertEqual(self._def, self._def_value)
1608
f0a42b33
FD
1609 def test_const_eq(self):
1610 self.assertEqual(self._def_const, self._def_value)
1611
1eccc498 1612 def test_not_eq(self):
9cf643d1
PP
1613 self.assertNotEqual(self._def, 23)
1614
1615 def test_lt_vstring(self):
1eccc498 1616 s1 = _create_string_field(self._tc)
9cf643d1 1617 s1.value = 'allo'
1eccc498 1618 s2 = _create_string_field(self._tc)
9cf643d1
PP
1619 s2.value = 'bateau'
1620 self.assertLess(s1, s2)
1621
1622 def test_lt_string(self):
1eccc498 1623 s1 = _create_string_field(self._tc)
9cf643d1
PP
1624 s1.value = 'allo'
1625 self.assertLess(s1, 'bateau')
1626
1627 def test_le_vstring(self):
1eccc498 1628 s1 = _create_string_field(self._tc)
9cf643d1 1629 s1.value = 'allo'
1eccc498 1630 s2 = _create_string_field(self._tc)
9cf643d1
PP
1631 s2.value = 'bateau'
1632 self.assertLessEqual(s1, s2)
1633
1634 def test_le_string(self):
1eccc498 1635 s1 = _create_string_field(self._tc)
9cf643d1
PP
1636 s1.value = 'allo'
1637 self.assertLessEqual(s1, 'bateau')
1638
1639 def test_gt_vstring(self):
1eccc498 1640 s1 = _create_string_field(self._tc)
9cf643d1 1641 s1.value = 'allo'
1eccc498 1642 s2 = _create_string_field(self._tc)
9cf643d1
PP
1643 s2.value = 'bateau'
1644 self.assertGreater(s2, s1)
1645
1646 def test_gt_string(self):
1eccc498 1647 s1 = _create_string_field(self._tc)
9cf643d1
PP
1648 s1.value = 'allo'
1649 self.assertGreater('bateau', s1)
1650
1651 def test_ge_vstring(self):
1eccc498 1652 s1 = _create_string_field(self._tc)
9cf643d1 1653 s1.value = 'allo'
1eccc498 1654 s2 = _create_string_field(self._tc)
9cf643d1
PP
1655 s2.value = 'bateau'
1656 self.assertGreaterEqual(s2, s1)
1657
1658 def test_ge_string(self):
1eccc498 1659 s1 = _create_string_field(self._tc)
9cf643d1
PP
1660 s1.value = 'allo'
1661 self.assertGreaterEqual('bateau', s1)
1662
1663 def test_bool_op(self):
1664 self.assertEqual(bool(self._def), bool(self._def_value))
1665
1666 def test_str_op(self):
1667 self.assertEqual(str(self._def), str(self._def_value))
1668
1669 def test_len(self):
1670 self.assertEqual(len(self._def), len(self._def_value))
1671
1672 def test_getitem(self):
1673 self.assertEqual(self._def[5], self._def_value[5])
1674
f0a42b33
FD
1675 def test_const_getitem(self):
1676 self.assertEqual(self._def_const[5], self._def_value[5])
1677
9cf643d1
PP
1678 def test_append_str(self):
1679 to_append = 'meow meow meow'
1680 self._def += to_append
1681 self._def_value += to_append
1682 self.assertEqual(self._def, self._def_value)
1683
f0a42b33
FD
1684 def test_const_append_str(self):
1685 to_append = 'meow meow meow'
1686 with self.assertRaises(TypeError):
1687 self._def_const += to_append
1688 self.assertEqual(self._def_const, self._def_value)
1689
9cf643d1 1690 def test_append_string_field(self):
1eccc498 1691 field = _create_string_field(self._tc)
9cf643d1
PP
1692 to_append = 'meow meow meow'
1693 field.value = to_append
1694 self._def += field
1695 self._def_value += to_append
1696 self.assertEqual(self._def, self._def_value)
1697
dda659b3
FD
1698 def test_hash_op(self):
1699 with self.assertRaises(TypeError):
1700 hash(self._def)
1701
1702 def test_const_hash_op(self):
1703 self.assertEqual(hash(self._def_const), hash(self._def_value))
1704
1705 def test_const_hash_dict(self):
1706 my_dict = {}
1707 my_dict[self._def_const] = 'my_value'
1708 self.assertEqual(my_dict[self._def_value], 'my_value')
1709
742e4747 1710
1eccc498 1711class _TestArrayFieldCommon:
9cf643d1
PP
1712 def _modify_def(self):
1713 self._def[2] = 23
1714
1715 def test_bool_op_true(self):
1716 self.assertTrue(self._def)
1717
1718 def test_len(self):
1719 self.assertEqual(len(self._def), 3)
1720
1eccc498
SM
1721 def test_length(self):
1722 self.assertEqual(self._def.length, 3)
1723
9cf643d1
PP
1724 def test_getitem(self):
1725 field = self._def[1]
3fb99a22 1726 self.assertIs(type(field), bt2._SignedIntegerField)
9cf643d1
PP
1727 self.assertEqual(field, 1847)
1728
f0a42b33
FD
1729 def test_const_getitem(self):
1730 field = self._def_const[1]
1731 self.assertIs(type(field), bt2._SignedIntegerFieldConst)
1732 self.assertEqual(field, 1847)
1733
9cf643d1 1734 def test_eq(self):
1eccc498 1735 field = _create_int_array_field(self._tc, 3)
9cf643d1
PP
1736 field[0] = 45
1737 field[1] = 1847
1738 field[2] = 1948754
1739 self.assertEqual(self._def, field)
1740
1741 def test_eq_invalid_type(self):
1742 self.assertNotEqual(self._def, 23)
1743
1744 def test_eq_diff_len(self):
1eccc498 1745 field = _create_int_array_field(self._tc, 2)
9cf643d1
PP
1746 field[0] = 45
1747 field[1] = 1847
1748 self.assertNotEqual(self._def, field)
1749
1750 def test_eq_diff_content_same_len(self):
1eccc498 1751 field = _create_int_array_field(self._tc, 3)
9cf643d1
PP
1752 field[0] = 45
1753 field[1] = 1846
1754 field[2] = 1948754
1755 self.assertNotEqual(self._def, field)
1756
73051d46
PP
1757 def test_eq_non_sequence_iterable(self):
1758 dct = collections.OrderedDict([(1, 2), (3, 4), (5, 6)])
1759 field = _create_int_array_field(self._tc, 3)
1760 field[0] = 1
1761 field[1] = 3
1762 field[2] = 5
1763 self.assertEqual(field, list(dct.keys()))
1764 self.assertNotEqual(field, dct)
1765
9cf643d1
PP
1766 def test_setitem(self):
1767 self._def[2] = 24
1768 self.assertEqual(self._def[2], 24)
1769
1770 def test_setitem_int_field(self):
1eccc498
SM
1771 int_fc = self._tc.create_signed_integer_field_class(32)
1772 int_field = _create_field(self._tc, int_fc)
9cf643d1
PP
1773 int_field.value = 19487
1774 self._def[1] = int_field
1775 self.assertEqual(self._def[1], 19487)
1776
1777 def test_setitem_non_basic_field(self):
1eccc498 1778 array_field = _create_struct_array_field(self._tc, 2)
9cf643d1
PP
1779 with self.assertRaises(TypeError):
1780 array_field[1] = 23
1781
1782 def test_setitem_none(self):
1783 with self.assertRaises(TypeError):
1784 self._def[1] = None
1785
1786 def test_setitem_index_wrong_type(self):
1787 with self.assertRaises(TypeError):
1788 self._def['yes'] = 23
1789
1790 def test_setitem_index_neg(self):
1791 with self.assertRaises(IndexError):
1792 self._def[-2] = 23
1793
1794 def test_setitem_index_out_of_range(self):
1795 with self.assertRaises(IndexError):
1796 self._def[len(self._def)] = 134679
1797
f0a42b33
FD
1798 def test_const_setitem(self):
1799 with self.assertRaises(TypeError):
1800 self._def_const[0] = 134679
1801
9cf643d1
PP
1802 def test_iter(self):
1803 for field, value in zip(self._def, (45, 1847, 1948754)):
1804 self.assertEqual(field, value)
1805
f0a42b33
FD
1806 def test_const_iter(self):
1807 for field, value in zip(self._def_const, (45, 1847, 1948754)):
1808 self.assertEqual(field, value)
1809
7c54e2e7
JG
1810 def test_value_int_field(self):
1811 values = [45646, 145, 12145]
1812 self._def.value = values
1813 self.assertEqual(values, self._def)
1814
7c54e2e7
JG
1815 def test_value_check_sequence(self):
1816 values = 42
1817 with self.assertRaises(TypeError):
1818 self._def.value = values
1819
1820 def test_value_wrong_type_in_sequence(self):
1821 values = [32, 'hello', 11]
1822 with self.assertRaises(TypeError):
1823 self._def.value = values
1824
1825 def test_value_complex_type(self):
1eccc498
SM
1826 struct_fc = self._tc.create_structure_field_class()
1827 int_fc = self._tc.create_signed_integer_field_class(32)
1828 another_int_fc = self._tc.create_signed_integer_field_class(32)
1829 str_fc = self._tc.create_string_field_class()
1830 struct_fc.append_member(field_class=int_fc, name='an_int')
1831 struct_fc.append_member(field_class=str_fc, name='a_string')
1832 struct_fc.append_member(field_class=another_int_fc, name='another_int')
1833 array_fc = self._tc.create_static_array_field_class(struct_fc, 3)
1834 stream = _create_stream(self._tc, [('array_field', array_fc)])
7c54e2e7 1835 values = [
cfbd7cf3
FD
1836 {'an_int': 42, 'a_string': 'hello', 'another_int': 66},
1837 {'an_int': 1, 'a_string': 'goodbye', 'another_int': 488},
1838 {'an_int': 156, 'a_string': 'or not', 'another_int': 4648},
7c54e2e7
JG
1839 ]
1840
1eccc498 1841 array = stream.create_packet().context_field['array_field']
7c54e2e7
JG
1842 array.value = values
1843 self.assertEqual(values, array)
1844 values[0]['an_int'] = 'a string'
1845 with self.assertRaises(TypeError):
1846 array.value = values
9cf643d1 1847
b0bdda42
JG
1848 def test_str_op(self):
1849 s = str(self._def)
cfbd7cf3 1850 expected_string = '[{}]'.format(', '.join([repr(v) for v in self._def_value]))
b0bdda42
JG
1851 self.assertEqual(expected_string, s)
1852
742e4747 1853
1eccc498 1854class StaticArrayFieldTestCase(_TestArrayFieldCommon, unittest.TestCase):
f0a42b33
FD
1855 @staticmethod
1856 def _const_value_setter(field):
1857 field.value = [45, 1847, 1948754]
1858
9cf643d1 1859 def setUp(self):
1eccc498
SM
1860 self._tc = get_default_trace_class()
1861 self._def = _create_int_array_field(self._tc, 3)
9cf643d1
PP
1862 self._def[0] = 45
1863 self._def[1] = 1847
1864 self._def[2] = 1948754
7c54e2e7 1865 self._def_value = [45, 1847, 1948754]
f0a42b33
FD
1866 self._def_const = _create_const_field(
1867 self._tc,
1868 self._tc.create_static_array_field_class(
1869 self._tc.create_signed_integer_field_class(32), 3
1870 ),
1871 self._const_value_setter,
1872 )
9cf643d1 1873
7c54e2e7
JG
1874 def test_value_wrong_len(self):
1875 values = [45, 1847]
1876 with self.assertRaises(ValueError):
1877 self._def.value = values
1878
9cf643d1 1879
1eccc498 1880class DynamicArrayFieldTestCase(_TestArrayFieldCommon, unittest.TestCase):
f0a42b33
FD
1881 @staticmethod
1882 def _const_value_setter(field):
1883 field.value = [45, 1847, 1948754]
1884
9cf643d1 1885 def setUp(self):
1eccc498
SM
1886 self._tc = get_default_trace_class()
1887 self._def = _create_dynamic_array(self._tc)
9cf643d1
PP
1888 self._def[0] = 45
1889 self._def[1] = 1847
1890 self._def[2] = 1948754
7c54e2e7 1891 self._def_value = [45, 1847, 1948754]
f0a42b33
FD
1892 self._def_const = _create_const_field(
1893 self._tc,
1894 self._tc.create_dynamic_array_field_class(
1895 self._tc.create_signed_integer_field_class(32)
1896 ),
1897 self._const_value_setter,
1898 )
9cf643d1 1899
7c54e2e7
JG
1900 def test_value_resize(self):
1901 new_values = [1, 2, 3, 4]
1902 self._def.value = new_values
1903 self.assertCountEqual(self._def, new_values)
1904
1eccc498
SM
1905 def test_set_length(self):
1906 self._def.length = 4
1907 self._def[3] = 0
1908 self.assertEqual(len(self._def), 4)
7c54e2e7 1909
f0a42b33
FD
1910 def test_const_set_length(self):
1911 with self.assertRaises(AttributeError):
1912 self._def_const.length = 4
1913 self.assertEqual(len(self._def), 3)
1914
1eccc498 1915 def test_set_invalid_length(self):
7c54e2e7 1916 with self.assertRaises(TypeError):
1eccc498
SM
1917 self._def.length = 'cheval'
1918
1919
1920class StructureFieldTestCase(unittest.TestCase):
f0a42b33
FD
1921 @staticmethod
1922 def _const_value_setter(field):
1923 field.value = {
1924 'A': -1872,
1925 'B': 'salut',
1926 'C': 17.5,
1927 'D': 16497,
1928 'E': {},
1929 'F': {'F_1': 52},
1930 }
1931
1eccc498
SM
1932 def _create_fc(self, tc):
1933 fc = tc.create_structure_field_class()
1934 fc.append_member('A', self._fc0_fn())
1935 fc.append_member('B', self._fc1_fn())
1936 fc.append_member('C', self._fc2_fn())
1937 fc.append_member('D', self._fc3_fn())
1938 fc.append_member('E', self._fc4_fn())
1939 fc5 = self._fc5_fn()
1940 fc5.append_member('F_1', self._fc5_inner_fn())
1941 fc.append_member('F', fc5)
1942 return fc
7c54e2e7 1943
9cf643d1 1944 def setUp(self):
1eccc498
SM
1945 self._tc = get_default_trace_class()
1946 self._fc0_fn = self._tc.create_signed_integer_field_class
1947 self._fc1_fn = self._tc.create_string_field_class
fe4df857 1948 self._fc2_fn = self._tc.create_double_precision_real_field_class
1eccc498
SM
1949 self._fc3_fn = self._tc.create_signed_integer_field_class
1950 self._fc4_fn = self._tc.create_structure_field_class
1951 self._fc5_fn = self._tc.create_structure_field_class
1952 self._fc5_inner_fn = self._tc.create_signed_integer_field_class
1953
1954 self._fc = self._create_fc(self._tc)
1955 self._def = _create_field(self._tc, self._fc)
9cf643d1
PP
1956 self._def['A'] = -1872
1957 self._def['B'] = 'salut'
1958 self._def['C'] = 17.5
1959 self._def['D'] = 16497
1eccc498
SM
1960 self._def['E'] = {}
1961 self._def['F'] = {'F_1': 52}
b0bdda42
JG
1962 self._def_value = {
1963 'A': -1872,
1964 'B': 'salut',
1965 'C': 17.5,
1eccc498
SM
1966 'D': 16497,
1967 'E': {},
cfbd7cf3 1968 'F': {'F_1': 52},
b0bdda42 1969 }
9cf643d1 1970
f0a42b33
FD
1971 self._def_const = _create_const_field(
1972 self._tc, self._create_fc(self._tc), self._const_value_setter
1973 )
1974
9cf643d1
PP
1975 def _modify_def(self):
1976 self._def['B'] = 'hola'
1977
1978 def test_bool_op_true(self):
1979 self.assertTrue(self._def)
1980
1981 def test_bool_op_false(self):
1eccc498 1982 field = self._def['E']
9cf643d1
PP
1983 self.assertFalse(field)
1984
1985 def test_len(self):
1eccc498 1986 self.assertEqual(len(self._def), len(self._def_value))
9cf643d1
PP
1987
1988 def test_getitem(self):
f0a42b33
FD
1989 field1 = self._def['A']
1990 field2 = self._def['B']
1991 field3 = self._def['C']
1992 field4 = self._def['D']
1993 field5 = self._def['E']
1994 field6 = self._def['F']
1995
1996 self.assertIs(type(field1), bt2._SignedIntegerField)
1997 self.assertEqual(field1, -1872)
1998
1999 self.assertIs(type(field2), bt2._StringField)
2000 self.assertEqual(field2, 'salut')
2001
fe4df857 2002 self.assertIs(type(field3), bt2._DoublePrecisionRealField)
f0a42b33
FD
2003 self.assertEqual(field3, 17.5)
2004
2005 self.assertIs(type(field4), bt2._SignedIntegerField)
2006 self.assertEqual(field4, 16497)
2007
2008 self.assertIs(type(field5), bt2._StructureField)
2009 self.assertEqual(field5, {})
2010
2011 self.assertIs(type(field6), bt2._StructureField)
2012 self.assertEqual(field6, {'F_1': 52})
2013
2014 def test_const_getitem(self):
2015 field1 = self._def_const['A']
2016 field2 = self._def_const['B']
2017 field3 = self._def_const['C']
2018 field4 = self._def_const['D']
2019 field5 = self._def_const['E']
2020 field6 = self._def_const['F']
2021
2022 self.assertIs(type(field1), bt2._SignedIntegerFieldConst)
2023 self.assertEqual(field1, -1872)
2024
2025 self.assertIs(type(field2), bt2._StringFieldConst)
2026 self.assertEqual(field2, 'salut')
2027
fe4df857 2028 self.assertIs(type(field3), bt2._DoublePrecisionRealFieldConst)
f0a42b33
FD
2029 self.assertEqual(field3, 17.5)
2030
2031 self.assertIs(type(field4), bt2._SignedIntegerFieldConst)
2032 self.assertEqual(field4, 16497)
2033
2034 self.assertIs(type(field5), bt2._StructureFieldConst)
2035 self.assertEqual(field5, {})
2036
2037 self.assertIs(type(field6), bt2._StructureFieldConst)
2038 self.assertEqual(field6, {'F_1': 52})
9cf643d1 2039
1eccc498 2040 def test_member_at_index_out_of_bounds_after(self):
811644b8 2041 with self.assertRaises(IndexError):
1eccc498 2042 self._def.member_at_index(len(self._def_value))
811644b8 2043
9cf643d1 2044 def test_eq(self):
cfbd7cf3 2045 field = _create_field(self._tc, self._create_fc(self._tc))
9cf643d1
PP
2046 field['A'] = -1872
2047 field['B'] = 'salut'
2048 field['C'] = 17.5
2049 field['D'] = 16497
1eccc498
SM
2050 field['E'] = {}
2051 field['F'] = {'F_1': 52}
9cf643d1
PP
2052 self.assertEqual(self._def, field)
2053
f0a42b33
FD
2054 def test_const_eq(self):
2055 field = _create_field(self._tc, self._create_fc(self._tc))
2056 field['A'] = -1872
2057 field['B'] = 'salut'
2058 field['C'] = 17.5
2059 field['D'] = 16497
2060 field['E'] = {}
2061 field['F'] = {'F_1': 52}
2062 self.assertEqual(self._def_const, field)
2063
9cf643d1
PP
2064 def test_eq_invalid_type(self):
2065 self.assertNotEqual(self._def, 23)
2066
2067 def test_eq_diff_len(self):
1eccc498
SM
2068 fc = self._tc.create_structure_field_class()
2069 fc.append_member('A', self._fc0_fn())
2070 fc.append_member('B', self._fc1_fn())
2071 fc.append_member('C', self._fc2_fn())
2072
2073 field = _create_field(self._tc, fc)
9cf643d1
PP
2074 field['A'] = -1872
2075 field['B'] = 'salut'
2076 field['C'] = 17.5
2077 self.assertNotEqual(self._def, field)
2078
1eccc498
SM
2079 def test_eq_diff_keys(self):
2080 fc = self._tc.create_structure_field_class()
2081 fc.append_member('U', self._fc0_fn())
2082 fc.append_member('V', self._fc1_fn())
2083 fc.append_member('W', self._fc2_fn())
2084 fc.append_member('X', self._fc3_fn())
2085 fc.append_member('Y', self._fc4_fn())
2086 fc.append_member('Z', self._fc5_fn())
2087 field = _create_field(self._tc, fc)
2088 field['U'] = -1871
2089 field['V'] = "gerry"
2090 field['W'] = 18.19
2091 field['X'] = 16497
2092 field['Y'] = {}
2093 field['Z'] = {}
2094 self.assertNotEqual(self._def, field)
2095
9cf643d1 2096 def test_eq_diff_content_same_len(self):
1eccc498 2097 field = _create_field(self._tc, self._create_fc(self._tc))
9cf643d1
PP
2098 field['A'] = -1872
2099 field['B'] = 'salut'
2100 field['C'] = 17.4
2101 field['D'] = 16497
1eccc498
SM
2102 field['E'] = {}
2103 field['F'] = {'F_1': 0}
9cf643d1
PP
2104 self.assertNotEqual(self._def, field)
2105
2106 def test_eq_same_content_diff_keys(self):
1eccc498
SM
2107 fc = self._tc.create_structure_field_class()
2108 fc.append_member('A', self._fc0_fn())
2109 fc.append_member('B', self._fc1_fn())
2110 fc.append_member('E', self._fc2_fn())
2111 fc.append_member('D', self._fc3_fn())
2112 fc.append_member('C', self._fc4_fn())
2113 fc.append_member('F', self._fc5_fn())
2114 field = _create_field(self._tc, fc)
9cf643d1
PP
2115 field['A'] = -1872
2116 field['B'] = 'salut'
1eccc498 2117 field['E'] = 17.5
9cf643d1 2118 field['D'] = 16497
1eccc498
SM
2119 field['C'] = {}
2120 field['F'] = {}
9cf643d1
PP
2121 self.assertNotEqual(self._def, field)
2122
2123 def test_setitem(self):
2124 self._def['C'] = -18.47
2125 self.assertEqual(self._def['C'], -18.47)
2126
f0a42b33
FD
2127 def test_const_setitem(self):
2128 with self.assertRaises(TypeError):
2129 self._def_const['A'] = 134679
2130
9cf643d1 2131 def test_setitem_int_field(self):
1eccc498
SM
2132 int_fc = self._tc.create_signed_integer_field_class(32)
2133 int_field = _create_field(self._tc, int_fc)
9cf643d1
PP
2134 int_field.value = 19487
2135 self._def['D'] = int_field
2136 self.assertEqual(self._def['D'], 19487)
2137
2138 def test_setitem_non_basic_field(self):
1eccc498
SM
2139 elem_fc = self._tc.create_structure_field_class()
2140 struct_fc = self._tc.create_structure_field_class()
2141 struct_fc.append_member('A', elem_fc)
2142 struct_field = _create_field(self._tc, struct_fc)
9cf643d1 2143
236355c2
JG
2144 # Will fail on access to .items() of the value
2145 with self.assertRaises(AttributeError):
9cf643d1
PP
2146 struct_field['A'] = 23
2147
2148 def test_setitem_none(self):
2149 with self.assertRaises(TypeError):
2150 self._def['C'] = None
2151
2152 def test_setitem_key_wrong_type(self):
2153 with self.assertRaises(TypeError):
2154 self._def[3] = 23
2155
2156 def test_setitem_wrong_key(self):
2157 with self.assertRaises(KeyError):
2158 self._def['hi'] = 134679
2159
1eccc498
SM
2160 def test_member_at_index(self):
2161 self.assertEqual(self._def.member_at_index(1), 'salut')
9cf643d1 2162
f0a42b33
FD
2163 def test_const_member_at_index(self):
2164 self.assertEqual(self._def_const.member_at_index(1), 'salut')
2165
9cf643d1
PP
2166 def test_iter(self):
2167 orig_values = {
2168 'A': -1872,
2169 'B': 'salut',
2170 'C': 17.5,
2171 'D': 16497,
1eccc498 2172 'E': {},
cfbd7cf3 2173 'F': {'F_1': 52},
9cf643d1
PP
2174 }
2175
2176 for vkey, vval in self._def.items():
2177 val = orig_values[vkey]
2178 self.assertEqual(vval, val)
811644b8 2179
7c54e2e7
JG
2180 def test_value(self):
2181 orig_values = {
2182 'A': -1872,
2183 'B': 'salut',
2184 'C': 17.5,
2185 'D': 16497,
1eccc498 2186 'E': {},
cfbd7cf3 2187 'F': {'F_1': 52},
7c54e2e7
JG
2188 }
2189 self.assertEqual(self._def, orig_values)
2190
2191 def test_set_value(self):
1eccc498
SM
2192 int_fc = self._tc.create_signed_integer_field_class(32)
2193 another_int_fc = self._tc.create_signed_integer_field_class(32)
2194 str_fc = self._tc.create_string_field_class()
2195 struct_fc = self._tc.create_structure_field_class()
2196 struct_fc.append_member(field_class=int_fc, name='an_int')
2197 struct_fc.append_member(field_class=str_fc, name='a_string')
2198 struct_fc.append_member(field_class=another_int_fc, name='another_int')
cfbd7cf3 2199 values = {'an_int': 42, 'a_string': 'hello', 'another_int': 66}
7c54e2e7 2200
1eccc498 2201 struct = _create_field(self._tc, struct_fc)
7c54e2e7
JG
2202 struct.value = values
2203 self.assertEqual(values, struct)
2204
2205 bad_type_values = copy.deepcopy(values)
2206 bad_type_values['an_int'] = 'a string'
2207 with self.assertRaises(TypeError):
2208 struct.value = bad_type_values
2209
2210 unknown_key_values = copy.deepcopy(values)
2211 unknown_key_values['unknown_key'] = 16546
2212 with self.assertRaises(KeyError):
2213 struct.value = unknown_key_values
2214
b0bdda42
JG
2215 def test_str_op(self):
2216 expected_string_found = False
2217 s = str(self._def)
2218 # Establish all permutations of the three expected matches since
2219 # the order in which mappings are enumerated is not explicitly part of
2220 # the API.
2221 for p in itertools.permutations([(k, v) for k, v in self._def.items()]):
2222 items = ['{}: {}'.format(repr(k), repr(v)) for k, v in p]
2223 candidate = '{{{}}}'.format(', '.join(items))
2224 if candidate == s:
2225 expected_string_found = True
2226 break
2227
2228 self.assertTrue(expected_string_found)
2229
b0bdda42 2230
cec0261d 2231class OptionFieldTestCase(unittest.TestCase):
f0a42b33
FD
2232 @staticmethod
2233 def _const_value_setter(field):
2234 field.value = {'opt_field': 'hiboux'}
2235
cec0261d
PP
2236 def _create_fc(self, tc):
2237 fc = tc.create_option_field_class(tc.create_string_field_class())
2238 top_fc = tc.create_structure_field_class()
2239 top_fc.append_member('opt_field', fc)
2240 return top_fc
2241
2242 def setUp(self):
2243 self._tc = get_default_trace_class()
2244 fld = _create_field(self._tc, self._create_fc(self._tc))
2245 self._def = fld['opt_field']
f0a42b33
FD
2246 self._def_value = 'hiboux'
2247 self._def_const = _create_const_field(
2248 self._tc, self._create_fc(self._tc), self._const_value_setter
2249 )['opt_field']
cec0261d
PP
2250
2251 def test_value_prop(self):
2252 self._def.value = 'hiboux'
2253 self.assertEqual(self._def.field, 'hiboux')
f0a42b33
FD
2254 self.assertIs(type(self._def), bt2._OptionField)
2255 self.assertIs(type(self._def.field), bt2._StringField)
cec0261d
PP
2256 self.assertTrue(self._def.has_field)
2257
f0a42b33
FD
2258 def test_const_value_prop(self):
2259 self.assertEqual(self._def_const.field, 'hiboux')
2260 self.assertIs(type(self._def_const), bt2._OptionFieldConst)
2261 self.assertIs(type(self._def_const.field), bt2._StringFieldConst)
2262 self.assertTrue(self._def_const.has_field)
2263
cec0261d
PP
2264 def test_has_field_prop_true(self):
2265 self._def.has_field = True
2266 self.assertTrue(self._def.has_field)
2267
d4db9beb 2268 def test_has_field_prop_false(self):
cec0261d
PP
2269 self._def.has_field = False
2270 self.assertFalse(self._def.has_field)
2271
2272 def test_bool_op_true(self):
2273 self._def.value = 'allo'
2274 self.assertTrue(self._def)
2275
d4db9beb 2276 def test_bool_op_false(self):
cec0261d
PP
2277 self._def.has_field = False
2278 self.assertFalse(self._def)
2279
2280 def test_field_prop_existing(self):
2281 self._def.value = 'meow'
2282 field = self._def.field
2283 self.assertEqual(field, 'meow')
2284
2285 def test_field_prop_none(self):
2286 self._def.has_field = False
2287 field = self._def.field
2288 self.assertIsNone(field)
2289
f0a42b33
FD
2290 def test_const_field_prop(self):
2291 with self.assertRaises(AttributeError):
2292 self._def_const.has_field = False
2293
2294 self.assertEqual(self._def_const, self._def_value)
2295 self.assertTrue(self._def_const.has_field)
2296
cec0261d
PP
2297 def test_field_prop_existing_then_none(self):
2298 self._def.value = 'meow'
2299 field = self._def.field
2300 self.assertEqual(field, 'meow')
2301 self._def.has_field = False
2302 field = self._def.field
2303 self.assertIsNone(field)
2304
2305 def test_eq(self):
2306 field = _create_field(self._tc, self._create_fc(self._tc))
2307 field = field['opt_field']
2308 field.value = 'walk'
2309 self._def.value = 'walk'
2310 self.assertEqual(self._def, field)
2311
f0a42b33
FD
2312 def test_const_eq(self):
2313 field = _create_field(self._tc, self._create_fc(self._tc))
2314 field = field['opt_field']
2315 field.value = 'hiboux'
2316 self.assertEqual(self._def_const, field)
2317 self.assertEqual(self._def_const, self._def_value)
2318
cec0261d
PP
2319 def test_eq_invalid_type(self):
2320 self._def.value = 'gerry'
2321 self.assertNotEqual(self._def, 23)
2322
2323 def test_str_op(self):
2324 self._def.value = 'marcel'
2325 self.assertEqual(str(self._def), str(self._def.field))
2326
2327 def test_repr_op(self):
2328 self._def.value = 'mireille'
2329 self.assertEqual(repr(self._def), repr(self._def.field))
2330
2331
1eccc498 2332class VariantFieldTestCase(unittest.TestCase):
f0a42b33
FD
2333 @staticmethod
2334 def _const_value_setter(field):
2335 field.selected_option_index = 3
2336 field.value = 1334
2337
1eccc498 2338 def _create_fc(self, tc):
1eccc498
SM
2339 ft0 = tc.create_signed_integer_field_class(32)
2340 ft1 = tc.create_string_field_class()
fe4df857 2341 ft2 = tc.create_double_precision_real_field_class()
1eccc498 2342 ft3 = tc.create_signed_integer_field_class(17)
1eccc498
SM
2343 fc = tc.create_variant_field_class()
2344 fc.append_option('corner', ft0)
2345 fc.append_option('zoom', ft1)
2346 fc.append_option('mellotron', ft2)
2347 fc.append_option('giorgio', ft3)
1eccc498 2348 top_fc = tc.create_structure_field_class()
1eccc498
SM
2349 top_fc.append_member('variant_field', fc)
2350 return top_fc
811644b8 2351
811644b8 2352 def setUp(self):
1eccc498
SM
2353 self._tc = get_default_trace_class()
2354 fld = _create_field(self._tc, self._create_fc(self._tc))
2355 self._def = fld['variant_field']
811644b8 2356
f0a42b33
FD
2357 self._def_value = 1334
2358 self._def_selected_index = 3
2359 const_fc = self._create_fc(self._tc)['variant_field']
2360
2361 fld_const = _create_const_field(
2362 self._tc, const_fc.field_class, self._const_value_setter
2363 )
2364 self._def_const = fld_const
2365
1eccc498
SM
2366 def test_bool_op(self):
2367 self._def.selected_option_index = 2
2368 self._def.value = -17.34
2369 with self.assertRaises(NotImplementedError):
2370 bool(self._def)
811644b8 2371
1eccc498
SM
2372 def test_selected_option_index(self):
2373 self._def.selected_option_index = 2
2374 self.assertEqual(self._def.selected_option_index, 2)
811644b8 2375
d431b4de
FD
2376 def test_selected_option_index_above_range(self):
2377 with self.assertRaises(IndexError):
2378 self._def.selected_option_index = 4
2379
2380 def test_selected_option_index_below_range(self):
2381 with self.assertRaises(IndexError):
2382 self._def.selected_option_index = -1
2383
f0a42b33
FD
2384 def test_const_selected_option_index(self):
2385 with self.assertRaises(AttributeError):
2386 self._def_const.selected_option_index = 2
2387 self.assertEqual(self._def_const.selected_option_index, 3)
2388
1eccc498
SM
2389 def test_selected_option(self):
2390 self._def.selected_option_index = 2
2391 self._def.value = -17.34
2392 self.assertEqual(self._def.selected_option, -17.34)
fe4df857 2393 self.assertEqual(type(self._def.selected_option), bt2._DoublePrecisionRealField)
1eccc498
SM
2394
2395 self._def.selected_option_index = 3
2396 self._def.value = 1921
2397 self.assertEqual(self._def.selected_option, 1921)
f0a42b33
FD
2398 self.assertEqual(type(self._def.selected_option), bt2._SignedIntegerField)
2399
2400 def test_const_selected_option(self):
2401 self.assertEqual(self._def_const.selected_option, 1334)
2402 self.assertEqual(
2403 type(self._def_const.selected_option), bt2._SignedIntegerFieldConst
2404 )
811644b8
PP
2405
2406 def test_eq(self):
1eccc498
SM
2407 field = _create_field(self._tc, self._create_fc(self._tc))
2408 field = field['variant_field']
2409 field.selected_option_index = 0
2410 field.value = 1774
2411 self._def.selected_option_index = 0
2412 self._def.value = 1774
811644b8
PP
2413 self.assertEqual(self._def, field)
2414
f0a42b33
FD
2415 def test_const_eq(self):
2416 field = _create_field(self._tc, self._create_fc(self._tc))
2417 field = field['variant_field']
2418 field.selected_option_index = 3
2419 field.value = 1334
2420 self.assertEqual(self._def_const, field)
2421
2b9aa00b
FD
2422 def test_len(self):
2423 self.assertEqual(len(self._def), 4)
2424
811644b8 2425 def test_eq_invalid_type(self):
1eccc498
SM
2426 self._def.selected_option_index = 1
2427 self._def.value = 'gerry'
811644b8 2428 self.assertNotEqual(self._def, 23)
742e4747 2429
b0bdda42 2430 def test_str_op_int(self):
1eccc498
SM
2431 field = _create_field(self._tc, self._create_fc(self._tc))
2432 field = field['variant_field']
2433 field.selected_option_index = 0
2434 field.value = 1774
2435 other_field = _create_field(self._tc, self._create_fc(self._tc))
2436 other_field = other_field['variant_field']
2437 other_field.selected_option_index = 0
2438 other_field.value = 1774
2439 self.assertEqual(str(field), str(other_field))
b0bdda42
JG
2440
2441 def test_str_op_str(self):
1eccc498
SM
2442 field = _create_field(self._tc, self._create_fc(self._tc))
2443 field = field['variant_field']
2444 field.selected_option_index = 1
2445 field.value = 'un beau grand bateau'
2446 other_field = _create_field(self._tc, self._create_fc(self._tc))
2447 other_field = other_field['variant_field']
2448 other_field.selected_option_index = 1
2449 other_field.value = 'un beau grand bateau'
2450 self.assertEqual(str(field), str(other_field))
2451
2452 def test_str_op_float(self):
2453 field = _create_field(self._tc, self._create_fc(self._tc))
2454 field = field['variant_field']
2455 field.selected_option_index = 2
2456 field.value = 14.4245
2457 other_field = _create_field(self._tc, self._create_fc(self._tc))
2458 other_field = other_field['variant_field']
2459 other_field.selected_option_index = 2
2460 other_field.value = 14.4245
2461 self.assertEqual(str(field), str(other_field))
d14ddbba
SM
2462
2463
2464if __name__ == '__main__':
2465 unittest.main()
This page took 0.154248 seconds and 4 git commands to generate.