Files
kodjo 821dbed189 Fixed #3: Added sheerka.resolve_rule()
Fixed #5: Refactored SheerkaComparisonManager
Fixed #6: Sya parser no longer works after restart
2021-01-15 07:11:04 +01:00

71 lines
2.9 KiB
Python

import pytest
from core.builtin_concepts import ReturnValueConcept, ParserResultConcept, BuiltinConcepts
from core.rule import Rule
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_unresolved_rules(self):
context = self.get_context()
rule = Rule().set_id("i")
rule.metadata.id_is_unresolved = True
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.id_is_unresolved = True
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]