summaryrefslogtreecommitdiff
path: root/tests/run/builtin_float.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/run/builtin_float.py')
-rw-r--r--tests/run/builtin_float.py260
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