From 0199aaa02a964b1a57a7006cd46ceda73e95e774 Mon Sep 17 00:00:00 2001 From: Daniel Weindl Date: Wed, 10 Jul 2024 09:42:36 +0200 Subject: [PATCH] Test swig exception-handling Related to #2478. --- python/tests/test_swig_interface.py | 35 ++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/python/tests/test_swig_interface.py b/python/tests/test_swig_interface.py index 2dfb46e0a7..cf4371339d 100644 --- a/python/tests/test_swig_interface.py +++ b/python/tests/test_swig_interface.py @@ -5,7 +5,7 @@ import copy import numbers - +from math import nan import pytest import amici @@ -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