71 lines
2.9 KiB
Python
71 lines
2.9 KiB
Python
import pytest
|
|
from core.builtin_concepts import ReturnValueConcept, ParserResultConcept, BuiltinConcepts
|
|
from core.rule import Rule, ACTION_TYPE_DEFERRED
|
|
from evaluators.RuleEvaluator import RuleEvaluator
|
|
|
|
from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka
|
|
|
|
|
|
class TestRuleEvaluator(TestUsingMemoryBasedSheerka):
|
|
|
|
@pytest.mark.parametrize("ret_val, expected", [
|
|
(ReturnValueConcept("some_name", True, ParserResultConcept(value=[Rule()])), True),
|
|
(ReturnValueConcept("some_name", True, ParserResultConcept(value="Not a concept")), False),
|
|
(ReturnValueConcept("some_name", True, ParserResultConcept(value=[])), False),
|
|
(ReturnValueConcept("some_name", True, Rule), False),
|
|
(ReturnValueConcept("some_name", False, ParserResultConcept(value=Rule())), False),
|
|
(ReturnValueConcept("some_name", False, ParserResultConcept(value=[Rule()])), False),
|
|
])
|
|
def test_i_can_match(self, ret_val, expected):
|
|
context = self.get_context()
|
|
assert RuleEvaluator().matches(context, ret_val) == expected
|
|
|
|
@pytest.mark.parametrize("body, expected", [
|
|
([Rule("exec", "rule1")], Rule("exec", "rule1")),
|
|
([Rule("exec", "rule1"), Rule("exec", "rule2")], [Rule("exec", "rule1"), Rule("exec", "rule2")]),
|
|
|
|
])
|
|
def test_i_can_evaluate(self, body, expected):
|
|
context = self.get_context()
|
|
ret_val = ReturnValueConcept("some_name", True, ParserResultConcept(value=body), True)
|
|
evaluator = RuleEvaluator()
|
|
|
|
result = evaluator.eval(context, ret_val)
|
|
|
|
assert result.who == evaluator.name
|
|
assert result.status
|
|
assert result.value == expected
|
|
assert result.parents == [ret_val]
|
|
|
|
def test_i_can_evaluate_deferred_rules(self):
|
|
context = self.get_context()
|
|
|
|
rule = Rule().set_id("i")
|
|
rule.metadata.action_type = ACTION_TYPE_DEFERRED
|
|
ret_val = ReturnValueConcept("some_name", True, ParserResultConcept(value=[rule]), True)
|
|
context.add_to_short_term_memory("i", 1)
|
|
evaluator = RuleEvaluator()
|
|
|
|
result = evaluator.eval(context, ret_val)
|
|
|
|
assert result.who == evaluator.name
|
|
assert result.status
|
|
assert result.value == context.sheerka.get_rule_by_id("1")
|
|
assert result.parents == [ret_val]
|
|
|
|
def test_i_cannot_evaluate_deferred_rule_if_the_rule_is_unknown(self):
|
|
sheerka, context = self.init_concepts()
|
|
|
|
rule = Rule().set_id("unknown variable")
|
|
rule.metadata.action_type = ACTION_TYPE_DEFERRED
|
|
ret_val = ReturnValueConcept("some_name", True, ParserResultConcept(value=[rule]), True)
|
|
evaluator = RuleEvaluator()
|
|
|
|
result = evaluator.eval(context, ret_val)
|
|
|
|
assert result.who == evaluator.name
|
|
assert not result.status
|
|
assert sheerka.isinstance(result.value, BuiltinConcepts.UNKNOWN_RULE)
|
|
assert result.value.body == [('id', 'unknown variable')]
|
|
assert result.parents == [ret_val]
|