Implemented FunctionParser
This commit is contained in:
@@ -1,8 +1,12 @@
|
||||
import ast
|
||||
|
||||
import pytest
|
||||
from core.builtin_concepts import ReturnValueConcept, ParserResultConcept, BuiltinConcepts
|
||||
from core.concept import Concept, CB, NotInit
|
||||
from core.sheerka.services.SheerkaExecute import ParserInput
|
||||
from core.tokenizer import Tokenizer
|
||||
from evaluators.PythonEvaluator import PythonEvaluator, PythonEvalError
|
||||
from parsers.BaseNodeParser import SourceCodeNode, SourceCodeWithConceptNode
|
||||
from parsers.PythonParser import PythonNode, PythonParser
|
||||
|
||||
from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka
|
||||
@@ -12,10 +16,28 @@ def get_concept_name(concept):
|
||||
return concept.name
|
||||
|
||||
|
||||
def get_source_code_node(source_code, concepts=None):
|
||||
if source_code:
|
||||
python_node = PythonNode(source_code, ast.parse(source_code, f"<source>", 'eval'))
|
||||
else:
|
||||
python_node = PythonNode("", None)
|
||||
|
||||
if concepts is None:
|
||||
tokens = list(Tokenizer(source_code, yield_eof=False))
|
||||
return SourceCodeNode(0, len(tokens), tokens, python_node=python_node)
|
||||
else:
|
||||
python_node.concepts = concepts
|
||||
scwcn = SourceCodeWithConceptNode(None, None)
|
||||
scwcn.python_node = python_node
|
||||
return scwcn
|
||||
|
||||
|
||||
class TestPythonEvaluator(TestUsingMemoryBasedSheerka):
|
||||
|
||||
@pytest.mark.parametrize("ret_val, expected", [
|
||||
(ReturnValueConcept("some_name", True, ParserResultConcept(value=PythonNode("", None))), True),
|
||||
(ReturnValueConcept("some_name", True, ParserResultConcept(value=get_source_code_node(""))), True),
|
||||
(ReturnValueConcept("some_name", True, ParserResultConcept(value=get_source_code_node("", {}))), True),
|
||||
(ReturnValueConcept("some_name", True, ParserResultConcept(value="other thing")), False),
|
||||
(ReturnValueConcept("some_name", False, "not relevant"), False),
|
||||
(ReturnValueConcept("some_name", True, Concept()), False)
|
||||
@@ -39,6 +61,19 @@ class TestPythonEvaluator(TestUsingMemoryBasedSheerka):
|
||||
assert evaluated.status
|
||||
assert evaluated.value == expected
|
||||
|
||||
@pytest.mark.parametrize("source_code_node, expected", [
|
||||
(get_source_code_node("1 + 1"), 2),
|
||||
(get_source_code_node("one + one", {"one": Concept("one", body="1")}), 2)
|
||||
])
|
||||
def test_i_can_eval_source_code_node(self, source_code_node, expected):
|
||||
context = self.get_context()
|
||||
return_value = context.sheerka.ret("parsers.??", True, ParserResultConcept(value=source_code_node))
|
||||
|
||||
evaluated = PythonEvaluator().eval(context, return_value)
|
||||
|
||||
assert evaluated.status
|
||||
assert evaluated.value == expected
|
||||
|
||||
def test_i_can_eval_using_context(self):
|
||||
context = self.get_context()
|
||||
parsed = PythonParser().parse(context, ParserInput("test_using_context('value for param1', 10)"))
|
||||
@@ -239,3 +274,18 @@ class TestPythonEvaluator(TestUsingMemoryBasedSheerka):
|
||||
PythonEvaluator().update_globals_with_context(my_globals, context)
|
||||
|
||||
assert my_globals == {"self": foo, "b": "'Initialized!'"}
|
||||
|
||||
def test_i_can_use_sheerka_locals(self):
|
||||
sheerka, context = self.init_concepts()
|
||||
|
||||
def func(i):
|
||||
return i + 1
|
||||
|
||||
sheerka.locals["func"] = func
|
||||
|
||||
parsed = PythonParser().parse(context, ParserInput("func(10)"))
|
||||
python_evaluator = PythonEvaluator()
|
||||
evaluated = python_evaluator.eval(context, parsed)
|
||||
|
||||
assert evaluated.status
|
||||
assert evaluated.value == 11
|
||||
|
||||
Reference in New Issue
Block a user