def gen_rules(cls, cfg): for topic, properties in cfg.subscribers.iteritems(): rule_name = "pub" + topic.replace("/", "__") method = RosRandomTester._gen_publish(topic, rule_name) pre_wrapper = precondition(cls._rule_precondition) rule_wrapper = rule(msg=properties._strategy()) method = pre_wrapper(rule_wrapper(method)) method.__name__ = rule_name setattr(cls, rule_name, method)
@rule() def do_stuff(self): pass run_state_machine_as_test(Invariant) @pytest.mark.parametrize( "decorators", [ (invariant(), rule()), (rule(), invariant()), (invariant(), initialize()), (initialize(), invariant()), (invariant(), precondition(lambda self: True), rule()), (rule(), precondition(lambda self: True), invariant()), (precondition(lambda self: True), invariant(), rule()), (precondition(lambda self: True), rule(), invariant()), ], ids=lambda x: "-".join(f.__qualname__.split(".")[0] for f in x), ) def test_invariant_and_rule_are_incompatible(decorators): """It's an error to apply @invariant and @rule to the same method.""" def method(self): pass for d in decorators[:-1]: method = d(method) with pytest.raises(InvalidDefinition):
def srulep(precond=lambda s: True, **kwargs): return compose(precondition(precond), rule(**kwargs), stateful)
def preconditions(*conditions): def combined_condition(self): return all(condition(self) for condition in conditions) return precondition(combined_condition)