Files
Sheerka-Old/tests/evaluators/test_RuleEvaluator.py
T

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]