bt2: Add remaining trace-ir `*Const` classes and adapt 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_eq_none(self):
664 # Ignore this lint error:
665 # E711 comparison to None should be 'if cond is None:'
666 # since this is what we want to test (even though not good practice).
667 self.assertFalse(self._def == None) # noqa: E711
668
669 def test_ne_none(self):
670 # Ignore this lint error:
671 # E711 comparison to None should be 'if cond is not None:'
672 # since this is what we want to test (even though not good practice).
673 self.assertTrue(self._def != None) # noqa: E711
674
675
676# This is a list of binary operators used for
677# _inject_numeric_testing_methods().
678#
679# Each entry is a pair of binary operator name (used as part of the
680# created testing method's name) and operator function.
681_BINOPS = (
682 ('lt', operator.lt),
683 ('le', operator.le),
684 ('eq', operator.eq),
685 ('ne', operator.ne),
686 ('ge', operator.ge),
687 ('gt', operator.gt),
688 ('add', operator.add),
689 ('radd', lambda a, b: operator.add(b, a)),
690 ('and', operator.and_),
691 ('rand', lambda a, b: operator.and_(b, a)),
692 ('floordiv', operator.floordiv),
693 ('rfloordiv', lambda a, b: operator.floordiv(b, a)),
694 ('lshift', operator.lshift),
695 ('rlshift', lambda a, b: operator.lshift(b, a)),
696 ('mod', operator.mod),
697 ('rmod', lambda a, b: operator.mod(b, a)),
698 ('mul', operator.mul),
699 ('rmul', lambda a, b: operator.mul(b, a)),
700 ('or', operator.or_),
701 ('ror', lambda a, b: operator.or_(b, a)),
702 ('pow', operator.pow),
703 ('rpow', lambda a, b: operator.pow(b, a)),
704 ('rshift', operator.rshift),
705 ('rrshift', lambda a, b: operator.rshift(b, a)),
706 ('sub', operator.sub),
707 ('rsub', lambda a, b: operator.sub(b, a)),
708 ('truediv', operator.truediv),
709 ('rtruediv', lambda a, b: operator.truediv(b, a)),
710 ('xor', operator.xor),
711 ('rxor', lambda a, b: operator.xor(b, a)),
712)
713
714
715# This is a list of unary operators used for
716# _inject_numeric_testing_methods().
717#
718# Each entry is a pair of unary operator name (used as part of the
719# created testing method's name) and operator function.
720_UNARYOPS = (
721 ('neg', operator.neg),
722 ('pos', operator.pos),
723 ('abs', operator.abs),
724 ('invert', operator.invert),
725 ('round', round),
726 ('round_0', partial(round, ndigits=0)),
727 ('round_1', partial(round, ndigits=1)),
728 ('round_2', partial(round, ndigits=2)),
729 ('round_3', partial(round, ndigits=3)),
730 ('ceil', math.ceil),
731 ('floor', math.floor),
732 ('trunc', math.trunc),
733)
734
735
736# This function injects a bunch of testing methods to a numeric
737# field test case.
738#
739# It is meant to be used like this:
740#
741# _inject_numeric_testing_methods(MyNumericFieldTestCase)
742#
743# This function injects:
744#
745# * One testing method for each _TestNumericField._test_binop_*()
746# method, for each binary operator in the _BINOPS tuple.
747#
748# * One testing method for each _TestNumericField._test_unaryop*()
749# method, for each unary operator in the _UNARYOPS tuple.
750def _inject_numeric_testing_methods(cls):
751 def test_binop_name(suffix):
752 return 'test_binop_{}_{}'.format(name, suffix)
753
754 def test_unaryop_name(suffix):
755 return 'test_unaryop_{}_{}'.format(name, suffix)
756
757 # inject testing methods for each binary operation
758 for name, binop in _BINOPS:
759 setattr(
760 cls,
761 test_binop_name('invalid_unknown'),
762 partialmethod(_TestNumericField._test_binop_invalid_unknown, op=binop),
763 )
764 setattr(
765 cls,
766 test_binop_name('invalid_none'),
767 partialmethod(_TestNumericField._test_binop_invalid_none, op=binop),
768 )
769 setattr(
770 cls,
771 test_binop_name('type_true'),
772 partialmethod(_TestNumericField._test_binop_type_true, op=binop),
773 )
774 setattr(
775 cls,
776 test_binop_name('type_pos_int'),
777 partialmethod(_TestNumericField._test_binop_type_pos_int, op=binop),
778 )
779 setattr(
780 cls,
781 test_binop_name('type_pos_vint'),
782 partialmethod(_TestNumericField._test_binop_type_pos_vint, op=binop),
783 )
784 setattr(
785 cls,
786 test_binop_name('value_true'),
787 partialmethod(_TestNumericField._test_binop_value_true, op=binop),
788 )
789 setattr(
790 cls,
791 test_binop_name('value_pos_int'),
792 partialmethod(_TestNumericField._test_binop_value_pos_int, op=binop),
793 )
794 setattr(
795 cls,
796 test_binop_name('value_pos_vint'),
797 partialmethod(_TestNumericField._test_binop_value_pos_vint, op=binop),
798 )
799 setattr(
800 cls,
801 test_binop_name('lhs_addr_same_true'),
802 partialmethod(_TestNumericField._test_binop_lhs_addr_same_true, op=binop),
803 )
804 setattr(
805 cls,
806 test_binop_name('lhs_addr_same_pos_int'),
807 partialmethod(
808 _TestNumericField._test_binop_lhs_addr_same_pos_int, op=binop
809 ),
810 )
811 setattr(
812 cls,
813 test_binop_name('lhs_addr_same_pos_vint'),
814 partialmethod(
815 _TestNumericField._test_binop_lhs_addr_same_pos_vint, op=binop
816 ),
817 )
818 setattr(
819 cls,
820 test_binop_name('lhs_value_same_true'),
821 partialmethod(_TestNumericField._test_binop_lhs_value_same_true, op=binop),
822 )
823 setattr(
824 cls,
825 test_binop_name('lhs_value_same_pos_int'),
826 partialmethod(
827 _TestNumericField._test_binop_lhs_value_same_pos_int, op=binop
828 ),
829 )
830 setattr(
831 cls,
832 test_binop_name('lhs_value_same_pos_vint'),
833 partialmethod(
834 _TestNumericField._test_binop_lhs_value_same_pos_vint, op=binop
835 ),
836 )
837 setattr(
838 cls,
839 test_binop_name('type_neg_int'),
840 partialmethod(_TestNumericField._test_binop_type_neg_int, op=binop),
841 )
842 setattr(
843 cls,
844 test_binop_name('type_neg_vint'),
845 partialmethod(_TestNumericField._test_binop_type_neg_vint, op=binop),
846 )
847 setattr(
848 cls,
849 test_binop_name('value_neg_int'),
850 partialmethod(_TestNumericField._test_binop_value_neg_int, op=binop),
851 )
852 setattr(
853 cls,
854 test_binop_name('value_neg_vint'),
855 partialmethod(_TestNumericField._test_binop_value_neg_vint, op=binop),
856 )
857 setattr(
858 cls,
859 test_binop_name('lhs_addr_same_neg_int'),
860 partialmethod(
861 _TestNumericField._test_binop_lhs_addr_same_neg_int, op=binop
862 ),
863 )
864 setattr(
865 cls,
866 test_binop_name('lhs_addr_same_neg_vint'),
867 partialmethod(
868 _TestNumericField._test_binop_lhs_addr_same_neg_vint, op=binop
869 ),
870 )
871 setattr(
872 cls,
873 test_binop_name('lhs_value_same_neg_int'),
874 partialmethod(
875 _TestNumericField._test_binop_lhs_value_same_neg_int, op=binop
876 ),
877 )
878 setattr(
879 cls,
880 test_binop_name('lhs_value_same_neg_vint'),
881 partialmethod(
882 _TestNumericField._test_binop_lhs_value_same_neg_vint, op=binop
883 ),
884 )
885 setattr(
886 cls,
887 test_binop_name('type_false'),
888 partialmethod(_TestNumericField._test_binop_type_false, op=binop),
889 )
890 setattr(
891 cls,
892 test_binop_name('type_zero_int'),
893 partialmethod(_TestNumericField._test_binop_type_zero_int, op=binop),
894 )
895 setattr(
896 cls,
897 test_binop_name('type_zero_vint'),
898 partialmethod(_TestNumericField._test_binop_type_zero_vint, op=binop),
899 )
900 setattr(
901 cls,
902 test_binop_name('value_false'),
903 partialmethod(_TestNumericField._test_binop_value_false, op=binop),
904 )
905 setattr(
906 cls,
907 test_binop_name('value_zero_int'),
908 partialmethod(_TestNumericField._test_binop_value_zero_int, op=binop),
909 )
910 setattr(
911 cls,
912 test_binop_name('value_zero_vint'),
913 partialmethod(_TestNumericField._test_binop_value_zero_vint, op=binop),
914 )
915 setattr(
916 cls,
917 test_binop_name('lhs_addr_same_false'),
918 partialmethod(_TestNumericField._test_binop_lhs_addr_same_false, op=binop),
919 )
920 setattr(
921 cls,
922 test_binop_name('lhs_addr_same_zero_int'),
923 partialmethod(
924 _TestNumericField._test_binop_lhs_addr_same_zero_int, op=binop
925 ),
926 )
927 setattr(
928 cls,
929 test_binop_name('lhs_addr_same_zero_vint'),
930 partialmethod(
931 _TestNumericField._test_binop_lhs_addr_same_zero_vint, op=binop
932 ),
933 )
934 setattr(
935 cls,
936 test_binop_name('lhs_value_same_false'),
937 partialmethod(_TestNumericField._test_binop_lhs_value_same_false, op=binop),
938 )
939 setattr(
940 cls,
941 test_binop_name('lhs_value_same_zero_int'),
942 partialmethod(
943 _TestNumericField._test_binop_lhs_value_same_zero_int, op=binop
944 ),
945 )
946 setattr(
947 cls,
948 test_binop_name('lhs_value_same_zero_vint'),
949 partialmethod(
950 _TestNumericField._test_binop_lhs_value_same_zero_vint, op=binop
951 ),
952 )
953 setattr(
954 cls,
955 test_binop_name('type_pos_float'),
956 partialmethod(_TestNumericField._test_binop_type_pos_float, op=binop),
957 )
958 setattr(
959 cls,
960 test_binop_name('type_neg_float'),
961 partialmethod(_TestNumericField._test_binop_type_neg_float, op=binop),
962 )
963 setattr(
964 cls,
965 test_binop_name('type_pos_vfloat'),
966 partialmethod(_TestNumericField._test_binop_type_pos_vfloat, op=binop),
967 )
968 setattr(
969 cls,
970 test_binop_name('type_neg_vfloat'),
971 partialmethod(_TestNumericField._test_binop_type_neg_vfloat, op=binop),
972 )
973 setattr(
974 cls,
975 test_binop_name('value_pos_float'),
976 partialmethod(_TestNumericField._test_binop_value_pos_float, op=binop),
977 )
978 setattr(
979 cls,
980 test_binop_name('value_neg_float'),
981 partialmethod(_TestNumericField._test_binop_value_neg_float, op=binop),
982 )
983 setattr(
984 cls,
985 test_binop_name('value_pos_vfloat'),
986 partialmethod(_TestNumericField._test_binop_value_pos_vfloat, op=binop),
987 )
988 setattr(
989 cls,
990 test_binop_name('value_neg_vfloat'),
991 partialmethod(_TestNumericField._test_binop_value_neg_vfloat, op=binop),
992 )
993 setattr(
994 cls,
995 test_binop_name('lhs_addr_same_pos_float'),
996 partialmethod(
997 _TestNumericField._test_binop_lhs_addr_same_pos_float, op=binop
998 ),
999 )
1000 setattr(
1001 cls,
1002 test_binop_name('lhs_addr_same_neg_float'),
1003 partialmethod(
1004 _TestNumericField._test_binop_lhs_addr_same_neg_float, op=binop
1005 ),
1006 )
1007 setattr(
1008 cls,
1009 test_binop_name('lhs_addr_same_pos_vfloat'),
1010 partialmethod(
1011 _TestNumericField._test_binop_lhs_addr_same_pos_vfloat, op=binop
1012 ),
1013 )
1014 setattr(
1015 cls,
1016 test_binop_name('lhs_addr_same_neg_vfloat'),
1017 partialmethod(
1018 _TestNumericField._test_binop_lhs_addr_same_neg_vfloat, op=binop
1019 ),
1020 )
1021 setattr(
1022 cls,
1023 test_binop_name('lhs_value_same_pos_float'),
1024 partialmethod(
1025 _TestNumericField._test_binop_lhs_value_same_pos_float, op=binop
1026 ),
1027 )
1028 setattr(
1029 cls,
1030 test_binop_name('lhs_value_same_neg_float'),
1031 partialmethod(
1032 _TestNumericField._test_binop_lhs_value_same_neg_float, op=binop
1033 ),
1034 )
1035 setattr(
1036 cls,
1037 test_binop_name('lhs_value_same_pos_vfloat'),
1038 partialmethod(
1039 _TestNumericField._test_binop_lhs_value_same_pos_vfloat, op=binop
1040 ),
1041 )
1042 setattr(
1043 cls,
1044 test_binop_name('lhs_value_same_neg_vfloat'),
1045 partialmethod(
1046 _TestNumericField._test_binop_lhs_value_same_neg_vfloat, op=binop
1047 ),
1048 )
1049 setattr(
1050 cls,
1051 test_binop_name('type_zero_float'),
1052 partialmethod(_TestNumericField._test_binop_type_zero_float, op=binop),
1053 )
1054 setattr(
1055 cls,
1056 test_binop_name('type_zero_vfloat'),
1057 partialmethod(_TestNumericField._test_binop_type_zero_vfloat, op=binop),
1058 )
1059 setattr(
1060 cls,
1061 test_binop_name('value_zero_float'),
1062 partialmethod(_TestNumericField._test_binop_value_zero_float, op=binop),
1063 )
1064 setattr(
1065 cls,
1066 test_binop_name('value_zero_vfloat'),
1067 partialmethod(_TestNumericField._test_binop_value_zero_vfloat, op=binop),
1068 )
1069 setattr(
1070 cls,
1071 test_binop_name('lhs_addr_same_zero_float'),
1072 partialmethod(
1073 _TestNumericField._test_binop_lhs_addr_same_zero_float, op=binop
1074 ),
1075 )
1076 setattr(
1077 cls,
1078 test_binop_name('lhs_addr_same_zero_vfloat'),
1079 partialmethod(
1080 _TestNumericField._test_binop_lhs_addr_same_zero_vfloat, op=binop
1081 ),
1082 )
1083 setattr(
1084 cls,
1085 test_binop_name('lhs_value_same_zero_float'),
1086 partialmethod(
1087 _TestNumericField._test_binop_lhs_value_same_zero_float, op=binop
1088 ),
1089 )
1090 setattr(
1091 cls,
1092 test_binop_name('lhs_value_same_zero_vfloat'),
1093 partialmethod(
1094 _TestNumericField._test_binop_lhs_value_same_zero_vfloat, op=binop
1095 ),
1096 )
1097 setattr(
1098 cls,
1099 test_binop_name('type_complex'),
1100 partialmethod(_TestNumericField._test_binop_type_complex, op=binop),
1101 )
1102 setattr(
1103 cls,
1104 test_binop_name('type_zero_complex'),
1105 partialmethod(_TestNumericField._test_binop_type_zero_complex, op=binop),
1106 )
1107 setattr(
1108 cls,
1109 test_binop_name('value_complex'),
1110 partialmethod(_TestNumericField._test_binop_value_complex, op=binop),
1111 )
1112 setattr(
1113 cls,
1114 test_binop_name('value_zero_complex'),
1115 partialmethod(_TestNumericField._test_binop_value_zero_complex, op=binop),
1116 )
1117 setattr(
1118 cls,
1119 test_binop_name('lhs_addr_same_complex'),
1120 partialmethod(
1121 _TestNumericField._test_binop_lhs_addr_same_complex, op=binop
1122 ),
1123 )
1124 setattr(
1125 cls,
1126 test_binop_name('lhs_addr_same_zero_complex'),
1127 partialmethod(
1128 _TestNumericField._test_binop_lhs_addr_same_zero_complex, op=binop
1129 ),
1130 )
1131 setattr(
1132 cls,
1133 test_binop_name('lhs_value_same_complex'),
1134 partialmethod(
1135 _TestNumericField._test_binop_lhs_value_same_complex, op=binop
1136 ),
1137 )
1138 setattr(
1139 cls,
1140 test_binop_name('lhs_value_same_zero_complex'),
1141 partialmethod(
1142 _TestNumericField._test_binop_lhs_value_same_zero_complex, op=binop
1143 ),
1144 )
1145
1146 # inject testing methods for each unary operation
1147 for name, unaryop in _UNARYOPS:
1148 setattr(
1149 cls,
1150 test_unaryop_name('type'),
1151 partialmethod(_TestNumericField._test_unaryop_type, op=unaryop),
1152 )
1153 setattr(
1154 cls,
1155 test_unaryop_name('value'),
1156 partialmethod(_TestNumericField._test_unaryop_value, op=unaryop),
1157 )
1158 setattr(
1159 cls,
1160 test_unaryop_name('addr_same'),
1161 partialmethod(_TestNumericField._test_unaryop_addr_same, op=unaryop),
1162 )
1163 setattr(
1164 cls,
1165 test_unaryop_name('value_same'),
1166 partialmethod(_TestNumericField._test_unaryop_value_same, op=unaryop),
1167 )
1168
1169
1170class BoolFieldTestCase(_TestNumericField, unittest.TestCase):
1171 @staticmethod
1172 def _const_value_setter(field):
1173 field.value = True
1174
1175 def _create_fc(self, tc):
1176 return tc.create_bool_field_class()
1177
1178 def setUp(self):
1179 self._tc = get_default_trace_class()
1180 self._def = _create_field(self._tc, self._create_fc(self._tc))
1181 self._def.value = True
1182 self._def_value = True
1183 self._def_const = _create_const_field(
1184 self._tc, self._tc.create_bool_field_class(), self._const_value_setter
1185 )
1186 self._def_new_value = False
1187
1188 def test_classes(self):
1189 self.assertIs(type(self._def), bt2._BoolField)
1190 self.assertIs(type(self._def_const), bt2._BoolFieldConst)
1191
1192 def test_assign_true(self):
1193 raw = True
1194 self._def.value = raw
1195 self.assertEqual(self._def, raw)
1196
1197 def test_assign_false(self):
1198 raw = False
1199 self._def.value = raw
1200 self.assertEqual(self._def, raw)
1201
1202 def test_assign_field_true(self):
1203 field = _create_field(self._tc, self._create_fc(self._tc))
1204 raw = True
1205 field.value = raw
1206 self._def.value = field
1207 self.assertEqual(self._def, raw)
1208
1209 def test_assign_field_false(self):
1210 field = _create_field(self._tc, self._create_fc(self._tc))
1211 raw = False
1212 field.value = raw
1213 self._def.value = field
1214 self.assertEqual(self._def, raw)
1215
1216 def test_assign_invalid_type(self):
1217 with self.assertRaises(TypeError):
1218 self._def.value = 17
1219
1220 def test_str_op(self):
1221 self.assertEqual(str(self._def), str(self._def_value))
1222
1223
1224_inject_numeric_testing_methods(BoolFieldTestCase)
1225
1226
1227class _TestIntegerFieldCommon(_TestNumericField):
1228 def test_assign_true(self):
1229 raw = True
1230 self._def.value = raw
1231 self.assertEqual(self._def, raw)
1232
1233 def test_assign_false(self):
1234 raw = False
1235 self._def.value = raw
1236 self.assertEqual(self._def, raw)
1237
1238 def test_assign_pos_int(self):
1239 raw = 477
1240 self._def.value = raw
1241 self.assertEqual(self._def, raw)
1242
1243 def test_assign_neg_int(self):
1244 raw = -13
1245 self._def.value = raw
1246 self.assertEqual(self._def, raw)
1247
1248 def test_assign_int_field(self):
1249 raw = 999
1250 field = _create_field(self._tc, self._create_fc(self._tc))
1251 field.value = raw
1252 self._def.value = field
1253 self.assertEqual(self._def, raw)
1254
1255 def test_assign_invalid_type(self):
1256 with self.assertRaises(TypeError):
1257 self._def.value = 'yes'
1258
1259 def test_assign_uint(self):
1260 uint_fc = self._tc.create_unsigned_integer_field_class(32)
1261 field = _create_field(self._tc, uint_fc)
1262 raw = 1777
1263 field.value = 1777
1264 self.assertEqual(field, raw)
1265
1266 def test_assign_big_uint(self):
1267 uint_fc = self._tc.create_unsigned_integer_field_class(64)
1268 field = _create_field(self._tc, uint_fc)
1269 # Larger than the IEEE 754 double-precision exact representation of
1270 # integers.
1271 raw = (2 ** 53) + 1
1272 field.value = (2 ** 53) + 1
1273 self.assertEqual(field, raw)
1274
1275 def test_assign_uint_invalid_neg(self):
1276 uint_fc = self._tc.create_unsigned_integer_field_class(32)
1277 field = _create_field(self._tc, uint_fc)
1278
1279 with self.assertRaises(ValueError):
1280 field.value = -23
1281
1282 def test_str_op(self):
1283 self.assertEqual(str(self._def), str(self._def_value))
1284
1285
1286_inject_numeric_testing_methods(_TestIntegerFieldCommon)
1287
1288
1289class SignedIntegerFieldTestCase(_TestIntegerFieldCommon, unittest.TestCase):
1290 def _create_fc(self, tc):
1291 return tc.create_signed_integer_field_class(25)
1292
1293 def setUp(self):
1294 self._tc = get_default_trace_class()
1295 self._field = _create_field(self._tc, self._create_fc(self._tc))
1296 self._field.value = 17
1297 self._def = _create_field(self._tc, self._create_fc(self._tc))
1298 self._def.value = 17
1299 self._def_value = 17
1300 self._def_new_value = -101
1301
1302
1303class SignedEnumerationFieldTestCase(_TestIntegerFieldCommon, unittest.TestCase):
1304 def _create_fc(self, tc):
1305 fc = tc.create_signed_enumeration_field_class(32)
1306 fc.add_mapping('something', bt2.SignedIntegerRangeSet([(17, 17)]))
1307 fc.add_mapping('speaker', bt2.SignedIntegerRangeSet([(12, 16)]))
1308 fc.add_mapping('can', bt2.SignedIntegerRangeSet([(18, 2540)]))
1309 fc.add_mapping(
1310 'whole range', bt2.SignedIntegerRangeSet([(-(2 ** 31), (2 ** 31) - 1)])
1311 )
1312 fc.add_mapping('zip', bt2.SignedIntegerRangeSet([(-45, 1001)]))
1313 return fc
1314
1315 def setUp(self):
1316 self._tc = get_default_trace_class()
1317 self._field = _create_field(self._tc, self._create_fc(self._tc))
1318 self._def = _create_field(self._tc, self._create_fc(self._tc))
1319 self._def.value = 17
1320 self._def_value = 17
1321 self._def_new_value = -101
1322
1323 def test_str_op(self):
1324 expected_string_found = False
1325 s = str(self._def)
1326
1327 # Establish all permutations of the three expected matches since
1328 # the order in which mappings are enumerated is not explicitly part of
1329 # the API.
1330 for p in itertools.permutations(['whole range', 'something', 'zip']):
1331 candidate = '{} ({})'.format(self._def_value, ', '.join(p))
1332 if candidate == s:
1333 expected_string_found = True
1334 break
1335
1336 self.assertTrue(expected_string_found)
1337
1338 def test_labels(self):
1339 self._field.value = 17
1340 labels = sorted(self._field.labels)
1341 self.assertEqual(labels, ['something', 'whole range', 'zip'])
1342
1343
1344class RealFieldTestCase(_TestNumericField, unittest.TestCase):
1345 def _create_fc(self, tc):
1346 return tc.create_real_field_class()
1347
1348 def setUp(self):
1349 self._tc = get_default_trace_class()
1350 self._field = _create_field(self._tc, self._create_fc(self._tc))
1351 self._def = _create_field(self._tc, self._create_fc(self._tc))
1352 self._def.value = 52.7
1353 self._def_value = 52.7
1354 self._def_new_value = -17.164857
1355
1356 def _test_invalid_op(self, cb):
1357 with self.assertRaises(TypeError):
1358 cb()
1359
1360 def test_assign_true(self):
1361 self._def.value = True
1362 self.assertTrue(self._def)
1363
1364 def test_assign_false(self):
1365 self._def.value = False
1366 self.assertFalse(self._def)
1367
1368 def test_assign_pos_int(self):
1369 raw = 477
1370 self._def.value = raw
1371 self.assertEqual(self._def, float(raw))
1372
1373 def test_assign_neg_int(self):
1374 raw = -13
1375 self._def.value = raw
1376 self.assertEqual(self._def, float(raw))
1377
1378 def test_assign_int_field(self):
1379 int_fc = self._tc.create_signed_integer_field_class(32)
1380 int_field = _create_field(self._tc, int_fc)
1381 raw = 999
1382 int_field.value = raw
1383 self._def.value = int_field
1384 self.assertEqual(self._def, float(raw))
1385
1386 def test_assign_float(self):
1387 raw = -19.23
1388 self._def.value = raw
1389 self.assertEqual(self._def, raw)
1390
1391 def test_assign_float_field(self):
1392 field = _create_field(self._tc, self._create_fc(self._tc))
1393 raw = 101.32
1394 field.value = raw
1395 self._def.value = field
1396 self.assertEqual(self._def, raw)
1397
1398 def test_assign_invalid_type(self):
1399 with self.assertRaises(TypeError):
1400 self._def.value = 'yes'
1401
1402 def test_invalid_lshift(self):
1403 self._test_invalid_op(lambda: self._def << 23)
1404
1405 def test_invalid_rshift(self):
1406 self._test_invalid_op(lambda: self._def >> 23)
1407
1408 def test_invalid_and(self):
1409 self._test_invalid_op(lambda: self._def & 23)
1410
1411 def test_invalid_or(self):
1412 self._test_invalid_op(lambda: self._def | 23)
1413
1414 def test_invalid_xor(self):
1415 self._test_invalid_op(lambda: self._def ^ 23)
1416
1417 def test_invalid_invert(self):
1418 self._test_invalid_op(lambda: ~self._def)
1419
1420 def test_str_op(self):
1421 self.assertEqual(str(self._def), str(self._def_value))
1422
1423
1424_inject_numeric_testing_methods(RealFieldTestCase)
1425
1426
1427class StringFieldTestCase(unittest.TestCase):
1428 @staticmethod
1429 def _const_value_setter(field):
1430 field.value = 'Hello, World!'
1431
1432 def setUp(self):
1433 self._tc = get_default_trace_class()
1434 self._def_value = 'Hello, World!'
1435 self._def = _create_string_field(self._tc)
1436 self._def_const = _create_const_field(
1437 self._tc, self._tc.create_string_field_class(), self._const_value_setter
1438 )
1439 self._def.value = self._def_value
1440 self._def_new_value = 'Yes!'
1441
1442 def test_assign_int(self):
1443 with self.assertRaises(TypeError):
1444 self._def.value = 283
1445
1446 def test_assign_string_field(self):
1447 field = _create_string_field(self._tc)
1448 raw = 'zorg'
1449 field.value = raw
1450 self.assertEqual(field, raw)
1451
1452 def test_eq(self):
1453 self.assertEqual(self._def, self._def_value)
1454
1455 def test_const_eq(self):
1456 self.assertEqual(self._def_const, self._def_value)
1457
1458 def test_not_eq(self):
1459 self.assertNotEqual(self._def, 23)
1460
1461 def test_lt_vstring(self):
1462 s1 = _create_string_field(self._tc)
1463 s1.value = 'allo'
1464 s2 = _create_string_field(self._tc)
1465 s2.value = 'bateau'
1466 self.assertLess(s1, s2)
1467
1468 def test_lt_string(self):
1469 s1 = _create_string_field(self._tc)
1470 s1.value = 'allo'
1471 self.assertLess(s1, 'bateau')
1472
1473 def test_le_vstring(self):
1474 s1 = _create_string_field(self._tc)
1475 s1.value = 'allo'
1476 s2 = _create_string_field(self._tc)
1477 s2.value = 'bateau'
1478 self.assertLessEqual(s1, s2)
1479
1480 def test_le_string(self):
1481 s1 = _create_string_field(self._tc)
1482 s1.value = 'allo'
1483 self.assertLessEqual(s1, 'bateau')
1484
1485 def test_gt_vstring(self):
1486 s1 = _create_string_field(self._tc)
1487 s1.value = 'allo'
1488 s2 = _create_string_field(self._tc)
1489 s2.value = 'bateau'
1490 self.assertGreater(s2, s1)
1491
1492 def test_gt_string(self):
1493 s1 = _create_string_field(self._tc)
1494 s1.value = 'allo'
1495 self.assertGreater('bateau', s1)
1496
1497 def test_ge_vstring(self):
1498 s1 = _create_string_field(self._tc)
1499 s1.value = 'allo'
1500 s2 = _create_string_field(self._tc)
1501 s2.value = 'bateau'
1502 self.assertGreaterEqual(s2, s1)
1503
1504 def test_ge_string(self):
1505 s1 = _create_string_field(self._tc)
1506 s1.value = 'allo'
1507 self.assertGreaterEqual('bateau', s1)
1508
1509 def test_bool_op(self):
1510 self.assertEqual(bool(self._def), bool(self._def_value))
1511
1512 def test_str_op(self):
1513 self.assertEqual(str(self._def), str(self._def_value))
1514
1515 def test_len(self):
1516 self.assertEqual(len(self._def), len(self._def_value))
1517
1518 def test_getitem(self):
1519 self.assertEqual(self._def[5], self._def_value[5])
1520
1521 def test_const_getitem(self):
1522 self.assertEqual(self._def_const[5], self._def_value[5])
1523
1524 def test_append_str(self):
1525 to_append = 'meow meow meow'
1526 self._def += to_append
1527 self._def_value += to_append
1528 self.assertEqual(self._def, self._def_value)
1529
1530 def test_const_append_str(self):
1531 to_append = 'meow meow meow'
1532 with self.assertRaises(TypeError):
1533 self._def_const += to_append
1534 self.assertEqual(self._def_const, self._def_value)
1535
1536 def test_append_string_field(self):
1537 field = _create_string_field(self._tc)
1538 to_append = 'meow meow meow'
1539 field.value = to_append
1540 self._def += field
1541 self._def_value += to_append
1542 self.assertEqual(self._def, self._def_value)
1543
1544
1545class _TestArrayFieldCommon:
1546 def _modify_def(self):
1547 self._def[2] = 23
1548
1549 def test_bool_op_true(self):
1550 self.assertTrue(self._def)
1551
1552 def test_len(self):
1553 self.assertEqual(len(self._def), 3)
1554
1555 def test_length(self):
1556 self.assertEqual(self._def.length, 3)
1557
1558 def test_getitem(self):
1559 field = self._def[1]
1560 self.assertIs(type(field), bt2._SignedIntegerField)
1561 self.assertEqual(field, 1847)
1562
1563 def test_const_getitem(self):
1564 field = self._def_const[1]
1565 self.assertIs(type(field), bt2._SignedIntegerFieldConst)
1566 self.assertEqual(field, 1847)
1567
1568 def test_eq(self):
1569 field = _create_int_array_field(self._tc, 3)
1570 field[0] = 45
1571 field[1] = 1847
1572 field[2] = 1948754
1573 self.assertEqual(self._def, field)
1574
1575 def test_eq_invalid_type(self):
1576 self.assertNotEqual(self._def, 23)
1577
1578 def test_eq_diff_len(self):
1579 field = _create_int_array_field(self._tc, 2)
1580 field[0] = 45
1581 field[1] = 1847
1582 self.assertNotEqual(self._def, field)
1583
1584 def test_eq_diff_content_same_len(self):
1585 field = _create_int_array_field(self._tc, 3)
1586 field[0] = 45
1587 field[1] = 1846
1588 field[2] = 1948754
1589 self.assertNotEqual(self._def, field)
1590
1591 def test_eq_non_sequence_iterable(self):
1592 dct = collections.OrderedDict([(1, 2), (3, 4), (5, 6)])
1593 field = _create_int_array_field(self._tc, 3)
1594 field[0] = 1
1595 field[1] = 3
1596 field[2] = 5
1597 self.assertEqual(field, list(dct.keys()))
1598 self.assertNotEqual(field, dct)
1599
1600 def test_setitem(self):
1601 self._def[2] = 24
1602 self.assertEqual(self._def[2], 24)
1603
1604 def test_setitem_int_field(self):
1605 int_fc = self._tc.create_signed_integer_field_class(32)
1606 int_field = _create_field(self._tc, int_fc)
1607 int_field.value = 19487
1608 self._def[1] = int_field
1609 self.assertEqual(self._def[1], 19487)
1610
1611 def test_setitem_non_basic_field(self):
1612 array_field = _create_struct_array_field(self._tc, 2)
1613 with self.assertRaises(TypeError):
1614 array_field[1] = 23
1615
1616 def test_setitem_none(self):
1617 with self.assertRaises(TypeError):
1618 self._def[1] = None
1619
1620 def test_setitem_index_wrong_type(self):
1621 with self.assertRaises(TypeError):
1622 self._def['yes'] = 23
1623
1624 def test_setitem_index_neg(self):
1625 with self.assertRaises(IndexError):
1626 self._def[-2] = 23
1627
1628 def test_setitem_index_out_of_range(self):
1629 with self.assertRaises(IndexError):
1630 self._def[len(self._def)] = 134679
1631
1632 def test_const_setitem(self):
1633 with self.assertRaises(TypeError):
1634 self._def_const[0] = 134679
1635
1636 def test_iter(self):
1637 for field, value in zip(self._def, (45, 1847, 1948754)):
1638 self.assertEqual(field, value)
1639
1640 def test_const_iter(self):
1641 for field, value in zip(self._def_const, (45, 1847, 1948754)):
1642 self.assertEqual(field, value)
1643
1644 def test_value_int_field(self):
1645 values = [45646, 145, 12145]
1646 self._def.value = values
1647 self.assertEqual(values, self._def)
1648
1649 def test_value_check_sequence(self):
1650 values = 42
1651 with self.assertRaises(TypeError):
1652 self._def.value = values
1653
1654 def test_value_wrong_type_in_sequence(self):
1655 values = [32, 'hello', 11]
1656 with self.assertRaises(TypeError):
1657 self._def.value = values
1658
1659 def test_value_complex_type(self):
1660 struct_fc = self._tc.create_structure_field_class()
1661 int_fc = self._tc.create_signed_integer_field_class(32)
1662 another_int_fc = self._tc.create_signed_integer_field_class(32)
1663 str_fc = self._tc.create_string_field_class()
1664 struct_fc.append_member(field_class=int_fc, name='an_int')
1665 struct_fc.append_member(field_class=str_fc, name='a_string')
1666 struct_fc.append_member(field_class=another_int_fc, name='another_int')
1667 array_fc = self._tc.create_static_array_field_class(struct_fc, 3)
1668 stream = _create_stream(self._tc, [('array_field', array_fc)])
1669 values = [
1670 {'an_int': 42, 'a_string': 'hello', 'another_int': 66},
1671 {'an_int': 1, 'a_string': 'goodbye', 'another_int': 488},
1672 {'an_int': 156, 'a_string': 'or not', 'another_int': 4648},
1673 ]
1674
1675 array = stream.create_packet().context_field['array_field']
1676 array.value = values
1677 self.assertEqual(values, array)
1678 values[0]['an_int'] = 'a string'
1679 with self.assertRaises(TypeError):
1680 array.value = values
1681
1682 def test_str_op(self):
1683 s = str(self._def)
1684 expected_string = '[{}]'.format(', '.join([repr(v) for v in self._def_value]))
1685 self.assertEqual(expected_string, s)
1686
1687
1688class StaticArrayFieldTestCase(_TestArrayFieldCommon, unittest.TestCase):
1689 @staticmethod
1690 def _const_value_setter(field):
1691 field.value = [45, 1847, 1948754]
1692
1693 def setUp(self):
1694 self._tc = get_default_trace_class()
1695 self._def = _create_int_array_field(self._tc, 3)
1696 self._def[0] = 45
1697 self._def[1] = 1847
1698 self._def[2] = 1948754
1699 self._def_value = [45, 1847, 1948754]
1700 self._def_const = _create_const_field(
1701 self._tc,
1702 self._tc.create_static_array_field_class(
1703 self._tc.create_signed_integer_field_class(32), 3
1704 ),
1705 self._const_value_setter,
1706 )
1707
1708 def test_value_wrong_len(self):
1709 values = [45, 1847]
1710 with self.assertRaises(ValueError):
1711 self._def.value = values
1712
1713
1714class DynamicArrayFieldTestCase(_TestArrayFieldCommon, unittest.TestCase):
1715 @staticmethod
1716 def _const_value_setter(field):
1717 field.value = [45, 1847, 1948754]
1718
1719 def setUp(self):
1720 self._tc = get_default_trace_class()
1721 self._def = _create_dynamic_array(self._tc)
1722 self._def[0] = 45
1723 self._def[1] = 1847
1724 self._def[2] = 1948754
1725 self._def_value = [45, 1847, 1948754]
1726 self._def_const = _create_const_field(
1727 self._tc,
1728 self._tc.create_dynamic_array_field_class(
1729 self._tc.create_signed_integer_field_class(32)
1730 ),
1731 self._const_value_setter,
1732 )
1733
1734 def test_value_resize(self):
1735 new_values = [1, 2, 3, 4]
1736 self._def.value = new_values
1737 self.assertCountEqual(self._def, new_values)
1738
1739 def test_set_length(self):
1740 self._def.length = 4
1741 self._def[3] = 0
1742 self.assertEqual(len(self._def), 4)
1743
1744 def test_const_set_length(self):
1745 with self.assertRaises(AttributeError):
1746 self._def_const.length = 4
1747 self.assertEqual(len(self._def), 3)
1748
1749 def test_set_invalid_length(self):
1750 with self.assertRaises(TypeError):
1751 self._def.length = 'cheval'
1752
1753
1754class StructureFieldTestCase(unittest.TestCase):
1755 @staticmethod
1756 def _const_value_setter(field):
1757 field.value = {
1758 'A': -1872,
1759 'B': 'salut',
1760 'C': 17.5,
1761 'D': 16497,
1762 'E': {},
1763 'F': {'F_1': 52},
1764 }
1765
1766 def _create_fc(self, tc):
1767 fc = tc.create_structure_field_class()
1768 fc.append_member('A', self._fc0_fn())
1769 fc.append_member('B', self._fc1_fn())
1770 fc.append_member('C', self._fc2_fn())
1771 fc.append_member('D', self._fc3_fn())
1772 fc.append_member('E', self._fc4_fn())
1773 fc5 = self._fc5_fn()
1774 fc5.append_member('F_1', self._fc5_inner_fn())
1775 fc.append_member('F', fc5)
1776 return fc
1777
1778 def setUp(self):
1779 self._tc = get_default_trace_class()
1780 self._fc0_fn = self._tc.create_signed_integer_field_class
1781 self._fc1_fn = self._tc.create_string_field_class
1782 self._fc2_fn = self._tc.create_real_field_class
1783 self._fc3_fn = self._tc.create_signed_integer_field_class
1784 self._fc4_fn = self._tc.create_structure_field_class
1785 self._fc5_fn = self._tc.create_structure_field_class
1786 self._fc5_inner_fn = self._tc.create_signed_integer_field_class
1787
1788 self._fc = self._create_fc(self._tc)
1789 self._def = _create_field(self._tc, self._fc)
1790 self._def['A'] = -1872
1791 self._def['B'] = 'salut'
1792 self._def['C'] = 17.5
1793 self._def['D'] = 16497
1794 self._def['E'] = {}
1795 self._def['F'] = {'F_1': 52}
1796 self._def_value = {
1797 'A': -1872,
1798 'B': 'salut',
1799 'C': 17.5,
1800 'D': 16497,
1801 'E': {},
1802 'F': {'F_1': 52},
1803 }
1804
1805 self._def_const = _create_const_field(
1806 self._tc, self._create_fc(self._tc), self._const_value_setter
1807 )
1808
1809 def _modify_def(self):
1810 self._def['B'] = 'hola'
1811
1812 def test_bool_op_true(self):
1813 self.assertTrue(self._def)
1814
1815 def test_bool_op_false(self):
1816 field = self._def['E']
1817 self.assertFalse(field)
1818
1819 def test_len(self):
1820 self.assertEqual(len(self._def), len(self._def_value))
1821
1822 def test_getitem(self):
1823 field1 = self._def['A']
1824 field2 = self._def['B']
1825 field3 = self._def['C']
1826 field4 = self._def['D']
1827 field5 = self._def['E']
1828 field6 = self._def['F']
1829
1830 self.assertIs(type(field1), bt2._SignedIntegerField)
1831 self.assertEqual(field1, -1872)
1832
1833 self.assertIs(type(field2), bt2._StringField)
1834 self.assertEqual(field2, 'salut')
1835
1836 self.assertIs(type(field3), bt2._RealField)
1837 self.assertEqual(field3, 17.5)
1838
1839 self.assertIs(type(field4), bt2._SignedIntegerField)
1840 self.assertEqual(field4, 16497)
1841
1842 self.assertIs(type(field5), bt2._StructureField)
1843 self.assertEqual(field5, {})
1844
1845 self.assertIs(type(field6), bt2._StructureField)
1846 self.assertEqual(field6, {'F_1': 52})
1847
1848 def test_const_getitem(self):
1849 field1 = self._def_const['A']
1850 field2 = self._def_const['B']
1851 field3 = self._def_const['C']
1852 field4 = self._def_const['D']
1853 field5 = self._def_const['E']
1854 field6 = self._def_const['F']
1855
1856 self.assertIs(type(field1), bt2._SignedIntegerFieldConst)
1857 self.assertEqual(field1, -1872)
1858
1859 self.assertIs(type(field2), bt2._StringFieldConst)
1860 self.assertEqual(field2, 'salut')
1861
1862 self.assertIs(type(field3), bt2._RealFieldConst)
1863 self.assertEqual(field3, 17.5)
1864
1865 self.assertIs(type(field4), bt2._SignedIntegerFieldConst)
1866 self.assertEqual(field4, 16497)
1867
1868 self.assertIs(type(field5), bt2._StructureFieldConst)
1869 self.assertEqual(field5, {})
1870
1871 self.assertIs(type(field6), bt2._StructureFieldConst)
1872 self.assertEqual(field6, {'F_1': 52})
1873
1874 def test_member_at_index_out_of_bounds_after(self):
1875 with self.assertRaises(IndexError):
1876 self._def.member_at_index(len(self._def_value))
1877
1878 def test_eq(self):
1879 field = _create_field(self._tc, self._create_fc(self._tc))
1880 field['A'] = -1872
1881 field['B'] = 'salut'
1882 field['C'] = 17.5
1883 field['D'] = 16497
1884 field['E'] = {}
1885 field['F'] = {'F_1': 52}
1886 self.assertEqual(self._def, field)
1887
1888 def test_const_eq(self):
1889 field = _create_field(self._tc, self._create_fc(self._tc))
1890 field['A'] = -1872
1891 field['B'] = 'salut'
1892 field['C'] = 17.5
1893 field['D'] = 16497
1894 field['E'] = {}
1895 field['F'] = {'F_1': 52}
1896 self.assertEqual(self._def_const, field)
1897
1898 def test_eq_invalid_type(self):
1899 self.assertNotEqual(self._def, 23)
1900
1901 def test_eq_diff_len(self):
1902 fc = self._tc.create_structure_field_class()
1903 fc.append_member('A', self._fc0_fn())
1904 fc.append_member('B', self._fc1_fn())
1905 fc.append_member('C', self._fc2_fn())
1906
1907 field = _create_field(self._tc, fc)
1908 field['A'] = -1872
1909 field['B'] = 'salut'
1910 field['C'] = 17.5
1911 self.assertNotEqual(self._def, field)
1912
1913 def test_eq_diff_keys(self):
1914 fc = self._tc.create_structure_field_class()
1915 fc.append_member('U', self._fc0_fn())
1916 fc.append_member('V', self._fc1_fn())
1917 fc.append_member('W', self._fc2_fn())
1918 fc.append_member('X', self._fc3_fn())
1919 fc.append_member('Y', self._fc4_fn())
1920 fc.append_member('Z', self._fc5_fn())
1921 field = _create_field(self._tc, fc)
1922 field['U'] = -1871
1923 field['V'] = "gerry"
1924 field['W'] = 18.19
1925 field['X'] = 16497
1926 field['Y'] = {}
1927 field['Z'] = {}
1928 self.assertNotEqual(self._def, field)
1929
1930 def test_eq_diff_content_same_len(self):
1931 field = _create_field(self._tc, self._create_fc(self._tc))
1932 field['A'] = -1872
1933 field['B'] = 'salut'
1934 field['C'] = 17.4
1935 field['D'] = 16497
1936 field['E'] = {}
1937 field['F'] = {'F_1': 0}
1938 self.assertNotEqual(self._def, field)
1939
1940 def test_eq_same_content_diff_keys(self):
1941 fc = self._tc.create_structure_field_class()
1942 fc.append_member('A', self._fc0_fn())
1943 fc.append_member('B', self._fc1_fn())
1944 fc.append_member('E', self._fc2_fn())
1945 fc.append_member('D', self._fc3_fn())
1946 fc.append_member('C', self._fc4_fn())
1947 fc.append_member('F', self._fc5_fn())
1948 field = _create_field(self._tc, fc)
1949 field['A'] = -1872
1950 field['B'] = 'salut'
1951 field['E'] = 17.5
1952 field['D'] = 16497
1953 field['C'] = {}
1954 field['F'] = {}
1955 self.assertNotEqual(self._def, field)
1956
1957 def test_setitem(self):
1958 self._def['C'] = -18.47
1959 self.assertEqual(self._def['C'], -18.47)
1960
1961 def test_const_setitem(self):
1962 with self.assertRaises(TypeError):
1963 self._def_const['A'] = 134679
1964
1965 def test_setitem_int_field(self):
1966 int_fc = self._tc.create_signed_integer_field_class(32)
1967 int_field = _create_field(self._tc, int_fc)
1968 int_field.value = 19487
1969 self._def['D'] = int_field
1970 self.assertEqual(self._def['D'], 19487)
1971
1972 def test_setitem_non_basic_field(self):
1973 elem_fc = self._tc.create_structure_field_class()
1974 struct_fc = self._tc.create_structure_field_class()
1975 struct_fc.append_member('A', elem_fc)
1976 struct_field = _create_field(self._tc, struct_fc)
1977
1978 # Will fail on access to .items() of the value
1979 with self.assertRaises(AttributeError):
1980 struct_field['A'] = 23
1981
1982 def test_setitem_none(self):
1983 with self.assertRaises(TypeError):
1984 self._def['C'] = None
1985
1986 def test_setitem_key_wrong_type(self):
1987 with self.assertRaises(TypeError):
1988 self._def[3] = 23
1989
1990 def test_setitem_wrong_key(self):
1991 with self.assertRaises(KeyError):
1992 self._def['hi'] = 134679
1993
1994 def test_member_at_index(self):
1995 self.assertEqual(self._def.member_at_index(1), 'salut')
1996
1997 def test_const_member_at_index(self):
1998 self.assertEqual(self._def_const.member_at_index(1), 'salut')
1999
2000 def test_iter(self):
2001 orig_values = {
2002 'A': -1872,
2003 'B': 'salut',
2004 'C': 17.5,
2005 'D': 16497,
2006 'E': {},
2007 'F': {'F_1': 52},
2008 }
2009
2010 for vkey, vval in self._def.items():
2011 val = orig_values[vkey]
2012 self.assertEqual(vval, val)
2013
2014 def test_value(self):
2015 orig_values = {
2016 'A': -1872,
2017 'B': 'salut',
2018 'C': 17.5,
2019 'D': 16497,
2020 'E': {},
2021 'F': {'F_1': 52},
2022 }
2023 self.assertEqual(self._def, orig_values)
2024
2025 def test_set_value(self):
2026 int_fc = self._tc.create_signed_integer_field_class(32)
2027 another_int_fc = self._tc.create_signed_integer_field_class(32)
2028 str_fc = self._tc.create_string_field_class()
2029 struct_fc = self._tc.create_structure_field_class()
2030 struct_fc.append_member(field_class=int_fc, name='an_int')
2031 struct_fc.append_member(field_class=str_fc, name='a_string')
2032 struct_fc.append_member(field_class=another_int_fc, name='another_int')
2033 values = {'an_int': 42, 'a_string': 'hello', 'another_int': 66}
2034
2035 struct = _create_field(self._tc, struct_fc)
2036 struct.value = values
2037 self.assertEqual(values, struct)
2038
2039 bad_type_values = copy.deepcopy(values)
2040 bad_type_values['an_int'] = 'a string'
2041 with self.assertRaises(TypeError):
2042 struct.value = bad_type_values
2043
2044 unknown_key_values = copy.deepcopy(values)
2045 unknown_key_values['unknown_key'] = 16546
2046 with self.assertRaises(KeyError):
2047 struct.value = unknown_key_values
2048
2049 def test_str_op(self):
2050 expected_string_found = False
2051 s = str(self._def)
2052 # Establish all permutations of the three expected matches since
2053 # the order in which mappings are enumerated is not explicitly part of
2054 # the API.
2055 for p in itertools.permutations([(k, v) for k, v in self._def.items()]):
2056 items = ['{}: {}'.format(repr(k), repr(v)) for k, v in p]
2057 candidate = '{{{}}}'.format(', '.join(items))
2058 if candidate == s:
2059 expected_string_found = True
2060 break
2061
2062 self.assertTrue(expected_string_found)
2063
2064
2065class OptionFieldTestCase(unittest.TestCase):
2066 @staticmethod
2067 def _const_value_setter(field):
2068 field.value = {'opt_field': 'hiboux'}
2069
2070 def _create_fc(self, tc):
2071 fc = tc.create_option_field_class(tc.create_string_field_class())
2072 top_fc = tc.create_structure_field_class()
2073 top_fc.append_member('opt_field', fc)
2074 return top_fc
2075
2076 def setUp(self):
2077 self._tc = get_default_trace_class()
2078 fld = _create_field(self._tc, self._create_fc(self._tc))
2079 self._def = fld['opt_field']
2080 self._def_value = 'hiboux'
2081 self._def_const = _create_const_field(
2082 self._tc, self._create_fc(self._tc), self._const_value_setter
2083 )['opt_field']
2084
2085 def test_value_prop(self):
2086 self._def.value = 'hiboux'
2087 self.assertEqual(self._def.field, 'hiboux')
2088 self.assertIs(type(self._def), bt2._OptionField)
2089 self.assertIs(type(self._def.field), bt2._StringField)
2090 self.assertTrue(self._def.has_field)
2091
2092 def test_const_value_prop(self):
2093 self.assertEqual(self._def_const.field, 'hiboux')
2094 self.assertIs(type(self._def_const), bt2._OptionFieldConst)
2095 self.assertIs(type(self._def_const.field), bt2._StringFieldConst)
2096 self.assertTrue(self._def_const.has_field)
2097
2098 def test_has_field_prop_true(self):
2099 self._def.has_field = True
2100 self.assertTrue(self._def.has_field)
2101
2102 def test_has_field_prop_true(self):
2103 self._def.has_field = False
2104 self.assertFalse(self._def.has_field)
2105
2106 def test_bool_op_true(self):
2107 self._def.value = 'allo'
2108 self.assertTrue(self._def)
2109
2110 def test_bool_op_true(self):
2111 self._def.has_field = False
2112 self.assertFalse(self._def)
2113
2114 def test_field_prop_existing(self):
2115 self._def.value = 'meow'
2116 field = self._def.field
2117 self.assertEqual(field, 'meow')
2118
2119 def test_field_prop_none(self):
2120 self._def.has_field = False
2121 field = self._def.field
2122 self.assertIsNone(field)
2123
2124 def test_const_field_prop(self):
2125 with self.assertRaises(AttributeError):
2126 self._def_const.has_field = False
2127
2128 self.assertEqual(self._def_const, self._def_value)
2129 self.assertTrue(self._def_const.has_field)
2130
2131 def test_field_prop_existing_then_none(self):
2132 self._def.value = 'meow'
2133 field = self._def.field
2134 self.assertEqual(field, 'meow')
2135 self._def.has_field = False
2136 field = self._def.field
2137 self.assertIsNone(field)
2138
2139 def test_eq(self):
2140 field = _create_field(self._tc, self._create_fc(self._tc))
2141 field = field['opt_field']
2142 field.value = 'walk'
2143 self._def.value = 'walk'
2144 self.assertEqual(self._def, field)
2145
2146 def test_const_eq(self):
2147 field = _create_field(self._tc, self._create_fc(self._tc))
2148 field = field['opt_field']
2149 field.value = 'hiboux'
2150 self.assertEqual(self._def_const, field)
2151 self.assertEqual(self._def_const, self._def_value)
2152
2153 def test_eq_invalid_type(self):
2154 self._def.value = 'gerry'
2155 self.assertNotEqual(self._def, 23)
2156
2157 def test_str_op(self):
2158 self._def.value = 'marcel'
2159 self.assertEqual(str(self._def), str(self._def.field))
2160
2161 def test_repr_op(self):
2162 self._def.value = 'mireille'
2163 self.assertEqual(repr(self._def), repr(self._def.field))
2164
2165
2166class VariantFieldTestCase(unittest.TestCase):
2167 @staticmethod
2168 def _const_value_setter(field):
2169 field.selected_option_index = 3
2170 field.value = 1334
2171
2172 def _create_fc(self, tc):
2173 ft0 = tc.create_signed_integer_field_class(32)
2174 ft1 = tc.create_string_field_class()
2175 ft2 = tc.create_real_field_class()
2176 ft3 = tc.create_signed_integer_field_class(17)
2177 fc = tc.create_variant_field_class()
2178 fc.append_option('corner', ft0)
2179 fc.append_option('zoom', ft1)
2180 fc.append_option('mellotron', ft2)
2181 fc.append_option('giorgio', ft3)
2182 top_fc = tc.create_structure_field_class()
2183 top_fc.append_member('variant_field', fc)
2184 return top_fc
2185
2186 def setUp(self):
2187 self._tc = get_default_trace_class()
2188 fld = _create_field(self._tc, self._create_fc(self._tc))
2189 self._def = fld['variant_field']
2190
2191 self._def_value = 1334
2192 self._def_selected_index = 3
2193 const_fc = self._create_fc(self._tc)['variant_field']
2194
2195 fld_const = _create_const_field(
2196 self._tc, const_fc.field_class, self._const_value_setter
2197 )
2198 self._def_const = fld_const
2199
2200 def test_bool_op(self):
2201 self._def.selected_option_index = 2
2202 self._def.value = -17.34
2203 with self.assertRaises(NotImplementedError):
2204 bool(self._def)
2205
2206 def test_selected_option_index(self):
2207 self._def.selected_option_index = 2
2208 self.assertEqual(self._def.selected_option_index, 2)
2209
2210 def test_selected_option_index_above_range(self):
2211 with self.assertRaises(IndexError):
2212 self._def.selected_option_index = 4
2213
2214 def test_selected_option_index_below_range(self):
2215 with self.assertRaises(IndexError):
2216 self._def.selected_option_index = -1
2217
2218 def test_const_selected_option_index(self):
2219 with self.assertRaises(AttributeError):
2220 self._def_const.selected_option_index = 2
2221 self.assertEqual(self._def_const.selected_option_index, 3)
2222
2223 def test_selected_option(self):
2224 self._def.selected_option_index = 2
2225 self._def.value = -17.34
2226 self.assertEqual(self._def.selected_option, -17.34)
2227 self.assertEqual(type(self._def.selected_option), bt2._RealField)
2228
2229 self._def.selected_option_index = 3
2230 self._def.value = 1921
2231 self.assertEqual(self._def.selected_option, 1921)
2232 self.assertEqual(type(self._def.selected_option), bt2._SignedIntegerField)
2233
2234 def test_const_selected_option(self):
2235 self.assertEqual(self._def_const.selected_option, 1334)
2236 self.assertEqual(
2237 type(self._def_const.selected_option), bt2._SignedIntegerFieldConst
2238 )
2239
2240 def test_eq(self):
2241 field = _create_field(self._tc, self._create_fc(self._tc))
2242 field = field['variant_field']
2243 field.selected_option_index = 0
2244 field.value = 1774
2245 self._def.selected_option_index = 0
2246 self._def.value = 1774
2247 self.assertEqual(self._def, field)
2248
2249 def test_const_eq(self):
2250 field = _create_field(self._tc, self._create_fc(self._tc))
2251 field = field['variant_field']
2252 field.selected_option_index = 3
2253 field.value = 1334
2254 self.assertEqual(self._def_const, field)
2255
2256 def test_len(self):
2257 self.assertEqual(len(self._def), 4)
2258
2259 def test_eq_invalid_type(self):
2260 self._def.selected_option_index = 1
2261 self._def.value = 'gerry'
2262 self.assertNotEqual(self._def, 23)
2263
2264 def test_str_op_int(self):
2265 field = _create_field(self._tc, self._create_fc(self._tc))
2266 field = field['variant_field']
2267 field.selected_option_index = 0
2268 field.value = 1774
2269 other_field = _create_field(self._tc, self._create_fc(self._tc))
2270 other_field = other_field['variant_field']
2271 other_field.selected_option_index = 0
2272 other_field.value = 1774
2273 self.assertEqual(str(field), str(other_field))
2274
2275 def test_str_op_str(self):
2276 field = _create_field(self._tc, self._create_fc(self._tc))
2277 field = field['variant_field']
2278 field.selected_option_index = 1
2279 field.value = 'un beau grand bateau'
2280 other_field = _create_field(self._tc, self._create_fc(self._tc))
2281 other_field = other_field['variant_field']
2282 other_field.selected_option_index = 1
2283 other_field.value = 'un beau grand bateau'
2284 self.assertEqual(str(field), str(other_field))
2285
2286 def test_str_op_float(self):
2287 field = _create_field(self._tc, self._create_fc(self._tc))
2288 field = field['variant_field']
2289 field.selected_option_index = 2
2290 field.value = 14.4245
2291 other_field = _create_field(self._tc, self._create_fc(self._tc))
2292 other_field = other_field['variant_field']
2293 other_field.selected_option_index = 2
2294 other_field.value = 14.4245
2295 self.assertEqual(str(field), str(other_field))
This page took 0.029074 seconds and 4 git commands to generate.