from memory import *
from memory_Context import *

def memory_test_detectMismatchedItems(
) -> str:
  c = memory_createContext()
  c.playfieldSize = 2
  c.recentField = "playfieldSize"
  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_detectMismatchedItems(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_detectMismatchedItems"
  #}
  return "ERR: memory_detectMismatchedItems"
#}

def memory_test_detectMismatchedItems_itemTwice(
) -> str:
  c = memory_createContext()
  c.playfieldSize = 2
  c.recentField = "playfieldSize"
  c = memory_generateConstPlayfield(c)

  # Select the same item twice.
  c.selectedId = 0
  c.recentField = "selectedId"
  c = memory_selectItem(c)
  c.selectedId = 0
  c.recentField = "selectedId"
  c = memory_selectItem(c)

  # Detect mismatching.
  c = memory_detectMismatchedItems(c)

  # See if the two selected items do not match.
  if (
    c.recentField == "mismatchedItems" and
    len(c.mismatchedItems) == 1 and
    c.mismatchedItems[0] == 0
  ):
    return "OK: memory_detectMismatchedItems_itemTwice"
  #}
  return "ERR: memory_detectMismatchedItems_itemTwice"
#}

def memory_test_detectVictory(
) -> str:
  c = memory_createContext()
  c.playfieldSize = 2
  c.recentField = "playfieldSize"
  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 memory_test_generateConstPlayfield(
) -> str:
  c = memory_createContext()
  c.playfieldSize = 2
  c.recentField = "playfieldSize"
  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 memory_test_hideMatchingItems(
) -> str:
  c = memory_createContext()
  c.playfieldSize = 2
  c.recentField = "playfieldSize"
  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 memory_test_selectItem_1x(
) -> str:
  c = memory_createContext()
  c.playfieldSize = 2
  c.recentField = "playfieldSize"
  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: memory_selectItem_1x"
  #}
  return "ERR: memory_selectItem_1x"
#}

def memory_test_selectItem_2x(
) -> str:
  c = memory_createContext()
  c.playfieldSize = 2
  c.recentField = "playfieldSize"
  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 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: memory_selectItem_2x"
  #}
  return "ERR: memory_selectItem_2x"
#}

def memory_test_selectItem_3x(
) -> str:
  c = memory_createContext()
  c.playfieldSize = 2
  c.recentField = "playfieldSize"
  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: memory_selectItem_3x"
  #}
  return "ERR: memory_selectItem_3x"
#}
