Skip to content

Commit

Permalink
tests/float: Test domain errors for more combos of args to math funcs.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
dpgeorge committed Jun 18, 2023
1 parent 47dc7d0 commit ed962f1
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 44 deletions.
107 changes: 63 additions & 44 deletions tests/float/math_domain.py
Expand Up @@ -10,25 +10,25 @@
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:
Expand All @@ -38,35 +38,54 @@
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))
26 changes: 26 additions & 0 deletions 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))
5 changes: 5 additions & 0 deletions 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

0 comments on commit ed962f1

Please sign in to comment.