|
| 1 | +from unittest.mock import patch |
| 2 | + |
| 3 | +import pytest |
| 4 | + |
| 5 | +from bionetgen.core.exc import BNGParseError |
| 6 | +from bionetgen.modelapi.rulemod import RuleMod |
| 7 | +from bionetgen.modelapi.structs import Parameter, Rule |
| 8 | +from bionetgen.network.structs import NetworkObj |
| 9 | + |
| 10 | + |
| 11 | +class FakePattern: |
| 12 | + def __init__(self, text): |
| 13 | + self._text = text |
| 14 | + |
| 15 | + def __str__(self): |
| 16 | + return self._text |
| 17 | + |
| 18 | + |
| 19 | +NET_MALFORMED_SPECIES = """\ |
| 20 | +# NET file |
| 21 | +begin species |
| 22 | + 1 A(b) |
| 23 | +end species |
| 24 | +""" |
| 25 | + |
| 26 | + |
| 27 | +def test_networkparser_malformed_species_line_raises_parse_error(tmp_path): |
| 28 | + net_file = tmp_path / "bad_species.net" |
| 29 | + net_file.write_text(NET_MALFORMED_SPECIES) |
| 30 | + from bionetgen.network import networkparser as networkparser_module |
| 31 | + from bionetgen.network.network import Network |
| 32 | + |
| 33 | + with patch.object(networkparser_module, "logger") as mock_logger: |
| 34 | + with pytest.raises(BNGParseError, match="Malformed species line"): |
| 35 | + Network(str(net_file)) |
| 36 | + |
| 37 | + mock_logger.error.assert_called_once() |
| 38 | + error_args, error_kwargs = mock_logger.error.call_args |
| 39 | + assert "Malformed species line" in error_args[0] |
| 40 | + assert "expected '<id> <species> <count>'" in error_args[0] |
| 41 | + assert "bad_species.net:3" in error_args[0] |
| 42 | + assert "BNGNetworkParser.parse_network()" in error_kwargs["loc"] |
| 43 | + |
| 44 | + |
| 45 | +def test_model_struct_line_label_none_uses_string_fallback(): |
| 46 | + parameter = Parameter("k1", "1") |
| 47 | + parameter.line_label = None |
| 48 | + assert parameter.line_label == "None: " |
| 49 | + |
| 50 | + |
| 51 | +def test_network_struct_line_label_none_uses_string_fallback(): |
| 52 | + obj = NetworkObj() |
| 53 | + obj.line_label = None |
| 54 | + assert obj.line_label == "None: " |
| 55 | + |
| 56 | + |
| 57 | +def test_rule_set_rate_constants_invalid_length_raises_parse_error(): |
| 58 | + rule = Rule( |
| 59 | + name="r", |
| 60 | + reactants=[FakePattern("A()")], |
| 61 | + products=[FakePattern("B()")], |
| 62 | + rate_constants=("k1",), |
| 63 | + ) |
| 64 | + with pytest.raises(BNGParseError, match="1 or 2 rate constants"): |
| 65 | + rule.set_rate_constants(("k1", "k2", "k3")) |
| 66 | + assert rule.bidirectional is False |
| 67 | + assert rule.rate_constants == ["k1"] |
| 68 | + |
| 69 | + |
| 70 | +def test_rule_init_without_rate_constants_raises_parse_error(): |
| 71 | + with pytest.raises(BNGParseError, match="1 or 2 rate constants"): |
| 72 | + Rule( |
| 73 | + name="r", |
| 74 | + reactants=[FakePattern("A()")], |
| 75 | + products=[FakePattern("B()")], |
| 76 | + ) |
| 77 | + |
| 78 | + |
| 79 | +def test_rulemod_invalid_init_raises_parse_error(): |
| 80 | + with pytest.raises(BNGParseError, match="Rule modifier type InvalidMod"): |
| 81 | + RuleMod(mod_type="InvalidMod") |
| 82 | + |
| 83 | + |
| 84 | +def test_rulemod_invalid_setter_raises_parse_error(): |
| 85 | + rule_mod = RuleMod() |
| 86 | + with pytest.raises(BNGParseError, match="Rule modifier type BadType"): |
| 87 | + rule_mod.type = "BadType" |
| 88 | + assert rule_mod.type is None |
0 commit comments