summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2023-06-16 12:08:34 +1000
committerDamien George <damien@micropython.org>2023-06-18 12:45:55 +1000
commited962f1f233eb74edf2cee83dc488d3cac5e02ee (patch)
tree02ab1470a0bf698100b1d161e6bf13c714113ee1
parent47dc7d0130d583ce3c9426a82eabe0473ec1cfa5 (diff)
tests/float: Test domain errors for more combos of args to math funcs.
Instead of having a special set of arguments to test for each math-module function, just test all functions with all sets of arguments. This gives improved test cases to prevent regressions. Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--tests/float/math_domain.py107
-rw-r--r--tests/float/math_domain_python311.py26
-rw-r--r--tests/float/math_domain_python311.py.exp5
3 files changed, 94 insertions, 44 deletions
diff --git a/tests/float/math_domain.py b/tests/float/math_domain.py
index 606a65528..26e883ea6 100644
--- a/tests/float/math_domain.py
+++ b/tests/float/math_domain.py
@@ -10,25 +10,25 @@ inf = float("inf")
nan = float("nan")
# single argument functions
-for name, f, args in (
- ("fabs", math.fabs, ()),
- ("ceil", math.ceil, ()),
- ("floor", math.floor, ()),
- ("trunc", math.trunc, ()),
- ("sqrt", math.sqrt, (-1, 0)),
- ("exp", math.exp, ()),
- ("log", math.log, ()),
- ("sin", math.sin, ()),
- ("cos", math.cos, ()),
- ("tan", math.tan, ()),
- ("asin", math.asin, (-1.1, 1, 1.1)),
- ("acos", math.acos, (-1.1, 1, 1.1)),
- ("atan", math.atan, ()),
- ("ldexp", lambda x: math.ldexp(x, 0), ()),
- ("radians", math.radians, ()),
- ("degrees", math.degrees, ()),
+for name, f in (
+ ("fabs", math.fabs),
+ ("ceil", math.ceil),
+ ("floor", math.floor),
+ ("trunc", math.trunc),
+ ("sqrt", math.sqrt),
+ ("exp", math.exp),
+ ("log", math.log),
+ ("sin", math.sin),
+ ("cos", math.cos),
+ ("tan", math.tan),
+ ("asin", math.asin),
+ ("acos", math.acos),
+ ("atan", math.atan),
+ ("ldexp", lambda x: math.ldexp(x, 0)),
+ ("radians", math.radians),
+ ("degrees", math.degrees),
):
- for x in args + (inf, -inf, nan):
+ for x in (0, 1, 1.1, -1, -1.1, inf, -inf, nan):
try:
ans = "%.4f" % f(x)
except ValueError:
@@ -38,35 +38,54 @@ for name, f, args in (
print("%s(%.4f) = %s" % (name, x, ans))
# double argument functions
-for name, f, args in (
- (
- "pow",
- math.pow,
- (
- (0, 2),
- (-1, 2),
- (0, -1),
- (-1, 2.3),
- (0.5, inf),
- (-0.5, inf),
- (0.5, -inf),
- (-0.5, -inf),
- (1.5, inf),
- (-1.5, inf),
- (1.5, -inf),
- (-1.5, -inf),
- (nan, 0),
- (1, nan),
- ),
- ),
- ("log", math.log, ()),
- ("fmod", math.fmod, ((1.2, inf), (1.2, -inf), (1.2, 0), (inf, 1.2))),
- ("atan2", math.atan2, ((0, 0), (-inf, inf), (-inf, -inf), (inf, -inf))),
- ("copysign", math.copysign, ()),
+for name, f in (
+ ("pow", math.pow),
+ ("log", math.log),
+ ("fmod", math.fmod),
+ ("atan2", math.atan2),
+ ("copysign", math.copysign),
):
- for x in args + ((0, inf), (inf, 0), (inf, inf), (inf, nan), (nan, inf), (nan, nan)):
+ for x in (
+ (0, 0),
+ (0, 2),
+ (0, -1),
+ (1, 0),
+ (1.2, 0),
+ (-1, 0),
+ (-1, 2),
+ (-1, 2.3),
+ (0, inf),
+ (0.5, inf),
+ (0.5, -inf),
+ (0.9, inf),
+ (0.9, -inf),
+ (1.2, inf),
+ (1.2, -inf),
+ (-0.5, inf),
+ (-0.5, -inf),
+ (-0.9, inf),
+ (-0.9, -inf),
+ (-1.2, inf),
+ (-1.2, -inf),
+ (inf, 0),
+ (inf, 1.2),
+ (inf, -1.2),
+ (inf, inf),
+ (inf, -inf),
+ (-inf, inf),
+ (-inf, -inf),
+ (0, nan),
+ (nan, 0),
+ (1, nan),
+ (nan, 1),
+ (inf, nan),
+ (nan, inf),
+ (nan, nan),
+ ):
try:
ans = "%.4f" % f(*x)
except ValueError:
ans = "ValueError"
+ except ZeroDivisionError:
+ ans = "ZeroDivisionError"
print("%s(%.4f, %.4f) = %s" % (name, x[0], x[1], ans))
diff --git a/tests/float/math_domain_python311.py b/tests/float/math_domain_python311.py
new file mode 100644
index 000000000..f56fd5585
--- /dev/null
+++ b/tests/float/math_domain_python311.py
@@ -0,0 +1,26 @@
+# Tests domain errors in math functions.
+# This is split out from math_domain.py because math.pow(0, -inf) was changed
+# in Python 3.11, and so this test requires a .py.exp file.
+# (See https://github.com/python/cpython/issues/88505)
+
+try:
+ import math
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+inf = float("inf")
+
+for name, f in (
+ ("pow", math.pow),
+ ("log", math.log),
+ ("fmod", math.fmod),
+ ("atan2", math.atan2),
+ ("copysign", math.copysign),
+):
+ for x in ((0, -inf),):
+ try:
+ ans = "%.4f" % f(*x)
+ except ValueError:
+ ans = "ValueError"
+ print("%s(%.4f, %.4f) = %s" % (name, x[0], x[1], ans))
diff --git a/tests/float/math_domain_python311.py.exp b/tests/float/math_domain_python311.py.exp
new file mode 100644
index 000000000..dfc93bb51
--- /dev/null
+++ b/tests/float/math_domain_python311.py.exp
@@ -0,0 +1,5 @@
+pow(0.0000, -inf) = inf
+log(0.0000, -inf) = ValueError
+fmod(0.0000, -inf) = 0.0000
+atan2(0.0000, -inf) = 3.1416
+copysign(0.0000, -inf) = -0.0000