Working on #50 : Adding unit tests

This commit is contained in:
2021-03-12 14:14:17 +01:00
parent ba9ba5bcb3
commit 42bc6abf97
3 changed files with 91 additions and 5 deletions
@@ -17,11 +17,12 @@ from core.tokenizer import Keywords, TokenKind, Token, IterParser
from core.utils import index_tokens, COLORS, get_text_from_tokens
from evaluators.ConceptEvaluator import ConceptEvaluator
from evaluators.PythonEvaluator import PythonEvaluator, Expando
from parsers.BaseExpressionParser import AndNode, ExpressionVisitor, VariableNode, ComparisonNode
from parsers.BaseNodeParser import SourceCodeWithConceptNode, ConceptNode, SourceCodeNode
from parsers.LogicalOperatorParser import LogicalOperatorParser
from parsers.PythonParser import PythonNode
from parsers.BaseExpressionParser import AndNode
from sheerkarete.conditions import AndConditions
from sheerkarete.common import V
from sheerkarete.conditions import AndConditions, Condition
CONCEPTS_ONLY_PARSERS = ["ExactConcept", "Bnf", "Sya", "Sequence"]
@@ -1118,3 +1119,51 @@ class SheerkaRuleManager(BaseService):
return return_value.body.body.concept
return None
class ReteConditionExprVisitor(ExpressionVisitor):
def __init__(self, context):
self.context = context
self.var_counter = 0
self.variables = {}
self.res = []
def add_variable(self, target):
var_name = f"__x_{self.var_counter:02}__"
self.var_counter += 1
self.variables[target] = var_name
return var_name
def init_variable_if_needed(self, node):
if node.name not in self.variables:
var_name = self.add_variable(node.name)
self.res.append(Condition(V(var_name), "__name__", node.name))
return V(self.variables[node.name])
def get_conditions(self, expr_node):
self.res.clear()
self.var_counter = 0
self.variables.clear()
self.visit(expr_node)
return AndConditions(self.res)
def visit_VariableNode(self, expr_node):
var_name = self.init_variable_if_needed(expr_node)
if expr_node.attributes_str is not None:
self.res.append(Condition(var_name, expr_node.attributes_str, True))
def visit_AndNode(self, expr_node: AndNode):
for node in expr_node.parts:
self.visit(node)
def visit_ComparisonNode(self, expr_node: ComparisonNode):
if isinstance(expr_node.left, VariableNode):
left = self.init_variable_if_needed(expr_node.left)
attr = expr_node.left.attributes_str or "__self__"
right = eval(get_text_from_tokens(expr_node.right.tokens))
self.res.append(Condition(left, attr, right))
else:
raise FailedToCompileError(expr_node)