Skip to content

Commit

Permalink
Test swig exception-handling
Browse files Browse the repository at this point in the history
Related to AMICI-dev#2478.
  • Loading branch information
dweindl committed Jul 10, 2024
1 parent 42dc328 commit 0199aaa
Showing 1 changed file with 34 additions and 1 deletion.
35 changes: 34 additions & 1 deletion python/tests/test_swig_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import copy
import numbers

from math import nan
import pytest

import amici
Expand Down Expand Up @@ -534,3 +534,36 @@ def test_rdataview(sbml_example_presimulation_module):

# field names are included by dir()
assert "x" in dir(rdata)


def test_python_exceptions(sbml_example_presimulation_module):
"""Test that C++ exceptions are correctly caught and re-raised in Python."""

# amici-base extension throws and its swig-wrapper catches
solver = amici.CVodeSolver()
with pytest.raises(
RuntimeError, match="maxsteps must be a positive number"
):
solver.setMaxSteps(-1)

# model extension throws and its swig-wrapper catches
model = sbml_example_presimulation_module.get_model()
with pytest.raises(RuntimeError, match="Steadystate mask has wrong size"):
model.set_steadystate_mask([1] * model.nx_solver * 2)

# amici-base extension throws and its swig-wrapper catches
edata = amici.ExpData(1, 1, 1, [1])
# too short sx0
edata.sx0 = (1, 2)
with pytest.raises(
RuntimeError,
match=r"Number of initial conditions sensitivities \(36\) "
r"in model does not match ExpData \(2\).",
):
amici.runAmiciSimulation(model, solver, edata)

# model throws, base catches, swig-exception handling is not involved
model.setParameters([nan] * model.np())
model.setTimepoints([1])
rdata = amici.runAmiciSimulation(model, solver)
assert rdata.status == amici.AMICI_FIRST_RHSFUNC_ERR

0 comments on commit 0199aaa

Please sign in to comment.