diff --git a/src/script_interface/bond_breakage/BreakageSpec.hpp b/src/script_interface/bond_breakage/BreakageSpec.hpp index b2605af9a5..c044529671 100644 --- a/src/script_interface/bond_breakage/BreakageSpec.hpp +++ b/src/script_interface/bond_breakage/BreakageSpec.hpp @@ -24,6 +24,8 @@ #include "script_interface/ScriptInterface.hpp" #include +#include +#include #include namespace ScriptInterface { @@ -36,7 +38,7 @@ class BreakageSpec : public AutoParameters { add_parameters({ {"breakage_length", m_breakage_spec->breakage_length}, {"action_type", - [this](const Variant &v) { + [this](Variant const &v) { m_breakage_spec->action_type = ::BondBreakage::ActionType{ m_breakage_str_to_enum.at(std::get(v))}; }, @@ -52,6 +54,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