def test_fact_setitem_do_raise_after_declare(): f = Fact() ke = KnowledgeEngine() ke.reset() ke.declare(f) with pytest.raises(RuntimeError): f[0] = 1
def test_KnowledgeEngine_reset_resets_agenda(): from pyknow.engine import KnowledgeEngine ke = KnowledgeEngine() ke.agenda = None ke.reset() assert ke.agenda is not None
def test_KnowledgeEngine_reset_resets_facts(): from pyknow.engine import KnowledgeEngine ke = KnowledgeEngine() ke.facts = None ke.reset() assert ke.facts is not None
def test_KE_parent(): from pyknow.engine import KnowledgeEngine engine = KnowledgeEngine() assert not engine.parent parent = KnowledgeEngine() engine.parent = parent assert parent is engine.parent
def test_KnowledgeEngine_reset_declare_initialfact(): from pyknow.engine import KnowledgeEngine ke = KnowledgeEngine() ke.reset() assert len(ke.facts) == 1
def test_KnowledgeEngine_reset_declares_InitialFact(): from pyknow.engine import KnowledgeEngine from pyknow.fact import InitialFact ke = KnowledgeEngine() assert not ke._facts.matches(InitialFact()) ke.reset() assert ke._facts.matches(InitialFact())
def test_KnowledgeEngine_retract_matching_retracts_fact(): from pyknow.engine import KnowledgeEngine from unittest.mock import patch ke = KnowledgeEngine() with patch('pyknow.factlist.FactList') as mock: ke.facts = mock ke.retract_matching(False) assert mock.retract_matching.called
def test_KnowledgeEngine_get_activations_returns_a_list(): from pyknow.engine import KnowledgeEngine ke = KnowledgeEngine() res = ke.get_activations() assert isinstance(res, tuple) assert isinstance(res[0], list) assert isinstance(res[1], list)
def test_KnowledgeEngine_retract_retracts_fact(): from pyknow.engine import KnowledgeEngine from unittest.mock import patch ke = KnowledgeEngine() with patch('pyknow.factlist.FactList') as mock: ke.facts = mock ke.retract({'__factid__': (0, )}) assert mock.retract.called
def test_KnowledgeEngine_declare_define_fact(): from pyknow.engine import KnowledgeEngine from pyknow.fact import Fact from unittest.mock import patch ke = KnowledgeEngine() with patch('pyknow.factlist.FactList') as mock: ke.facts = mock ke.declare(Fact()) assert mock.declare.called
def test_KnowledgeEngine_declare_define_fact(): from pyknow.engine import KnowledgeEngine from pyknow import Fact from unittest.mock import patch ke = KnowledgeEngine() with patch('pyknow.factlist.FactList') as mock: ke.facts = mock ke.declare(Fact()) assert mock.declare.called
def test_KnowledgeEngine_modify_retracts_and_declares(): from pyknow.engine import KnowledgeEngine from unittest.mock import patch ke = KnowledgeEngine() with patch('pyknow.factlist.FactList') as mock: with patch('pyknow.engine.KnowledgeEngine.declare') as declare_mock: ke.facts = mock ke.modify(False, False) assert mock.retract_matching.called assert declare_mock.called
def test_duplicate_declare(): from pyknow import KnowledgeEngine, Fact ke = KnowledgeEngine() f1 = ke.declare(Fact(color='red')) assert len(ke.facts) == 1 f2 = ke.duplicate(f1, color='yellow', blink=True) assert len(ke.facts) == 2 assert f2 is not f1 assert f2['color'] == 'yellow' assert f2['blink']
def test_modify_retracts_and_declare(): from pyknow import KnowledgeEngine, Fact ke = KnowledgeEngine() f1 = ke.declare(Fact()) assert len(ke.facts) == 1 f2 = ke.modify(f1, _0='test_pos', key='test_key') assert f1 != f2 assert len(ke.facts) == 1 assert f2.__factid__ in ke.facts assert f2[0] == 'test_pos' assert f2['key'] == 'test_key'
def test_double_underscore_raise_on_declare(): ke = KnowledgeEngine() ke.reset() ke.declare(Fact(__startwithdoubleunderscore__=True)) with pytest.raises(KeyError): ke.declare(Fact(key__with__double__underscores=True))
def test_retematcher_changes_are_propagated(TestNode): from pyknow.engine import KnowledgeEngine from pyknow.fact import Fact from pyknow.matchers.rete import ReteMatcher from pyknow.matchers.rete.token import Token matcher = ReteMatcher(KnowledgeEngine()) tn1 = TestNode() tn2 = TestNode() matcher.root_node.add_child(tn1, tn1.activate) matcher.root_node.add_child(tn2, tn2.activate) f1 = Fact(__factid__=1) f2 = Fact(__factid__=2) f3 = Fact(__factid__=3) f4 = Fact(__factid__=4) matcher.changes(adding=[f1, f2], deleting=[f3, f4]) assert Token.valid(f1) in tn1.added assert Token.valid(f1) in tn2.added assert Token.valid(f2) in tn1.added assert Token.valid(f2) in tn2.added assert Token.invalid(f3) in tn1.added assert Token.invalid(f3) in tn2.added assert Token.invalid(f4) in tn1.added assert Token.invalid(f4) in tn2.added
def test_KnowledgeEngine_agenda_is_Agenda(): from pyknow.engine import KnowledgeEngine from pyknow.agenda import Agenda ke = KnowledgeEngine() assert isinstance(ke.agenda, Agenda)
def test_retematcher_has_root_node(): from pyknow.matchers.rete import ReteMatcher from pyknow.engine import KnowledgeEngine from pyknow.matchers.rete.nodes import BusNode matcher = ReteMatcher(KnowledgeEngine()) assert hasattr(matcher, 'root_node') assert isinstance(matcher.root_node, BusNode)
def test_tree_iterations(): """ test tree iteration """ from pyknow.tree import KETree from pyknow.engine import KnowledgeEngine a = KETree({ 'node': KnowledgeEngine(), 'children': [{ 'node': KnowledgeEngine(), 'children': [] }, { 'node': KnowledgeEngine(), 'children': [] }] }) assert len(a.nodes) == 3 b = 3 for elements in a: b -= 1 assert len(elements) == b
def test_retematcher_changes_return_activations_if_csn(): from pyknow.engine import KnowledgeEngine from pyknow.fact import Fact from pyknow.rule import Rule from pyknow.activation import Activation from pyknow.matchers.rete.nodes import ConflictSetNode from pyknow.matchers.rete import ReteMatcher matcher = ReteMatcher(KnowledgeEngine()) rule = Rule() csn = ConflictSetNode(rule) matcher.root_node.add_child(csn, csn.activate) added, removed = matcher.changes( adding=[Fact(__factid__=1), Fact(__factid__=2)]) assert len(added) == 2 assert all(isinstance(a, Activation) for a in added)
def test_KnowledgeEngine_get_activations_returns_a_generator(): from pyknow.engine import KnowledgeEngine import types ke = KnowledgeEngine() assert isinstance(ke.get_activations(), types.GeneratorType)
def test_declare_raises_typeerror_if_conditionalelement_found(): from pyknow import KnowledgeEngine, L, W, P, Fact ke = KnowledgeEngine() with pytest.raises(TypeError): ke.declare(Fact(L(1))) with pytest.raises(TypeError): ke.declare(Fact(W())) with pytest.raises(TypeError): ke.declare(Fact(P(lambda _: True))) with pytest.raises(TypeError): ke.declare(Fact(~L(1))) with pytest.raises(TypeError): ke.declare(Fact(L(1) | L(2))) with pytest.raises(TypeError): ke.declare(Fact(L(1) & L(2)))
def test_retematcher_is_not_abstract(): from pyknow.matchers.rete import ReteMatcher from pyknow.engine import KnowledgeEngine # MUST NOT RAISE ReteMatcher(KnowledgeEngine())
def test_KnowledgeEngine_has_declare(): from pyknow.engine import KnowledgeEngine ke = KnowledgeEngine() assert hasattr(ke, 'declare')
def test_KnowledgeEngine_has_initialfacts(): from pyknow.engine import KnowledgeEngine # pylint: disable=protected-access assert KnowledgeEngine()._fixed_facts == []
def test_KnowledgeEngine_has_initialfacts(): from pyknow.engine import KnowledgeEngine from pyknow import InitialFact assert list(KnowledgeEngine()._declare_initial_fact()) == [InitialFact()]
def test_KnowledgeEngine__facts_is_FactList(): from pyknow.engine import KnowledgeEngine from pyknow.factlist import FactList ke = KnowledgeEngine() assert isinstance(ke.facts, FactList)
def test_KnowledgeEngine_reset(): """ Given a set of fixed facts, they're still there after a reset. Also, we have in account that InitialFact() is always there. And that if we add a normal fact after that, it's not persistent """ from pyknow.engine import KnowledgeEngine from pyknow.fact import Fact, L ke = KnowledgeEngine() ke.deffacts(Fact(foo=L(1))) ke.deffacts(Fact(foo=L(1), bar=L(2))) ke.reset() assert len(ke.facts.facts) == 3 ke = KnowledgeEngine() ke.deffacts(Fact(foo=L(1))) ke.declare(Fact(foo=L(9))) ke.deffacts(Fact(foo=L(1), bar=L(2))) ke.reset() assert len(ke.facts.facts) == 3 ke = KnowledgeEngine() ke.deffacts(Fact(foo=L(1))) ke.declare(Fact(foo=L(9))) ke.reset() assert len(ke.facts.facts) == 2
def test_KnowledgeEngine_has_agenda(): from pyknow.engine import KnowledgeEngine ke = KnowledgeEngine() assert hasattr(ke, 'agenda')
def test_KnowledgeEngine_has__facts(): from pyknow.engine import KnowledgeEngine ke = KnowledgeEngine() assert hasattr(ke, 'facts')
def test_KnowledgeEngine_default_strategy_is_Depth_instance(): from pyknow.engine import KnowledgeEngine from pyknow.strategies import Depth assert isinstance(KnowledgeEngine().strategy, Depth)
def test_KnowledgeEngine_get_rules_return_empty_list(): from pyknow.engine import KnowledgeEngine ke = KnowledgeEngine() assert ke.get_rules() == []
def test_KnowledgeEngine_get_activations_returns_a_list(): from pyknow.engine import KnowledgeEngine ke = KnowledgeEngine() assert ke.get_activations() == []