class _IntegerField(_IntegerFieldConst, _IntegralField, _Field):
- pass
+ def _check_range(self, value):
+ if not (value >= self._lower_bound and value <= self._upper_bound):
+ raise ValueError(
+ "Value {} is outside valid range [{}, {}]".format(
+ value, self._lower_bound, self._upper_bound
+ )
+ )
class _UnsignedIntegerFieldConst(_IntegerFieldConst, _FieldConst):
if not isinstance(value, numbers.Integral):
raise TypeError('expecting an integral number object')
- value = int(value)
- utils._check_uint64(value)
-
- return value
+ return int(value)
@property
def _value(self):
def _set_value(self, value):
value = self._value_to_int(value)
+
+ self._check_range(value)
+
native_bt.field_integer_unsigned_set_value(self._ptr, value)
value = property(fset=_set_value)
+ @property
+ def _lower_bound(self):
+ return 0
+
+ @property
+ def _upper_bound(self):
+ return (2 ** self.cls.field_value_range) - 1
+
class _SignedIntegerFieldConst(_IntegerFieldConst, _FieldConst):
_NAME = 'Const signed integer'
if not isinstance(value, numbers.Integral):
raise TypeError('expecting an integral number object')
- value = int(value)
- utils._check_int64(value)
-
- return value
+ return int(value)
@property
def _value(self):
def _set_value(self, value):
value = self._value_to_int(value)
+
+ self._check_range(value)
+
native_bt.field_integer_signed_set_value(self._ptr, value)
value = property(fset=_set_value)
+ @property
+ def _lower_bound(self):
+ return -1 * (2 ** (self.cls.field_value_range - 1))
+
+ @property
+ def _upper_bound(self):
+ return (2 ** (self.cls.field_value_range - 1)) - 1
+
class _RealFieldConst(_NumericFieldConst, numbers.Real):
_NAME = 'Const real'
field.value = (2 ** 53) + 1
self.assertEqual(field, raw)
- def test_assign_uint_invalid_neg(self):
- uint_fc = self._tc.create_unsigned_integer_field_class(32)
+ def test_assign_uint_out_of_range(self):
+ uint_fc = self._tc.create_unsigned_integer_field_class(8)
field = _create_field(self._tc, uint_fc)
- with self.assertRaises(ValueError):
- field.value = -23
+ with self.assertRaises(ValueError) as ctx:
+ field.value = 256
+ self.assertEqual(
+ str(ctx.exception), 'Value 256 is outside valid range [0, 255]'
+ )
+
+ with self.assertRaises(ValueError) as ctx:
+ field.value = -1
+ self.assertEqual(str(ctx.exception), 'Value -1 is outside valid range [0, 255]')
+
+ def test_assign_int_out_of_range(self):
+ int_fc = self._tc.create_signed_integer_field_class(8)
+ field = _create_field(self._tc, int_fc)
+
+ with self.assertRaises(ValueError) as ctx:
+ field.value = 128
+ self.assertEqual(
+ str(ctx.exception), 'Value 128 is outside valid range [-128, 127]'
+ )
+
+ with self.assertRaises(ValueError) as ctx:
+ field.value = -129
+ self.assertEqual(
+ str(ctx.exception), 'Value -129 is outside valid range [-128, 127]'
+ )
def test_str_op(self):
self.assertEqual(str(self._def), str(self._def_value))