Fixed #125: SheerkaErrorManager
Fixed #135: Change services service priorities Fixed #136: ErrorManager: Implement recognize_error Fixed #137: BNFNodeParser : Error when parsing regex with sub parsers Fixed #138: get_last_errors(): real errors sources are lost Fixed #139: OneError return value removes the origin of the error Fixed #140: Concept variables are not correctly handled when parsing sub expression Fixed #143: Implement has_unknown_concepts()
This commit is contained in:
+15
-156
@@ -3,14 +3,13 @@ import os
|
||||
import pytest
|
||||
|
||||
from conftest import SHEERKA_TEST_FOLDER
|
||||
from core.builtin_concepts import BuiltinConcepts, ReturnValueConcept, UnknownConcept, UserInputConcept
|
||||
from core.builtin_concepts import BuiltinConcepts, ReturnValueConcept, UserInputConcept
|
||||
from core.builtin_concepts_ids import AllBuiltinConcepts
|
||||
from core.concept import Concept, ConceptParts, PROPERTIES_TO_SERIALIZE, get_concept_attrs
|
||||
from core.global_symbols import NotInit
|
||||
from core.sheerka.Sheerka import BASE_NODE_PARSER_CLASS, Sheerka
|
||||
from core.sheerka.services.SheerkaConceptManager import SheerkaConceptManager, ValueNotFound
|
||||
from core.sheerka.services.SheerkaConceptManager import SheerkaConceptManager
|
||||
from core.tokenizer import Token, TokenKind
|
||||
from parsers.PythonParser import PythonErrorNode
|
||||
from tests.TestUsingFileBasedSheerka import TestUsingFileBasedSheerka
|
||||
from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka
|
||||
|
||||
@@ -44,21 +43,25 @@ class TestSheerkaUsingMemoryBasedSheerka(TestUsingMemoryBasedSheerka):
|
||||
|
||||
def test_i_can_list_builtin_concepts(self):
|
||||
sheerka = self.get_sheerka()
|
||||
builtins = list(sheerka.get_builtins_classes_as_dict())
|
||||
builtins, _ = sheerka.get_builtins_classes_as_dict()
|
||||
|
||||
assert str(BuiltinConcepts.ERROR) in builtins
|
||||
assert str(BuiltinConcepts.RETURN_VALUE) in builtins
|
||||
assert BuiltinConcepts.ERROR in builtins
|
||||
assert BuiltinConcepts.RETURN_VALUE in builtins
|
||||
|
||||
def test_i_can_get_a_builtin_concept_by_their_enum_or_the_string(self):
|
||||
"""
|
||||
Checks that a concept can be found its name
|
||||
even when there are variables in the name (ex 'hello + a' or 'a + b' )
|
||||
Also returns the mapping between concept name and specific class name
|
||||
:return:
|
||||
"""
|
||||
sheerka = self.get_sheerka()
|
||||
for key in sheerka.get_builtins_classes_as_dict():
|
||||
builtins_by_key, builtins_by_class_name = sheerka.get_builtins_classes_as_dict()
|
||||
for key in builtins_by_key:
|
||||
assert sheerka.get_by_key(key) is not None
|
||||
assert sheerka.get_by_key(str(key)) is not None
|
||||
|
||||
for k, v in builtins_by_class_name.items():
|
||||
assert type(sheerka.get_by_key(v)).__name__ == k
|
||||
|
||||
def test_i_cannot_get_when_key_is_none(self):
|
||||
sheerka = self.get_sheerka()
|
||||
@@ -98,7 +101,8 @@ class TestSheerkaUsingMemoryBasedSheerka(TestUsingMemoryBasedSheerka):
|
||||
assert ret.value == "value"
|
||||
|
||||
# check the others
|
||||
for key, concept_class in sheerka.get_builtins_classes_as_dict().items():
|
||||
builtins_by_key, _ = sheerka.get_builtins_classes_as_dict()
|
||||
for key, concept_class in builtins_by_key.items():
|
||||
assert isinstance(sheerka.get_by_key(key), concept_class)
|
||||
|
||||
def test_i_can_instantiate_a_builtin_concept_when_no_specific_class(self):
|
||||
@@ -426,151 +430,6 @@ class TestSheerkaUsingMemoryBasedSheerka(TestUsingMemoryBasedSheerka):
|
||||
assert not res.status
|
||||
assert sheerka.isinstance(res.body, BuiltinConcepts.ONTOLOGY_ALREADY_DEFINED)
|
||||
|
||||
@pytest.mark.parametrize("obj, expected", [
|
||||
("a string", []),
|
||||
(True, []),
|
||||
(False, []),
|
||||
(Concept("foo"), []),
|
||||
(Concept("foo", body=False).auto_init(), []),
|
||||
(UnknownConcept(), [UnknownConcept()]),
|
||||
(Concept("foo", body=UnknownConcept()).auto_init(), [UnknownConcept()]),
|
||||
(PythonErrorNode("msg", None), [PythonErrorNode("msg", None)])
|
||||
])
|
||||
def test_i_can_get_error_for_simple_objects(self, obj, expected):
|
||||
sheerka, context = self.init_test().unpack()
|
||||
|
||||
assert sheerka.get_errors(context, obj) == expected
|
||||
|
||||
def test_i_can_get_error_when_builtin_concept_in_error(self):
|
||||
sheerka, context = self.init_test().unpack()
|
||||
|
||||
obj = sheerka.new(BuiltinConcepts.ONTOLOGY_ALREADY_DEFINED)
|
||||
assert sheerka.get_errors(context, obj) == [obj]
|
||||
|
||||
def test_i_can_get_error_when_return_value(self):
|
||||
sheerka, context = self.init_test().unpack()
|
||||
|
||||
error = sheerka.err("an error")
|
||||
ret_val = ReturnValueConcept("Test", False, sheerka.err("an error"))
|
||||
assert sheerka.get_errors(context, ret_val) == [error]
|
||||
|
||||
def test_i_can_get_inner_error(self):
|
||||
sheerka, context = self.init_test().unpack()
|
||||
|
||||
error = sheerka.err("an error")
|
||||
ret_val = ReturnValueConcept("Test", False, sheerka.err("an error"))
|
||||
assert sheerka.get_errors(context, ret_val) == [error]
|
||||
|
||||
def test_i_can_get_error_when_embedded_errors(self):
|
||||
sheerka, context = self.init_test().unpack()
|
||||
|
||||
concept_eval_error = sheerka.new(BuiltinConcepts.CONCEPT_EVAL_ERROR)
|
||||
unknown_concept = sheerka.new(BuiltinConcepts.UNKNOWN_CONCEPT)
|
||||
not_an_error = sheerka.new(BuiltinConcepts.AUTO_EVAL)
|
||||
error = sheerka.err([concept_eval_error, unknown_concept, not_an_error])
|
||||
|
||||
ret_val = ReturnValueConcept("Test", False, error)
|
||||
errors_found = sheerka.get_errors(context, ret_val)
|
||||
|
||||
assert errors_found == [error, concept_eval_error, unknown_concept]
|
||||
|
||||
def test_i_can_get_error_from_list(self):
|
||||
sheerka, context = self.init_test().unpack()
|
||||
|
||||
concept_eval_error = sheerka.new(BuiltinConcepts.CONCEPT_EVAL_ERROR)
|
||||
unknown_concept = sheerka.new(BuiltinConcepts.UNKNOWN_CONCEPT)
|
||||
not_an_error = sheerka.new(BuiltinConcepts.AUTO_EVAL)
|
||||
error = sheerka.err([concept_eval_error, unknown_concept, not_an_error])
|
||||
ret_val_1 = ReturnValueConcept("Test", False, error)
|
||||
|
||||
python_error = PythonErrorNode("msg", Exception())
|
||||
value_not_found = ValueNotFound("item", "value")
|
||||
multiple_error = sheerka.new(BuiltinConcepts.MULTIPLE_ERRORS, body=[python_error, value_not_found])
|
||||
ret_val_2 = ReturnValueConcept("Test", False, multiple_error)
|
||||
|
||||
errors_found = sheerka.get_errors(context, [ret_val_1, ret_val_2])
|
||||
|
||||
assert errors_found == [error, concept_eval_error, unknown_concept,
|
||||
multiple_error, python_error, value_not_found]
|
||||
|
||||
def test_i_can_filter_error_by_concept_key(self):
|
||||
sheerka, context = self.init_test().unpack()
|
||||
|
||||
concept_eval_error = sheerka.new(BuiltinConcepts.CONCEPT_EVAL_ERROR)
|
||||
unknown_concept = sheerka.new(BuiltinConcepts.UNKNOWN_CONCEPT)
|
||||
python_error = PythonErrorNode("msg", Exception())
|
||||
error = sheerka.err([concept_eval_error, unknown_concept, python_error])
|
||||
ret_val = ReturnValueConcept("Test", False, error)
|
||||
|
||||
errors_found = sheerka.get_errors(context, ret_val, __type=BuiltinConcepts.CONCEPT_EVAL_ERROR)
|
||||
assert errors_found == [concept_eval_error]
|
||||
|
||||
def test_i_can_filter_error_by_class_name(self):
|
||||
sheerka, context = self.init_test().unpack()
|
||||
|
||||
concept_eval_error = sheerka.new(BuiltinConcepts.CONCEPT_EVAL_ERROR)
|
||||
unknown_concept = sheerka.new(BuiltinConcepts.UNKNOWN_CONCEPT)
|
||||
python_error = PythonErrorNode("msg", Exception())
|
||||
error = sheerka.err([concept_eval_error, unknown_concept, python_error])
|
||||
ret_val = ReturnValueConcept("Test", False, error)
|
||||
|
||||
errors_found = sheerka.get_errors(context, ret_val, __type="PythonErrorNode")
|
||||
assert errors_found == [python_error]
|
||||
|
||||
def test_i_can_filter_error_by_concept_attribute(self):
|
||||
sheerka, context = self.init_test().unpack()
|
||||
|
||||
concept_eval_error = sheerka.new(BuiltinConcepts.CONCEPT_EVAL_ERROR)
|
||||
unknown_concept = sheerka.new(BuiltinConcepts.UNKNOWN_CONCEPT, concept_ref="a_concept_ref")
|
||||
python_error = PythonErrorNode("msg", Exception())
|
||||
error = sheerka.err([concept_eval_error, unknown_concept, python_error])
|
||||
ret_val = ReturnValueConcept("Test", False, error)
|
||||
|
||||
errors_found = sheerka.get_errors(context, ret_val, concept_ref="a_concept_ref")
|
||||
assert errors_found == [unknown_concept]
|
||||
|
||||
def test_i_can_filter_error_by_class_attribute(self):
|
||||
sheerka, context = self.init_test().unpack()
|
||||
|
||||
concept_eval_error = sheerka.new(BuiltinConcepts.CONCEPT_EVAL_ERROR)
|
||||
unknown_concept = sheerka.new(BuiltinConcepts.UNKNOWN_CONCEPT, concept_ref="a_concept_ref")
|
||||
python_error = PythonErrorNode("error source", Exception())
|
||||
error = sheerka.err([concept_eval_error, unknown_concept, python_error])
|
||||
ret_val = ReturnValueConcept("Test", False, error)
|
||||
|
||||
errors_found = sheerka.get_errors(context, ret_val, source="error source")
|
||||
assert errors_found == [python_error]
|
||||
|
||||
def test_i_can_filter_error_by_exception_name(self):
|
||||
sheerka, context = self.init_test().unpack()
|
||||
|
||||
from evaluators.PythonEvaluator import PythonEvalError
|
||||
name_error = NameError("foo")
|
||||
python_eval_error = PythonEvalError(name_error, "foo", None, None)
|
||||
error = sheerka.err([python_eval_error])
|
||||
ret_val = ReturnValueConcept("Test", False, error)
|
||||
|
||||
errors_found = sheerka.get_errors(context, ret_val, __type="NameError")
|
||||
assert errors_found == [name_error]
|
||||
|
||||
def test_i_can_filter_error_on_multiple_criteria(self):
|
||||
sheerka, context = self.init_test().unpack()
|
||||
|
||||
concept_eval_error = sheerka.new(BuiltinConcepts.CONCEPT_EVAL_ERROR)
|
||||
unknown_concept = sheerka.new(BuiltinConcepts.UNKNOWN_CONCEPT, concept_ref="a_concept_ref")
|
||||
value_not_found = ValueNotFound("an_item", "a value")
|
||||
error = sheerka.err([concept_eval_error, unknown_concept, value_not_found])
|
||||
ret_val = ReturnValueConcept("Test", False, error)
|
||||
|
||||
errors_found = sheerka.get_errors(context, ret_val, __type="ValueNotFound", item="an_item", value="a value")
|
||||
assert errors_found == [value_not_found]
|
||||
|
||||
def test_i_cannot_get_error_when_return_value_s_status_is_true(self):
|
||||
sheerka, context = self.init_test().unpack()
|
||||
|
||||
ret_val = ReturnValueConcept("Test", True, sheerka.err("an error"))
|
||||
assert sheerka.get_errors(context, ret_val) == []
|
||||
|
||||
def test_i_can_add_and_remove_global_context_hints(self):
|
||||
sheerka, context = self.init_test().unpack()
|
||||
|
||||
@@ -592,7 +451,7 @@ class TestSheerkaUsingMemoryBasedSheerka(TestUsingMemoryBasedSheerka):
|
||||
).unpack()
|
||||
|
||||
res = sheerka.evaluate_user_input("eval foo", "testing_user")
|
||||
assert sheerka.isinstance(res[0].value, BuiltinConcepts.CONDITION_FAILED) # sanity check
|
||||
assert sheerka.isinstance(res[0].value.value, BuiltinConcepts.CONDITION_FAILED) # sanity check
|
||||
|
||||
sheerka.add_to_context(BuiltinConcepts.EVAL_GLOBAL_TRUTH_REQUESTED)
|
||||
res = sheerka.evaluate_user_input("eval foo", "testing_user")
|
||||
@@ -600,7 +459,7 @@ class TestSheerkaUsingMemoryBasedSheerka(TestUsingMemoryBasedSheerka):
|
||||
|
||||
sheerka.remove_fom_context(BuiltinConcepts.EVAL_GLOBAL_TRUTH_REQUESTED)
|
||||
res = sheerka.evaluate_user_input("eval foo", "testing_user")
|
||||
assert sheerka.isinstance(res[0].value, BuiltinConcepts.CONDITION_FAILED)
|
||||
assert sheerka.isinstance(res[0].value.value, BuiltinConcepts.CONDITION_FAILED)
|
||||
|
||||
|
||||
class TestSheerkaUsingFileBasedSheerka(TestUsingFileBasedSheerka):
|
||||
|
||||
Reference in New Issue
Block a user