Fix bug when removing test case keys
[anna.git] / source / testing / TestManager.cpp
index 87278f1..beb0d93 100644 (file)
@@ -287,6 +287,10 @@ TestCase *TestManager::findTestCase(unsigned int id) const { // id = -1 provides
 
 TestCase *TestManager::getTestCase(unsigned int id, const std::string &description) {
 
+  if (id == 0) { // 0 is used to sequence automatically and get the value of 'tests() + 1'
+    id = tests() + 1;
+  }
+
   test_pool_nc_it it = a_testPool.find(id);
   if (it != a_testPool.end()) return it->second;
 
@@ -295,6 +299,56 @@ TestCase *TestManager::getTestCase(unsigned int id, const std::string &descripti
   return result;
 }
 
+bool TestManager::clearTestCase(std::string &result, unsigned int id) {
+  result = "";
+
+  if (!tests()) {
+    result = "There are not programmed test cases to be removed";
+    return false;
+  }
+
+  test_pool_it it = ((id != -1) ? a_testPool.find(id) : a_currentTestIt);
+  if (it == a_testPool.end()) {
+    result = "Test case id provided not found";
+    return false;
+  }
+
+  if (!it->second->safeToClear()) {
+    result = "Test case id provided has running-thread steps. Check for stuck external procedures or try later.";
+    return false;
+  }
+
+  a_testPool.erase(it);
+
+  result = "Provided test case has been dropped";
+  bool something_removed = false;
+
+  auto key1_it = a_key1TestCaseMap.find(it->second->getKey1());
+  if (key1_it != a_key1TestCaseMap.end()) {
+    a_key1TestCaseMap.erase(key1_it);
+    result += " | Removed key1 = ";
+    result += it->second->getKey1();
+    something_removed = true;
+  }
+  auto key2_it = a_key2TestCaseMap.find(it->second->getKey2());
+  if (key2_it != a_key2TestCaseMap.end()) {
+    a_key2TestCaseMap.erase(key2_it);
+    result += " | Removed key2 = ";
+    result += it->second->getKey2();
+    something_removed = true;
+  }
+
+  if (something_removed) return true;
+
+  result = "Provided test case has been dropped, but key1 = '";
+  result += it->second->getKey1();
+  result += "' was not found, and also key2 = '";
+  result += it->second->getKey2();
+  result += "' was not found";
+
+  return false;
+}
+
 bool TestManager::clearPool(std::string &result) {
 
   result = "";