Skip to content

Commit

Permalink
instances: add support for definstances
Browse files Browse the repository at this point in the history
Signed-off-by: Matteo Cafasso <noxdafox@gmail.com>
  • Loading branch information
noxdafox committed May 23, 2021
1 parent b031ab5 commit d2f9ef5
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 4 deletions.
19 changes: 18 additions & 1 deletion clips/classes.py
Original file line number Diff line number Diff line change
Expand Up @@ -662,7 +662,7 @@ def _ptr(self) -> ffi.CData:
@property
def name(self) -> str:
"""The DefinedInstances name."""
return ffi.string(lib.DefinstancesName(self._ptr())).decode()
return self._name.decode()

@property
def module(self) -> Module:
Expand Down Expand Up @@ -750,6 +750,23 @@ def find_class(self, name: str) -> Class:

return Class(self._env, name)

def defined_instances(self) -> iter:
"""Iterate over the DefinedInstances."""
definstances = lib.GetNextDefinstances(self._env, ffi.NULL)
while definstances != ffi.NULL:
name = ffi.string(lib.DefinstancesName(definstances)).decode()
yield DefinedInstances(self._env, name)

definstances = lib.GetNextDefinstances(self._env, definstances)

def find_defined_instances(self, name: str) -> DefinedInstances:
"""Find the DefinedInstances by its name."""
dfs = lib.FindDefinstances(self._env, name.encode())
if dfs == ffi.NULL:
raise LookupError("DefinedInstances '%s' not found" % name)

return DefinedInstances(self._env, name)

def instances(self) -> iter:
"""Iterate over the defined Instancees."""
definstance = lib.GetNextInstance(self._env, ffi.NULL)
Expand Down
24 changes: 24 additions & 0 deletions test/classes_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
(+ ?self:One ?self:Two))
"""
]
DEFINSTANCES = """(definstances MAIN::defined-instances
(c1 of ConcreteClass (Slot a-slot)))
"""


class TempFile:
Expand Down Expand Up @@ -247,3 +250,24 @@ def test_message_handler_instance(self):
instance = defclass.make_instance('test-instance', One=1, Two=2)

self.assertEqual(instance.send('test-handler'), 3)

def test_defined_instances(self):
"""DefinedInstances tests."""
self.env.build(DEFINSTANCES)
definstances = self.env.find_defined_instances('defined-instances')
listed = list(self.env.defined_instances())

self.assertEqual(definstances, listed[0])
self.assertEqual(definstances.name, 'defined-instances')
self.assertEqual(
str(definstances),
'(definstances MAIN::defined-instances (c1 of ConcreteClass (Slot a-slot)))')
self.assertEqual(definstances.module.name, 'MAIN')
self.assertTrue(definstances.deletable)

definstances.undefine()

with self.assertRaises(LookupError):
self.env.find_defined_instances('defined-instances')
with self.assertRaises(CLIPSError):
print(definstances)
7 changes: 4 additions & 3 deletions test/facts_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
(multislot multifield))
"""
DEFFACTS = """(deffacts MAIN::defined-facts
(one "two" three))
(template-fact (int 1) (str "a-string")))
"""

IMPL_STR = '(implied-fact 1 2.3 "4" five)'
Expand Down Expand Up @@ -42,7 +42,6 @@ class TestFacts(unittest.TestCase):
def setUp(self):
self.env = Environment()
self.env.build(DEFTEMPLATE)
self.env.build(DEFFACTS)

def test_facts(self):
"""Facts wrapper test."""
Expand Down Expand Up @@ -202,13 +201,15 @@ def test_template_fact_slot(self):

def test_defined_facts(self):
"""DefinedFacts tests."""
self.env.build(DEFFACTS)
deffacts = self.env.find_defined_facts('defined-facts')
listed = list(self.env.defined_facts())

self.assertEqual(deffacts, listed[0])
self.assertEqual(deffacts.name, 'defined-facts')
self.assertEqual(
str(deffacts), '(deffacts MAIN::defined-facts (one "two" three))')
str(deffacts),
'(deffacts MAIN::defined-facts (template-fact (int 1) (str "a-string")))')
self.assertEqual(deffacts.module.name, 'MAIN')
self.assertTrue(deffacts.deletable)

Expand Down

0 comments on commit d2f9ef5

Please sign in to comment.