Skip to content

Commit

Permalink
Add tests for Calibration static methods
Browse files Browse the repository at this point in the history
  • Loading branch information
markbandstra committed Mar 16, 2021
1 parent e7f90b4 commit 8cfb0f9
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 2 deletions.
4 changes: 2 additions & 2 deletions becquerel/core/calibration.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,14 +157,14 @@ def validate_expression(expr, params=None):
try:
y = Calibration.eval_expression(expr, params, 200.0)
print("y:", y)
except (NotImplementedError,):
except TypeError:
raise CalibrationError(
f"Cannot evaluate expression for a float:\n{expr}\n{safe_eval.symtable['x']}"
)
try:
y = Calibration.eval_expression(expr, params, [200.0, 500.0])
print("y:", y)
except (NotImplementedError,):
except TypeError:
raise CalibrationError(
f"Cannot evaluate expression for an array:\n{expr}\n{safe_eval.symtable['x']}"
)
Expand Down
78 changes: 78 additions & 0 deletions tests/calibration_test.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""Test Calibration class."""

import os
import numpy as np
from becquerel.core.calibration import (
CalibrationError,
Calibration,
Expand All @@ -12,6 +13,83 @@
from h5_tools_test import TEST_IO


def test_eval_expression():
"""Test Calibration.eval_expression."""
Calibration.eval_expression("p[0] + p[1] * x", [1.0, 5.0], 2.0)
# bad syntax results in a TypeError
with pytest.raises(TypeError):
Calibration.eval_expression("p[0] + p[1] x", [1.0, 5.0], 2.0)
# unknown symbol results in a TypeError
with pytest.raises(TypeError):
Calibration.eval_expression("p[0] + p[1] * x + z", [1.0, 5.0], 2.0)
# unknown function results in a TypeError
with pytest.raises(TypeError):
Calibration.eval_expression(
"p[0] + p[1] * scipy.special.xlogy(x, x)", [1.0, 5.0], 2.0
)


def test_expression_param_indices():
"""Test Calibration.expression_param_indices."""
assert np.allclose(Calibration.param_indices("p[0] + p[1] * x"), [0, 1])
# does not result in an error when calling this function
assert np.allclose(Calibration.param_indices("p[0] + p[2] * x"), [0, 2])
# neither does this, but notice the order!
assert np.allclose(Calibration.param_indices("p[0] + p[-1] * x"), [-1, 0])
# error if indices are not integers
with pytest.raises(ValueError):
Calibration.param_indices("p[0.2] + p[1] * x")
with pytest.raises(ValueError):
Calibration.param_indices("p[:] + p[1] * x")
with pytest.raises(ValueError):
Calibration.param_indices("p[] + p[1] * x")
with pytest.raises(ValueError):
Calibration.param_indices("p[a] + p[1] * x")


def test_validate_expression():
"""Test Calibration.validate_expression."""
# python syntax error
with pytest.raises(CalibrationError):
Calibration.validate_expression("p[0] + p[1] None")
# parentheses not matching
with pytest.raises(CalibrationError):
Calibration.validate_expression("(p[0] + p[1] * x")
# parentheses not matching
with pytest.raises(CalibrationError):
Calibration.validate_expression("p[0] + p[1] * x]")
# square brackets must only occur with "p"
with pytest.raises(CalibrationError):
Calibration.validate_expression("s[0] + s[1] * x")
# square brackets must only enclose integers
with pytest.raises(CalibrationError):
Calibration.validate_expression("p[0.2] + p[1] * x")
with pytest.raises(CalibrationError):
Calibration.validate_expression("p[:] + p[1] * x")
with pytest.raises(CalibrationError):
Calibration.validate_expression("p[] + p[1] * x")
with pytest.raises(CalibrationError):
Calibration.validate_expression("p[a] + p[1] * x")
# minimum parameter index is > 0
with pytest.raises(CalibrationError):
Calibration.validate_expression("p[1] + p[2] * x")
# parameter indices not consecutive
with pytest.raises(CalibrationError):
Calibration.validate_expression("p[0] + p[2] * x")
# mismtach between number of parameters in expression and length of params
Calibration.validate_expression("p[0] + p[1] * x")
with pytest.raises(CalibrationError):
Calibration.validate_expression("p[0] + p[1] * x", params=[1.0])
Calibration.validate_expression("p[0] + p[1] * x", params=[1.0, 5.0])
with pytest.raises(CalibrationError):
Calibration.validate_expression("p[0] + p[1] * x", params=[1.0, 5.0, 2.0])
# expression is okay except for an unknown function
with pytest.raises(CalibrationError):
Calibration.validate_expression(
"p[0] + p[1] * scipy.special.xlogy(x, x)", [1.0, 5.0]
)


name_cls_args = [
["cal1", Calibration, ("p[0]", [1.0])],
["cal2", Calibration, ("p[0] + p[1] * x", [1.0, 5.0])],
Expand Down

0 comments on commit 8cfb0f9

Please sign in to comment.