Added ExactConceptParser
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
import pytest
|
||||
from os import path
|
||||
import shutil
|
||||
import os
|
||||
|
||||
from core.concept import Concept, Property
|
||||
from core.sheerka import Sheerka, ExecutionContext
|
||||
from parsers.DefaultParser import DefaultParser
|
||||
from parsers.ExactConceptParser import ExactConceptParser
|
||||
|
||||
tests_root = path.abspath("../build/tests")
|
||||
root_folder = "init_folder"
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def init_test():
|
||||
if path.exists(tests_root):
|
||||
shutil.rmtree(tests_root)
|
||||
|
||||
if not path.exists(tests_root):
|
||||
os.makedirs(tests_root)
|
||||
current_pwd = os.getcwd()
|
||||
os.chdir(tests_root)
|
||||
|
||||
yield None
|
||||
|
||||
os.chdir(current_pwd)
|
||||
|
||||
|
||||
def test_i_can_compute_combinations():
|
||||
parser = ExactConceptParser()
|
||||
res = parser.combinations(["foo", "bar", "baz"])
|
||||
|
||||
assert res == {('foo', 'bar', 'baz'),
|
||||
('__var__0', 'bar', 'baz'),
|
||||
('foo', '__var__0', 'baz'),
|
||||
('foo', 'bar', '__var__0'),
|
||||
('__var__0', '__var__1', 'baz'),
|
||||
('__var__0', 'bar', '__var__1'),
|
||||
('foo', '__var__0', '__var__1'),
|
||||
('__var__0', '__var__1', '__var__2')}
|
||||
|
||||
|
||||
def test_i_can_compute_combinations_with_duplicates():
|
||||
parser = ExactConceptParser()
|
||||
res = parser.combinations(["foo", "bar", "foo"])
|
||||
|
||||
assert res == {('foo', 'bar', 'foo'),
|
||||
('__var__0', 'bar', '__var__0'),
|
||||
('foo', '__var__0', 'foo'),
|
||||
('__var__0', '__var__1', '__var__0'),
|
||||
('__var__1', '__var__0', '__var__1')}
|
||||
# TODO: the last tuple is not possible, so the algo can be improved
|
||||
|
||||
|
||||
def test_i_can_recognize_a_simple_concept():
|
||||
sheerka = get_sheerka()
|
||||
concept = get_concept("hello world", [])
|
||||
sheerka.add_in_cache(concept)
|
||||
source = "hello world"
|
||||
context = ExecutionContext(sheerka, "xxxx")
|
||||
results = ExactConceptParser().parse(context, source)
|
||||
|
||||
assert len(results) == 1
|
||||
assert results[0].status
|
||||
assert results[0].value.key == concept.key
|
||||
|
||||
|
||||
def test_i_can_recognize_concepts_defined_several_times():
|
||||
sheerka = get_sheerka()
|
||||
sheerka.add_in_cache(get_concept("hello world", []))
|
||||
sheerka.add_in_cache(get_concept("hello a", ["a"]))
|
||||
|
||||
source = "hello world"
|
||||
context = ExecutionContext(sheerka, "xxxx")
|
||||
results = ExactConceptParser().parse(context, source)
|
||||
|
||||
assert len(results) == 2
|
||||
results = sorted(results, key=lambda x: x.value.name) # because of the usage of sets
|
||||
|
||||
assert results[0].status
|
||||
assert results[0].value.name == "hello a"
|
||||
assert results[0].value.props["a"].value == "world"
|
||||
|
||||
assert results[1].status
|
||||
assert results[1].value.name == "hello world"
|
||||
|
||||
|
||||
def test_i_can_recognize_a_concept_with_variables():
|
||||
sheerka = get_sheerka()
|
||||
concept = get_concept("a + b", ["a", "b"])
|
||||
sheerka.concepts_cache[concept.key] = concept
|
||||
source = "10 + 5"
|
||||
context = ExecutionContext(sheerka, "xxxx")
|
||||
results = ExactConceptParser().parse(context, source)
|
||||
|
||||
assert len(results) == 1
|
||||
assert results[0].status
|
||||
assert results[0].value.key == concept.key
|
||||
assert results[0].value.props["a"].value == "10"
|
||||
assert results[0].value.props["b"].value == "5"
|
||||
|
||||
|
||||
def test_i_can_recognize_a_concept_with_duplicate_variables():
|
||||
sheerka = get_sheerka()
|
||||
concept = get_concept("a + b + a", ["a", "b"])
|
||||
sheerka.concepts_cache[concept.key] = concept
|
||||
source = "10 + 5 + 10"
|
||||
context = ExecutionContext(sheerka, "xxxx")
|
||||
results = ExactConceptParser().parse(context, source)
|
||||
|
||||
assert len(results) == 1
|
||||
assert results[0].status
|
||||
assert results[0].value.key == concept.key
|
||||
assert results[0].value.props["a"].value == "10"
|
||||
assert results[0].value.props["b"].value == "5"
|
||||
|
||||
|
||||
def test_i_can_manage_unknown_concept():
|
||||
sheerka = get_sheerka()
|
||||
source = "def concept hello world" # this is not a concept by itself
|
||||
context = ExecutionContext(sheerka, "xxxx")
|
||||
res = ExactConceptParser().parse(context, source)
|
||||
|
||||
assert not res.status
|
||||
assert sheerka.isinstance(res.value, Sheerka.UNKNOWN_CONCEPT_NAME)
|
||||
|
||||
|
||||
def test_i_can_detect_concepts_too_long():
|
||||
sheerka = get_sheerka()
|
||||
source = "a very very long concept that cannot be an unique one"
|
||||
context = ExecutionContext(sheerka, "xxxx")
|
||||
res = ExactConceptParser().parse(context, source)
|
||||
|
||||
assert not res.status
|
||||
assert sheerka.isinstance(res.value, Sheerka.CONCEPT_TOO_LONG_CONCEPT_NAME)
|
||||
|
||||
|
||||
def get_concept(name, variables):
|
||||
c = Concept(name=name)
|
||||
if variables:
|
||||
for v in variables:
|
||||
c.props[v] = Property(v, None)
|
||||
c.init_key()
|
||||
return c
|
||||
|
||||
|
||||
def get_sheerka():
|
||||
sheerka = Sheerka()
|
||||
sheerka.initialize(root_folder)
|
||||
|
||||
return sheerka
|
||||
Reference in New Issue
Block a user