diff options
Diffstat (limited to 'tests/test_numbers.py')
-rw-r--r-- | tests/test_numbers.py | 219 |
1 files changed, 78 insertions, 141 deletions
diff --git a/tests/test_numbers.py b/tests/test_numbers.py index bac6c61..78f7797 100644 --- a/tests/test_numbers.py +++ b/tests/test_numbers.py @@ -25,25 +25,17 @@ from babel.numbers import ( class FormatDecimalTestCase(unittest.TestCase): def test_patterns(self): - self.assertEqual(numbers.format_decimal(12345, '##0', - locale='en_US'), '12345') - self.assertEqual(numbers.format_decimal(6.5, '0.00', locale='sv'), - '6,50') - self.assertEqual(numbers.format_decimal(10.0**20, - '#.00', locale='en_US'), - '100000000000000000000.00') + assert numbers.format_decimal(12345, '##0', locale='en_US') == '12345' + assert numbers.format_decimal(6.5, '0.00', locale='sv') == '6,50' + assert numbers.format_decimal((10.0 ** 20), '#.00', locale='en_US') == '100000000000000000000.00' # regression test for #183, fraction digits were not correctly cutted # if the input was a float value and the value had more than 7 # significant digits - self.assertEqual(u'12,345,678.05', - numbers.format_decimal(12345678.051, '#,##0.00', - locale='en_US')) + assert numbers.format_decimal(12345678.051, '#,##0.00', locale='en_US') == u'12,345,678.05' def test_subpatterns(self): - self.assertEqual(numbers.format_decimal(-12345, '#,##0.##;-#', - locale='en_US'), '-12,345') - self.assertEqual(numbers.format_decimal(-12345, '#,##0.##;(#)', - locale='en_US'), '(12,345)') + assert numbers.format_decimal((- 12345), '#,##0.##;-#', locale='en_US') == '-12,345' + assert numbers.format_decimal((- 12345), '#,##0.##;(#)', locale='en_US') == '(12,345)' def test_default_rounding(self): """ @@ -51,169 +43,114 @@ class FormatDecimalTestCase(unittest.TestCase): A '5' is rounded to the closest 'even' number """ - self.assertEqual(numbers.format_decimal(5.5, '0', locale='sv'), '6') - self.assertEqual(numbers.format_decimal(6.5, '0', locale='sv'), '6') - self.assertEqual(numbers.format_decimal(6.5, '0', locale='sv'), '6') - self.assertEqual(numbers.format_decimal(1.2325, locale='sv'), '1,232') - self.assertEqual(numbers.format_decimal(1.2335, locale='sv'), '1,234') + assert numbers.format_decimal(5.5, '0', locale='sv') == '6' + assert numbers.format_decimal(6.5, '0', locale='sv') == '6' + assert numbers.format_decimal(6.5, '0', locale='sv') == '6' + assert numbers.format_decimal(1.2325, locale='sv') == '1,232' + assert numbers.format_decimal(1.2335, locale='sv') == '1,234' def test_significant_digits(self): """Test significant digits patterns""" - self.assertEqual(numbers.format_decimal(123004, '@@', locale='en_US'), - '120000') - self.assertEqual(numbers.format_decimal(1.12, '@', locale='sv'), '1') - self.assertEqual(numbers.format_decimal(1.1, '@@', locale='sv'), '1,1') - self.assertEqual(numbers.format_decimal(1.1, '@@@@@##', locale='sv'), - '1,1000') - self.assertEqual(numbers.format_decimal(0.0001, '@@@', locale='sv'), - '0,000100') - self.assertEqual(numbers.format_decimal(0.0001234, '@@@', locale='sv'), - '0,000123') - self.assertEqual(numbers.format_decimal(0.0001234, '@@@#', locale='sv'), - '0,0001234') - self.assertEqual(numbers.format_decimal(0.0001234, '@@@#', locale='sv'), - '0,0001234') - self.assertEqual(numbers.format_decimal(0.12345, '@@@', locale='sv'), - '0,123') - self.assertEqual(numbers.format_decimal(3.14159, '@@##', locale='sv'), - '3,142') - self.assertEqual(numbers.format_decimal(1.23004, '@@##', locale='sv'), - '1,23') - self.assertEqual(numbers.format_decimal(1230.04, '@@,@@', locale='en_US'), - '12,30') - self.assertEqual(numbers.format_decimal(123.41, '@@##', locale='en_US'), - '123.4') - self.assertEqual(numbers.format_decimal(1, '@@', locale='en_US'), - '1.0') - self.assertEqual(numbers.format_decimal(0, '@', locale='en_US'), - '0') - self.assertEqual(numbers.format_decimal(0.1, '@', locale='en_US'), - '0.1') - self.assertEqual(numbers.format_decimal(0.1, '@#', locale='en_US'), - '0.1') - self.assertEqual(numbers.format_decimal(0.1, '@@', locale='en_US'), - '0.10') + assert numbers.format_decimal(123004, '@@', locale='en_US') == '120000' + assert numbers.format_decimal(1.12, '@', locale='sv') == '1' + assert numbers.format_decimal(1.1, '@@', locale='sv') == '1,1' + assert numbers.format_decimal(1.1, '@@@@@##', locale='sv') == '1,1000' + assert numbers.format_decimal(0.0001, '@@@', locale='sv') == '0,000100' + assert numbers.format_decimal(0.0001234, '@@@', locale='sv') == '0,000123' + assert numbers.format_decimal(0.0001234, '@@@#', locale='sv') == '0,0001234' + assert numbers.format_decimal(0.0001234, '@@@#', locale='sv') == '0,0001234' + assert numbers.format_decimal(0.12345, '@@@', locale='sv') == '0,123' + assert numbers.format_decimal(3.14159, '@@##', locale='sv') == '3,142' + assert numbers.format_decimal(1.23004, '@@##', locale='sv') == '1,23' + assert numbers.format_decimal(1230.04, '@@,@@', locale='en_US') == '12,30' + assert numbers.format_decimal(123.41, '@@##', locale='en_US') == '123.4' + assert numbers.format_decimal(1, '@@', locale='en_US') == '1.0' + assert numbers.format_decimal(0, '@', locale='en_US') == '0' + assert numbers.format_decimal(0.1, '@', locale='en_US') == '0.1' + assert numbers.format_decimal(0.1, '@#', locale='en_US') == '0.1' + assert numbers.format_decimal(0.1, '@@', locale='en_US') == '0.10' def test_decimals(self): """Test significant digits patterns""" - self.assertEqual(numbers.format_decimal(decimal.Decimal('1.2345'), - '#.00', locale='en_US'), - '1.23') - self.assertEqual(numbers.format_decimal(decimal.Decimal('1.2345000'), - '#.00', locale='en_US'), - '1.23') - self.assertEqual(numbers.format_decimal(decimal.Decimal('1.2345000'), - '@@', locale='en_US'), - '1.2') - self.assertEqual(numbers.format_decimal(decimal.Decimal('12345678901234567890.12345'), - '#.00', locale='en_US'), - '12345678901234567890.12') + assert numbers.format_decimal(decimal.Decimal('1.2345'), '#.00', locale='en_US') == '1.23' + assert numbers.format_decimal(decimal.Decimal('1.2345000'), '#.00', locale='en_US') == '1.23' + assert numbers.format_decimal(decimal.Decimal('1.2345000'), '@@', locale='en_US') == '1.2' + assert numbers.format_decimal(decimal.Decimal('12345678901234567890.12345'), '#.00', locale='en_US') == '12345678901234567890.12' def test_scientific_notation(self): - fmt = numbers.format_scientific(0.1, '#E0', locale='en_US') - self.assertEqual(fmt, '1E-1') - fmt = numbers.format_scientific(0.01, '#E0', locale='en_US') - self.assertEqual(fmt, '1E-2') - fmt = numbers.format_scientific(10, '#E0', locale='en_US') - self.assertEqual(fmt, '1E1') - fmt = numbers.format_scientific(1234, '0.###E0', locale='en_US') - self.assertEqual(fmt, '1.234E3') - fmt = numbers.format_scientific(1234, '0.#E0', locale='en_US') - self.assertEqual(fmt, '1.2E3') + assert numbers.format_scientific(0.1, '#E0', locale='en_US') == '1E-1' + assert numbers.format_scientific(0.01, '#E0', locale='en_US') == '1E-2' + assert numbers.format_scientific(10, '#E0', locale='en_US') == '1E1' + assert numbers.format_scientific(1234, '0.###E0', locale='en_US') == '1.234E3' + assert numbers.format_scientific(1234, '0.#E0', locale='en_US') == '1.2E3' # Exponent grouping - fmt = numbers.format_scientific(12345, '##0.####E0', locale='en_US') - self.assertEqual(fmt, '1.2345E4') + assert numbers.format_scientific(12345, '##0.####E0', locale='en_US') == '1.2345E4' # Minimum number of int digits - fmt = numbers.format_scientific(12345, '00.###E0', locale='en_US') - self.assertEqual(fmt, '12.345E3') - fmt = numbers.format_scientific(-12345.6, '00.###E0', locale='en_US') - self.assertEqual(fmt, '-12.346E3') - fmt = numbers.format_scientific(-0.01234, '00.###E0', locale='en_US') - self.assertEqual(fmt, '-12.34E-3') - # Custom pattern suffic - fmt = numbers.format_scientific(123.45, '#.##E0 m/s', locale='en_US') - self.assertEqual(fmt, '1.23E2 m/s') + assert numbers.format_scientific(12345, '00.###E0', locale='en_US') == '12.345E3' + assert numbers.format_scientific(-12345.6, '00.###E0', locale='en_US') == '-12.346E3' + assert numbers.format_scientific(-0.01234, '00.###E0', locale='en_US') == '-12.34E-3' + # Custom pattern suffix + assert numbers.format_scientific(123.45, '#.##E0 m/s', locale='en_US') == '1.23E2 m/s' # Exponent patterns - fmt = numbers.format_scientific(123.45, '#.##E00 m/s', locale='en_US') - self.assertEqual(fmt, '1.23E02 m/s') - fmt = numbers.format_scientific(0.012345, '#.##E00 m/s', locale='en_US') - self.assertEqual(fmt, '1.23E-02 m/s') - fmt = numbers.format_scientific(decimal.Decimal('12345'), '#.##E+00 m/s', - locale='en_US') - self.assertEqual(fmt, '1.23E+04 m/s') + assert numbers.format_scientific(123.45, '#.##E00 m/s', locale='en_US') == '1.23E02 m/s' + assert numbers.format_scientific(0.012345, '#.##E00 m/s', locale='en_US') == '1.23E-02 m/s' + assert numbers.format_scientific(decimal.Decimal('12345'), '#.##E+00 m/s', locale='en_US') == '1.23E+04 m/s' # 0 (see ticket #99) - fmt = numbers.format_scientific(0, '#E0', locale='en_US') - self.assertEqual(fmt, '0E0') + assert numbers.format_scientific(0, '#E0', locale='en_US') == '0E0' def test_formatting_of_very_small_decimals(self): # previously formatting very small decimals could lead to a type error # because the Decimal->string conversion was too simple (see #214) number = decimal.Decimal("7E-7") - fmt = numbers.format_decimal(number, format="@@@", locale='en_US') - self.assertEqual('0.000000700', fmt) + assert numbers.format_decimal(number, format="@@@", locale='en_US') == '0.000000700' def test_group_separator(self): - self.assertEqual('29567.12', numbers.format_decimal(29567.12, - locale='en_US', group_separator=False)) - self.assertEqual('29567,12', numbers.format_decimal(29567.12, - locale='fr_CA', group_separator=False)) - self.assertEqual('29567,12', numbers.format_decimal(29567.12, - locale='pt_BR', group_separator=False)) - self.assertEqual(u'$1099.98', numbers.format_currency(1099.98, 'USD', - locale='en_US', group_separator=False)) - self.assertEqual(u'101299,98\xa0€', numbers.format_currency(101299.98, 'EUR', - locale='fr_CA', group_separator=False)) - self.assertEqual('101299.98 euros', numbers.format_currency(101299.98, 'EUR', - locale='en_US', group_separator=False, format_type='name')) - self.assertEqual(u'25123412\xa0%', numbers.format_percent(251234.1234, locale='sv_SE', group_separator=False)) - - self.assertEqual(u'29,567.12', numbers.format_decimal(29567.12, - locale='en_US', group_separator=True)) - self.assertEqual(u'29\xa0567,12', numbers.format_decimal(29567.12, - locale='fr_CA', group_separator=True)) - self.assertEqual(u'29.567,12', numbers.format_decimal(29567.12, - locale='pt_BR', group_separator=True)) - self.assertEqual(u'$1,099.98', numbers.format_currency(1099.98, 'USD', - locale='en_US', group_separator=True)) - self.assertEqual(u'101\xa0299,98\xa0\u20ac', numbers.format_currency(101299.98, 'EUR', - locale='fr_CA', group_separator=True)) - self.assertEqual(u'101,299.98 euros', numbers.format_currency(101299.98, 'EUR', - locale='en_US', group_separator=True, - format_type='name')) - self.assertEqual(u'25\xa0123\xa0412\xa0%', numbers.format_percent(251234.1234, locale='sv_SE', group_separator=True)) + assert numbers.format_decimal(29567.12, locale='en_US', group_separator=False) == '29567.12' + assert numbers.format_decimal(29567.12, locale='fr_CA', group_separator=False) == '29567,12' + assert numbers.format_decimal(29567.12, locale='pt_BR', group_separator=False) == '29567,12' + assert numbers.format_currency(1099.98, 'USD', locale='en_US', group_separator=False) == u'$1099.98' + assert numbers.format_currency(101299.98, 'EUR', locale='fr_CA', group_separator=False) == u'101299,98\xa0€' + assert numbers.format_currency(101299.98, 'EUR', locale='en_US', group_separator=False, format_type='name') == '101299.98 euros' + assert numbers.format_percent(251234.1234, locale='sv_SE', group_separator=False) == u'25123412\xa0%' + + assert numbers.format_decimal(29567.12, locale='en_US', group_separator=True) == u'29,567.12' + assert numbers.format_decimal(29567.12, locale='fr_CA', group_separator=True) == u'29\xa0567,12' + assert numbers.format_decimal(29567.12, locale='pt_BR', group_separator=True) == u'29.567,12' + assert numbers.format_currency(1099.98, 'USD', locale='en_US', group_separator=True) == u'$1,099.98' + assert numbers.format_currency(101299.98, 'EUR', locale='fr_CA', group_separator=True) == u'101\xa0299,98\xa0€' + assert numbers.format_currency(101299.98, 'EUR', locale='en_US', group_separator=True, format_type='name') == u'101,299.98 euros' + assert numbers.format_percent(251234.1234, locale='sv_SE', group_separator=True) == u'25\xa0123\xa0412\xa0%' class NumberParsingTestCase(unittest.TestCase): def test_can_parse_decimals(self): - self.assertEqual(decimal.Decimal('1099.98'), - numbers.parse_decimal('1,099.98', locale='en_US')) - self.assertEqual(decimal.Decimal('1099.98'), - numbers.parse_decimal('1.099,98', locale='de')) - self.assertRaises(numbers.NumberFormatError, - lambda: numbers.parse_decimal('2,109,998', locale='de')) + assert decimal.Decimal('1099.98') == numbers.parse_decimal('1,099.98', locale='en_US') + assert decimal.Decimal('1099.98') == numbers.parse_decimal('1.099,98', locale='de') + with pytest.raises(numbers.NumberFormatError): + numbers.parse_decimal('2,109,998', locale='de') def test_parse_decimal_strict_mode(self): # Numbers with a misplaced grouping symbol should be rejected - with self.assertRaises(numbers.NumberFormatError) as info: + with pytest.raises(numbers.NumberFormatError) as info: numbers.parse_decimal('11.11', locale='de', strict=True) - assert info.exception.suggestions == ['1.111', '11,11'] + assert info.value.suggestions == ['1.111', '11,11'] # Numbers with two misplaced grouping symbols should be rejected - with self.assertRaises(numbers.NumberFormatError) as info: + with pytest.raises(numbers.NumberFormatError) as info: numbers.parse_decimal('80.00.00', locale='de', strict=True) - assert info.exception.suggestions == ['800.000'] + assert info.value.suggestions == ['800.000'] # Partially grouped numbers should be rejected - with self.assertRaises(numbers.NumberFormatError) as info: + with pytest.raises(numbers.NumberFormatError) as info: numbers.parse_decimal('2000,000', locale='en_US', strict=True) - assert info.exception.suggestions == ['2,000,000', '2,000'] + assert info.value.suggestions == ['2,000,000', '2,000'] # Numbers with duplicate grouping symbols should be rejected - with self.assertRaises(numbers.NumberFormatError) as info: + with pytest.raises(numbers.NumberFormatError) as info: numbers.parse_decimal('0,,000', locale='en_US', strict=True) - assert info.exception.suggestions == ['0'] + assert info.value.suggestions == ['0'] # Return only suggestion for 0 on strict - with self.assertRaises(numbers.NumberFormatError) as info: + with pytest.raises(numbers.NumberFormatError) as info: numbers.parse_decimal('0.00', locale='de', strict=True) - assert info.exception.suggestions == ['0'] + assert info.value.suggestions == ['0'] # Properly formatted numbers should be accepted assert str(numbers.parse_decimal('1.001', locale='de', strict=True)) == '1001' # Trailing zeroes should be accepted |