diff options
Diffstat (limited to 'tests/run/builtin_float.py')
-rw-r--r-- | tests/run/builtin_float.py | 260 |
1 files changed, 252 insertions, 8 deletions
diff --git a/tests/run/builtin_float.py b/tests/run/builtin_float.py index f2eff2be8..8e135a607 100644 --- a/tests/run/builtin_float.py +++ b/tests/run/builtin_float.py @@ -1,6 +1,20 @@ +# mode: run +# tag: pure3.0 +import cython import sys +def fix_underscores(s): + if sys.version_info < (3, 6) or getattr(sys, 'pypy_version_info', (9, 9)) < (3, 7, 4): + # Py2 float() does not support PEP-515 underscore literals + if isinstance(s, bytes): + if not cython.compiled and b'_' in s: + return s.replace(b'_', b'') + elif '_' in s: + return s.replace('_', '') + return s + + def empty_float(): """ >>> float() @@ -11,24 +25,254 @@ def empty_float(): x = float() return x + def float_conjugate(): """ >>> float_call_conjugate() 1.5 """ - if sys.version_info >= (2,6): - x = 1.5 .conjugate() - else: - x = 1.5 + x = 1.5 .conjugate() return x + def float_call_conjugate(): """ >>> float_call_conjugate() 1.5 """ - if sys.version_info >= (2,6): - x = float(1.5).conjugate() - else: - x = 1.5 + x = float(1.5).conjugate() return x + + +def from_int(i): + """ + >>> from_int(0) + 0.0 + >>> from_int(1) + 1.0 + >>> from_int(-1) + -1.0 + >>> from_int(99) + 99.0 + >>> from_int(-99) + -99.0 + + >>> for exp in (14, 15, 16, 30, 31, 32, 52, 53, 54, 60, 61, 62, 63, 64): + ... for sign in (1, 0, -1): + ... value = (sign or 1) * 2**exp + sign + ... float_value = from_int(value) + ... assert float_value == float(value), "expected %s2**%s+%s == %r, got %r, difference %r" % ( + ... '-' if sign < 0 else '', exp, sign, float(value), float_value, float_value - float(value)) + """ + return float(i) + + +@cython.test_assert_path_exists( + "//CoerceToPyTypeNode", + "//CoerceToPyTypeNode//PythonCapiCallNode", +) +def from_bytes(s: bytes): + """ + >>> from_bytes(b"123") + 123.0 + >>> from_bytes(b"123.25") + 123.25 + >>> from_bytes(fix_underscores(b"98_5_6.2_1")) + 9856.21 + >>> from_bytes(fix_underscores(b"12_4_131_123123_1893798127398123_19238712_128937198237.8222113_519879812387")) + 1.2413112312318938e+47 + >>> from_bytes(b"123E100") + 1.23e+102 + >>> from_bytes(b"12__._3") # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ...12__._3... + >>> from_bytes(b"_12.3") # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ..._12.3... + >>> from_bytes(b"12.3_") # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ...12.3_... + >>> from_bytes(b"na_n") # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ...na_n... + >>> from_bytes(None) # doctest: +ELLIPSIS + Traceback (most recent call last): + TypeError... + """ + return float(s) + + +@cython.test_assert_path_exists( + "//CoerceToPyTypeNode", + "//CoerceToPyTypeNode//PythonCapiCallNode", +) +def from_bytes_literals(): + """ + >>> from_bytes_literals() + (123.0, 123.23, 123.76, 1e+100) + """ + return float(b"123"), float(b"123.23"), float(fix_underscores(b"12_3.7_6")), float(b"1e100") + + +@cython.test_assert_path_exists( + "//CoerceToPyTypeNode", + "//CoerceToPyTypeNode//PythonCapiCallNode", +) +def from_bytearray(s: bytearray): + """ + >>> from_bytearray(bytearray(b"123")) + 123.0 + >>> from_bytearray(bytearray(b"123.25")) + 123.25 + >>> from_bytearray(bytearray(fix_underscores(b"98_5_6.2_1"))) + 9856.21 + >>> from_bytearray(bytearray(fix_underscores(b"12_4_131_123123_1893798127398123_19238712_128937198237.8222113_519879812387"))) + 1.2413112312318938e+47 + >>> from_bytearray(bytearray(b"123E100")) + 1.23e+102 + >>> from_bytearray(bytearray(b"12__._3")) # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ...12__._3... + >>> from_bytearray(bytearray(b"_12.3")) # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ..._12.3... + >>> from_bytearray(bytearray(b"12.3_")) # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ...12.3_... + >>> from_bytearray(bytearray(b"in_f")) # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ...in_f... + >>> from_bytearray(None) # doctest: +ELLIPSIS + Traceback (most recent call last): + TypeError... + """ + return float(s) + + +@cython.test_assert_path_exists( + "//CoerceToPyTypeNode", + "//CoerceToPyTypeNode//PythonCapiCallNode", +) +def from_str(s: 'str'): + """ + >>> from_str("123") + 123.0 + >>> from_str("123.25") + 123.25 + >>> from_str(fix_underscores("3_21.2_5")) + 321.25 + >>> from_str(fix_underscores("12_4_131_123123_1893798127398123_19238712_128937198237.8222113_519879812387")) + 1.2413112312318938e+47 + >>> from_str("123E100") + 1.23e+102 + >>> from_str("12__._3") # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ...12__._3... + >>> from_str("_12.3") # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ..._12.3... + >>> from_str("12.3_") # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ...12.3_... + >>> from_str("n_an") # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ...n_an... + >>> from_str(None) # doctest: +ELLIPSIS + Traceback (most recent call last): + TypeError... + """ + return float(s) + + +@cython.test_assert_path_exists( + "//CoerceToPyTypeNode", + "//CoerceToPyTypeNode//PythonCapiCallNode", +) +def from_str_literals(): + """ + >>> from_str_literals() + (123.0, 123.23, 124.23, 1e+100) + """ + return float("123"), float("123.23"), float(fix_underscores("1_2_4.2_3")), float("1e100") + + +@cython.test_assert_path_exists( + "//CoerceToPyTypeNode", + "//CoerceToPyTypeNode//PythonCapiCallNode", +) +def from_unicode(s: 'unicode'): + """ + >>> from_unicode(u"123") + 123.0 + >>> from_unicode(u"123.25") + 123.25 + >>> from_unicode(fix_underscores(u"12_4.8_5")) + 124.85 + >>> from_unicode(fix_underscores(u"12_4_131_123123_1893798127398123_19238712_128937198237.8222113_519879812387")) + 1.2413112312318938e+47 + >>> from_unicode(u"123E100") + 1.23e+102 + >>> from_unicode(u"123.23\\N{PUNCTUATION SPACE}") + 123.23 + >>> from_unicode(u"\\N{PUNCTUATION SPACE} 123.23 \\N{PUNCTUATION SPACE}") + 123.23 + >>> from_unicode(fix_underscores(u"\\N{PUNCTUATION SPACE} 12_3.2_3 \\N{PUNCTUATION SPACE}")) + 123.23 + >>> from_unicode(u"\\N{PUNCTUATION SPACE} " * 25 + u"123.54 " + u"\\N{PUNCTUATION SPACE} " * 22) # >= 40 chars + 123.54 + >>> from_unicode(fix_underscores(u"\\N{PUNCTUATION SPACE} " * 25 + u"1_23.5_4 " + u"\\N{PUNCTUATION SPACE} " * 22)) + 123.54 + >>> from_unicode(u"\\N{PUNCTUATION SPACE} " + u"123.54 " * 2 + u"\\N{PUNCTUATION SPACE}") # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ...123.54 123.54... + >>> from_unicode(u"\\N{PUNCTUATION SPACE} " * 25 + u"123.54 " * 2 + u"\\N{PUNCTUATION SPACE} " * 22) # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ...123.54 123.54... + >>> from_unicode(u"_12__._3") # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ..._12__._3... + >>> from_unicode(u"_12.3") # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ..._12.3... + >>> from_unicode(u"12.3_") # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ...12.3_... + >>> from_unicode(u"i_nf") # doctest: +ELLIPSIS + Traceback (most recent call last): + ValueError: ...i_nf... + >>> from_unicode(None) # doctest: +ELLIPSIS + Traceback (most recent call last): + TypeError... + """ + return float(s) + + +@cython.test_assert_path_exists( + "//CoerceToPyTypeNode", + "//CoerceToPyTypeNode//PythonCapiCallNode", +) +def from_unicode_literals(): + """ + >>> from_unicode_literals() + (123.0, 123.23, 123.45, 1e+100, 123.23) + """ + return float(u"123"), float(u"123.23"), float(fix_underscores(u"12_3.4_5")), float(u"1e100"), float(u"123.23\N{PUNCTUATION SPACE}") + + +def catch_valueerror(val): + """ + >>> catch_valueerror("foo") + False + >>> catch_valueerror(u"foo") + False + >>> catch_valueerror(b"foo") + False + >>> catch_valueerror(bytearray(b"foo")) + False + >>> catch_valueerror("-1") + -1.0 + """ + try: + return float(val) + except ValueError: + return False |