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