from core.builtin_concepts import BuiltinConcepts from core.concept import Concept from core.sheerka.ExecutionContext import ExecutionContext from core.sheerka.services.SheerkaMemory import SheerkaMemory, MemoryObject from tests.TestUsingFileBasedSheerka import TestUsingFileBasedSheerka from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka class TestSheerkaMemory(TestUsingMemoryBasedSheerka): def test_i_can_add_to_global_short_term_memory(self): sheerka = self.get_sheerka() service = sheerka.services[SheerkaMemory.NAME] foo = Concept("foo") sheerka.add_to_short_term_memory(None, "a", foo) assert service.short_term_objects.copy() == {":a": foo} assert id(sheerka.get_from_short_term_memory(None, "a")) == id(foo) def test_i_can_add_context_short_term_memory(self): sheerka, context = self.init_concepts() service = sheerka.services[SheerkaMemory.NAME] foo = Concept("foo") sheerka.add_to_short_term_memory(context, "a", foo) context_id = ExecutionContext.ids[context.event.get_digest()] assert service.short_term_objects.copy() == {f"{context_id}:a": foo} assert id(sheerka.get_from_short_term_memory(context, "a")) == id(foo) assert sheerka.get_from_short_term_memory(None, "a") is None def test_i_can_get_obj_from_parents(self): sheerka, context = self.init_concepts() service = sheerka.services[SheerkaMemory.NAME] foo = Concept("foo") sheerka.add_to_short_term_memory(None, "a", foo) with context.push(BuiltinConcepts.TESTING, None) as sub_context: assert service.short_term_objects.copy() == {":a": foo} assert id(sheerka.get_from_short_term_memory(sub_context, "a")) == id(foo) assert id(sheerka.get_from_short_term_memory(context, "a")) == id(foo) assert id(sheerka.get_from_short_term_memory(None, "a")) == id(foo) def test_entry_are_removed_on_context_exit(self): sheerka, context = self.init_concepts() with context.push(BuiltinConcepts.TESTING, None) as sub_context: foo = Concept("foo") sheerka.add_to_short_term_memory(sub_context, "a", foo) assert id(sheerka.get_from_short_term_memory(sub_context, "a")) == id(foo) assert sheerka.get_from_short_term_memory(sub_context, "a") is None def test_i_can_add_and_retrieve_from_memory(self): sheerka, context = self.init_concepts() service = sheerka.services[SheerkaMemory.NAME] assert sheerka.get_from_memory(context, "a") is None foo = Concept("foo") sheerka.add_to_memory(context, "a", foo) assert service.objects.copy() == {"a": MemoryObject(context.event.get_digest(), foo)} assert id(sheerka.get_from_memory(context, "a").obj) == id(foo) def test_i_can_use_memory_to_get_the_list_of_all_objects(self): sheerka, context = self.init_concepts() foo = Concept("foo") bar = Concept("bar") sheerka.add_to_memory(context, "foo", 'value that will not appear') sheerka.add_to_memory(context, "foo", foo) sheerka.add_to_memory(context, "bar", bar) assert sheerka.memory(context) == {"foo": foo, "bar": bar} def test_i_can_use_memory_with_a_string(self): sheerka, context = self.init_concepts() foo = Concept("foo") sheerka.add_to_memory(context, "foo", foo) assert sheerka.memory(context, "foo") == foo def test_i_can_use_memory_with_a_concept(self): sheerka, context = self.init_concepts() foo = Concept("foo") sheerka.add_to_memory(context, "foo", foo) assert sheerka.memory(context, Concept("foo")) == foo def test_concept_not_found_is_return_when_not_found(self): sheerka, context = self.init_concepts() res = sheerka.memory(context, "foo") assert sheerka.isinstance(res, BuiltinConcepts.NOT_FOUND) assert res.body == {"#name": "foo"} def test_memory_only_returns_the_last_object(self): sheerka, context = self.init_concepts() foo = Concept("foo") bar = Concept("bar") sheerka.add_to_memory(context, "item", foo) sheerka.add_to_memory(context, "item", bar) assert sheerka.memory(context, "item") == bar class TestSheerkaMemoryUsingFileBase(TestUsingFileBasedSheerka): def test_i_can_record_memory_objects(self): sheerka, context = self.init_concepts() sheerka.add_to_memory(context, "item", Concept("foo")) sheerka.cache_manager.commit(context) sheerka = self.get_sheerka() context = self.get_context(sheerka) assert sheerka.get_from_memory(context, "item").obj == Concept("foo")