@@ -1,19 +0,0 @@ | |||||
class MemoryContext: | |||||
def __init__(self): | |||||
self.hiddenItems = [] | |||||
self.mismatchedItems = [] | |||||
self.playfieldItems = {} | |||||
self.playfieldSize = 0 | |||||
self.recentField = None | |||||
self.selectedId = None | |||||
self.selectedItems = [] | |||||
self.victory = False | |||||
def __repr__(self): | |||||
return self.__str__() | |||||
def __str__(self): | |||||
return f"MemoryContext(plyfieldI/playfieldS/recentF/selectedId/selectedI: '{self.playfieldItems}'/'{self.playfieldSize}'/'{self.recentField}'/'{self.selectedId}'/'{self.selectedItems}')" | |||||
def memory_createEmptyContext(): | |||||
return MemoryContext() |
@@ -1,329 +0,0 @@ | |||||
from entities import * | |||||
from llm import * | |||||
# Detect victory | |||||
# | |||||
# Conditions: | |||||
# 1. Matching items have just been hidden and all items are hidden now | |||||
@llm_by_value | |||||
def memory_detectVictory( | |||||
c: MemoryContext | |||||
) -> MemoryContext: | |||||
if ( | |||||
c.recentField == "hiddenItems" and | |||||
len(c.hiddenItems) == len(c.playfieldItems) | |||||
): | |||||
c.victory = True | |||||
c.recentField = "victory" | |||||
return c | |||||
c.recentField = None | |||||
return c | |||||
#} | |||||
# Deselect mismatched items | |||||
# | |||||
# Conditions: | |||||
# 1. Two items are selected and they are of different groups | |||||
@llm_by_value | |||||
def memory_deselectMismatchedItems( | |||||
c: MemoryContext | |||||
) -> MemoryContext: | |||||
if ( | |||||
c.recentField == "selectedItems" and | |||||
len(c.selectedItems) == 2 and | |||||
c.playfieldItems[c.selectedItems[0]] != c.playfieldItems[c.selectedItems[1]] | |||||
): | |||||
c.mismatchedItems.clear() | |||||
c.mismatchedItems.append(c.selectedItems[0]) | |||||
c.mismatchedItems.append(c.selectedItems[1]) | |||||
c.recentField = "mismatchedItems" | |||||
return c | |||||
c.recentField = None | |||||
return c | |||||
#} | |||||
# Generate constant playfield suitable for testing and debugging | |||||
@llm_by_value | |||||
def memory_generateConstPlayfield( | |||||
c: MemoryContext | |||||
) -> MemoryContext: | |||||
idGroups: dict[int, int] = { } | |||||
id = 0 | |||||
for gid in range(0, c.playfieldSize): | |||||
idGroups[id] = gid | |||||
id += 1 | |||||
idGroups[id] = gid | |||||
id += 1 | |||||
#} | |||||
c.playfieldItems = idGroups | |||||
c.recentField = "playfieldItems" | |||||
return c | |||||
#} | |||||
# Hide matching selected items | |||||
# | |||||
# Conditions: | |||||
# 1. Two items are selected and they are of the same group | |||||
@llm_by_value | |||||
def memory_hideMatchingItems( | |||||
c: MemoryContext | |||||
) -> MemoryContext: | |||||
if ( | |||||
c.recentField == "selectedItems" and | |||||
len(c.selectedItems) == 2 and | |||||
c.playfieldItems[c.selectedItems[0]] == c.playfieldItems[c.selectedItems[1]] | |||||
): | |||||
c.hiddenItems.append(c.selectedItems[0]) | |||||
c.hiddenItems.append(c.selectedItems[1]) | |||||
c.recentField = "hiddenItems" | |||||
return c | |||||
c.recentField = None | |||||
return c | |||||
#} | |||||
# Select item | |||||
# | |||||
# Conditions: | |||||
# 1. There are already two selected items | |||||
# 2. Item has just been selected | |||||
@llm_by_value | |||||
def memory_selectItem( | |||||
c: MemoryContext | |||||
) -> MemoryContext: | |||||
if ( | |||||
len(c.selectedItems) == 2 | |||||
): | |||||
c.selectedItems = [] | |||||
if ( | |||||
c.recentField == "selectedId" | |||||
): | |||||
c.selectedItems.append(c.selectedId) | |||||
c.recentField = "selectedItems" | |||||
return c | |||||
c.recentField = None | |||||
return c | |||||
#} | |||||
# Test. | |||||
def test_memory_generateConstPlayfield( | |||||
) -> str: | |||||
c = memory_createEmptyContext() | |||||
c.playfieldSize = 2 | |||||
c = memory_generateConstPlayfield(c) | |||||
if ( | |||||
c.recentField == "playfieldItems" and | |||||
len(c.playfieldItems) == 4 and | |||||
c.playfieldItems[0] == 0 and | |||||
c.playfieldItems[1] == 0 and | |||||
c.playfieldItems[2] == 1 and | |||||
c.playfieldItems[3] == 1 | |||||
): | |||||
return "OK: memory_generateConstPlayfield" | |||||
#} | |||||
return "ERR: memory_generateConstPlayfield" | |||||
#} | |||||
def test_memory_selectItem( | |||||
) -> str: | |||||
c = memory_createEmptyContext() | |||||
c.playfieldSize = 2 | |||||
c = memory_generateConstPlayfield(c) | |||||
# Select the first item. | |||||
c.selectedId = 0 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
# See if it's in selectedItems now. | |||||
if ( | |||||
c.recentField == "selectedItems" and | |||||
len(c.selectedItems) == 1 and | |||||
c.selectedItems[0] == 0 | |||||
): | |||||
return "OK: selectItem" | |||||
#} | |||||
return "ERR: selectItem" | |||||
#} | |||||
def test_selectTwoItems( | |||||
) -> str: | |||||
c = memory_createEmptyContext() | |||||
c.playfieldSize = 2 | |||||
c = memory_generateConstPlayfield(c) | |||||
# Select the first two items. | |||||
c.selectedId = 0 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
c.selectedId = 1 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
# See if it's both items are selected now. | |||||
if ( | |||||
c.recentField == "selectedItems" and | |||||
len(c.selectedItems) == 2 and | |||||
c.selectedItems[0] == 0 and | |||||
c.selectedItems[1] == 1 | |||||
): | |||||
return "OK: selectTwoItems" | |||||
#} | |||||
return "ERR: selectTwoItems" | |||||
#} | |||||
def test_selectThreeItems( | |||||
) -> str: | |||||
c = memory_createEmptyContext() | |||||
c.playfieldSize = 2 | |||||
c = memory_generateConstPlayfield(c) | |||||
# Select three items. | |||||
c.selectedId = 0 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
c.selectedId = 1 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
c.selectedId = 2 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
# See if only one (last) item is selected now. | |||||
if ( | |||||
c.recentField == "selectedItems" and | |||||
len(c.selectedItems) == 1 and | |||||
c.selectedItems[0] == 2 | |||||
): | |||||
return "OK: selectThreeItems" | |||||
#} | |||||
return "ERR: selectThreeItems" | |||||
#} | |||||
def test_memory_hideMatchingItems( | |||||
) -> str: | |||||
c = memory_createEmptyContext() | |||||
c.playfieldSize = 2 | |||||
c = memory_generateConstPlayfield(c) | |||||
# Select two items of the same group. | |||||
c.selectedId = 0 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
c.selectedId = 1 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
# Hide matching items. | |||||
c = memory_hideMatchingItems(c) | |||||
# See if the two selected items match. | |||||
if ( | |||||
c.recentField == "hiddenItems" and | |||||
len(c.hiddenItems) == 2 and | |||||
c.hiddenItems[0] == 0 and | |||||
c.hiddenItems[1] == 1 | |||||
): | |||||
return "OK: memory_hideMatchingItems" | |||||
#} | |||||
return "ERR: memory_hideMatchingItems" | |||||
#} | |||||
def test_memory_deselectMismatchedItems( | |||||
) -> str: | |||||
c = memory_createEmptyContext() | |||||
c.playfieldSize = 2 | |||||
c = memory_generateConstPlayfield(c) | |||||
# Select two items of different groups. | |||||
c.selectedId = 0 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
c.selectedId = 2 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
# Detect mismatching. | |||||
c = memory_deselectMismatchedItems(c) | |||||
# See if the two selected items do not match. | |||||
if ( | |||||
c.recentField == "mismatchedItems" and | |||||
len(c.mismatchedItems) == 2 and | |||||
c.mismatchedItems[0] == 0 and | |||||
c.mismatchedItems[1] == 2 | |||||
): | |||||
return "OK: memory_deselectMismatchedItems" | |||||
#} | |||||
return "ERR: memory_deselectMismatchedItems" | |||||
#} | |||||
def test_memory_detectVictory( | |||||
) -> str: | |||||
c = memory_createEmptyContext() | |||||
c.playfieldSize = 2 | |||||
c = memory_generateConstPlayfield(c) | |||||
# Select the first two items of the same group. | |||||
c.selectedId = 0 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
c.selectedId = 1 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
# Hide the first pair. | |||||
c = memory_hideMatchingItems(c) | |||||
# Select the last two items of the same group. | |||||
c.selectedId = 2 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
c.selectedId = 3 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
# Hide the second pair. | |||||
c = memory_hideMatchingItems(c) | |||||
# Detect victory. | |||||
c = memory_detectVictory(c) | |||||
# See if victory has been detected. | |||||
if ( | |||||
c.recentField == "victory" and | |||||
c.victory == True | |||||
): | |||||
return "OK: memory_detectVictory" | |||||
#} | |||||
return "ERR: memory_detectVictory" | |||||
#} | |||||
def test_passContextByValue( | |||||
) -> str: | |||||
c = memory_createEmptyContext() | |||||
c.playfieldSize = 2 | |||||
c = memory_generateConstPlayfield(c) | |||||
c.selectedId = 0 | |||||
c.recentField = "selectedId" | |||||
c1 = memory_selectItem(c) | |||||
c.selectedId = 1 | |||||
c.recentField = "selectedId" | |||||
c2 = memory_selectItem(c) | |||||
# See if c1 and c2 have different recentField. | |||||
if ( | |||||
c1.selectedId != c2.selectedId | |||||
): | |||||
return "OK: passContextByValue" | |||||
return "ERR: passContextByValue" | |||||
#} | |||||
@@ -8,5 +8,3 @@ print(memory_test_shouldDeselectMismatchedItems()) | |||||
print(memory_test_shouldDeselectMismatchedItems_itemTwice()) | print(memory_test_shouldDeselectMismatchedItems_itemTwice()) | ||||
print(memory_test_shouldDetectVictory()) | print(memory_test_shouldDetectVictory()) | ||||
print(memory_test_shouldHideMatchingItems()) | print(memory_test_shouldHideMatchingItems()) | ||||
#print(memory_seq_test_selectTwoItems()) |
@@ -1,50 +0,0 @@ | |||||
from memory_api import * | |||||
from memory_api_Context import * | |||||
from memory_seq import * | |||||
from memory_seq_Context import * | |||||
def memory_seq_test_selectThreeItems( | |||||
) -> str: | |||||
seq = memory_seq_createContext() | |||||
seq.api = memory_api_createContext() | |||||
seq.api.playfieldSize = 2 | |||||
seq.api = memory_api_generateConstPlayfield(seq.api) | |||||
seq.itemsToSelect = [0, 1, 2] | |||||
seq = memory_seq_selectItems(seq) | |||||
# See if only one (last) item is selected now. | |||||
if ( | |||||
seq.api.recentField == "selectedItems" and | |||||
len(seq.api.selectedItems) == 1 and | |||||
seq.api.selectedItems[0] == 2 | |||||
): | |||||
return "OK: memory_seq_selectThreeItems" | |||||
#} | |||||
return "ERR: memory_seq_selectThreeItems" | |||||
#} | |||||
def memory_seq_test_selectTwoItems( | |||||
) -> str: | |||||
seq = memory_seq_createContext() | |||||
seq.api = memory_api_createContext() | |||||
seq.api.playfieldSize = 2 | |||||
seq.api = memory_api_generateConstPlayfield(seq.api) | |||||
seq.itemsToSelect = [0, 1] | |||||
seq = memory_seq_selectItems(seq) | |||||
# See if both items are selected now. | |||||
if ( | |||||
seq.api.recentField == "selectedItems" and | |||||
len(seq.api.selectedItems) == 2 and | |||||
seq.api.selectedItems[0] == 0 and | |||||
seq.api.selectedItems[1] == 1 | |||||
): | |||||
return "OK: memory_seq_selectTwoItems" | |||||
#} | |||||
return "ERR: memory_seq_selectTwoItems" | |||||
#} | |||||
@@ -1,231 +0,0 @@ | |||||
from entities import * | |||||
from llm import * | |||||
# Execute selections and verify | |||||
# | |||||
# Conditions: | |||||
# 1. Matching items have just been hidden and all items are hidden now | |||||
@llm_by_value | |||||
def memory_api_detectVictory( | |||||
c: MemoryContext | |||||
) -> MemoryContext: | |||||
# Test. | |||||
def test_memory_generateConstPlayfield( | |||||
) -> str: | |||||
c = memory_createEmptyContext() | |||||
c.playfieldSize = 2 | |||||
c = memory_generateConstPlayfield(c) | |||||
if ( | |||||
c.recentField == "playfieldItems" and | |||||
len(c.playfieldItems) == 4 and | |||||
c.playfieldItems[0] == 0 and | |||||
c.playfieldItems[1] == 0 and | |||||
c.playfieldItems[2] == 1 and | |||||
c.playfieldItems[3] == 1 | |||||
): | |||||
return "OK: memory_generateConstPlayfield" | |||||
#} | |||||
return "ERR: memory_generateConstPlayfield" | |||||
#} | |||||
def test_memory_selectItem( | |||||
) -> str: | |||||
c = memory_createEmptyContext() | |||||
c.playfieldSize = 2 | |||||
c = memory_generateConstPlayfield(c) | |||||
# Select the first item. | |||||
c.selectedId = 0 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
# See if it's in selectedItems now. | |||||
if ( | |||||
c.recentField == "selectedItems" and | |||||
len(c.selectedItems) == 1 and | |||||
c.selectedItems[0] == 0 | |||||
): | |||||
return "OK: selectItem" | |||||
#} | |||||
return "ERR: selectItem" | |||||
#} | |||||
def test_selectTwoItems( | |||||
) -> str: | |||||
c = memory_createEmptyContext() | |||||
c.playfieldSize = 2 | |||||
c = memory_generateConstPlayfield(c) | |||||
# Select the first two items. | |||||
c.selectedId = 0 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
c.selectedId = 1 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
# See if it's both items are selected now. | |||||
if ( | |||||
c.recentField == "selectedItems" and | |||||
len(c.selectedItems) == 2 and | |||||
c.selectedItems[0] == 0 and | |||||
c.selectedItems[1] == 1 | |||||
): | |||||
return "OK: selectTwoItems" | |||||
#} | |||||
return "ERR: selectTwoItems" | |||||
#} | |||||
def test_selectThreeItems( | |||||
) -> str: | |||||
c = memory_createEmptyContext() | |||||
c.playfieldSize = 2 | |||||
c = memory_generateConstPlayfield(c) | |||||
# Select three items. | |||||
c.selectedId = 0 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
c.selectedId = 1 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
c.selectedId = 2 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
# See if only one (last) item is selected now. | |||||
if ( | |||||
c.recentField == "selectedItems" and | |||||
len(c.selectedItems) == 1 and | |||||
c.selectedItems[0] == 2 | |||||
): | |||||
return "OK: selectThreeItems" | |||||
#} | |||||
return "ERR: selectThreeItems" | |||||
#} | |||||
def test_memory_hideMatchingItems( | |||||
) -> str: | |||||
c = memory_createEmptyContext() | |||||
c.playfieldSize = 2 | |||||
c = memory_generateConstPlayfield(c) | |||||
# Select two items of the same group. | |||||
c.selectedId = 0 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
c.selectedId = 1 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
# Hide matching items. | |||||
c = memory_hideMatchingItems(c) | |||||
# See if the two selected items match. | |||||
if ( | |||||
c.recentField == "hiddenItems" and | |||||
len(c.hiddenItems) == 2 and | |||||
c.hiddenItems[0] == 0 and | |||||
c.hiddenItems[1] == 1 | |||||
): | |||||
return "OK: memory_hideMatchingItems" | |||||
#} | |||||
return "ERR: memory_hideMatchingItems" | |||||
#} | |||||
def test_memory_deselectMismatchedItems( | |||||
) -> str: | |||||
c = memory_createEmptyContext() | |||||
c.playfieldSize = 2 | |||||
c = memory_generateConstPlayfield(c) | |||||
# Select two items of different groups. | |||||
c.selectedId = 0 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
c.selectedId = 2 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
# Detect mismatching. | |||||
c = memory_deselectMismatchedItems(c) | |||||
# See if the two selected items do not match. | |||||
if ( | |||||
c.recentField == "mismatchedItems" and | |||||
len(c.mismatchedItems) == 2 and | |||||
c.mismatchedItems[0] == 0 and | |||||
c.mismatchedItems[1] == 2 | |||||
): | |||||
return "OK: memory_deselectMismatchedItems" | |||||
#} | |||||
return "ERR: memory_deselectMismatchedItems" | |||||
#} | |||||
def test_memory_detectVictory( | |||||
) -> str: | |||||
c = memory_createEmptyContext() | |||||
c.playfieldSize = 2 | |||||
c = memory_generateConstPlayfield(c) | |||||
# Select the first two items of the same group. | |||||
c.selectedId = 0 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
c.selectedId = 1 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
# Hide the first pair. | |||||
c = memory_hideMatchingItems(c) | |||||
# Select the last two items of the same group. | |||||
c.selectedId = 2 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
c.selectedId = 3 | |||||
c.recentField = "selectedId" | |||||
c = memory_selectItem(c) | |||||
# Hide the second pair. | |||||
c = memory_hideMatchingItems(c) | |||||
# Detect victory. | |||||
c = memory_detectVictory(c) | |||||
# See if victory has been detected. | |||||
if ( | |||||
c.recentField == "victory" and | |||||
c.victory == True | |||||
): | |||||
return "OK: memory_detectVictory" | |||||
#} | |||||
return "ERR: memory_detectVictory" | |||||
#} | |||||
def test_passContextByValue( | |||||
) -> str: | |||||
c = memory_createEmptyContext() | |||||
c.playfieldSize = 2 | |||||
c = memory_generateConstPlayfield(c) | |||||
c.selectedId = 0 | |||||
c.recentField = "selectedId" | |||||
c1 = memory_selectItem(c) | |||||
c.selectedId = 1 | |||||
c.recentField = "selectedId" | |||||
c2 = memory_selectItem(c) | |||||
# See if c1 and c2 have different recentField. | |||||
if ( | |||||
c1.selectedId != c2.selectedId | |||||
): | |||||
return "OK: passContextByValue" | |||||
return "ERR: passContextByValue" | |||||
#} | |||||