Basic stat summary for testcases
[anna.git] / example / diameter / launcher / testing / TestCase.cpp
index e95a670..3d91f32 100644 (file)
@@ -11,8 +11,6 @@
 #include <fstream>
 #include <sstream>
 #include <cmath>
-#include <iterator>
-#include <vector>
 #include <iostream>
 
 // Project
@@ -30,6 +28,7 @@
 #include <TestManager.hpp>
 
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
 void TestCase::DebugSummary::addHint(const std::string &hint) throw() {
   event_t event;
   event.Timestamp = anna::functions::millisecond();
@@ -53,12 +52,24 @@ anna::xml::Node* TestCase::DebugSummary::asXML(anna::xml::Node* parent) const th
 
   return result;
 };
+///////////////////////////////////////////////////////////////////////////////////////////////////
 
 
+TestCase::TestCase(unsigned int id) :
+    a_id(id),
+    a_state(State::Initialized),
+    a_startTime(0),
+    a_interactiveAmount(-1) {
+
+  /*a_stepsIt = a_steps.end()*/;
+  TestManager &testManager = TestManager::instantiate();
+  testManager.tcsStateStats(State::Initialized, State::Initialized);
+}
+
 TestCase::~TestCase() {
   reset(true); // hard reset
-  std::map<int/* step number*/, TestStep*>::const_iterator it;
-  for (it = a_steps.begin(); it != a_steps.end(); it++) delete (it->second);
+  std::vector<TestStep*>::const_iterator it;
+  for (it = a_steps.begin(); it != a_steps.end(); it++) delete (*it);
 }
 
 const char* TestCase::asText(const State::_v state)
@@ -77,9 +88,9 @@ throw() {
   int steps = a_steps.size();
   if (steps != 0) {
     result->createAttribute("NumberOfTestSteps", steps);
-    std::map<int/* step number*/, TestStep*>::const_iterator it;
+    std::vector<TestStep*>::const_iterator it;
     for (it = a_steps.begin(); it != a_steps.end(); it++) {
-      it->second->asXML(result);
+      (*it)->asXML(result);
     }
   }
 
@@ -98,11 +109,11 @@ std::string TestCase::asXMLString() const throw() {
 }
 
 bool TestCase::hasSameCondition(const TestCondition &condition) const throw() {
-  std::map<int/* step number*/, TestStep*>::const_iterator it;
+  std::vector<TestStep*>::const_iterator it;
   TestStepWait *step;
   for (it = a_steps.begin(); it != a_steps.end(); it++) {
-    if (it->second->getType() != TestStep::Type::Wait) continue;
-    step = (TestStepWait *)(it->second);
+    if ((*it)->getType() != TestStep::Type::Wait) continue;
+    step = (TestStepWait *)(*it);
     if (step->getCondition() == condition) return true;
   }
   return false;
@@ -115,6 +126,11 @@ void TestCase::setState(const State::_v &state) throw() {
   if (state == previousState) return;
   a_state = state;
   TestManager &testManager = TestManager::instantiate();
+
+  // stats:
+  testManager.tcsStateStats(previousState, state);
+
+
   if (isFinished()) {
     if (!testManager.getDumpReports()) return;
     // report file name: cycle-<cycle id>.testcase-<test case id>.xml
@@ -142,14 +158,6 @@ void TestCase::setState(const State::_v &state) throw() {
       out.close();
     }
   }
-
-  // Count in-progress test cases:
-  if (inProgress()) {
-    testManager.setInProgressCountDelta(1);
-  }
-  else if (previousState == State::InProgress){
-    testManager.setInProgressCountDelta(-1);
-  }
 }
 
 bool TestCase::done() throw() {
@@ -162,7 +170,7 @@ bool TestCase::done() throw() {
 }
 
 bool TestCase::process() throw() {
-  if (a_steps.size() == 0) {
+  if (steps() == 0) {
     LOGWARNING(anna::Logger::warning(anna::functions::asString("Test case %llu is empty, nothing to execute", a_id), ANNA_FILE_LOCATION));
     return false;
   }
@@ -183,7 +191,7 @@ bool TestCase::process() throw() {
   if (done()) return false;
 
   bool somethingDone = false;
-  while (a_stepsIt->second->execute()) { // executes returns 'true' if the next step must be also executed (execute until can't stand no more)
+  while ((*a_stepsIt)->execute()) { // executes returns 'true' if the next step must be also executed (execute until can't stand no more)
     nextStep();
     // Check end of the test case:
     if (done()) return false;
@@ -200,9 +208,9 @@ bool TestCase::reset(bool hard) throw() {
 
   // Clean stage ////////////////////////////
   // id is kept
-  std::map<int/* step number*/, TestStep*>::iterator it;
+  std::vector<TestStep*>::iterator it;
   for (it = a_steps.begin(); it != a_steps.end(); it++)
-    it->second->reset();
+    (*it)->reset();
 
   a_debugSummary.clear();
   a_startTime = 0;
@@ -367,10 +375,10 @@ void TestCase::addCommand(const std::string &cmd) throw(anna::RuntimeException)
 TestStepWait *TestCase::searchNextWaitConditionFulfilled(const anna::DataBlock &message, bool waitFromEntity) throw() {
 
   TestStepWait *result;
-  for (std::map<int/* step number*/, TestStep*>::const_iterator it = a_stepsIt /* current */; it != a_steps.end(); it++) {
-    if (it->second->getType() != TestStep::Type::Wait) continue;
-    if (it->second->isCompleted()) continue;
-    result = (TestStepWait*)(it->second);
+  for (std::vector<TestStep*>::const_iterator it = a_stepsIt /* current */; it != a_steps.end(); it++) {
+    if ((*it)->getType() != TestStep::Type::Wait) continue;
+    if ((*it)->isCompleted()) continue;
+    result = (TestStepWait*)(*it);
     if ((result->getCondition().receivedFromEntity() == waitFromEntity) && (result->fulfilled(message)))
       return result;
   }
@@ -379,7 +387,7 @@ TestStepWait *TestCase::searchNextWaitConditionFulfilled(const anna::DataBlock &
 }
 
 const TestStep *TestCase::getStep(int stepNumber) const throw() {
-  std::map<int/* step number*/, TestStep*>::const_iterator it = a_steps.find(stepNumber);
-  if (it != a_steps.end()) return it->second;
-  return NULL;
+  if (stepNumber < 1 || stepNumber > steps()) return NULL;
+//  return a_steps.at(stepNumber-1);  // http://stackoverflow.com/questions/3269809/stdvectorat-vs-operator-surprising-results-5-to-10-times-slower-f
+  return a_steps[stepNumber-1];
 }