def test_can_parse_multiple_ranges(self): self.assertEquals( ranges.DecimalRange("1.1, 3").items, [(decimal.Decimal('1.1'), decimal.Decimal('1.1')), (3, 3)]) self.assertEquals( ranges.DecimalRange("1...2.3, 5...").items, [(1, decimal.Decimal('2.3')), (5, None)])
def test_can_get_upper_limit(self): self.assertEquals( ranges.DecimalRange("1...2.1").upper_limit, decimal.Decimal('2.1')) self.assertEquals(ranges.DecimalRange("0...").upper_limit, None) self.assertEquals(ranges.DecimalRange("...0").upper_limit, 0) self.assertEquals(ranges.DecimalRange("...1, 3...").upper_limit, None) self.assertEquals( ranges.DecimalRange("1...2, 5...9.3").upper_limit, decimal.Decimal('9.3'))
def test_can_handle_proper_decimal_ranges(self): self.assertEquals( ranges.DecimalRange("1.1").items, [(decimal.Decimal('1.1'), decimal.Decimal('1.1'))]) self.assertEquals(ranges.DecimalRange("1...").items, [(1, None)]) self.assertEquals( ranges.DecimalRange("...1.").items, [(None, decimal.Decimal('1'))]) self.assertEquals( ranges.DecimalRange("1.1" + "\u2026" + "2.1").items, [(decimal.Decimal('1.1'), decimal.Decimal('2.1'))]) self.assertEquals( ranges.DecimalRange("-1.1...2").items, [(decimal.Decimal('-1.1'), 2)]) self.assertEquals( ranges.DecimalRange("1.1...").items, [(decimal.Decimal('1.1'), None)]) self.assertEquals( ranges.DecimalRange("...1.1").items, [(None, decimal.Decimal('1.1'))]) self.assertEquals( ranges.DecimalRange("1.1...2.1").items, [(decimal.Decimal('1.1'), decimal.Decimal('2.1'))]) self.assertEquals( ranges.DecimalRange("-1.1...2.1").items, [(decimal.Decimal('-1.1'), decimal.Decimal('2.1'))])
def __init__(self, field_name, is_allowed_to_be_empty, length_text, rule, data_format, empty_value=None): super(DecimalFieldFormat, self).__init__( field_name, is_allowed_to_be_empty, "", "", data_format, empty_value) assert rule is not None, 'to specify "no rule" use "" instead of None' self.decimal_separator = data_format.decimal_separator self.thousands_separator = data_format.thousands_separator self.valid_range = ranges.DecimalRange(rule, ranges.DEFAULT_DECIMAL_RANGE_TEXT) self._length = ranges.DecimalRange(length_text) self._precision = self.valid_range.precision self._scale = self.valid_range.scale
def test_can_set_precision_and_scale(self): empty_range = ranges.DecimalRange('') self.assertEqual(empty_range.precision, ranges.DEFAULT_PRECISION) self.assertEqual(empty_range.scale, ranges.DEFAULT_SCALE) range_without_digits_after_dot = ranges.DecimalRange('123') self.assertEqual(range_without_digits_after_dot.precision, 0) self.assertEqual(range_without_digits_after_dot.scale, 3) single_range = ranges.DecimalRange('123.45') self.assertEqual(single_range.precision, 2) self.assertEqual(single_range.scale, 5) trailing_zeroes_range = ranges.DecimalRange('123.00') self.assertEqual(trailing_zeroes_range.precision, 2) self.assertEqual(trailing_zeroes_range.scale, 5) negative_range = ranges.DecimalRange('-123.45') self.assertEqual(negative_range.precision, 2) self.assertEqual(negative_range.scale, 5) lower_and_upper_range = ranges.DecimalRange('123.45...5432.1') self.assertEqual(lower_and_upper_range.precision, 2) self.assertEqual(lower_and_upper_range.scale, 6) multi_range = ranges.DecimalRange('1.2...45.678, 56.7...1234') self.assertEqual(multi_range.precision, 3) self.assertEqual(multi_range.scale, 7)
def test_fails_on_value_out_of_range(self): lower_and_upper_range = ranges.DecimalRange("-1.2...1.5") dev_test.assert_raises_and_fnmatches( self, errors.RangeValueError, "x is Decimal('-1.3') but must be within range: '-1.2...1.5'", lower_and_upper_range.validate, "x", '-1.3') self.assertRaises(errors.RangeValueError, lower_and_upper_range.validate, "x", decimal.Decimal('1.6')) lower_range = ranges.DecimalRange("1.1...") self.assertRaises(errors.RangeValueError, lower_range.validate, "x", 1) upper_range = ranges.DecimalRange("...1.1") self.assertRaises(errors.RangeValueError, upper_range.validate, "x", decimal.Decimal('1.2')) multi_range = ranges.DecimalRange("1.1...4.9, 7.1...9") self.assertRaises(errors.RangeValueError, multi_range.validate, "x", 1) self.assertRaises(errors.RangeValueError, multi_range.validate, "x", 5) self.assertRaises(errors.RangeValueError, multi_range.validate, "x", 7) self.assertRaises(errors.RangeValueError, multi_range.validate, "x", decimal.Decimal('9.1'))
def test_can_get_lower_limit(self): self.assertEquals(ranges.DecimalRange("5.5...9").lower_limit, decimal.Decimal('5.5')) self.assertEquals(ranges.DecimalRange("0...").lower_limit, 0) self.assertEquals(ranges.DecimalRange("...0").lower_limit, None) self.assertEquals(ranges.DecimalRange("...1, 3...").lower_limit, None) self.assertEquals(ranges.DecimalRange("5...9").lower_limit, 5) self.assertEquals(ranges.DecimalRange("1.1...2, 5...9").lower_limit, decimal.Decimal('1.1')) self.assertEquals(ranges.DecimalRange("5...9, 1.1...2").lower_limit, decimal.Decimal('1.1'))
def _test_can_handle_empty_range(self, description): empty_range = ranges.DecimalRange(description) self.assertEquals(empty_range.items, None) self.assertEquals(empty_range.lower_limit, None) self.assertEquals(empty_range.upper_limit, None) self.assertIsNone(empty_range.validate("x", decimal.Decimal(ranges.MIN_DECIMAL_TEXT) - 1)) self.assertIsNone(empty_range.validate("x", decimal.Decimal('1.1'))) self.assertIsNone(empty_range.validate("x", 0)) self.assertIsNone(empty_range.validate("x", decimal.Decimal('-1.1'))) self.assertIsNone(empty_range.validate("x", decimal.Decimal(ranges.MAX_DECIMAL_TEXT) + 1))
def test_can_validate_values(self): lower_and_upper_range = ranges.DecimalRange("-1.2...1.5") lower_and_upper_range.validate("x", '-1.2') lower_and_upper_range.validate("x", 0) lower_and_upper_range.validate("x", '1.5') lower_range = ranges.DecimalRange("1.1...") lower_range.validate("x", '1.1') lower_range.validate("x", 2) lower_range.validate("x", 2 ** 32) upper_range = ranges.DecimalRange("...1.1") upper_range.validate("x", '1.1') upper_range.validate("x", - 2) upper_range.validate("x", - (2 ** 32) - 1) multi_range = ranges.DecimalRange("1.1...4.9, 7.1...9") multi_range.validate("x", '1.1') multi_range.validate("x", '4.9') multi_range.validate("x", '7.1') multi_range.validate("x", 9)
def test_can_handle_scientific_notation(self): decimal_range = ranges.DecimalRange('1.23...1e4') self.assertEqual(7, decimal_range.scale) self.assertEqual(2, decimal_range.precision)
def test_can_process_empty_range(self): self.assertEqual(ranges.DecimalRange("").items, None)
def test_can_override_default_range(self): self.assertEquals(ranges.DecimalRange("1.1...2", "2...3").items, [(decimal.Decimal('1.1'), 2)])
def test_can_use_default_range(self): self.assertEquals(ranges.DecimalRange("", "2.1...3").items, [(decimal.Decimal('2.1'), 3)])
def test_can_display_lower_is_upper_length(self): self.assertEqual(six.text_type(ranges.DecimalRange("9.9...9.9")), "9.9...9.9")
def test_fails_on_non_decimal_value_to_validate(self): decimal_range = ranges.DecimalRange("1.1...2.2") self.assertRaises(errors.RangeValueError, decimal_range.validate, "x", "a")
def test_can_represent_range_containing_none(self): none_range = ranges.DecimalRange(None) self.assertEqual(six.text_type(none_range), six.text_type(None)) upper_none_range = ranges.DecimalRange("1...") upper_none_range.items.append(None) self.assertEqual(six.text_type(upper_none_range), "1, None")
def test_can_display_multi_range(self): self.assertEqual( six.text_type(ranges.DecimalRange("9.1...10.9, 11...13")), "9.1...10.9, 11.0...13.0")