Михаил Капелько 7 months ago
parent
commit
7f2dbfd65c
4 changed files with 643 additions and 156 deletions
  1. +195
    -9
      v4/cli.cpp
  2. +265
    -3
      v4/cli_test.cpp
  3. +58
    -43
      v4/memory.cpp
  4. +125
    -101
      v4/memory_test.cpp

+ 195
- 9
v4/cli.cpp View File

@@ -7,24 +7,172 @@
#include "memory_Context.h"
#include "shell.h"

// Exit
//
// Conditions:
// 1. `e`, `exit`, `q`, or `quit` was entered
// 2. Victory has just been reported
memory_Context cli_exit(
memory_Context c
) {
if (
c.recentField == "input" &&
(
c.input == "e" ||
c.input == "exit" ||
c.input == "q" ||
c.input == "quit"
)
) {
c.exit = true;
c.recentField = "exit";
return c;
}
if (
c.recentField == "outputVictory"
) {
c.exit = true;
c.recentField = "exit";
return c;
}
c.recentField = "none";
return c;
}

// Ask user to go on
//
// Conditions:
// 1. Items have just matched and there are still items left to select
memory_Context cli_goOn(
memory_Context c
) {
if (
c.recentField == "outputMatchedItems" &&
c.hiddenItems.size() != c.playfieldItems.size()
) {
c.outputGoOn = "Go on:";
c.recentField = "outputGoOn";
return c;
}
c.recentField = "none";
return c;
}

