
#include <map>
#include <string>
#include <vector>
#include "ctx.h"
#include "llm.h"
#include "memory_Context.h"
#include "main.h"




std::string memory_test_detectMismatchedItems(
) {
  auto 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" &&
    c.mismatchedItems.size() == 2 &&
    c.mismatchedItems[0] == 0 &&
    c.mismatchedItems[1] == 2
  ) {
    return "OK: memory_detectMismatchedItems";
  }
  return "ERR: memory_detectMismatchedItems";
}




std::string memory_test_detectMismatchedItems_itemTwice(
) {
  auto 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" &&
    c.mismatchedItems.size() == 1 &&
    c.mismatchedItems[0] == 0
  ) {
    return "OK: memory_detectMismatchedItems_itemTwice";
  }
  return "ERR: memory_detectMismatchedItems_itemTwice";
}







std::string memory_test_detectVictory(
) {
  auto 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" &&
    c.victory == true
  ) {
    return "OK: memory_detectVictory";
  }
  return "ERR: memory_detectVictory";
}

std::string memory_test_generateConstPlayfield(
) {
  auto c = memory_createContext();
  c.playfieldSize = 2;
  c.recentField = "playfieldSize";
  c = memory_generateConstPlayfield(c);
  if (
    c.recentField == "playfieldItems" &&
    c.playfieldItems.size() == 4 &&
    c.playfieldItems[0] == 0 &&
    c.playfieldItems[1] == 0 &&
    c.playfieldItems[2] == 1 &&
    c.playfieldItems[3] == 1
  ) {
    return "OK: memory_generateConstPlayfield";
  }
  return "ERR: memory_generateConstPlayfield";
}




std::string memory_test_hideMatchingItems(
) {
  auto 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" &&
    c.hiddenItems.size() == 2 &&
    c.hiddenItems[0] == 0 &&
    c.hiddenItems[1] == 1
  ) {
    return "OK: memory_hideMatchingItems";
  }
  return "ERR: memory_hideMatchingItems";
}



std::string memory_test_selectItem_1x(
) {
  auto 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" &&
    c.selectedItems.size() == 1 &&
    c.selectedItems[0] == 0
  ) {
    return "OK: memory_selectItem_1x";
  }
  return "ERR: memory_selectItem_1x";
}



std::string memory_test_selectItem_2x(
) {
  auto 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" &&
    c.selectedItems.size() == 2 &&
    c.selectedItems[0] == 0 &&
    c.selectedItems[1] == 1
  ) {
    return "OK: memory_selectItem_2x";
  }
  return "ERR: memory_selectItem_2x";
}



std::string memory_test_selectItem_3x(
) {
  auto 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" &&
    c.selectedItems.size() == 1 &&
    c.selectedItems[0] == 2
  ) {
    return "OK: memory_selectItem_3x";
  }
  return "ERR: memory_selectItem_3x";
}

