test_{field,value}.py: array test cases: add non-sequence equality 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
28
29
30_COMP_BINOPS = (
31 operator.eq,
32 operator.ne,
33)
34
35
36# Create and return a stream with the field classes part of its stream packet
37# context.
38#
39# The stream is part of a dummy trace created from trace class `tc`.
40
41def _create_stream(tc, ctx_field_classes):
42 packet_context_fc = tc.create_structure_field_class()
43 for name, fc in ctx_field_classes:
44 packet_context_fc.append_member(name, fc)
45
46 trace = tc()
47 stream_class = tc.create_stream_class(packet_context_field_class=packet_context_fc)
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
58def _create_field(tc, field_class):
59 field_name = 'field'
60 stream = _create_stream(tc, [(field_name, field_class)])
61 packet = stream.create_packet()
62 return packet.context_field[field_name]
63
64
65# Create a field of type string.
66#
67# The field is part of a dummy stream, itself part of a dummy trace created
68# from trace class `tc`. It is made out of a dummy string field class.
69
70def _create_string_field(tc):
71 field_name = 'string_field'
72 stream = _create_stream(tc, [(field_name, tc.create_string_field_class())])
73 packet = stream.create_packet()
74 return packet.context_field[field_name]
75
76
77# Create a field of type static array of ints.
78#
79# The field is part of a dummy stream, itself part of a dummy trace created
80# from trace class `tc`. It is made out of a dummy static array field class,
81# with a dummy integer field class as element class.
82
83def _create_int_array_field(tc, length):
84 elem_fc = tc.create_signed_integer_field_class(32)
85 fc = tc.create_static_array_field_class(elem_fc, length)
86 field_name = 'int_array'
87 stream = _create_stream(tc, [(field_name, fc)])
88 packet = stream.create_packet()
89 return packet.context_field[field_name]
90
91
92# Create a field of type dynamic array of ints.
93#
94# The field is part of a dummy stream, itself part of a dummy trace created
95# from trace class `tc`. It is made out of a dummy static array field class,
96# with a dummy integer field class as element and length classes.
97
98def _create_dynamic_array(tc):
99 elem_fc = tc.create_signed_integer_field_class(32)
100 len_fc = tc.create_signed_integer_field_class(32)
101 fc = tc.create_dynamic_array_field_class(elem_fc)
102 field_name = 'int_dyn_array'
103 stream = _create_stream(tc, [('thelength', len_fc), (field_name, fc)])
104 packet = stream.create_packet()
105 packet.context_field[field_name].length = 3
106 return packet.context_field[field_name]
107
108
109# Create a field of type array of (empty) structures.
110#
111# The field is part of a dummy stream, itself part of a dummy trace created
112# from trace class `tc`. It is made out of a dummy static array field class,
113# with a dummy struct field class as element class.
114
115def _create_struct_array_field(tc, length):
116 elem_fc = tc.create_structure_field_class()
117 fc = tc.create_static_array_field_class(elem_fc, length)
118 field_name = 'struct_array'
119 stream = _create_stream(tc, [(field_name, fc)])
120 packet = stream.create_packet()
121 return packet.context_field[field_name]
122
123
124# Base class for numeric field test cases.
125#
126# To be compatible with this base class, a derived class must, in its
127# setUp() method:
128#
129# * Set `self._def` to a field object with an arbitrary value.
130# * Set `self._def_value` to the equivalent value of `self._def`.
131class _TestNumericField:
132 # Tries the binary operation `op`:
133 #
134 # 1. Between `self._def`, which is a field object, and `rhs`.
135 # 2. Between `self._def_value`, which is the raw value of
136 # `self._def`, and `rhs`.
137 #
138 # Returns the results of 1. and 2.
139 #
140 # If there's an exception while performing 1. or 2., asserts that
141 # both operations raised exceptions, that both exceptions have the
142 # same type, and returns `None` for both results.
143 def _binop(self, op, rhs):
144 type_rexc = None
145 type_rvexc = None
146 comp_value = rhs
147
148 # try with field object
149 try:
150 r = op(self._def, rhs)
151 except Exception as e:
152 type_rexc = type(e)
153
154 # try with value
155 try:
156 rv = op(self._def_value, comp_value)
157 except Exception as e:
158 type_rvexc = type(e)
159
160 if type_rexc is not None or type_rvexc is not None:
161 # at least one of the operations raised an exception: in
162 # this case both operations should have raised the same
163 # type of exception (division by zero, bit shift with a
164 # floating point number operand, etc.)
165 self.assertIs(type_rexc, type_rvexc)
166 return None, None
167
168 return r, rv
169
170 # Tries the unary operation `op`:
171 #
172 # 1. On `self._def`, which is a field object.
173 # 2. On `self._def_value`, which is the value of `self._def`.
174 #
175 # Returns the results of 1. and 2.
176 #
177 # If there's an exception while performing 1. or 2., asserts that
178 # both operations raised exceptions, that both exceptions have the
179 # same type, and returns `None` for both results.
180 def _unaryop(self, op):
181 type_rexc = None
182 type_rvexc = None
183
184 # try with field object
185 try:
186 r = op(self._def)
187 except Exception as e:
188 type_rexc = type(e)
189
190 # try with value
191 try:
192 rv = op(self._def_value)
193 except Exception as e:
194 type_rvexc = type(e)
195
196 if type_rexc is not None or type_rvexc is not None:
197 # at least one of the operations raised an exception: in
198 # this case both operations should have raised the same
199 # type of exception (division by zero, bit shift with a
200 # floating point number operand, etc.)
201 self.assertIs(type_rexc, type_rvexc)
202 return None, None
203
204 return r, rv
205
206 # Tests that the unary operation `op` gives results with the same
207 # type for both `self._def` and `self._def_value`.
208 def _test_unaryop_type(self, op):
209 r, rv = self._unaryop(op)
210
211 if r is None:
212 return
213
214 self.assertIsInstance(r, type(rv))
215
216 # Tests that the unary operation `op` gives results with the same
217 # value for both `self._def` and `self._def_value`. This uses the
218 # __eq__() operator of `self._def`.
219 def _test_unaryop_value(self, op):
220 r, rv = self._unaryop(op)
221
222 if r is None:
223 return
224
225 self.assertEqual(r, rv)
226
227 # Tests that the unary operation `op`, when applied to `self._def`,
228 # does not change its underlying BT object address.
229 def _test_unaryop_addr_same(self, op):
230 addr_before = self._def.addr
231 self._unaryop(op)
232 self.assertEqual(self._def.addr, addr_before)
233
234 # Tests that the unary operation `op`, when applied to `self._def`,
235 # does not change its value.
236 def _test_unaryop_value_same(self, op):
237 value_before = copy.copy(self._def_value)
238 self._unaryop(op)
239 self.assertEqual(self._def, value_before)
240
241 # Tests that the binary operation `op` gives results with the same
242 # type for both `self._def` and `self._def_value`.
243 def _test_binop_type(self, op, rhs):
244 r, rv = self._binop(op, rhs)
245
246 if r is None:
247 return
248
249 if op in _COMP_BINOPS:
250 # __eq__() and __ne__() always return a 'bool' object
251 self.assertIsInstance(r, bool)
252 else:
253 self.assertIsInstance(r, type(rv))
254
255 # Tests that the binary operation `op` gives results with the same
256 # value for both `self._def` and `self._def_value`. This uses the
257 # __eq__() operator of `self._def`.
258 def _test_binop_value(self, op, rhs):
259 r, rv = self._binop(op, rhs)
260
261 if r is None:
262 return
263
264 self.assertEqual(r, rv)
265
266 # Tests that the binary operation `op`, when applied to `self._def`,
267 # does not change its underlying BT object address.
268 def _test_binop_lhs_addr_same(self, op, rhs):
269 addr_before = self._def.addr
270 r, rv = self._binop(op, rhs)
271 self.assertEqual(self._def.addr, addr_before)
272
273 # Tests that the binary operation `op`, when applied to `self._def`,
274 # does not change its value.
275 @unittest.skip('copy is not implemented')
276 def _test_binop_lhs_value_same(self, op, rhs):
277 value_before = copy.copy(self._def)
278 r, rv = self._binop(op, rhs)
279 self.assertEqual(self._def, value_before)
280
281 # The methods below which take the `test_cb` and/or `op` parameters
282 # are meant to be used with one of the _test_binop_*() functions
283 # above as `test_cb` and a binary operator function as `op`.
284 #
285 # For example:
286 #
287 # self._test_binop_rhs_pos_int(self._test_binop_value,
288 # operator.add)
289 #
290 # This tests that a numeric field object added to a positive integer
291 # value gives a result with the expected value.
292 #
293 # `vint` and `vfloat` mean a signed integer value object and a real
294 # value object.
295
296 def _test_binop_invalid_unknown(self, op):
297 if op in _COMP_BINOPS:
298 self.skipTest('not testing')
299
300 class A:
301 pass
302
303 with self.assertRaises(TypeError):
304 op(self._def, A())
305
306 def _test_binop_invalid_none(self, op):
307 if op in _COMP_BINOPS:
308 self.skipTest('not testing')
309
310 with self.assertRaises(TypeError):
311 op(self._def, None)
312
313 def _test_binop_rhs_false(self, test_cb, op):
314 test_cb(op, False)
315
316 def _test_binop_rhs_true(self, test_cb, op):
317 test_cb(op, True)
318
319 def _test_binop_rhs_pos_int(self, test_cb, op):
320 test_cb(op, 2)
321
322 def _test_binop_rhs_neg_int(self, test_cb, op):
323 test_cb(op, -23)
324
325 def _test_binop_rhs_zero_int(self, test_cb, op):
326 test_cb(op, 0)
327
328 def _test_binop_rhs_pos_vint(self, test_cb, op):
329 test_cb(op, bt2.create_value(2))
330
331 def _test_binop_rhs_neg_vint(self, test_cb, op):
332 test_cb(op, bt2.create_value(-23))
333
334 def _test_binop_rhs_zero_vint(self, test_cb, op):
335 test_cb(op, bt2.create_value(0))
336
337 def _test_binop_rhs_pos_float(self, test_cb, op):
338 test_cb(op, 2.2)
339
340 def _test_binop_rhs_neg_float(self, test_cb, op):
341 test_cb(op, -23.4)
342
343 def _test_binop_rhs_zero_float(self, test_cb, op):
344 test_cb(op, 0.0)
345
346 def _test_binop_rhs_pos_vfloat(self, test_cb, op):
347 test_cb(op, bt2.create_value(2.2))
348
349 def _test_binop_rhs_neg_vfloat(self, test_cb, op):
350 test_cb(op, bt2.create_value(-23.4))
351
352 def _test_binop_rhs_zero_vfloat(self, test_cb, op):
353 test_cb(op, bt2.create_value(0.0))
354
355 def _test_binop_rhs_complex(self, test_cb, op):
356 test_cb(op, -23+19j)
357
358 def _test_binop_rhs_zero_complex(self, test_cb, op):
359 test_cb(op, 0j)
360
361 def _test_binop_type_false(self, op):
362 self._test_binop_rhs_false(self._test_binop_type, op)
363
364 def _test_binop_type_true(self, op):
365 self._test_binop_rhs_true(self._test_binop_type, op)
366
367 def _test_binop_type_pos_int(self, op):
368 self._test_binop_rhs_pos_int(self._test_binop_type, op)
369
370 def _test_binop_type_neg_int(self, op):
371 self._test_binop_rhs_neg_int(self._test_binop_type, op)
372
373 def _test_binop_type_zero_int(self, op):
374 self._test_binop_rhs_zero_int(self._test_binop_type, op)
375
376 def _test_binop_type_pos_vint(self, op):
377 self._test_binop_rhs_pos_vint(self._test_binop_type, op)
378
379 def _test_binop_type_neg_vint(self, op):
380 self._test_binop_rhs_neg_vint(self._test_binop_type, op)
381
382 def _test_binop_type_zero_vint(self, op):
383 self._test_binop_rhs_zero_vint(self._test_binop_type, op)
384
385 def _test_binop_type_pos_float(self, op):
386 self._test_binop_rhs_pos_float(self._test_binop_type, op)
387
388 def _test_binop_type_neg_float(self, op):
389 self._test_binop_rhs_neg_float(self._test_binop_type, op)
390
391 def _test_binop_type_zero_float(self, op):
392 self._test_binop_rhs_zero_float(self._test_binop_type, op)
393
394 def _test_binop_type_pos_vfloat(self, op):
395 self._test_binop_rhs_pos_vfloat(self._test_binop_type, op)
396
397 def _test_binop_type_neg_vfloat(self, op):
398 self._test_binop_rhs_neg_vfloat(self._test_binop_type, op)
399
400 def _test_binop_type_zero_vfloat(self, op):
401 self._test_binop_rhs_zero_vfloat(self._test_binop_type, op)
402
403 def _test_binop_type_complex(self, op):
404 self._test_binop_rhs_complex(self._test_binop_type, op)
405
406 def _test_binop_type_zero_complex(self, op):
407 self._test_binop_rhs_zero_complex(self._test_binop_type, op)
408
409 def _test_binop_value_false(self, op):
410 self._test_binop_rhs_false(self._test_binop_value, op)
411
412 def _test_binop_value_true(self, op):
413 self._test_binop_rhs_true(self._test_binop_value, op)
414
415 def _test_binop_value_pos_int(self, op):
416 self._test_binop_rhs_pos_int(self._test_binop_value, op)
417
418 def _test_binop_value_neg_int(self, op):
419 self._test_binop_rhs_neg_int(self._test_binop_value, op)
420
421 def _test_binop_value_zero_int(self, op):
422 self._test_binop_rhs_zero_int(self._test_binop_value, op)
423
424 def _test_binop_value_pos_vint(self, op):
425 self._test_binop_rhs_pos_vint(self._test_binop_value, op)
426
427 def _test_binop_value_neg_vint(self, op):
428 self._test_binop_rhs_neg_vint(self._test_binop_value, op)
429
430 def _test_binop_value_zero_vint(self, op):
431 self._test_binop_rhs_zero_vint(self._test_binop_value, op)
432
433 def _test_binop_value_pos_float(self, op):
434 self._test_binop_rhs_pos_float(self._test_binop_value, op)
435
436 def _test_binop_value_neg_float(self, op):
437 self._test_binop_rhs_neg_float(self._test_binop_value, op)
438
439 def _test_binop_value_zero_float(self, op):
440 self._test_binop_rhs_zero_float(self._test_binop_value, op)
441
442 def _test_binop_value_pos_vfloat(self, op):
443 self._test_binop_rhs_pos_vfloat(self._test_binop_value, op)
444
445 def _test_binop_value_neg_vfloat(self, op):
446 self._test_binop_rhs_neg_vfloat(self._test_binop_value, op)
447
448 def _test_binop_value_zero_vfloat(self, op):
449 self._test_binop_rhs_zero_vfloat(self._test_binop_value, op)
450
451 def _test_binop_value_complex(self, op):
452 self._test_binop_rhs_complex(self._test_binop_value, op)
453
454 def _test_binop_value_zero_complex(self, op):
455 self._test_binop_rhs_zero_complex(self._test_binop_value, op)
456
457 def _test_binop_lhs_addr_same_false(self, op):
458 self._test_binop_rhs_false(self._test_binop_lhs_addr_same, op)
459
460 def _test_binop_lhs_addr_same_true(self, op):
461 self._test_binop_rhs_true(self._test_binop_lhs_addr_same, op)
462
463 def _test_binop_lhs_addr_same_pos_int(self, op):
464 self._test_binop_rhs_pos_int(self._test_binop_lhs_addr_same, op)
465
466 def _test_binop_lhs_addr_same_neg_int(self, op):
467 self._test_binop_rhs_neg_int(self._test_binop_lhs_addr_same, op)
468
469 def _test_binop_lhs_addr_same_zero_int(self, op):
470 self._test_binop_rhs_zero_int(self._test_binop_lhs_addr_same, op)
471
472 def _test_binop_lhs_addr_same_pos_vint(self, op):
473 self._test_binop_rhs_pos_vint(self._test_binop_lhs_addr_same, op)
474
475 def _test_binop_lhs_addr_same_neg_vint(self, op):
476 self._test_binop_rhs_neg_vint(self._test_binop_lhs_addr_same, op)
477
478 def _test_binop_lhs_addr_same_zero_vint(self, op):
479 self._test_binop_rhs_zero_vint(self._test_binop_lhs_addr_same, op)
480
481 def _test_binop_lhs_addr_same_pos_float(self, op):
482 self._test_binop_rhs_pos_float(self._test_binop_lhs_addr_same, op)
483
484 def _test_binop_lhs_addr_same_neg_float(self, op):
485 self._test_binop_rhs_neg_float(self._test_binop_lhs_addr_same, op)
486
487 def _test_binop_lhs_addr_same_zero_float(self, op):
488 self._test_binop_rhs_zero_float(self._test_binop_lhs_addr_same, op)
489
490 def _test_binop_lhs_addr_same_pos_vfloat(self, op):
491 self._test_binop_rhs_pos_vfloat(self._test_binop_lhs_addr_same, op)
492
493 def _test_binop_lhs_addr_same_neg_vfloat(self, op):
494 self._test_binop_rhs_neg_vfloat(self._test_binop_lhs_addr_same, op)
495
496 def _test_binop_lhs_addr_same_zero_vfloat(self, op):
497 self._test_binop_rhs_zero_vfloat(self._test_binop_lhs_addr_same, op)
498
499 def _test_binop_lhs_addr_same_complex(self, op):
500 self._test_binop_rhs_complex(self._test_binop_lhs_addr_same, op)
501
502 def _test_binop_lhs_addr_same_zero_complex(self, op):
503 self._test_binop_rhs_zero_complex(self._test_binop_lhs_addr_same, op)
504
505 def _test_binop_lhs_value_same_false(self, op):
506 self._test_binop_rhs_false(self._test_binop_lhs_value_same, op)
507
508 def _test_binop_lhs_value_same_true(self, op):
509 self._test_binop_rhs_true(self._test_binop_lhs_value_same, op)
510
511 def _test_binop_lhs_value_same_pos_int(self, op):
512 self._test_binop_rhs_pos_int(self._test_binop_lhs_value_same, op)
513
514 def _test_binop_lhs_value_same_neg_int(self, op):
515 self._test_binop_rhs_neg_int(self._test_binop_lhs_value_same, op)
516
517 def _test_binop_lhs_value_same_zero_int(self, op):
518 self._test_binop_rhs_zero_int(self._test_binop_lhs_value_same, op)
519
520 def _test_binop_lhs_value_same_pos_vint(self, op):
521 self._test_binop_rhs_pos_vint(self._test_binop_lhs_value_same, op)
522
523 def _test_binop_lhs_value_same_neg_vint(self, op):
524 self._test_binop_rhs_neg_vint(self._test_binop_lhs_value_same, op)
525
526 def _test_binop_lhs_value_same_zero_vint(self, op):
527 self._test_binop_rhs_zero_vint(self._test_binop_lhs_value_same, op)
528
529 def _test_binop_lhs_value_same_pos_float(self, op):
530 self._test_binop_rhs_pos_float(self._test_binop_lhs_value_same, op)
531
532 def _test_binop_lhs_value_same_neg_float(self, op):
533 self._test_binop_rhs_neg_float(self._test_binop_lhs_value_same, op)
534
535 def _test_binop_lhs_value_same_zero_float(self, op):
536 self._test_binop_rhs_zero_float(self._test_binop_lhs_value_same, op)
537
538 def _test_binop_lhs_value_same_pos_vfloat(self, op):
539 self._test_binop_rhs_pos_vfloat(self._test_binop_lhs_value_same, op)
540
541 def _test_binop_lhs_value_same_neg_vfloat(self, op):
542 self._test_binop_rhs_neg_vfloat(self._test_binop_lhs_value_same, op)
543
544 def _test_binop_lhs_value_same_zero_vfloat(self, op):
545 self._test_binop_rhs_zero_vfloat(self._test_binop_lhs_value_same, op)
546
547 def _test_binop_lhs_value_same_complex(self, op):
548 self._test_binop_rhs_complex(self._test_binop_lhs_value_same, op)
549
550 def _test_binop_lhs_value_same_zero_complex(self, op):
551 self._test_binop_rhs_zero_complex(self._test_binop_lhs_value_same, op)
552
553 def test_bool_op(self):
554 self.assertEqual(bool(self._def), bool(self._def_value))
555
556 def test_int_op(self):
557 self.assertEqual(int(self._def), int(self._def_value))
558
559 def test_float_op(self):
560 self.assertEqual(float(self._def), float(self._def_value))
561
562 def test_complex_op(self):
563 self.assertEqual(complex(self._def), complex(self._def_value))
564
565 def test_str_op(self):
566 self.assertEqual(str(self._def), str(self._def_value))
567
568 def test_eq_none(self):
569 # Ignore this lint error:
570 # E711 comparison to None should be 'if cond is None:'
571 # since this is what we want to test (even though not good practice).
572 self.assertFalse(self._def == None) # noqa: E711
573
574 def test_ne_none(self):
575 # Ignore this lint error:
576 # E711 comparison to None should be 'if cond is not None:'
577 # since this is what we want to test (even though not good practice).
578 self.assertTrue(self._def != None) # noqa: E711
579
580
581# This is a list of binary operators used for
582# _inject_numeric_testing_methods().
583#
584# Each entry is a pair of binary operator name (used as part of the
585# created testing method's name) and operator function.
586_BINOPS = (
587 ('lt', operator.lt),
588 ('le', operator.le),
589 ('eq', operator.eq),
590 ('ne', operator.ne),
591 ('ge', operator.ge),
592 ('gt', operator.gt),
593 ('add', operator.add),
594 ('radd', lambda a, b: operator.add(b, a)),
595 ('and', operator.and_),
596 ('rand', lambda a, b: operator.and_(b, a)),
597 ('floordiv', operator.floordiv),
598 ('rfloordiv', lambda a, b: operator.floordiv(b, a)),
599 ('lshift', operator.lshift),
600 ('rlshift', lambda a, b: operator.lshift(b, a)),
601 ('mod', operator.mod),
602 ('rmod', lambda a, b: operator.mod(b, a)),
603 ('mul', operator.mul),
604 ('rmul', lambda a, b: operator.mul(b, a)),
605 ('or', operator.or_),
606 ('ror', lambda a, b: operator.or_(b, a)),
607 ('pow', operator.pow),
608 ('rpow', lambda a, b: operator.pow(b, a)),
609 ('rshift', operator.rshift),
610 ('rrshift', lambda a, b: operator.rshift(b, a)),
611 ('sub', operator.sub),
612 ('rsub', lambda a, b: operator.sub(b, a)),
613 ('truediv', operator.truediv),
614 ('rtruediv', lambda a, b: operator.truediv(b, a)),
615 ('xor', operator.xor),
616 ('rxor', lambda a, b: operator.xor(b, a)),
617)
618
619
620# This is a list of unary operators used for
621# _inject_numeric_testing_methods().
622#
623# Each entry is a pair of unary operator name (used as part of the
624# created testing method's name) and operator function.
625_UNARYOPS = (
626 ('neg', operator.neg),
627 ('pos', operator.pos),
628 ('abs', operator.abs),
629 ('invert', operator.invert),
630 ('round', round),
631 ('round_0', partial(round, ndigits=0)),
632 ('round_1', partial(round, ndigits=1)),
633 ('round_2', partial(round, ndigits=2)),
634 ('round_3', partial(round, ndigits=3)),
635 ('ceil', math.ceil),
636 ('floor', math.floor),
637 ('trunc', math.trunc),
638)
639
640
641# This function injects a bunch of testing methods to a numeric
642# field test case.
643#
644# It is meant to be used like this:
645#
646# _inject_numeric_testing_methods(MyNumericFieldTestCase)
647#
648# This function injects:
649#
650# * One testing method for each _TestNumericField._test_binop_*()
651# method, for each binary operator in the _BINOPS tuple.
652#
653# * One testing method for each _TestNumericField._test_unaryop*()
654# method, for each unary operator in the _UNARYOPS tuple.
655def _inject_numeric_testing_methods(cls):
656 def test_binop_name(suffix):
657 return 'test_binop_{}_{}'.format(name, suffix)
658
659 def test_unaryop_name(suffix):
660 return 'test_unaryop_{}_{}'.format(name, suffix)
661
662 # inject testing methods for each binary operation
663 for name, binop in _BINOPS:
664 setattr(cls, test_binop_name('invalid_unknown'), partialmethod(_TestNumericField._test_binop_invalid_unknown, op=binop))
665 setattr(cls, test_binop_name('invalid_none'), partialmethod(_TestNumericField._test_binop_invalid_none, op=binop))
666 setattr(cls, test_binop_name('type_true'), partialmethod(_TestNumericField._test_binop_type_true, op=binop))
667 setattr(cls, test_binop_name('type_pos_int'), partialmethod(_TestNumericField._test_binop_type_pos_int, op=binop))
668 setattr(cls, test_binop_name('type_pos_vint'), partialmethod(_TestNumericField._test_binop_type_pos_vint, op=binop))
669 setattr(cls, test_binop_name('value_true'), partialmethod(_TestNumericField._test_binop_value_true, op=binop))
670 setattr(cls, test_binop_name('value_pos_int'), partialmethod(_TestNumericField._test_binop_value_pos_int, op=binop))
671 setattr(cls, test_binop_name('value_pos_vint'), partialmethod(_TestNumericField._test_binop_value_pos_vint, op=binop))
672 setattr(cls, test_binop_name('lhs_addr_same_true'), partialmethod(_TestNumericField._test_binop_lhs_addr_same_true, op=binop))
673 setattr(cls, test_binop_name('lhs_addr_same_pos_int'), partialmethod(_TestNumericField._test_binop_lhs_addr_same_pos_int, op=binop))
674 setattr(cls, test_binop_name('lhs_addr_same_pos_vint'), partialmethod(_TestNumericField._test_binop_lhs_addr_same_pos_vint, op=binop))
675 setattr(cls, test_binop_name('lhs_value_same_true'), partialmethod(_TestNumericField._test_binop_lhs_value_same_true, op=binop))
676 setattr(cls, test_binop_name('lhs_value_same_pos_int'), partialmethod(_TestNumericField._test_binop_lhs_value_same_pos_int, op=binop))
677 setattr(cls, test_binop_name('lhs_value_same_pos_vint'), partialmethod(_TestNumericField._test_binop_lhs_value_same_pos_vint, op=binop))
678 setattr(cls, test_binop_name('type_neg_int'), partialmethod(_TestNumericField._test_binop_type_neg_int, op=binop))
679 setattr(cls, test_binop_name('type_neg_vint'), partialmethod(_TestNumericField._test_binop_type_neg_vint, op=binop))
680 setattr(cls, test_binop_name('value_neg_int'), partialmethod(_TestNumericField._test_binop_value_neg_int, op=binop))
681 setattr(cls, test_binop_name('value_neg_vint'), partialmethod(_TestNumericField._test_binop_value_neg_vint, op=binop))
682 setattr(cls, test_binop_name('lhs_addr_same_neg_int'), partialmethod(_TestNumericField._test_binop_lhs_addr_same_neg_int, op=binop))
683 setattr(cls, test_binop_name('lhs_addr_same_neg_vint'), partialmethod(_TestNumericField._test_binop_lhs_addr_same_neg_vint, op=binop))
684 setattr(cls, test_binop_name('lhs_value_same_neg_int'), partialmethod(_TestNumericField._test_binop_lhs_value_same_neg_int, op=binop))
685 setattr(cls, test_binop_name('lhs_value_same_neg_vint'), partialmethod(_TestNumericField._test_binop_lhs_value_same_neg_vint, op=binop))
686 setattr(cls, test_binop_name('type_false'), partialmethod(_TestNumericField._test_binop_type_false, op=binop))
687 setattr(cls, test_binop_name('type_zero_int'), partialmethod(_TestNumericField._test_binop_type_zero_int, op=binop))
688 setattr(cls, test_binop_name('type_zero_vint'), partialmethod(_TestNumericField._test_binop_type_zero_vint, op=binop))
689 setattr(cls, test_binop_name('value_false'), partialmethod(_TestNumericField._test_binop_value_false, op=binop))
690 setattr(cls, test_binop_name('value_zero_int'), partialmethod(_TestNumericField._test_binop_value_zero_int, op=binop))
691 setattr(cls, test_binop_name('value_zero_vint'), partialmethod(_TestNumericField._test_binop_value_zero_vint, op=binop))
692 setattr(cls, test_binop_name('lhs_addr_same_false'), partialmethod(_TestNumericField._test_binop_lhs_addr_same_false, op=binop))
693 setattr(cls, test_binop_name('lhs_addr_same_zero_int'), partialmethod(_TestNumericField._test_binop_lhs_addr_same_zero_int, op=binop))
694 setattr(cls, test_binop_name('lhs_addr_same_zero_vint'), partialmethod(_TestNumericField._test_binop_lhs_addr_same_zero_vint, op=binop))
695 setattr(cls, test_binop_name('lhs_value_same_false'), partialmethod(_TestNumericField._test_binop_lhs_value_same_false, op=binop))
696 setattr(cls, test_binop_name('lhs_value_same_zero_int'), partialmethod(_TestNumericField._test_binop_lhs_value_same_zero_int, op=binop))
697 setattr(cls, test_binop_name('lhs_value_same_zero_vint'), partialmethod(_TestNumericField._test_binop_lhs_value_same_zero_vint, op=binop))
698 setattr(cls, test_binop_name('type_pos_float'), partialmethod(_TestNumericField._test_binop_type_pos_float, op=binop))
699 setattr(cls, test_binop_name('type_neg_float'), partialmethod(_TestNumericField._test_binop_type_neg_float, op=binop))
700 setattr(cls, test_binop_name('type_pos_vfloat'), partialmethod(_TestNumericField._test_binop_type_pos_vfloat, op=binop))
701 setattr(cls, test_binop_name('type_neg_vfloat'), partialmethod(_TestNumericField._test_binop_type_neg_vfloat, op=binop))
702 setattr(cls, test_binop_name('value_pos_float'), partialmethod(_TestNumericField._test_binop_value_pos_float, op=binop))
703 setattr(cls, test_binop_name('value_neg_float'), partialmethod(_TestNumericField._test_binop_value_neg_float, op=binop))
704 setattr(cls, test_binop_name('value_pos_vfloat'), partialmethod(_TestNumericField._test_binop_value_pos_vfloat, op=binop))
705 setattr(cls, test_binop_name('value_neg_vfloat'), partialmethod(_TestNumericField._test_binop_value_neg_vfloat, op=binop))
706 setattr(cls, test_binop_name('lhs_addr_same_pos_float'), partialmethod(_TestNumericField._test_binop_lhs_addr_same_pos_float, op=binop))
707 setattr(cls, test_binop_name('lhs_addr_same_neg_float'), partialmethod(_TestNumericField._test_binop_lhs_addr_same_neg_float, op=binop))
708 setattr(cls, test_binop_name('lhs_addr_same_pos_vfloat'), partialmethod(_TestNumericField._test_binop_lhs_addr_same_pos_vfloat, op=binop))
709 setattr(cls, test_binop_name('lhs_addr_same_neg_vfloat'), partialmethod(_TestNumericField._test_binop_lhs_addr_same_neg_vfloat, op=binop))
710 setattr(cls, test_binop_name('lhs_value_same_pos_float'), partialmethod(_TestNumericField._test_binop_lhs_value_same_pos_float, op=binop))
711 setattr(cls, test_binop_name('lhs_value_same_neg_float'), partialmethod(_TestNumericField._test_binop_lhs_value_same_neg_float, op=binop))
712 setattr(cls, test_binop_name('lhs_value_same_pos_vfloat'), partialmethod(_TestNumericField._test_binop_lhs_value_same_pos_vfloat, op=binop))
713 setattr(cls, test_binop_name('lhs_value_same_neg_vfloat'), partialmethod(_TestNumericField._test_binop_lhs_value_same_neg_vfloat, op=binop))
714 setattr(cls, test_binop_name('type_zero_float'), partialmethod(_TestNumericField._test_binop_type_zero_float, op=binop))
715 setattr(cls, test_binop_name('type_zero_vfloat'), partialmethod(_TestNumericField._test_binop_type_zero_vfloat, op=binop))
716 setattr(cls, test_binop_name('value_zero_float'), partialmethod(_TestNumericField._test_binop_value_zero_float, op=binop))
717 setattr(cls, test_binop_name('value_zero_vfloat'), partialmethod(_TestNumericField._test_binop_value_zero_vfloat, op=binop))
718 setattr(cls, test_binop_name('lhs_addr_same_zero_float'), partialmethod(_TestNumericField._test_binop_lhs_addr_same_zero_float, op=binop))
719 setattr(cls, test_binop_name('lhs_addr_same_zero_vfloat'), partialmethod(_TestNumericField._test_binop_lhs_addr_same_zero_vfloat, op=binop))
720 setattr(cls, test_binop_name('lhs_value_same_zero_float'), partialmethod(_TestNumericField._test_binop_lhs_value_same_zero_float, op=binop))
721 setattr(cls, test_binop_name('lhs_value_same_zero_vfloat'), partialmethod(_TestNumericField._test_binop_lhs_value_same_zero_vfloat, op=binop))
722 setattr(cls, test_binop_name('type_complex'), partialmethod(_TestNumericField._test_binop_type_complex, op=binop))
723 setattr(cls, test_binop_name('type_zero_complex'), partialmethod(_TestNumericField._test_binop_type_zero_complex, op=binop))
724 setattr(cls, test_binop_name('value_complex'), partialmethod(_TestNumericField._test_binop_value_complex, op=binop))
725 setattr(cls, test_binop_name('value_zero_complex'), partialmethod(_TestNumericField._test_binop_value_zero_complex, op=binop))
726 setattr(cls, test_binop_name('lhs_addr_same_complex'), partialmethod(_TestNumericField._test_binop_lhs_addr_same_complex, op=binop))
727 setattr(cls, test_binop_name('lhs_addr_same_zero_complex'), partialmethod(_TestNumericField._test_binop_lhs_addr_same_zero_complex, op=binop))
728 setattr(cls, test_binop_name('lhs_value_same_complex'), partialmethod(_TestNumericField._test_binop_lhs_value_same_complex, op=binop))
729 setattr(cls, test_binop_name('lhs_value_same_zero_complex'), partialmethod(_TestNumericField._test_binop_lhs_value_same_zero_complex, op=binop))
730
731 # inject testing methods for each unary operation
732 for name, unaryop in _UNARYOPS:
733 setattr(cls, test_unaryop_name('type'), partialmethod(_TestNumericField._test_unaryop_type, op=unaryop))
734 setattr(cls, test_unaryop_name('value'), partialmethod(_TestNumericField._test_unaryop_value, op=unaryop))
735 setattr(cls, test_unaryop_name('addr_same'), partialmethod(_TestNumericField._test_unaryop_addr_same, op=unaryop))
736 setattr(cls, test_unaryop_name('value_same'), partialmethod(_TestNumericField._test_unaryop_value_same, op=unaryop))
737
738
739class _TestIntegerFieldCommon(_TestNumericField):
740 def test_assign_true(self):
741 raw = True
742 self._def.value = raw
743 self.assertEqual(self._def, raw)
744
745 def test_assign_false(self):
746 raw = False
747 self._def.value = raw
748 self.assertEqual(self._def, raw)
749
750 def test_assign_pos_int(self):
751 raw = 477
752 self._def.value = raw
753 self.assertEqual(self._def, raw)
754
755 def test_assign_neg_int(self):
756 raw = -13
757 self._def.value = raw
758 self.assertEqual(self._def, raw)
759
760 def test_assign_int_field(self):
761 raw = 999
762 field = _create_field(self._tc, self._create_fc(self._tc))
763 field.value = raw
764 self._def.value = field
765 self.assertEqual(self._def, raw)
766
767 def test_assign_invalid_type(self):
768 with self.assertRaises(TypeError):
769 self._def.value = 'yes'
770
771 def test_assign_uint(self):
772 uint_fc = self._tc.create_unsigned_integer_field_class(32)
773 field = _create_field(self._tc, uint_fc)
774 raw = 1777
775 field.value = 1777
776 self.assertEqual(field, raw)
777
778 def test_assign_big_uint(self):
779 uint_fc = self._tc.create_unsigned_integer_field_class(64)
780 field = _create_field(self._tc, uint_fc)
781 # Larger than the IEEE 754 double-precision exact representation of
782 # integers.
783 raw = (2**53) + 1
784 field.value = (2**53) + 1
785 self.assertEqual(field, raw)
786
787 def test_assign_uint_invalid_neg(self):
788 uint_fc = self._tc.create_unsigned_integer_field_class(32)
789 field = _create_field(self._tc, uint_fc)
790
791 with self.assertRaises(ValueError):
792 field.value = -23
793
794 def test_str_op(self):
795 self.assertEqual(str(self._def), str(self._def_value))
796
797
798_inject_numeric_testing_methods(_TestIntegerFieldCommon)
799
800
801class SignedIntegerFieldTestCase(_TestIntegerFieldCommon, unittest.TestCase):
802 def _create_fc(self, tc):
803 return tc.create_signed_integer_field_class(25)
804
805 def setUp(self):
806 self._tc = get_default_trace_class()
807 self._field = _create_field(self._tc, self._create_fc(self._tc))
808 self._field.value = 17
809 self._def = _create_field(self._tc, self._create_fc(self._tc))
810 self._def.value = 17
811 self._def_value = 17
812 self._def_new_value = -101
813
814
815class SignedEnumerationFieldTestCase(_TestIntegerFieldCommon, unittest.TestCase):
816 def _create_fc(self, tc):
817 fc = tc.create_signed_enumeration_field_class(32)
818 fc.map_range('something', 17)
819 fc.map_range('speaker', 12, 16)
820 fc.map_range('can', 18, 2540)
821 fc.map_range('whole range', -(2 ** 31), (2 ** 31) - 1)
822 fc.map_range('zip', -45, 1001)
823 return fc
824
825 def setUp(self):
826 self._tc = get_default_trace_class()
827 self._field = _create_field(self._tc, self._create_fc(self._tc))
828 self._def = _create_field(self._tc, self._create_fc(self._tc))
829 self._def.value = 17
830 self._def_value = 17
831 self._def_new_value = -101
832
833 def test_str_op(self):
834 expected_string_found = False
835 s = str(self._def)
836
837 # Establish all permutations of the three expected matches since
838 # the order in which mappings are enumerated is not explicitly part of
839 # the API.
840 for p in itertools.permutations(['whole range', 'something',
841 'zip']):
842 candidate = '{} ({})'.format(self._def_value, ', '.join(p))
843 if candidate == s:
844 expected_string_found = True
845 break
846
847 self.assertTrue(expected_string_found)
848
849 def test_labels(self):
850 self._field.value = 17
851 labels = sorted(self._field.labels)
852 self.assertEqual(labels, ['something', 'whole range', 'zip'])
853
854
855class RealFieldTestCase(_TestNumericField, unittest.TestCase):
856 def _create_fc(self, tc):
857 return tc.create_real_field_class()
858
859 def setUp(self):
860 self._tc = get_default_trace_class()
861 self._field = _create_field(self._tc, self._create_fc(self._tc))
862 self._def = _create_field(self._tc, self._create_fc(self._tc))
863 self._def.value = 52.7
864 self._def_value = 52.7
865 self._def_new_value = -17.164857
866
867 def _test_invalid_op(self, cb):
868 with self.assertRaises(TypeError):
869 cb()
870
871 def test_assign_true(self):
872 self._def.value = True
873 self.assertTrue(self._def)
874
875 def test_assign_false(self):
876 self._def.value = False
877 self.assertFalse(self._def)
878
879 def test_assign_pos_int(self):
880 raw = 477
881 self._def.value = raw
882 self.assertEqual(self._def, float(raw))
883
884 def test_assign_neg_int(self):
885 raw = -13
886 self._def.value = raw
887 self.assertEqual(self._def, float(raw))
888
889 def test_assign_int_field(self):
890 int_fc = self._tc.create_signed_integer_field_class(32)
891 int_field = _create_field(self._tc, int_fc)
892 raw = 999
893 int_field.value = raw
894 self._def.value = int_field
895 self.assertEqual(self._def, float(raw))
896
897 def test_assign_float(self):
898 raw = -19.23
899 self._def.value = raw
900 self.assertEqual(self._def, raw)
901
902 def test_assign_float_field(self):
903 field = _create_field(self._tc, self._create_fc(self._tc))
904 raw = 101.32
905 field.value = raw
906 self._def.value = field
907 self.assertEqual(self._def, raw)
908
909 def test_assign_invalid_type(self):
910 with self.assertRaises(TypeError):
911 self._def.value = 'yes'
912
913 def test_invalid_lshift(self):
914 self._test_invalid_op(lambda: self._def << 23)
915
916 def test_invalid_rshift(self):
917 self._test_invalid_op(lambda: self._def >> 23)
918
919 def test_invalid_and(self):
920 self._test_invalid_op(lambda: self._def & 23)
921
922 def test_invalid_or(self):
923 self._test_invalid_op(lambda: self._def | 23)
924
925 def test_invalid_xor(self):
926 self._test_invalid_op(lambda: self._def ^ 23)
927
928 def test_invalid_invert(self):
929 self._test_invalid_op(lambda: ~self._def)
930
931 def test_str_op(self):
932 self.assertEqual(str(self._def), str(self._def_value))
933
934
935_inject_numeric_testing_methods(RealFieldTestCase)
936
937
938class StringFieldTestCase(unittest.TestCase):
939 def setUp(self):
940 self._tc = get_default_trace_class()
941 self._def_value = 'Hello, World!'
942 self._def = _create_string_field(self._tc)
943 self._def.value = self._def_value
944 self._def_new_value = 'Yes!'
945
946 def test_assign_int(self):
947 with self.assertRaises(TypeError):
948 self._def.value = 283
949
950 def test_assign_string_field(self):
951 field = _create_string_field(self._tc)
952 raw = 'zorg'
953 field.value = raw
954 self.assertEqual(field, raw)
955
956 def test_eq(self):
957 self.assertEqual(self._def, self._def_value)
958
959 def test_not_eq(self):
960 self.assertNotEqual(self._def, 23)
961
962 def test_lt_vstring(self):
963 s1 = _create_string_field(self._tc)
964 s1.value = 'allo'
965 s2 = _create_string_field(self._tc)
966 s2.value = 'bateau'
967 self.assertLess(s1, s2)
968
969 def test_lt_string(self):
970 s1 = _create_string_field(self._tc)
971 s1.value = 'allo'
972 self.assertLess(s1, 'bateau')
973
974 def test_le_vstring(self):
975 s1 = _create_string_field(self._tc)
976 s1.value = 'allo'
977 s2 = _create_string_field(self._tc)
978 s2.value = 'bateau'
979 self.assertLessEqual(s1, s2)
980
981 def test_le_string(self):
982 s1 = _create_string_field(self._tc)
983 s1.value = 'allo'
984 self.assertLessEqual(s1, 'bateau')
985
986 def test_gt_vstring(self):
987 s1 = _create_string_field(self._tc)
988 s1.value = 'allo'
989 s2 = _create_string_field(self._tc)
990 s2.value = 'bateau'
991 self.assertGreater(s2, s1)
992
993 def test_gt_string(self):
994 s1 = _create_string_field(self._tc)
995 s1.value = 'allo'
996 self.assertGreater('bateau', s1)
997
998 def test_ge_vstring(self):
999 s1 = _create_string_field(self._tc)
1000 s1.value = 'allo'
1001 s2 = _create_string_field(self._tc)
1002 s2.value = 'bateau'
1003 self.assertGreaterEqual(s2, s1)
1004
1005 def test_ge_string(self):
1006 s1 = _create_string_field(self._tc)
1007 s1.value = 'allo'
1008 self.assertGreaterEqual('bateau', s1)
1009
1010 def test_bool_op(self):
1011 self.assertEqual(bool(self._def), bool(self._def_value))
1012
1013 def test_str_op(self):
1014 self.assertEqual(str(self._def), str(self._def_value))
1015
1016 def test_len(self):
1017 self.assertEqual(len(self._def), len(self._def_value))
1018
1019 def test_getitem(self):
1020 self.assertEqual(self._def[5], self._def_value[5])
1021
1022 def test_append_str(self):
1023 to_append = 'meow meow meow'
1024 self._def += to_append
1025 self._def_value += to_append
1026 self.assertEqual(self._def, self._def_value)
1027
1028 def test_append_string_field(self):
1029 field = _create_string_field(self._tc)
1030 to_append = 'meow meow meow'
1031 field.value = to_append
1032 self._def += field
1033 self._def_value += to_append
1034 self.assertEqual(self._def, self._def_value)
1035
1036
1037class _TestArrayFieldCommon:
1038 def _modify_def(self):
1039 self._def[2] = 23
1040
1041 def test_bool_op_true(self):
1042 self.assertTrue(self._def)
1043
1044 def test_len(self):
1045 self.assertEqual(len(self._def), 3)
1046
1047 def test_length(self):
1048 self.assertEqual(self._def.length, 3)
1049
1050 def test_getitem(self):
1051 field = self._def[1]
1052 self.assertIs(type(field), bt2.field._SignedIntegerField)
1053 self.assertEqual(field, 1847)
1054
1055 def test_eq(self):
1056 field = _create_int_array_field(self._tc, 3)
1057 field[0] = 45
1058 field[1] = 1847
1059 field[2] = 1948754
1060 self.assertEqual(self._def, field)
1061
1062 def test_eq_invalid_type(self):
1063 self.assertNotEqual(self._def, 23)
1064
1065 def test_eq_diff_len(self):
1066 field = _create_int_array_field(self._tc, 2)
1067 field[0] = 45
1068 field[1] = 1847
1069 self.assertNotEqual(self._def, field)
1070
1071 def test_eq_diff_content_same_len(self):
1072 field = _create_int_array_field(self._tc, 3)
1073 field[0] = 45
1074 field[1] = 1846
1075 field[2] = 1948754
1076 self.assertNotEqual(self._def, field)
1077
1078 def test_eq_non_sequence_iterable(self):
1079 dct = collections.OrderedDict([(1, 2), (3, 4), (5, 6)])
1080 field = _create_int_array_field(self._tc, 3)
1081 field[0] = 1
1082 field[1] = 3
1083 field[2] = 5
1084 self.assertEqual(field, list(dct.keys()))
1085 self.assertNotEqual(field, dct)
1086
1087 def test_setitem(self):
1088 self._def[2] = 24
1089 self.assertEqual(self._def[2], 24)
1090
1091 def test_setitem_int_field(self):
1092 int_fc = self._tc.create_signed_integer_field_class(32)
1093 int_field = _create_field(self._tc, int_fc)
1094 int_field.value = 19487
1095 self._def[1] = int_field
1096 self.assertEqual(self._def[1], 19487)
1097
1098 def test_setitem_non_basic_field(self):
1099 array_field = _create_struct_array_field(self._tc, 2)
1100 with self.assertRaises(TypeError):
1101 array_field[1] = 23
1102
1103 def test_setitem_none(self):
1104 with self.assertRaises(TypeError):
1105 self._def[1] = None
1106
1107 def test_setitem_index_wrong_type(self):
1108 with self.assertRaises(TypeError):
1109 self._def['yes'] = 23
1110
1111 def test_setitem_index_neg(self):
1112 with self.assertRaises(IndexError):
1113 self._def[-2] = 23
1114
1115 def test_setitem_index_out_of_range(self):
1116 with self.assertRaises(IndexError):
1117 self._def[len(self._def)] = 134679
1118
1119 def test_iter(self):
1120 for field, value in zip(self._def, (45, 1847, 1948754)):
1121 self.assertEqual(field, value)
1122
1123 def test_value_int_field(self):
1124 values = [45646, 145, 12145]
1125 self._def.value = values
1126 self.assertEqual(values, self._def)
1127
1128 def test_value_check_sequence(self):
1129 values = 42
1130 with self.assertRaises(TypeError):
1131 self._def.value = values
1132
1133 def test_value_wrong_type_in_sequence(self):
1134 values = [32, 'hello', 11]
1135 with self.assertRaises(TypeError):
1136 self._def.value = values
1137
1138 def test_value_complex_type(self):
1139 struct_fc = self._tc.create_structure_field_class()
1140 int_fc = self._tc.create_signed_integer_field_class(32)
1141 another_int_fc = self._tc.create_signed_integer_field_class(32)
1142 str_fc = self._tc.create_string_field_class()
1143 struct_fc.append_member(field_class=int_fc, name='an_int')
1144 struct_fc.append_member(field_class=str_fc, name='a_string')
1145 struct_fc.append_member(field_class=another_int_fc, name='another_int')
1146 array_fc = self._tc.create_static_array_field_class(struct_fc, 3)
1147 stream = _create_stream(self._tc, [('array_field', array_fc)])
1148 values = [
1149 {
1150 'an_int': 42,
1151 'a_string': 'hello',
1152 'another_int': 66
1153 },
1154 {
1155 'an_int': 1,
1156 'a_string': 'goodbye',
1157 'another_int': 488
1158 },
1159 {
1160 'an_int': 156,
1161 'a_string': 'or not',
1162 'another_int': 4648
1163 },
1164 ]
1165
1166 array = stream.create_packet().context_field['array_field']
1167 array.value = values
1168 self.assertEqual(values, array)
1169 values[0]['an_int'] = 'a string'
1170 with self.assertRaises(TypeError):
1171 array.value = values
1172
1173 def test_str_op(self):
1174 s = str(self._def)
1175 expected_string = '[{}]'.format(', '.join(
1176 [repr(v) for v in self._def_value]))
1177 self.assertEqual(expected_string, s)
1178
1179
1180class StaticArrayFieldTestCase(_TestArrayFieldCommon, unittest.TestCase):
1181 def setUp(self):
1182 self._tc = get_default_trace_class()
1183 self._def = _create_int_array_field(self._tc, 3)
1184 self._def[0] = 45
1185 self._def[1] = 1847
1186 self._def[2] = 1948754
1187 self._def_value = [45, 1847, 1948754]
1188
1189 def test_value_wrong_len(self):
1190 values = [45, 1847]
1191 with self.assertRaises(ValueError):
1192 self._def.value = values
1193
1194
1195class DynamicArrayFieldTestCase(_TestArrayFieldCommon, unittest.TestCase):
1196 def setUp(self):
1197 self._tc = get_default_trace_class()
1198 self._def = _create_dynamic_array(self._tc)
1199 self._def[0] = 45
1200 self._def[1] = 1847
1201 self._def[2] = 1948754
1202 self._def_value = [45, 1847, 1948754]
1203
1204 def test_value_resize(self):
1205 new_values = [1, 2, 3, 4]
1206 self._def.value = new_values
1207 self.assertCountEqual(self._def, new_values)
1208
1209 def test_set_length(self):
1210 self._def.length = 4
1211 self._def[3] = 0
1212 self.assertEqual(len(self._def), 4)
1213
1214 def test_set_invalid_length(self):
1215 with self.assertRaises(TypeError):
1216 self._def.length = 'cheval'
1217
1218
1219class StructureFieldTestCase(unittest.TestCase):
1220 def _create_fc(self, tc):
1221 fc = tc.create_structure_field_class()
1222 fc.append_member('A', self._fc0_fn())
1223 fc.append_member('B', self._fc1_fn())
1224 fc.append_member('C', self._fc2_fn())
1225 fc.append_member('D', self._fc3_fn())
1226 fc.append_member('E', self._fc4_fn())
1227 fc5 = self._fc5_fn()
1228 fc5.append_member('F_1', self._fc5_inner_fn())
1229 fc.append_member('F', fc5)
1230 return fc
1231
1232 def setUp(self):
1233 self._tc = get_default_trace_class()
1234 self._fc0_fn = self._tc.create_signed_integer_field_class
1235 self._fc1_fn = self._tc.create_string_field_class
1236 self._fc2_fn = self._tc.create_real_field_class
1237 self._fc3_fn = self._tc.create_signed_integer_field_class
1238 self._fc4_fn = self._tc.create_structure_field_class
1239 self._fc5_fn = self._tc.create_structure_field_class
1240 self._fc5_inner_fn = self._tc.create_signed_integer_field_class
1241
1242 self._fc = self._create_fc(self._tc)
1243 self._def = _create_field(self._tc, self._fc)
1244 self._def['A'] = -1872
1245 self._def['B'] = 'salut'
1246 self._def['C'] = 17.5
1247 self._def['D'] = 16497
1248 self._def['E'] = {}
1249 self._def['F'] = {'F_1': 52}
1250 self._def_value = {
1251 'A': -1872,
1252 'B': 'salut',
1253 'C': 17.5,
1254 'D': 16497,
1255 'E': {},
1256 'F': {'F_1': 52}
1257 }
1258
1259 def _modify_def(self):
1260 self._def['B'] = 'hola'
1261
1262 def test_bool_op_true(self):
1263 self.assertTrue(self._def)
1264
1265 def test_bool_op_false(self):
1266 field = self._def['E']
1267 self.assertFalse(field)
1268
1269 def test_len(self):
1270 self.assertEqual(len(self._def), len(self._def_value))
1271
1272 def test_getitem(self):
1273 field = self._def['A']
1274 self.assertIs(type(field), bt2.field._SignedIntegerField)
1275 self.assertEqual(field, -1872)
1276
1277 def test_member_at_index_out_of_bounds_after(self):
1278 with self.assertRaises(IndexError):
1279 self._def.member_at_index(len(self._def_value))
1280
1281 def test_eq(self):
1282 field = _create_field(self._tc, self._create_fc(self._tc, ))
1283 field['A'] = -1872
1284 field['B'] = 'salut'
1285 field['C'] = 17.5
1286 field['D'] = 16497
1287 field['E'] = {}
1288 field['F'] = {'F_1': 52}
1289 self.assertEqual(self._def, field)
1290
1291 def test_eq_invalid_type(self):
1292 self.assertNotEqual(self._def, 23)
1293
1294 def test_eq_diff_len(self):
1295 fc = self._tc.create_structure_field_class()
1296 fc.append_member('A', self._fc0_fn())
1297 fc.append_member('B', self._fc1_fn())
1298 fc.append_member('C', self._fc2_fn())
1299
1300 field = _create_field(self._tc, fc)
1301 field['A'] = -1872
1302 field['B'] = 'salut'
1303 field['C'] = 17.5
1304 self.assertNotEqual(self._def, field)
1305
1306 def test_eq_diff_keys(self):
1307 fc = self._tc.create_structure_field_class()
1308 fc.append_member('U', self._fc0_fn())
1309 fc.append_member('V', self._fc1_fn())
1310 fc.append_member('W', self._fc2_fn())
1311 fc.append_member('X', self._fc3_fn())
1312 fc.append_member('Y', self._fc4_fn())
1313 fc.append_member('Z', self._fc5_fn())
1314 field = _create_field(self._tc, fc)
1315 field['U'] = -1871
1316 field['V'] = "gerry"
1317 field['W'] = 18.19
1318 field['X'] = 16497
1319 field['Y'] = {}
1320 field['Z'] = {}
1321 self.assertNotEqual(self._def, field)
1322
1323 def test_eq_diff_content_same_len(self):
1324 field = _create_field(self._tc, self._create_fc(self._tc))
1325 field['A'] = -1872
1326 field['B'] = 'salut'
1327 field['C'] = 17.4
1328 field['D'] = 16497
1329 field['E'] = {}
1330 field['F'] = {'F_1': 0}
1331 self.assertNotEqual(self._def, field)
1332
1333 def test_eq_same_content_diff_keys(self):
1334 fc = self._tc.create_structure_field_class()
1335 fc.append_member('A', self._fc0_fn())
1336 fc.append_member('B', self._fc1_fn())
1337 fc.append_member('E', self._fc2_fn())
1338 fc.append_member('D', self._fc3_fn())
1339 fc.append_member('C', self._fc4_fn())
1340 fc.append_member('F', self._fc5_fn())
1341 field = _create_field(self._tc, fc)
1342 field['A'] = -1872
1343 field['B'] = 'salut'
1344 field['E'] = 17.5
1345 field['D'] = 16497
1346 field['C'] = {}
1347 field['F'] = {}
1348 self.assertNotEqual(self._def, field)
1349
1350 def test_setitem(self):
1351 self._def['C'] = -18.47
1352 self.assertEqual(self._def['C'], -18.47)
1353
1354 def test_setitem_int_field(self):
1355 int_fc = self._tc.create_signed_integer_field_class(32)
1356 int_field = _create_field(self._tc, int_fc)
1357 int_field.value = 19487
1358 self._def['D'] = int_field
1359 self.assertEqual(self._def['D'], 19487)
1360
1361 def test_setitem_non_basic_field(self):
1362 elem_fc = self._tc.create_structure_field_class()
1363 struct_fc = self._tc.create_structure_field_class()
1364 struct_fc.append_member('A', elem_fc)
1365 struct_field = _create_field(self._tc, struct_fc)
1366
1367 # Will fail on access to .items() of the value
1368 with self.assertRaises(AttributeError):
1369 struct_field['A'] = 23
1370
1371 def test_setitem_none(self):
1372 with self.assertRaises(TypeError):
1373 self._def['C'] = None
1374
1375 def test_setitem_key_wrong_type(self):
1376 with self.assertRaises(TypeError):
1377 self._def[3] = 23
1378
1379 def test_setitem_wrong_key(self):
1380 with self.assertRaises(KeyError):
1381 self._def['hi'] = 134679
1382
1383 def test_member_at_index(self):
1384 self.assertEqual(self._def.member_at_index(1), 'salut')
1385
1386 def test_iter(self):
1387 orig_values = {
1388 'A': -1872,
1389 'B': 'salut',
1390 'C': 17.5,
1391 'D': 16497,
1392 'E': {},
1393 'F': {'F_1': 52}
1394 }
1395
1396 for vkey, vval in self._def.items():
1397 val = orig_values[vkey]
1398 self.assertEqual(vval, val)
1399
1400 def test_value(self):
1401 orig_values = {
1402 'A': -1872,
1403 'B': 'salut',
1404 'C': 17.5,
1405 'D': 16497,
1406 'E': {},
1407 'F': {'F_1': 52}
1408 }
1409 self.assertEqual(self._def, orig_values)
1410
1411 def test_set_value(self):
1412 int_fc = self._tc.create_signed_integer_field_class(32)
1413 another_int_fc = self._tc.create_signed_integer_field_class(32)
1414 str_fc = self._tc.create_string_field_class()
1415 struct_fc = self._tc.create_structure_field_class()
1416 struct_fc.append_member(field_class=int_fc, name='an_int')
1417 struct_fc.append_member(field_class=str_fc, name='a_string')
1418 struct_fc.append_member(field_class=another_int_fc, name='another_int')
1419 values = {
1420 'an_int': 42,
1421 'a_string': 'hello',
1422 'another_int': 66
1423 }
1424
1425 struct = _create_field(self._tc, struct_fc)
1426 struct.value = values
1427 self.assertEqual(values, struct)
1428
1429 bad_type_values = copy.deepcopy(values)
1430 bad_type_values['an_int'] = 'a string'
1431 with self.assertRaises(TypeError):
1432 struct.value = bad_type_values
1433
1434 unknown_key_values = copy.deepcopy(values)
1435 unknown_key_values['unknown_key'] = 16546
1436 with self.assertRaises(KeyError):
1437 struct.value = unknown_key_values
1438
1439 def test_str_op(self):
1440 expected_string_found = False
1441 s = str(self._def)
1442 # Establish all permutations of the three expected matches since
1443 # the order in which mappings are enumerated is not explicitly part of
1444 # the API.
1445 for p in itertools.permutations([(k, v) for k, v in self._def.items()]):
1446 items = ['{}: {}'.format(repr(k), repr(v)) for k, v in p]
1447 candidate = '{{{}}}'.format(', '.join(items))
1448 if candidate == s:
1449 expected_string_found = True
1450 break
1451
1452 self.assertTrue(expected_string_found)
1453
1454
1455class VariantFieldTestCase(unittest.TestCase):
1456 def _create_fc(self, tc):
1457 selector_fc = tc.create_signed_enumeration_field_class(field_value_range=32)
1458 selector_fc.map_range('corner', 23)
1459 selector_fc.map_range('zoom', 17, 20)
1460 selector_fc.map_range('mellotron', 1001)
1461 selector_fc.map_range('giorgio', 2000, 3000)
1462
1463 ft0 = tc.create_signed_integer_field_class(32)
1464 ft1 = tc.create_string_field_class()
1465 ft2 = tc.create_real_field_class()
1466 ft3 = tc.create_signed_integer_field_class(17)
1467
1468 fc = tc.create_variant_field_class()
1469 fc.append_option('corner', ft0)
1470 fc.append_option('zoom', ft1)
1471 fc.append_option('mellotron', ft2)
1472 fc.append_option('giorgio', ft3)
1473 fc.selector_field_class = selector_fc
1474
1475 top_fc = tc.create_structure_field_class()
1476 top_fc.append_member('selector_field', selector_fc)
1477 top_fc.append_member('variant_field', fc)
1478 return top_fc
1479
1480 def setUp(self):
1481 self._tc = get_default_trace_class()
1482 fld = _create_field(self._tc, self._create_fc(self._tc))
1483 self._def = fld['variant_field']
1484
1485 def test_bool_op(self):
1486 self._def.selected_option_index = 2
1487 self._def.value = -17.34
1488 with self.assertRaises(NotImplementedError):
1489 bool(self._def)
1490
1491 def test_selected_option_index(self):
1492 self._def.selected_option_index = 2
1493 self.assertEqual(self._def.selected_option_index, 2)
1494
1495 def test_selected_option(self):
1496 self._def.selected_option_index = 2
1497 self._def.value = -17.34
1498 self.assertEqual(self._def.selected_option, -17.34)
1499
1500 self._def.selected_option_index = 3
1501 self._def.value = 1921
1502 self.assertEqual(self._def.selected_option, 1921)
1503
1504 def test_eq(self):
1505 field = _create_field(self._tc, self._create_fc(self._tc))
1506 field = field['variant_field']
1507 field.selected_option_index = 0
1508 field.value = 1774
1509 self._def.selected_option_index = 0
1510 self._def.value = 1774
1511 self.assertEqual(self._def, field)
1512
1513 def test_eq_invalid_type(self):
1514 self._def.selected_option_index = 1
1515 self._def.value = 'gerry'
1516 self.assertNotEqual(self._def, 23)
1517
1518 def test_str_op_int(self):
1519 field = _create_field(self._tc, self._create_fc(self._tc))
1520 field = field['variant_field']
1521 field.selected_option_index = 0
1522 field.value = 1774
1523 other_field = _create_field(self._tc, self._create_fc(self._tc))
1524 other_field = other_field['variant_field']
1525 other_field.selected_option_index = 0
1526 other_field.value = 1774
1527 self.assertEqual(str(field), str(other_field))
1528
1529 def test_str_op_str(self):
1530 field = _create_field(self._tc, self._create_fc(self._tc))
1531 field = field['variant_field']
1532 field.selected_option_index = 1
1533 field.value = 'un beau grand bateau'
1534 other_field = _create_field(self._tc, self._create_fc(self._tc))
1535 other_field = other_field['variant_field']
1536 other_field.selected_option_index = 1
1537 other_field.value = 'un beau grand bateau'
1538 self.assertEqual(str(field), str(other_field))
1539
1540 def test_str_op_float(self):
1541 field = _create_field(self._tc, self._create_fc(self._tc))
1542 field = field['variant_field']
1543 field.selected_option_index = 2
1544 field.value = 14.4245
1545 other_field = _create_field(self._tc, self._create_fc(self._tc))
1546 other_field = other_field['variant_field']
1547 other_field.selected_option_index = 2
1548 other_field.value = 14.4245
1549 self.assertEqual(str(field), str(other_field))
This page took 0.027064 seconds and 4 git commands to generate.