// Greet the user
cli_Context cli_greetUser(
cli_Context c
//
// Conditions:
// 1. Just launched
memory_Context cli_greetUser(
memory_Context c
) {
if (
c.recentField == "didLaunch" &&
c.didLaunch == true
) {
c.outputGreeting = "OGS Memory Command Line Interface";
c.recentField = "outputGreeting";
return c;
}
c.recentField = "none";
return c;
}

// Ask user to select second item to have a pair of selected items
//
// Conditions:
// 1. Single item has just been selected
memory_Context cli_promptSecondItemSelection(
memory_Context c
) {
c.outputGreeting = "OGS Memory Textual UI";
c.recentField = "outputGreeting";
if (
c.recentField == "selectedItems" &&
c.selectedItems.size() == 1
) {
c.outputPromptSelection = "Select the second item now:";
c.recentField = "outputPromptSelection";
return c;
}
c.recentField = "none";
return c;
}

// Report matched items
//
// Conditions:
// 1. Items were hidden (i.e., they matched)
memory_Context cli_reportMatchedItems(
memory_Context c
) {
if (
c.recentField == "hiddenItems"
) {
c.outputMatchedItems = "Items matched!";
c.recentField = "outputMatchedItems";
return c;
}
c.recentField = "none";
return c;
}

// Report victory
memory_Context cli_reportVictory(
memory_Context c
) {
if (
c.recentField == "victory"
) {
c.outputVictory = "VICTORY! The game is over now";
c.recentField = "outputVictory";
return c;
}
c.recentField = "none";
return c;
}

// Select item
//
// Conditions:
// 1. Id is digit
memory_Context cli_selectItem(
memory_Context c
) {
if (
c.recentField == "input" &&
c.input.isdigit()
) {
// CLI ids start with 1 while memory module has ids starting with 0
// Convert CLI id to memory id
c.selectedId = int(c.input) - 1;
c.recentField = "selectedId";
return c;
}
c.recentField = "none";
return c;
}

// Show help (aka commands)
cli_Context cli_showHelp(
cli_Context c
//
// Conditions:
// 1. Just launched
// 1. `h` or `help` was entered
memory_Context cli_showHelp(
memory_Context c
) {
if (
c.input == "h" ||
c.input == "help"
(
c.recentField == "didLaunch" &&
c.didLaunch == true
) ||
(
c.recentField == "input" &&
c.input == "h"
) ||
(
c.recentField == "input" &&
c.input == "help"
)
) {
c.outputHelp = "Commands:\n\te, exit, q, quit\n\t\tExit\n\th, help\n\t\tList commands\n";
c.outputHelp = "Commands:\n\te, exit, q, quit\n\t\tExit\n\th, help\n\t\tList commands\n\t1, 2, 3, ...\n\t\tSelect item\nEnter your choice:";
c.recentField = "outputHelp";
return c;
}
@@ -32,3 +180,41 @@ cli_Context cli_showHelp(
return c;
}

// Report mismatched items
memory_Context cli_reportMismatchedItems(
memory_Context c
) {
if (
c.recentField == "mismatchedItems"
) {
c.outputMismatchedItems = "Wrong! Try again:";
c.recentField = "outputMismatchedItems";
return c;
}
c.recentField = "none";
return c;
}

//// Report selection of invalid item ids
////
//// Conditions:
//// 1. Index out of bounds: less than minimum
//// 2. Index out of bounds: greater than maximum
//// 3. Item is already hidden
////@llm_by_value
////def cli_shouldReportInvalidItemSelection(
//// c: cli_Context
////) -> cli_Context:
//// if (
//// c.recentField == "cMemory" and
//// c.cMemory.recentField == "selectedItems" and
//// len(c.cMemory.selectedItems) == 1
//// ):
//// c.outputPromptSelection = "Select the second item now:"
//// c.recentField = "outputPromptSelection"
//// return c
//// //}
//// c.recentField = "none"
//// return c
//////}


+ 265
- 3
v4/cli_test.cpp View File

@@ -7,9 +7,135 @@
#include "memory_Context.h"
#include "shell.h"

std::string cli_test_exit_e(
) {
auto c = memory_createContext();
c.input = "e";
c.recentField = "input";
c = cli_exit(c);
if (
c.recentField == "exit"
) {
return "OK: cli_exit_e";
}
return "ERR: cli_exit_e";
}

std::string cli_test_exit_exit(
) {
auto c = memory_createContext();
c.input = "exit";
c.recentField = "input";
c = cli_exit(c);
if (
c.recentField == "exit"
) {
return "OK: cli_exit_exit";
}
return "ERR: cli_exit_e";
}




std::string cli_test_exit_victory(
) {
auto c = memory_createContext();
c.playfieldSize = 2;
c.recentField = "playfieldSize";
c = memory_generateConstPlayfield(c);
// Match the first pair of tiles.
c.input = "1";
c.recentField = "input";
c = cli_selectItem(c);
c = memory_selectItem(c);
c.input = "2";
c.recentField = "input";
c = cli_selectItem(c);
c = memory_selectItem(c);
c = memory_hideMatchingItems(c);
// Match the second pair of tiles.
c.input = "3";
c.recentField = "input";
c = cli_selectItem(c);
c = memory_selectItem(c);
c.input = "4";
c.recentField = "input";
c = cli_selectItem(c);
c = memory_selectItem(c);
c = memory_hideMatchingItems(c);
c = memory_detectVictory(c);
c = cli_reportVictory(c);
c = cli_exit(c);
if (
c.recentField == "exit"
) {
return "OK: cli_exit_victory";
}
return "ERR: cli_exit_victory";
}

std::string cli_test_exit_q(
) {
auto c = memory_createContext();
c.input = "q";
c.recentField = "input";
c = cli_exit(c);
if (
c.recentField == "exit"
) {
return "OK: cli_exit_q";
}
return "ERR: cli_exit_q";
}

std::string cli_test_exit_quit(
) {
auto c = memory_createContext();
c.input = "quit";
c.recentField = "input";
c = cli_exit(c);
if (
c.recentField == "exit"
) {
return "OK: cli_exit_quit";
}
return "ERR: cli_exit_quit";
}



std::string cli_test_goOn(
) {
auto c = memory_createContext();
c.playfieldSize = 2;
c.recentField = "playfieldSize";
c = memory_generateConstPlayfield(c);
// Match the first pair of items.
c.input = "1";
c.recentField = "input";
c = cli_selectItem(c);
c = memory_selectItem(c);
c.input = "2";
c.recentField = "input";
c = cli_selectItem(c);
c = memory_selectItem(c);
c = memory_hideMatchingItems(c);
c = cli_reportMatchedItems(c);
c = cli_goOn(c);
if (
c.recentField == "outputGoOn"
) {
return "OK: cli_goOn";
}
return "ERR: cli_goOn";
}

std::string cli_test_greetUser(
) {
auto c = cli_createContext();
auto c = memory_createContext();
c.didLaunch = true;
c.recentField = "didLaunch";
c = cli_greetUser(c);
if (
c.recentField == "outputGreeting"
@@ -19,10 +145,90 @@ std::string cli_test_greetUser(
return "ERR: cli_greetUser";
}

std::string cli_test_promptSecondItemSelection(
) {
auto c = memory_createContext();
c.input = "1";
c.recentField = "input";
c = cli_selectItem(c);
c = memory_selectItem(c);
c = cli_promptSecondItemSelection(c);
if (
c.recentField == "outputPromptSelection"
) {
return "OK: cli_promptSecondItemSelection";
}
return "ERR: cli_promptSecondItemSelection";
}

std::string cli_test_reportMatchedItems(
) {
auto c = memory_createContext();
c.playfieldSize = 2;
c.recentField = "playfieldSize";
c = memory_generateConstPlayfield(c);
c.input = "1";
c.recentField = "input";
c = cli_selectItem(c);
c = memory_selectItem(c);
c.input = "2";
c.recentField = "input";
c = cli_selectItem(c);
c = memory_selectItem(c);
c = memory_hideMatchingItems(c);
c = cli_reportMatchedItems(c);
if (
c.recentField == "outputMatchedItems"
) {
return "OK: cli_reportMatchedItems";
}
return "ERR: cli_reportMatchedItems";
}

std::string cli_test_reportMismatchedItems(
) {
auto c = memory_createContext();
c.playfieldSize = 2;
c.recentField = "playfieldSize";
c = memory_generateConstPlayfield(c);
c.input = "1";
c.recentField = "input";
c = cli_selectItem(c);
c = memory_selectItem(c);
c.input = "3";
c.recentField = "input";
c = cli_selectItem(c);
c = memory_selectItem(c);
c = memory_detectMismatchedItems(c);
c = cli_reportMismatchedItems(c);
if (
c.recentField == "outputMismatchedItems"
) {
return "OK: cli_reportMismatchedItems";
}
return "ERR: cli_reportMismatchedItems";
}

std::string cli_test_selectItem(
) {
auto c = memory_createContext();
c.input = "1";
c.recentField = "input";
c = cli_selectItem(c);
if (
c.recentField == "selectedId" &&
c.selectedId == 0
) {
return "OK: cli_selectItem";
}
return "ERR: cli_selectItem";
}

std::string cli_test_showHelp_h(
) {
auto c = cli_createContext();
auto c = memory_createContext();
c.input = "h";
c.recentField = "input";
c = cli_showHelp(c);
if (
c.recentField == "outputHelp"
@@ -34,8 +240,9 @@ std::string cli_test_showHelp_h(

std::string cli_test_showHelp_help(
) {
auto c = cli_createContext();
auto c = memory_createContext();
c.input = "help";
c.recentField = "input";
c = cli_showHelp(c);
if (
c.recentField == "outputHelp"
@@ -45,3 +252,58 @@ std::string cli_test_showHelp_help(
return "ERR: cli_showHelp_help";
}




std::string cli_test_reportVictory(
) {
auto c = memory_createContext();
c.playfieldSize = 2;
c.recentField = "playfieldSize";
c = memory_generateConstPlayfield(c);
// Match the first pair of tiles.
c.input = "1";
c.recentField = "input";
c = cli_selectItem(c);
c = memory_selectItem(c);
c.input = "2";
c.recentField = "input";
c = cli_selectItem(c);
c = memory_selectItem(c);
c = memory_hideMatchingItems(c);
// Match the second pair of tiles.
c.input = "3";
c.recentField = "input";
c = cli_selectItem(c);
c = memory_selectItem(c);
c.input = "4";
c.recentField = "input";
c = cli_selectItem(c);
c = memory_selectItem(c);
c = memory_hideMatchingItems(c);
c = memory_detectVictory(c);
c = cli_reportVictory(c);
if (
c.recentField == "outputVictory"
) {
return "OK: cli_reportVictory";
}
return "ERR: cli_reportVictory";
}

//def cli_test_shouldReportIvalidItemSelection_outOfBoundsMin(
//) -> str:
// c = cli_createContext()
// c.cMemory = memory_createContext()
// c.input = "0"
// c = cli_selectItem(c)
// c = cli_shouldReportInvalidItemSelection(c)
// if (
// c.recentField == "outputInvalidItemSelection"
// ):
// return "OK: cli_shouldReportInvalidItemSelection"
// //}
// return "ERR: cli_shouldReportInvalidItemSelection"
////}
//


+ 58
- 43
v4/memory.cpp View File

@@ -7,52 +7,13 @@
#include "memory_Context.h"
#include "shell.h"

////////////////
// Client initiated input
////////////////

// Generate constant playfield
memory_Context memory_generateConstPlayfield(
memory_Context c
) {
std::map<int, int> idGroups = { };
auto id = 0;
for (auto gid = 0; gid < c.playfieldSize; ++gid) {
idGroups[id] = gid;
id += 1;
idGroups[id] = gid;
id += 1;
}
c.playfieldItems = idGroups;
c.recentField = "playfieldItems";
return c;
}

// Select item
memory_Context memory_selectItem(
memory_Context c
) {
if (
c.selectedItems.size() == 2
) {
c.selectedItems.clear();
}
c.selectedItems.push_back(c.selectedId);
c.recentField = "selectedItems";
return c;
}

////////////////
// System initiated reaction
////////////////

// Deselect mismatched items
// Detect mismatched items
//
// Conditions:
// 0. Two items has just been selected
// 1. The same item has been selected twice
// 2. Selected items are of different groups
memory_Context memory_shouldDeselectMismatchedItems(
memory_Context memory_detectMismatchedItems(
memory_Context c
) {
if (!(
@@ -87,7 +48,7 @@ memory_Context memory_shouldDeselectMismatchedItems(
//
// Conditions:
// 1. Matching items have just been hidden and all items are hidden now
memory_Context memory_shouldDetectVictory(
memory_Context memory_detectVictory(
memory_Context c
) {
if (
@@ -102,11 +63,40 @@ memory_Context memory_shouldDetectVictory(
return c;
}

// Generate constant playfield
//
// Conditions:
// 1. Size has just been specified
//
// Both ids and group ids start with 0

memory_Context memory_generateConstPlayfield(
memory_Context c
) {
if (!(
c.recentField == "playfieldSize"
)) {
c.recentField = "none";
return c;
}
std::map<int, int> idGroups = { };
auto id = 0;
for (auto gid = 0; gid < c.playfieldSize; ++gid) {
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
memory_Context memory_shouldHideMatchingItems(
memory_Context memory_hideMatchingItems(
memory_Context c
) {
if (
@@ -123,3 +113,28 @@ memory_Context memory_shouldHideMatchingItems(
return c;
}

// Select item
//
// Conditions:
// 1. Id has just been specified for selection

memory_Context memory_selectItem(
memory_Context c
) {
if (!(
c.recentField == "selectedId"
)) {
c.recentField = "none";
return c;
}
if (
c.selectedItems.size() == 2
) {
c.selectedItems.clear();
}
c.selectedItems.push_back(c.selectedId);
c.recentField = "selectedItems";
return c;
}



+ 125
- 101
v4/memory_test.cpp View File

@@ -7,208 +7,232 @@
#include "memory_Context.h"
#include "shell.h"

std::string memory_test_generateConstPlayfield(



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 == "playfieldItems" &&
c.playfieldItems.size() == 4 &&
c.playfieldItems[0] == 0 &&
c.playfieldItems[1] == 0 &&
c.playfieldItems[2] == 1 &&
c.playfieldItems[3] == 1
c.recentField == "mismatchedItems" &&
c.mismatchedItems.size() == 2 &&
c.mismatchedItems[0] == 0 &&
c.mismatchedItems[1] == 2
) {
return "OK: memory_generateConstPlayfield";
return "OK: memory_detectMismatchedItems";
}
return "ERR: memory_generateConstPlayfield";
return "ERR: memory_detectMismatchedItems";
}



std::string memory_test_selectItem_1x(

std::string memory_test_detectMismatchedItems_itemTwice(
) {
auto c = memory_createContext();
c.playfieldSize = 2;
c.recentField = "playfieldSize";
c = memory_generateConstPlayfield(c);
// Select the first item.
// Select the same item twice.
c.selectedId = 0;
c.recentField = "selectedId";
c = memory_selectItem(c);
// See if it's in selectedItems now.
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 == "selectedItems" &&
c.selectedItems.size() == 1 &&
c.selectedItems[0] == 0
c.recentField == "mismatchedItems" &&
c.mismatchedItems.size() == 1 &&
c.mismatchedItems[0] == 0
) {
return "OK: memory_selectItem_1x";
return "OK: memory_detectMismatchedItems_itemTwice";
}
return "ERR: memory_selectItem_1x";
return "ERR: memory_detectMismatchedItems_itemTwice";
}



std::string memory_test_selectItem_2x(




std::string memory_test_detectVictory(
) {
auto c = memory_createContext();
c.playfieldSize = 2;
c.recentField = "playfieldSize";
c = memory_generateConstPlayfield(c);
// Select the first two items.
// 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);
// See if both items are selected now.
// 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 == "selectedItems" &&
c.selectedItems.size() == 2 &&
c.selectedItems[0] == 0 &&
c.selectedItems[1] == 1
c.recentField == "victory" &&
c.victory == true
) {
return "OK: memory_selectItem_2x";
return "OK: memory_detectVictory";
}
return "ERR: memory_selectItem_2x";
return "ERR: memory_detectVictory";
}



std::string memory_test_selectItem_3x(
std::string memory_test_generateConstPlayfield(
) {
auto c = memory_createContext();
c.playfieldSize = 2;
c.recentField = "playfieldSize";
c = memory_generateConstPlayfield(c);
// Select three items.
c.selectedId = 0;
c = memory_selectItem(c);
c.selectedId = 1;
c = memory_selectItem(c);
c.selectedId = 2;
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
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_selectItem_3x";
return "OK: memory_generateConstPlayfield";
}
return "ERR: memory_selectItem_3x";
return "ERR: memory_generateConstPlayfield";
}




std::string memory_test_shouldDeselectMismatchedItems(
std::string memory_test_hideMatchingItems(
) {
auto c = memory_createContext();
c.playfieldSize = 2;
c.recentField = "playfieldSize";
c = memory_generateConstPlayfield(c);
// Select two items of different groups.
// Select two items of the same group.
c.selectedId = 0;
c.recentField = "selectedId";
c = memory_selectItem(c);
c.selectedId = 2;
c.selectedId = 1;
c.recentField = "selectedId";
c = memory_selectItem(c);
// Detect mismatching.
c = memory_shouldDeselectMismatchedItems(c);
// See if the two selected items do not match.
// Hide matching items.
c = memory_hideMatchingItems(c);
// See if the two selected items match.
if (
c.recentField == "mismatchedItems" &&
c.mismatchedItems.size() == 2 &&
c.mismatchedItems[0] == 0 &&
c.mismatchedItems[1] == 2
c.recentField == "hiddenItems" &&
c.hiddenItems.size() == 2 &&
c.hiddenItems[0] == 0 &&
c.hiddenItems[1] == 1
) {
return "OK: memory_shouldDeselectMismatchedItems";
return "OK: memory_hideMatchingItems";
}
return "ERR: memory_shouldDeselectMismatchedItems";
return "ERR: memory_hideMatchingItems";
}




std::string memory_test_shouldDeselectMismatchedItems_itemTwice(
std::string memory_test_selectItem_1x(
) {
auto c = memory_createContext();
c.playfieldSize = 2;
c.recentField = "playfieldSize";
c = memory_generateConstPlayfield(c);
// Select the same item twice.
c.selectedId = 0;
c = memory_selectItem(c);
// Select the first item.
c.selectedId = 0;
c.recentField = "selectedId";
c = memory_selectItem(c);
// Detect mismatching.
c = memory_shouldDeselectMismatchedItems(c);
// See if the two selected items do not match.
// See if it's in selectedItems now.
if (
c.recentField == "mismatchedItems" &&
c.mismatchedItems.size() == 1 &&
c.mismatchedItems[0] == 0
c.recentField == "selectedItems" &&
c.selectedItems.size() == 1 &&
c.selectedItems[0] == 0
) {
return "OK: memory_shouldDeselectMismatchedItems_itemTwice";
return "OK: memory_selectItem_1x";
}
return "ERR: memory_shouldDeselectMismatchedItems_itemTwice";
return "ERR: memory_selectItem_1x";
}







std::string memory_test_shouldDetectVictory(
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 of the same group.
// 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);
// Hide the first pair.
c = memory_shouldHideMatchingItems(c);
// Select the last two items of the same group.
c.selectedId = 2;
c = memory_selectItem(c);
c.selectedId = 3;
c = memory_selectItem(c);
// Hide the second pair.
c = memory_shouldHideMatchingItems(c);
// Detect victory.
c = memory_shouldDetectVictory(c);
// See if victory has been detected.
// See if both items are selected now.
if (
c.recentField == "victory" &&
c.victory == true
c.recentField == "selectedItems" &&
c.selectedItems.size() == 2 &&
c.selectedItems[0] == 0 &&
c.selectedItems[1] == 1
) {
return "OK: memory_shouldDetectVictory";
return "OK: memory_selectItem_2x";
}
return "ERR: memory_shouldDetectVictory";
return "ERR: memory_selectItem_2x";
}




std::string memory_test_shouldHideMatchingItems(
std::string memory_test_selectItem_3x(
) {
auto c = memory_createContext();
c.playfieldSize = 2;
c.recentField = "playfieldSize";
c = memory_generateConstPlayfield(c);
// Select two items of the same group.
// Select three items.
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_shouldHideMatchingItems(c);
// See if the two selected items match.
c.selectedId = 2;
c.recentField = "selectedId";
c = memory_selectItem(c);
// See if only one (last) item is selected now.
if (
c.recentField == "hiddenItems" &&
c.hiddenItems.size() == 2 &&
c.hiddenItems[0] == 0 &&
c.hiddenItems[1] == 1
c.recentField == "selectedItems" &&
c.selectedItems.size() == 1 &&
c.selectedItems[0] == 2
) {
return "OK: memory_shouldHideMatchingItems";
return "OK: memory_selectItem_3x";
}
return "ERR: memory_shouldHideMatchingItems";
return "ERR: memory_selectItem_3x";
}


Loading…
Cancel
Save