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