diff --git a/src/script_interface/bond_breakage/BreakageSpec.hpp b/src/script_interface/bond_breakage/BreakageSpec.hpp index b2605af9a5..f9e1adb4d1 100644 --- a/src/script_interface/bond_breakage/BreakageSpec.hpp +++ b/src/script_interface/bond_breakage/BreakageSpec.hpp @@ -24,6 +24,10 @@ #include "script_interface/ScriptInterface.hpp" #include +#include +#include +#include +#include #include namespace ScriptInterface { @@ -52,6 +56,21 @@ class BreakageSpec : public AutoParameters { } private: + void do_construct(VariantMap const ¶ms) override { + context()->parallel_try_catch([&]() { + // all parameters are required: reject construction if any is omitted, + // because "breakage_length" has no meaningful default (0.0 is a valid + // value that would silently queue every bond of that type for breakage) + for (auto const &key : valid_parameters()) { + if (not params.contains(std::string{key})) { + throw std::runtime_error("Parameter '" + std::string{key} + + "' is missing"); + } + } + AutoParameters::do_construct(params); + }); + } + std::shared_ptr<::BondBreakage::BreakageSpec> m_breakage_spec; std::unordered_map<::BondBreakage::ActionType, std::string> m_breakage_enum_to_str = { diff --git a/testsuite/python/bond_breakage.py b/testsuite/python/bond_breakage.py index a071431331..ed94e2d0b9 100644 --- a/testsuite/python/bond_breakage.py +++ b/testsuite/python/bond_breakage.py @@ -100,6 +100,14 @@ def test_00_interface(self): with self.assertRaisesRegex(RuntimeError, "Inserting breakage spec without a bond type is not permitted"): self.system.bond_breakage.call_method("insert", object=spec2) + # all parameters are required: omitting one must raise at construction + # rather than silently defaulting breakage_length to 0.0 (which would + # queue every bond of that type for breakage on the first execute()) + with self.assertRaisesRegex(Exception, "Parameter 'breakage_length' is missing"): + BreakageSpec(action_type="delete_bond") + with self.assertRaisesRegex(Exception, "Parameter 'action_type' is missing"): + BreakageSpec(breakage_length=1.0) + def test_ignore(self): system = self.system