bt2: add `if __name__ == '__main__'` snippet to all tests
[babeltrace.git] / tests / bindings / python / bt2 / test_field.py
... / ...
CommitLineData
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
19from functools import partial, partialmethod
20import operator
21import unittest
22import math
23import copy
24import itertools
25import collections
26import bt2
27from utils import get_default_trace_class, TestOutputPortMessageIterator
28
29
30_COMP_BINOPS = (operator.eq, operator.ne)
31
32
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
38
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()
45 stream_class = tc.create_stream_class(
46 packet_context_field_class=packet_context_fc, supports_packets=True
47 )
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
58
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
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):
76 def __init__(self, self_port_output):
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):
96 def __init__(self, params, obj):
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
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
115
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
129
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
145
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
163
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
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
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`.
226class _TestNumericField:
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.
238 def _binop(self, op, rhs):
239 type_rexc = None
240 type_rvexc = None
241 comp_value = rhs
242
243 # try with field object
244 try:
245 r = op(self._def, rhs)
246 except Exception as e:
247 type_rexc = type(e)
248
249 # try with value
250 try:
251 rv = op(self._def_value, comp_value)
252 except Exception as e:
253 type_rvexc = type(e)
254
255 if type_rexc is not None or type_rvexc is not None:
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.)
260 self.assertIs(type_rexc, type_rvexc)
261 return None, None
262
263 return r, rv
264
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.
275 def _unaryop(self, op):
276 type_rexc = None
277 type_rvexc = None
278
279 # try with field object
280 try:
281 r = op(self._def)
282 except Exception as e:
283 type_rexc = type(e)
284
285 # try with value
286 try:
287 rv = op(self._def_value)
288 except Exception as e:
289 type_rvexc = type(e)
290
291 if type_rexc is not None or type_rvexc is not None:
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.)
296 self.assertIs(type_rexc, type_rvexc)
297 return None, None
298
299 return r, rv
300
301 # Tests that the unary operation `op` gives results with the same
302 # type for both `self._def` and `self._def_value`.
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
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`.
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
322 # Tests that the unary operation `op`, when applied to `self._def`,
323 # does not change its underlying BT object address.
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
329 # Tests that the unary operation `op`, when applied to `self._def`,
330 # does not change its value.
331 def _test_unaryop_value_same(self, op):
332 value_before = copy.copy(self._def_value)
333 self._unaryop(op)
334 self.assertEqual(self._def, value_before)
335
336 # Tests that the binary operation `op` gives results with the same
337 # type for both `self._def` and `self._def_value`.
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
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`.
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
361 # Tests that the binary operation `op`, when applied to `self._def`,
362 # does not change its underlying BT object address.
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
368 # Tests that the binary operation `op`, when applied to `self._def`,
369 # does not change its value.
370 @unittest.skip('copy is not implemented')
371 def _test_binop_lhs_value_same(self, op, rhs):
372 value_before = copy.copy(self._def)
373 r, rv = self._binop(op, rhs)
374 self.assertEqual(self._def, value_before)
375
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
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
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
450 def _test_binop_rhs_complex(self, test_cb, op):
451 test_cb(op, -23 + 19j)
452
453 def _test_binop_rhs_zero_complex(self, test_cb, op):
454 test_cb(op, 0j)
455
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
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
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
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
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
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
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
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
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
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
675 def test_eq_none(self):
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).
679 self.assertFalse(self._def == None) # noqa: E711
680
681 def test_ne_none(self):
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).
685 self.assertTrue(self._def != None) # noqa: E711
686
687
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.
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
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.
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
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.
762def _inject_numeric_testing_methods(cls):
763 def test_binop_name(suffix):
764 return 'test_binop_{}_{}'.format(name, suffix)
765
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:
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 )
1157
1158 # inject testing methods for each unary operation
1159 for name, unaryop in _UNARYOPS:
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 )
1180
1181
1182class BoolFieldTestCase(_TestNumericField, unittest.TestCase):
1183 @staticmethod
1184 def _const_value_setter(field):
1185 field.value = True
1186
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
1195 self._def_const = _create_const_field(
1196 self._tc, self._tc.create_bool_field_class(), self._const_value_setter
1197 )
1198 self._def_new_value = False
1199
1200 def test_classes(self):
1201 self.assertIs(type(self._def), bt2._BoolField)
1202 self.assertIs(type(self._def_const), bt2._BoolFieldConst)
1203
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
1239class _TestIntegerFieldCommon(_TestNumericField):
1240 def test_assign_true(self):
1241 raw = True
1242 self._def.value = raw
1243 self.assertEqual(self._def, raw)
1244
1245 def test_assign_false(self):
1246 raw = False
1247 self._def.value = raw
1248 self.assertEqual(self._def, raw)
1249
1250 def test_assign_pos_int(self):
1251 raw = 477
1252 self._def.value = raw
1253 self.assertEqual(self._def, raw)
1254
1255 def test_assign_neg_int(self):
1256 raw = -13
1257 self._def.value = raw
1258 self.assertEqual(self._def, raw)
1259
1260 def test_assign_int_field(self):
1261 raw = 999
1262 field = _create_field(self._tc, self._create_fc(self._tc))
1263 field.value = raw
1264 self._def.value = field
1265 self.assertEqual(self._def, raw)
1266
1267 def test_assign_invalid_type(self):
1268 with self.assertRaises(TypeError):
1269 self._def.value = 'yes'
1270
1271 def test_assign_uint(self):
1272 uint_fc = self._tc.create_unsigned_integer_field_class(32)
1273 field = _create_field(self._tc, uint_fc)
1274 raw = 1777
1275 field.value = 1777
1276 self.assertEqual(field, raw)
1277
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.
1283 raw = (2 ** 53) + 1
1284 field.value = (2 ** 53) + 1
1285 self.assertEqual(field, raw)
1286
1287 def test_assign_uint_invalid_neg(self):
1288 uint_fc = self._tc.create_unsigned_integer_field_class(32)
1289 field = _create_field(self._tc, uint_fc)
1290
1291 with self.assertRaises(ValueError):
1292 field.value = -23
1293
1294 def test_str_op(self):
1295 self.assertEqual(str(self._def), str(self._def_value))
1296
1297
1298_inject_numeric_testing_methods(_TestIntegerFieldCommon)
1299
1300
1301class SignedIntegerFieldTestCase(_TestIntegerFieldCommon, unittest.TestCase):
1302 @staticmethod
1303 def _const_value_setter(field):
1304 field.value = 17
1305
1306 def _create_fc(self, tc):
1307 return tc.create_signed_integer_field_class(25)
1308
1309 def setUp(self):
1310 self._tc = get_default_trace_class()
1311 self._field = _create_field(self._tc, self._create_fc(self._tc))
1312 self._field.value = 17
1313 self._def = _create_field(self._tc, self._create_fc(self._tc))
1314 self._def.value = 17
1315 self._def_value = 17
1316 self._def_const = _create_const_field(
1317 self._tc, self._create_fc(self._tc), self._const_value_setter
1318 )
1319 self._def_new_value = -101
1320
1321
1322class SignedEnumerationFieldTestCase(_TestIntegerFieldCommon, unittest.TestCase):
1323 @staticmethod
1324 def _const_value_setter(field):
1325 field.value = 17
1326
1327 def _create_fc(self, tc):
1328 fc = tc.create_signed_enumeration_field_class(32)
1329 fc.add_mapping('something', bt2.SignedIntegerRangeSet([(17, 17)]))
1330 fc.add_mapping('speaker', bt2.SignedIntegerRangeSet([(12, 16)]))
1331 fc.add_mapping('can', bt2.SignedIntegerRangeSet([(18, 2540)]))
1332 fc.add_mapping(
1333 'whole range', bt2.SignedIntegerRangeSet([(-(2 ** 31), (2 ** 31) - 1)])
1334 )
1335 fc.add_mapping('zip', bt2.SignedIntegerRangeSet([(-45, 1001)]))
1336 return fc
1337
1338 def setUp(self):
1339 self._tc = get_default_trace_class()
1340 self._field = _create_field(self._tc, self._create_fc(self._tc))
1341 self._def = _create_field(self._tc, self._create_fc(self._tc))
1342 self._def.value = 17
1343 self._def_value = 17
1344 self._def_const = _create_const_field(
1345 self._tc, self._create_fc(self._tc), self._const_value_setter
1346 )
1347 self._def_new_value = -101
1348
1349 def test_str_op(self):
1350 expected_string_found = False
1351 s = str(self._def)
1352
1353 # Establish all permutations of the three expected matches since
1354 # the order in which mappings are enumerated is not explicitly part of
1355 # the API.
1356 for p in itertools.permutations(['whole range', 'something', 'zip']):
1357 candidate = '{} ({})'.format(self._def_value, ', '.join(p))
1358 if candidate == s:
1359 expected_string_found = True
1360 break
1361
1362 self.assertTrue(expected_string_found)
1363
1364 def test_labels(self):
1365 self._field.value = 17
1366 labels = sorted(self._field.labels)
1367 self.assertEqual(labels, ['something', 'whole range', 'zip'])
1368
1369
1370class RealFieldTestCase(_TestNumericField, unittest.TestCase):
1371 @staticmethod
1372 def _const_value_setter(field):
1373 field.value = 52.7
1374
1375 def _create_fc(self, tc):
1376 return tc.create_real_field_class()
1377
1378 def setUp(self):
1379 self._tc = get_default_trace_class()
1380 self._field = _create_field(self._tc, self._create_fc(self._tc))
1381 self._def = _create_field(self._tc, self._create_fc(self._tc))
1382 self._def_const = _create_const_field(
1383 self._tc, self._tc.create_real_field_class(), self._const_value_setter
1384 )
1385 self._def.value = 52.7
1386 self._def_value = 52.7
1387 self._def_new_value = -17.164857
1388
1389 def _test_invalid_op(self, cb):
1390 with self.assertRaises(TypeError):
1391 cb()
1392
1393 def test_assign_true(self):
1394 self._def.value = True
1395 self.assertTrue(self._def)
1396
1397 def test_assign_false(self):
1398 self._def.value = False
1399 self.assertFalse(self._def)
1400
1401 def test_assign_pos_int(self):
1402 raw = 477
1403 self._def.value = raw
1404 self.assertEqual(self._def, float(raw))
1405
1406 def test_assign_neg_int(self):
1407 raw = -13
1408 self._def.value = raw
1409 self.assertEqual(self._def, float(raw))
1410
1411 def test_assign_int_field(self):
1412 int_fc = self._tc.create_signed_integer_field_class(32)
1413 int_field = _create_field(self._tc, int_fc)
1414 raw = 999
1415 int_field.value = raw
1416 self._def.value = int_field
1417 self.assertEqual(self._def, float(raw))
1418
1419 def test_assign_float(self):
1420 raw = -19.23
1421 self._def.value = raw
1422 self.assertEqual(self._def, raw)
1423
1424 def test_assign_float_field(self):
1425 field = _create_field(self._tc, self._create_fc(self._tc))
1426 raw = 101.32
1427 field.value = raw
1428 self._def.value = field
1429 self.assertEqual(self._def, raw)
1430
1431 def test_assign_invalid_type(self):
1432 with self.assertRaises(TypeError):
1433 self._def.value = 'yes'
1434
1435 def test_invalid_lshift(self):
1436 self._test_invalid_op(lambda: self._def << 23)
1437
1438 def test_invalid_rshift(self):
1439 self._test_invalid_op(lambda: self._def >> 23)
1440
1441 def test_invalid_and(self):
1442 self._test_invalid_op(lambda: self._def & 23)
1443
1444 def test_invalid_or(self):
1445 self._test_invalid_op(lambda: self._def | 23)
1446
1447 def test_invalid_xor(self):
1448 self._test_invalid_op(lambda: self._def ^ 23)
1449
1450 def test_invalid_invert(self):
1451 self._test_invalid_op(lambda: ~self._def)
1452
1453 def test_str_op(self):
1454 self.assertEqual(str(self._def), str(self._def_value))
1455
1456
1457_inject_numeric_testing_methods(RealFieldTestCase)
1458
1459
1460class StringFieldTestCase(unittest.TestCase):
1461 @staticmethod
1462 def _const_value_setter(field):
1463 field.value = 'Hello, World!'
1464
1465 def setUp(self):
1466 self._tc = get_default_trace_class()
1467 self._def_value = 'Hello, World!'
1468 self._def = _create_string_field(self._tc)
1469 self._def_const = _create_const_field(
1470 self._tc, self._tc.create_string_field_class(), self._const_value_setter
1471 )
1472 self._def.value = self._def_value
1473 self._def_new_value = 'Yes!'
1474
1475 def test_assign_int(self):
1476 with self.assertRaises(TypeError):
1477 self._def.value = 283
1478
1479 def test_assign_string_field(self):
1480 field = _create_string_field(self._tc)
1481 raw = 'zorg'
1482 field.value = raw
1483 self.assertEqual(field, raw)
1484
1485 def test_eq(self):
1486 self.assertEqual(self._def, self._def_value)
1487
1488 def test_const_eq(self):
1489 self.assertEqual(self._def_const, self._def_value)
1490
1491 def test_not_eq(self):
1492 self.assertNotEqual(self._def, 23)
1493
1494 def test_lt_vstring(self):
1495 s1 = _create_string_field(self._tc)
1496 s1.value = 'allo'
1497 s2 = _create_string_field(self._tc)
1498 s2.value = 'bateau'
1499 self.assertLess(s1, s2)
1500
1501 def test_lt_string(self):
1502 s1 = _create_string_field(self._tc)
1503 s1.value = 'allo'
1504 self.assertLess(s1, 'bateau')
1505
1506 def test_le_vstring(self):
1507 s1 = _create_string_field(self._tc)
1508 s1.value = 'allo'
1509 s2 = _create_string_field(self._tc)
1510 s2.value = 'bateau'
1511 self.assertLessEqual(s1, s2)
1512
1513 def test_le_string(self):
1514 s1 = _create_string_field(self._tc)
1515 s1.value = 'allo'
1516 self.assertLessEqual(s1, 'bateau')
1517
1518 def test_gt_vstring(self):
1519 s1 = _create_string_field(self._tc)
1520 s1.value = 'allo'
1521 s2 = _create_string_field(self._tc)
1522 s2.value = 'bateau'
1523 self.assertGreater(s2, s1)
1524
1525 def test_gt_string(self):
1526 s1 = _create_string_field(self._tc)
1527 s1.value = 'allo'
1528 self.assertGreater('bateau', s1)
1529
1530 def test_ge_vstring(self):
1531 s1 = _create_string_field(self._tc)
1532 s1.value = 'allo'
1533 s2 = _create_string_field(self._tc)
1534 s2.value = 'bateau'
1535 self.assertGreaterEqual(s2, s1)
1536
1537 def test_ge_string(self):
1538 s1 = _create_string_field(self._tc)
1539 s1.value = 'allo'
1540 self.assertGreaterEqual('bateau', s1)
1541
1542 def test_bool_op(self):
1543 self.assertEqual(bool(self._def), bool(self._def_value))
1544
1545 def test_str_op(self):
1546 self.assertEqual(str(self._def), str(self._def_value))
1547
1548 def test_len(self):
1549 self.assertEqual(len(self._def), len(self._def_value))
1550
1551 def test_getitem(self):
1552 self.assertEqual(self._def[5], self._def_value[5])
1553
1554 def test_const_getitem(self):
1555 self.assertEqual(self._def_const[5], self._def_value[5])
1556
1557 def test_append_str(self):
1558 to_append = 'meow meow meow'
1559 self._def += to_append
1560 self._def_value += to_append
1561 self.assertEqual(self._def, self._def_value)
1562
1563 def test_const_append_str(self):
1564 to_append = 'meow meow meow'
1565 with self.assertRaises(TypeError):
1566 self._def_const += to_append
1567 self.assertEqual(self._def_const, self._def_value)
1568
1569 def test_append_string_field(self):
1570 field = _create_string_field(self._tc)
1571 to_append = 'meow meow meow'
1572 field.value = to_append
1573 self._def += field
1574 self._def_value += to_append
1575 self.assertEqual(self._def, self._def_value)
1576
1577 def test_hash_op(self):
1578 with self.assertRaises(TypeError):
1579 hash(self._def)
1580
1581 def test_const_hash_op(self):
1582 self.assertEqual(hash(self._def_const), hash(self._def_value))
1583
1584 def test_const_hash_dict(self):
1585 my_dict = {}
1586 my_dict[self._def_const] = 'my_value'
1587 self.assertEqual(my_dict[self._def_value], 'my_value')
1588
1589
1590class _TestArrayFieldCommon:
1591 def _modify_def(self):
1592 self._def[2] = 23
1593
1594 def test_bool_op_true(self):
1595 self.assertTrue(self._def)
1596
1597 def test_len(self):
1598 self.assertEqual(len(self._def), 3)
1599
1600 def test_length(self):
1601 self.assertEqual(self._def.length, 3)
1602
1603 def test_getitem(self):
1604 field = self._def[1]
1605 self.assertIs(type(field), bt2._SignedIntegerField)
1606 self.assertEqual(field, 1847)
1607
1608 def test_const_getitem(self):
1609 field = self._def_const[1]
1610 self.assertIs(type(field), bt2._SignedIntegerFieldConst)
1611 self.assertEqual(field, 1847)
1612
1613 def test_eq(self):
1614 field = _create_int_array_field(self._tc, 3)
1615 field[0] = 45
1616 field[1] = 1847
1617 field[2] = 1948754
1618 self.assertEqual(self._def, field)
1619
1620 def test_eq_invalid_type(self):
1621 self.assertNotEqual(self._def, 23)
1622
1623 def test_eq_diff_len(self):
1624 field = _create_int_array_field(self._tc, 2)
1625 field[0] = 45
1626 field[1] = 1847
1627 self.assertNotEqual(self._def, field)
1628
1629 def test_eq_diff_content_same_len(self):
1630 field = _create_int_array_field(self._tc, 3)
1631 field[0] = 45
1632 field[1] = 1846
1633 field[2] = 1948754
1634 self.assertNotEqual(self._def, field)
1635
1636 def test_eq_non_sequence_iterable(self):
1637 dct = collections.OrderedDict([(1, 2), (3, 4), (5, 6)])
1638 field = _create_int_array_field(self._tc, 3)
1639 field[0] = 1
1640 field[1] = 3
1641 field[2] = 5
1642 self.assertEqual(field, list(dct.keys()))
1643 self.assertNotEqual(field, dct)
1644
1645 def test_setitem(self):
1646 self._def[2] = 24
1647 self.assertEqual(self._def[2], 24)
1648
1649 def test_setitem_int_field(self):
1650 int_fc = self._tc.create_signed_integer_field_class(32)
1651 int_field = _create_field(self._tc, int_fc)
1652 int_field.value = 19487
1653 self._def[1] = int_field
1654 self.assertEqual(self._def[1], 19487)
1655
1656 def test_setitem_non_basic_field(self):
1657 array_field = _create_struct_array_field(self._tc, 2)
1658 with self.assertRaises(TypeError):
1659 array_field[1] = 23
1660
1661 def test_setitem_none(self):
1662 with self.assertRaises(TypeError):
1663 self._def[1] = None
1664
1665 def test_setitem_index_wrong_type(self):
1666 with self.assertRaises(TypeError):
1667 self._def['yes'] = 23
1668
1669 def test_setitem_index_neg(self):
1670 with self.assertRaises(IndexError):
1671 self._def[-2] = 23
1672
1673 def test_setitem_index_out_of_range(self):
1674 with self.assertRaises(IndexError):
1675 self._def[len(self._def)] = 134679
1676
1677 def test_const_setitem(self):
1678 with self.assertRaises(TypeError):
1679 self._def_const[0] = 134679
1680
1681 def test_iter(self):
1682 for field, value in zip(self._def, (45, 1847, 1948754)):
1683 self.assertEqual(field, value)
1684
1685 def test_const_iter(self):
1686 for field, value in zip(self._def_const, (45, 1847, 1948754)):
1687 self.assertEqual(field, value)
1688
1689 def test_value_int_field(self):
1690 values = [45646, 145, 12145]
1691 self._def.value = values
1692 self.assertEqual(values, self._def)
1693
1694 def test_value_check_sequence(self):
1695 values = 42
1696 with self.assertRaises(TypeError):
1697 self._def.value = values
1698
1699 def test_value_wrong_type_in_sequence(self):
1700 values = [32, 'hello', 11]
1701 with self.assertRaises(TypeError):
1702 self._def.value = values
1703
1704 def test_value_complex_type(self):
1705 struct_fc = self._tc.create_structure_field_class()
1706 int_fc = self._tc.create_signed_integer_field_class(32)
1707 another_int_fc = self._tc.create_signed_integer_field_class(32)
1708 str_fc = self._tc.create_string_field_class()
1709 struct_fc.append_member(field_class=int_fc, name='an_int')
1710 struct_fc.append_member(field_class=str_fc, name='a_string')
1711 struct_fc.append_member(field_class=another_int_fc, name='another_int')
1712 array_fc = self._tc.create_static_array_field_class(struct_fc, 3)
1713 stream = _create_stream(self._tc, [('array_field', array_fc)])
1714 values = [
1715 {'an_int': 42, 'a_string': 'hello', 'another_int': 66},
1716 {'an_int': 1, 'a_string': 'goodbye', 'another_int': 488},
1717 {'an_int': 156, 'a_string': 'or not', 'another_int': 4648},
1718 ]
1719
1720 array = stream.create_packet().context_field['array_field']
1721 array.value = values
1722 self.assertEqual(values, array)
1723 values[0]['an_int'] = 'a string'
1724 with self.assertRaises(TypeError):
1725 array.value = values
1726
1727 def test_str_op(self):
1728 s = str(self._def)
1729 expected_string = '[{}]'.format(', '.join([repr(v) for v in self._def_value]))
1730 self.assertEqual(expected_string, s)
1731
1732
1733class StaticArrayFieldTestCase(_TestArrayFieldCommon, unittest.TestCase):
1734 @staticmethod
1735 def _const_value_setter(field):
1736 field.value = [45, 1847, 1948754]
1737
1738 def setUp(self):
1739 self._tc = get_default_trace_class()
1740 self._def = _create_int_array_field(self._tc, 3)
1741 self._def[0] = 45
1742 self._def[1] = 1847
1743 self._def[2] = 1948754
1744 self._def_value = [45, 1847, 1948754]
1745 self._def_const = _create_const_field(
1746 self._tc,
1747 self._tc.create_static_array_field_class(
1748 self._tc.create_signed_integer_field_class(32), 3
1749 ),
1750 self._const_value_setter,
1751 )
1752
1753 def test_value_wrong_len(self):
1754 values = [45, 1847]
1755 with self.assertRaises(ValueError):
1756 self._def.value = values
1757
1758
1759class DynamicArrayFieldTestCase(_TestArrayFieldCommon, unittest.TestCase):
1760 @staticmethod
1761 def _const_value_setter(field):
1762 field.value = [45, 1847, 1948754]
1763
1764 def setUp(self):
1765 self._tc = get_default_trace_class()
1766 self._def = _create_dynamic_array(self._tc)
1767 self._def[0] = 45
1768 self._def[1] = 1847
1769 self._def[2] = 1948754
1770 self._def_value = [45, 1847, 1948754]
1771 self._def_const = _create_const_field(
1772 self._tc,
1773 self._tc.create_dynamic_array_field_class(
1774 self._tc.create_signed_integer_field_class(32)
1775 ),
1776 self._const_value_setter,
1777 )
1778
1779 def test_value_resize(self):
1780 new_values = [1, 2, 3, 4]
1781 self._def.value = new_values
1782 self.assertCountEqual(self._def, new_values)
1783
1784 def test_set_length(self):
1785 self._def.length = 4
1786 self._def[3] = 0
1787 self.assertEqual(len(self._def), 4)
1788
1789 def test_const_set_length(self):
1790 with self.assertRaises(AttributeError):
1791 self._def_const.length = 4
1792 self.assertEqual(len(self._def), 3)
1793
1794 def test_set_invalid_length(self):
1795 with self.assertRaises(TypeError):
1796 self._def.length = 'cheval'
1797
1798
1799class StructureFieldTestCase(unittest.TestCase):
1800 @staticmethod
1801 def _const_value_setter(field):
1802 field.value = {
1803 'A': -1872,
1804 'B': 'salut',
1805 'C': 17.5,
1806 'D': 16497,
1807 'E': {},
1808 'F': {'F_1': 52},
1809 }
1810
1811 def _create_fc(self, tc):
1812 fc = tc.create_structure_field_class()
1813 fc.append_member('A', self._fc0_fn())
1814 fc.append_member('B', self._fc1_fn())
1815 fc.append_member('C', self._fc2_fn())
1816 fc.append_member('D', self._fc3_fn())
1817 fc.append_member('E', self._fc4_fn())
1818 fc5 = self._fc5_fn()
1819 fc5.append_member('F_1', self._fc5_inner_fn())
1820 fc.append_member('F', fc5)
1821 return fc
1822
1823 def setUp(self):
1824 self._tc = get_default_trace_class()
1825 self._fc0_fn = self._tc.create_signed_integer_field_class
1826 self._fc1_fn = self._tc.create_string_field_class
1827 self._fc2_fn = self._tc.create_real_field_class
1828 self._fc3_fn = self._tc.create_signed_integer_field_class
1829 self._fc4_fn = self._tc.create_structure_field_class
1830 self._fc5_fn = self._tc.create_structure_field_class
1831 self._fc5_inner_fn = self._tc.create_signed_integer_field_class
1832
1833 self._fc = self._create_fc(self._tc)
1834 self._def = _create_field(self._tc, self._fc)
1835 self._def['A'] = -1872
1836 self._def['B'] = 'salut'
1837 self._def['C'] = 17.5
1838 self._def['D'] = 16497
1839 self._def['E'] = {}
1840 self._def['F'] = {'F_1': 52}
1841 self._def_value = {
1842 'A': -1872,
1843 'B': 'salut',
1844 'C': 17.5,
1845 'D': 16497,
1846 'E': {},
1847 'F': {'F_1': 52},
1848 }
1849
1850 self._def_const = _create_const_field(
1851 self._tc, self._create_fc(self._tc), self._const_value_setter
1852 )
1853
1854 def _modify_def(self):
1855 self._def['B'] = 'hola'
1856
1857 def test_bool_op_true(self):
1858 self.assertTrue(self._def)
1859
1860 def test_bool_op_false(self):
1861 field = self._def['E']
1862 self.assertFalse(field)
1863
1864 def test_len(self):
1865 self.assertEqual(len(self._def), len(self._def_value))
1866
1867 def test_getitem(self):
1868 field1 = self._def['A']
1869 field2 = self._def['B']
1870 field3 = self._def['C']
1871 field4 = self._def['D']
1872 field5 = self._def['E']
1873 field6 = self._def['F']
1874
1875 self.assertIs(type(field1), bt2._SignedIntegerField)
1876 self.assertEqual(field1, -1872)
1877
1878 self.assertIs(type(field2), bt2._StringField)
1879 self.assertEqual(field2, 'salut')
1880
1881 self.assertIs(type(field3), bt2._RealField)
1882 self.assertEqual(field3, 17.5)
1883
1884 self.assertIs(type(field4), bt2._SignedIntegerField)
1885 self.assertEqual(field4, 16497)
1886
1887 self.assertIs(type(field5), bt2._StructureField)
1888 self.assertEqual(field5, {})
1889
1890 self.assertIs(type(field6), bt2._StructureField)
1891 self.assertEqual(field6, {'F_1': 52})
1892
1893 def test_const_getitem(self):
1894 field1 = self._def_const['A']
1895 field2 = self._def_const['B']
1896 field3 = self._def_const['C']
1897 field4 = self._def_const['D']
1898 field5 = self._def_const['E']
1899 field6 = self._def_const['F']
1900
1901 self.assertIs(type(field1), bt2._SignedIntegerFieldConst)
1902 self.assertEqual(field1, -1872)
1903
1904 self.assertIs(type(field2), bt2._StringFieldConst)
1905 self.assertEqual(field2, 'salut')
1906
1907 self.assertIs(type(field3), bt2._RealFieldConst)
1908 self.assertEqual(field3, 17.5)
1909
1910 self.assertIs(type(field4), bt2._SignedIntegerFieldConst)
1911 self.assertEqual(field4, 16497)
1912
1913 self.assertIs(type(field5), bt2._StructureFieldConst)
1914 self.assertEqual(field5, {})
1915
1916 self.assertIs(type(field6), bt2._StructureFieldConst)
1917 self.assertEqual(field6, {'F_1': 52})
1918
1919 def test_member_at_index_out_of_bounds_after(self):
1920 with self.assertRaises(IndexError):
1921 self._def.member_at_index(len(self._def_value))
1922
1923 def test_eq(self):
1924 field = _create_field(self._tc, self._create_fc(self._tc))
1925 field['A'] = -1872
1926 field['B'] = 'salut'
1927 field['C'] = 17.5
1928 field['D'] = 16497
1929 field['E'] = {}
1930 field['F'] = {'F_1': 52}
1931 self.assertEqual(self._def, field)
1932
1933 def test_const_eq(self):
1934 field = _create_field(self._tc, self._create_fc(self._tc))
1935 field['A'] = -1872
1936 field['B'] = 'salut'
1937 field['C'] = 17.5
1938 field['D'] = 16497
1939 field['E'] = {}
1940 field['F'] = {'F_1': 52}
1941 self.assertEqual(self._def_const, field)
1942
1943 def test_eq_invalid_type(self):
1944 self.assertNotEqual(self._def, 23)
1945
1946 def test_eq_diff_len(self):
1947 fc = self._tc.create_structure_field_class()
1948 fc.append_member('A', self._fc0_fn())
1949 fc.append_member('B', self._fc1_fn())
1950 fc.append_member('C', self._fc2_fn())
1951
1952 field = _create_field(self._tc, fc)
1953 field['A'] = -1872
1954 field['B'] = 'salut'
1955 field['C'] = 17.5
1956 self.assertNotEqual(self._def, field)
1957
1958 def test_eq_diff_keys(self):
1959 fc = self._tc.create_structure_field_class()
1960 fc.append_member('U', self._fc0_fn())
1961 fc.append_member('V', self._fc1_fn())
1962 fc.append_member('W', self._fc2_fn())
1963 fc.append_member('X', self._fc3_fn())
1964 fc.append_member('Y', self._fc4_fn())
1965 fc.append_member('Z', self._fc5_fn())
1966 field = _create_field(self._tc, fc)
1967 field['U'] = -1871
1968 field['V'] = "gerry"
1969 field['W'] = 18.19
1970 field['X'] = 16497
1971 field['Y'] = {}
1972 field['Z'] = {}
1973 self.assertNotEqual(self._def, field)
1974
1975 def test_eq_diff_content_same_len(self):
1976 field = _create_field(self._tc, self._create_fc(self._tc))
1977 field['A'] = -1872
1978 field['B'] = 'salut'
1979 field['C'] = 17.4
1980 field['D'] = 16497
1981 field['E'] = {}
1982 field['F'] = {'F_1': 0}
1983 self.assertNotEqual(self._def, field)
1984
1985 def test_eq_same_content_diff_keys(self):
1986 fc = self._tc.create_structure_field_class()
1987 fc.append_member('A', self._fc0_fn())
1988 fc.append_member('B', self._fc1_fn())
1989 fc.append_member('E', self._fc2_fn())
1990 fc.append_member('D', self._fc3_fn())
1991 fc.append_member('C', self._fc4_fn())
1992 fc.append_member('F', self._fc5_fn())
1993 field = _create_field(self._tc, fc)
1994 field['A'] = -1872
1995 field['B'] = 'salut'
1996 field['E'] = 17.5
1997 field['D'] = 16497
1998 field['C'] = {}
1999 field['F'] = {}
2000 self.assertNotEqual(self._def, field)
2001
2002 def test_setitem(self):
2003 self._def['C'] = -18.47
2004 self.assertEqual(self._def['C'], -18.47)
2005
2006 def test_const_setitem(self):
2007 with self.assertRaises(TypeError):
2008 self._def_const['A'] = 134679
2009
2010 def test_setitem_int_field(self):
2011 int_fc = self._tc.create_signed_integer_field_class(32)
2012 int_field = _create_field(self._tc, int_fc)
2013 int_field.value = 19487
2014 self._def['D'] = int_field
2015 self.assertEqual(self._def['D'], 19487)
2016
2017 def test_setitem_non_basic_field(self):
2018 elem_fc = self._tc.create_structure_field_class()
2019 struct_fc = self._tc.create_structure_field_class()
2020 struct_fc.append_member('A', elem_fc)
2021 struct_field = _create_field(self._tc, struct_fc)
2022
2023 # Will fail on access to .items() of the value
2024 with self.assertRaises(AttributeError):
2025 struct_field['A'] = 23
2026
2027 def test_setitem_none(self):
2028 with self.assertRaises(TypeError):
2029 self._def['C'] = None
2030
2031 def test_setitem_key_wrong_type(self):
2032 with self.assertRaises(TypeError):
2033 self._def[3] = 23
2034
2035 def test_setitem_wrong_key(self):
2036 with self.assertRaises(KeyError):
2037 self._def['hi'] = 134679
2038
2039 def test_member_at_index(self):
2040 self.assertEqual(self._def.member_at_index(1), 'salut')
2041
2042 def test_const_member_at_index(self):
2043 self.assertEqual(self._def_const.member_at_index(1), 'salut')
2044
2045 def test_iter(self):
2046 orig_values = {
2047 'A': -1872,
2048 'B': 'salut',
2049 'C': 17.5,
2050 'D': 16497,
2051 'E': {},
2052 'F': {'F_1': 52},
2053 }
2054
2055 for vkey, vval in self._def.items():
2056 val = orig_values[vkey]
2057 self.assertEqual(vval, val)
2058
2059 def test_value(self):
2060 orig_values = {
2061 'A': -1872,
2062 'B': 'salut',
2063 'C': 17.5,
2064 'D': 16497,
2065 'E': {},
2066 'F': {'F_1': 52},
2067 }
2068 self.assertEqual(self._def, orig_values)
2069
2070 def test_set_value(self):
2071 int_fc = self._tc.create_signed_integer_field_class(32)
2072 another_int_fc = self._tc.create_signed_integer_field_class(32)
2073 str_fc = self._tc.create_string_field_class()
2074 struct_fc = self._tc.create_structure_field_class()
2075 struct_fc.append_member(field_class=int_fc, name='an_int')
2076 struct_fc.append_member(field_class=str_fc, name='a_string')
2077 struct_fc.append_member(field_class=another_int_fc, name='another_int')
2078 values = {'an_int': 42, 'a_string': 'hello', 'another_int': 66}
2079
2080 struct = _create_field(self._tc, struct_fc)
2081 struct.value = values
2082 self.assertEqual(values, struct)
2083
2084 bad_type_values = copy.deepcopy(values)
2085 bad_type_values['an_int'] = 'a string'
2086 with self.assertRaises(TypeError):
2087 struct.value = bad_type_values
2088
2089 unknown_key_values = copy.deepcopy(values)
2090 unknown_key_values['unknown_key'] = 16546
2091 with self.assertRaises(KeyError):
2092 struct.value = unknown_key_values
2093
2094 def test_str_op(self):
2095 expected_string_found = False
2096 s = str(self._def)
2097 # Establish all permutations of the three expected matches since
2098 # the order in which mappings are enumerated is not explicitly part of
2099 # the API.
2100 for p in itertools.permutations([(k, v) for k, v in self._def.items()]):
2101 items = ['{}: {}'.format(repr(k), repr(v)) for k, v in p]
2102 candidate = '{{{}}}'.format(', '.join(items))
2103 if candidate == s:
2104 expected_string_found = True
2105 break
2106
2107 self.assertTrue(expected_string_found)
2108
2109
2110class OptionFieldTestCase(unittest.TestCase):
2111 @staticmethod
2112 def _const_value_setter(field):
2113 field.value = {'opt_field': 'hiboux'}
2114
2115 def _create_fc(self, tc):
2116 fc = tc.create_option_field_class(tc.create_string_field_class())
2117 top_fc = tc.create_structure_field_class()
2118 top_fc.append_member('opt_field', fc)
2119 return top_fc
2120
2121 def setUp(self):
2122 self._tc = get_default_trace_class()
2123 fld = _create_field(self._tc, self._create_fc(self._tc))
2124 self._def = fld['opt_field']
2125 self._def_value = 'hiboux'
2126 self._def_const = _create_const_field(
2127 self._tc, self._create_fc(self._tc), self._const_value_setter
2128 )['opt_field']
2129
2130 def test_value_prop(self):
2131 self._def.value = 'hiboux'
2132 self.assertEqual(self._def.field, 'hiboux')
2133 self.assertIs(type(self._def), bt2._OptionField)
2134 self.assertIs(type(self._def.field), bt2._StringField)
2135 self.assertTrue(self._def.has_field)
2136
2137 def test_const_value_prop(self):
2138 self.assertEqual(self._def_const.field, 'hiboux')
2139 self.assertIs(type(self._def_const), bt2._OptionFieldConst)
2140 self.assertIs(type(self._def_const.field), bt2._StringFieldConst)
2141 self.assertTrue(self._def_const.has_field)
2142
2143 def test_has_field_prop_true(self):
2144 self._def.has_field = True
2145 self.assertTrue(self._def.has_field)
2146
2147 def test_has_field_prop_true(self):
2148 self._def.has_field = False
2149 self.assertFalse(self._def.has_field)
2150
2151 def test_bool_op_true(self):
2152 self._def.value = 'allo'
2153 self.assertTrue(self._def)
2154
2155 def test_bool_op_true(self):
2156 self._def.has_field = False
2157 self.assertFalse(self._def)
2158
2159 def test_field_prop_existing(self):
2160 self._def.value = 'meow'
2161 field = self._def.field
2162 self.assertEqual(field, 'meow')
2163
2164 def test_field_prop_none(self):
2165 self._def.has_field = False
2166 field = self._def.field
2167 self.assertIsNone(field)
2168
2169 def test_const_field_prop(self):
2170 with self.assertRaises(AttributeError):
2171 self._def_const.has_field = False
2172
2173 self.assertEqual(self._def_const, self._def_value)
2174 self.assertTrue(self._def_const.has_field)
2175
2176 def test_field_prop_existing_then_none(self):
2177 self._def.value = 'meow'
2178 field = self._def.field
2179 self.assertEqual(field, 'meow')
2180 self._def.has_field = False
2181 field = self._def.field
2182 self.assertIsNone(field)
2183
2184 def test_eq(self):
2185 field = _create_field(self._tc, self._create_fc(self._tc))
2186 field = field['opt_field']
2187 field.value = 'walk'
2188 self._def.value = 'walk'
2189 self.assertEqual(self._def, field)
2190
2191 def test_const_eq(self):
2192 field = _create_field(self._tc, self._create_fc(self._tc))
2193 field = field['opt_field']
2194 field.value = 'hiboux'
2195 self.assertEqual(self._def_const, field)
2196 self.assertEqual(self._def_const, self._def_value)
2197
2198 def test_eq_invalid_type(self):
2199 self._def.value = 'gerry'
2200 self.assertNotEqual(self._def, 23)
2201
2202 def test_str_op(self):
2203 self._def.value = 'marcel'
2204 self.assertEqual(str(self._def), str(self._def.field))
2205
2206 def test_repr_op(self):
2207 self._def.value = 'mireille'
2208 self.assertEqual(repr(self._def), repr(self._def.field))
2209
2210
2211class VariantFieldTestCase(unittest.TestCase):
2212 @staticmethod
2213 def _const_value_setter(field):
2214 field.selected_option_index = 3
2215 field.value = 1334
2216
2217 def _create_fc(self, tc):
2218 ft0 = tc.create_signed_integer_field_class(32)
2219 ft1 = tc.create_string_field_class()
2220 ft2 = tc.create_real_field_class()
2221 ft3 = tc.create_signed_integer_field_class(17)
2222 fc = tc.create_variant_field_class()
2223 fc.append_option('corner', ft0)
2224 fc.append_option('zoom', ft1)
2225 fc.append_option('mellotron', ft2)
2226 fc.append_option('giorgio', ft3)
2227 top_fc = tc.create_structure_field_class()
2228 top_fc.append_member('variant_field', fc)
2229 return top_fc
2230
2231 def setUp(self):
2232 self._tc = get_default_trace_class()
2233 fld = _create_field(self._tc, self._create_fc(self._tc))
2234 self._def = fld['variant_field']
2235
2236 self._def_value = 1334
2237 self._def_selected_index = 3
2238 const_fc = self._create_fc(self._tc)['variant_field']
2239
2240 fld_const = _create_const_field(
2241 self._tc, const_fc.field_class, self._const_value_setter
2242 )
2243 self._def_const = fld_const
2244
2245 def test_bool_op(self):
2246 self._def.selected_option_index = 2
2247 self._def.value = -17.34
2248 with self.assertRaises(NotImplementedError):
2249 bool(self._def)
2250
2251 def test_selected_option_index(self):
2252 self._def.selected_option_index = 2
2253 self.assertEqual(self._def.selected_option_index, 2)
2254
2255 def test_selected_option_index_above_range(self):
2256 with self.assertRaises(IndexError):
2257 self._def.selected_option_index = 4
2258
2259 def test_selected_option_index_below_range(self):
2260 with self.assertRaises(IndexError):
2261 self._def.selected_option_index = -1
2262
2263 def test_const_selected_option_index(self):
2264 with self.assertRaises(AttributeError):
2265 self._def_const.selected_option_index = 2
2266 self.assertEqual(self._def_const.selected_option_index, 3)
2267
2268 def test_selected_option(self):
2269 self._def.selected_option_index = 2
2270 self._def.value = -17.34
2271 self.assertEqual(self._def.selected_option, -17.34)
2272 self.assertEqual(type(self._def.selected_option), bt2._RealField)
2273
2274 self._def.selected_option_index = 3
2275 self._def.value = 1921
2276 self.assertEqual(self._def.selected_option, 1921)
2277 self.assertEqual(type(self._def.selected_option), bt2._SignedIntegerField)
2278
2279 def test_const_selected_option(self):
2280 self.assertEqual(self._def_const.selected_option, 1334)
2281 self.assertEqual(
2282 type(self._def_const.selected_option), bt2._SignedIntegerFieldConst
2283 )
2284
2285 def test_eq(self):
2286 field = _create_field(self._tc, self._create_fc(self._tc))
2287 field = field['variant_field']
2288 field.selected_option_index = 0
2289 field.value = 1774
2290 self._def.selected_option_index = 0
2291 self._def.value = 1774
2292 self.assertEqual(self._def, field)
2293
2294 def test_const_eq(self):
2295 field = _create_field(self._tc, self._create_fc(self._tc))
2296 field = field['variant_field']
2297 field.selected_option_index = 3
2298 field.value = 1334
2299 self.assertEqual(self._def_const, field)
2300
2301 def test_len(self):
2302 self.assertEqual(len(self._def), 4)
2303
2304 def test_eq_invalid_type(self):
2305 self._def.selected_option_index = 1
2306 self._def.value = 'gerry'
2307 self.assertNotEqual(self._def, 23)
2308
2309 def test_str_op_int(self):
2310 field = _create_field(self._tc, self._create_fc(self._tc))
2311 field = field['variant_field']
2312 field.selected_option_index = 0
2313 field.value = 1774
2314 other_field = _create_field(self._tc, self._create_fc(self._tc))
2315 other_field = other_field['variant_field']
2316 other_field.selected_option_index = 0
2317 other_field.value = 1774
2318 self.assertEqual(str(field), str(other_field))
2319
2320 def test_str_op_str(self):
2321 field = _create_field(self._tc, self._create_fc(self._tc))
2322 field = field['variant_field']
2323 field.selected_option_index = 1
2324 field.value = 'un beau grand bateau'
2325 other_field = _create_field(self._tc, self._create_fc(self._tc))
2326 other_field = other_field['variant_field']
2327 other_field.selected_option_index = 1
2328 other_field.value = 'un beau grand bateau'
2329 self.assertEqual(str(field), str(other_field))
2330
2331 def test_str_op_float(self):
2332 field = _create_field(self._tc, self._create_fc(self._tc))
2333 field = field['variant_field']
2334 field.selected_option_index = 2
2335 field.value = 14.4245
2336 other_field = _create_field(self._tc, self._create_fc(self._tc))
2337 other_field = other_field['variant_field']
2338 other_field.selected_option_index = 2
2339 other_field.value = 14.4245
2340 self.assertEqual(str(field), str(other_field))
2341
2342
2343if __name__ == '__main__':
2344 unittest.main()
This page took 0.030915 seconds and 4 git commands to generate.