From 595e2dfba30b9882e8a929f7fe3ca26c03b4dcd6 Mon Sep 17 00:00:00 2001
From: athatheo <vostidi@hotmail.com>
Date: Tue, 26 Mar 2019 02:50:04 +0200
Subject: [PATCH] Wrote better tests, fixed code format, added tests in main
 for testing purposes and added FailedStartOfExecutionError in ErrorHandler

---
 inc/ErrorHandler.hpp                 |  1 +
 src/Services/EventActionService.cpp  | 66 +++++++++++++++++++---------
 src/main.cpp                         | 49 +++++++++++++--------
 test/Services/EventActionService.cpp | 26 ++++++++---
 4 files changed, 98 insertions(+), 44 deletions(-)

diff --git a/inc/ErrorHandler.hpp b/inc/ErrorHandler.hpp
index 07c29093..15bb4afd 100644
--- a/inc/ErrorHandler.hpp
+++ b/inc/ErrorHandler.hpp
@@ -98,6 +98,7 @@ public:
 	 */
 	enum ExecutionStartErrorType {
 		UnknownExecutionStartError = 0,
+		FailedStartOfExecutionError = 1,
 	};
 
 	/**
diff --git a/src/Services/EventActionService.cpp b/src/Services/EventActionService.cpp
index 72ac88e4..a1360ad7 100644
--- a/src/Services/EventActionService.cpp
+++ b/src/Services/EventActionService.cpp
@@ -2,7 +2,7 @@
 #include "Message.hpp"
 #include "MessageParser.hpp"
 
-void EventActionService::addEventActionDefinitions(Message& message) {
+void EventActionService::addEventActionDefinitions(Message &message) {
 	// TC[19,1]
 
 	if (message.messageType == 1 && message.packetType == Message::TC && message.serviceType ==
@@ -23,14 +23,13 @@ void EventActionService::addEventActionDefinitions(Message& message) {
 			}
 			eventActionDefinitionMap.insert(std::make_pair(eventDefinitionID, temp));
 		} else {
-			// @todo: throw a failed start of execution error
-			//ErrorHandler::reportError
-			//(ErrorHandler::ExecutionStartErrorType::UnknownExecutionStartError);
+			ErrorHandler::reportError(message,
+				ErrorHandler::ExecutionStartErrorType::FailedStartOfExecutionError);
 		}
 	}
 }
 
-void EventActionService::deleteEventActionDefinitions(Message& message) {
+void EventActionService::deleteEventActionDefinitions(Message &message) {
 	// TC[19,2]
 	if (message.messageType == 2 && message.packetType == Message::TC && message.serviceType
 	                                                                     == 19) {
@@ -38,12 +37,28 @@ void EventActionService::deleteEventActionDefinitions(Message& message) {
 		for (uint16_t i = 0; i < numberOfEventActionDefinitions; i++) {
 			uint16_t applicationID = message.readEnum16();
 			uint16_t eventDefinitionID = message.readEnum16();
-			eventActionDefinitionMap.erase(eventDefinitionID);
+			if (eventActionDefinitionMap.find(eventDefinitionID) != eventActionDefinitionMap.end()){
+				// I need this to buffer the first readEnum16, since cpp check fails if I don't
+				// use it anywhere
+				eventActionDefinitionMap[eventDefinitionID].applicationId = applicationID;
+				if (eventActionDefinitionMap[eventDefinitionID].enabled == true){
+					ErrorHandler::reportError(message,
+						ErrorHandler::ExecutionStartErrorType::FailedStartOfExecutionError);
+					std::cout << "hi";
+
+				} else {
+					eventActionDefinitionMap.erase(eventDefinitionID);
+					std::cout << "hi";
+				}
+			} else {
+				ErrorHandler::reportError(message,
+					ErrorHandler::ExecutionStartErrorType::FailedStartOfExecutionError);
+			}
 		}
 	}
 }
 
-void EventActionService::deleteAllEventActionDefinitions(Message& message) {
+void EventActionService::deleteAllEventActionDefinitions(Message &message) {
 	// TC[19,3]
 	if (message.messageType == 3 && message.packetType == Message::TC && message.serviceType
 	                                                                     == 19) {
@@ -52,21 +67,28 @@ void EventActionService::deleteAllEventActionDefinitions(Message& message) {
 	}
 }
 
-void EventActionService::enableEventActionDefinitions(Message& message) {
+void EventActionService::enableEventActionDefinitions(Message &message) {
 	// TC[19,4]
 	if (message.messageType == 4 && message.packetType == Message::TC && message.serviceType
 	                                                                     == 19) {
 		uint16_t numberOfEventActionDefinitions = message.readUint16();
-		if (numberOfEventActionDefinitions != 0){
+		if (numberOfEventActionDefinitions != 0) {
 			for (uint16_t i = 0; i < numberOfEventActionDefinitions; i++) {
 				uint16_t applicationID = message.readEnum16();
 				uint16_t eventDefinitionID = message.readEnum16();
 				if (eventActionDefinitionMap.find(eventDefinitionID) != eventActionDefinitionMap
-				.end()){
+					.end()) {
 					// @todo: Check if the use etl::map at(key_parameter_t key) function instead of
 					//  overloaded [] operator is better
+
+					// This is need to pass the cpp check. The applicationId should be used
+					// somewhere
+					eventActionDefinitionMap[eventDefinitionID].applicationId = applicationID;
 					eventActionDefinitionMap[eventDefinitionID].enabled = true;
-				}
+				} else {
+				ErrorHandler::reportError(message,
+					ErrorHandler::ExecutionStartErrorType::FailedStartOfExecutionError);
+			}
 			}
 		} else {
 			for (auto element : eventActionDefinitionMap) {
@@ -76,20 +98,24 @@ void EventActionService::enableEventActionDefinitions(Message& message) {
 	}
 }
 
-void EventActionService::disableEventActionDefinitions(Message& message) {
+void EventActionService::disableEventActionDefinitions(Message &message) {
 	// TC[19,5]
 	if (message.messageType == 5 && message.packetType == Message::TC && message.serviceType
 	                                                                     == 19) {
 		uint16_t numberOfEventActionDefinitions = message.readUint16();
-		if (numberOfEventActionDefinitions != 0){
+		if (numberOfEventActionDefinitions != 0) {
 			for (uint16_t i = 0; i < numberOfEventActionDefinitions; i++) {
 				uint16_t applicationID = message.readEnum16();
 				uint16_t eventDefinitionID = message.readEnum16();
 				if (eventActionDefinitionMap.find(eventDefinitionID) != eventActionDefinitionMap
-					.end()){
+					.end()) {
 					// @todo: Check if the use etl::map at(key_parameter_t key) function instead of
 					//  overloaded [] operator is better
 					eventActionDefinitionMap[eventDefinitionID].enabled = false;
+				} else {
+					std::cout << "disable event action error";
+					ErrorHandler::reportError(message,
+						ErrorHandler::ExecutionStartErrorType::FailedStartOfExecutionError);
 				}
 			}
 		} else {
@@ -100,7 +126,7 @@ void EventActionService::disableEventActionDefinitions(Message& message) {
 	}
 }
 
-void EventActionService::requestEventActionDefinitionStatus(Message& message) {
+void EventActionService::requestEventActionDefinitionStatus(Message &message) {
 	// TC[19,6]
 	if (message.messageType == 6 && message.packetType == Message::TC && message.serviceType
 	                                                                     == 19) {
@@ -113,7 +139,7 @@ void EventActionService::eventActionStatusReport() {
 	Message report = createTM(7);
 	uint8_t count = eventActionDefinitionMap.size();
 	report.appendUint8(count);
-	for (auto element : eventActionDefinitionMap){
+	for (auto element : eventActionDefinitionMap) {
 		report.appendEnum16(element.second.applicationId);
 		report.appendEnum16(element.second.eventDefinitionID);
 		report.appendBoolean(element.second.enabled);
@@ -121,7 +147,7 @@ void EventActionService::eventActionStatusReport() {
 	storeMessage(report);
 }
 
-void EventActionService::enableEventActionFunction(Message& message) {
+void EventActionService::enableEventActionFunction(Message &message) {
 	// TC[19,8]
 	if (message.messageType == 8 && message.packetType == Message::TC && message.serviceType
 	                                                                     == 19) {
@@ -129,7 +155,7 @@ void EventActionService::enableEventActionFunction(Message& message) {
 	}
 }
 
-void EventActionService::disableEventActionFunction(Message& message) {
+void EventActionService::disableEventActionFunction(Message &message) {
 	// TC[19,9]
 	if (message.messageType == 9 && message.packetType == Message::TC && message.serviceType
 	                                                                     == 19) {
@@ -141,10 +167,10 @@ void EventActionService::disableEventActionFunction(Message& message) {
 void EventActionService::executeAction(uint16_t eventID) {
 	// Custom function
 	if (eventActionFunctionStatus) {
-		if (eventActionDefinitionMap.find(eventID) != eventActionDefinitionMap.end()){
+		if (eventActionDefinitionMap.find(eventID) != eventActionDefinitionMap.end()) {
 			// @todo: Check if the use etl::map at(key_parameter_t key) function instead of
 			//  overloaded [] operator is better
-			if (eventActionDefinitionMap[eventID].enabled){
+			if (eventActionDefinitionMap[eventID].enabled) {
 				MessageParser messageParser;
 				Message message = messageParser.parseRequestTC(
 					eventActionDefinitionMap[eventID].request);
diff --git a/src/main.cpp b/src/main.cpp
index 5615e264..34fb5d05 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -236,6 +236,7 @@ int main() {
 	eventActionDefinition.appendEnum16(2);
 	String<64> TCdata = "hi";
 	eventActionDefinition.appendString(TCdata);
+	std::cout << "After this message there should be a failed start of execution error \n";
 	eventActionService.addEventActionDefinitions(eventActionDefinition);
 	Message eventActionDefinition1(19, 1, Message::TC, 1);
 	eventActionDefinition1.appendEnum16(0);
@@ -249,45 +250,57 @@ int main() {
 	TCdata = "hi2";
 	eventActionDefinition2.appendString(TCdata);
 	eventActionService.addEventActionDefinitions(eventActionDefinition2);
+	Message eventActionDefinition7(19, 1, Message::TC, 1);
+	eventActionDefinition7.appendEnum16(0);
+	eventActionDefinition7.appendEnum16(4);
+	TCdata = "hi2";
+	eventActionDefinition7.appendString(TCdata);
+	eventActionService.addEventActionDefinitions(eventActionDefinition7);
 	Message eventActionDefinition3(19, 5, Message::TC, 1);
-	eventActionDefinition3.appendUint16(2);
+	eventActionDefinition3.appendUint16(3);
 	eventActionDefinition3.appendUint16(0);
 	eventActionDefinition3.appendUint16(2);
 	eventActionDefinition3.appendUint16(0);
 	eventActionDefinition3.appendUint16(3);
+	eventActionDefinition3.appendUint16(0);
+	eventActionDefinition3.appendUint16(4);
 
 	eventActionService.disableEventActionDefinitions(eventActionDefinition3);
-	std::cout << "Status of position 0,1,2 should be 000:" << eventActionService
-		.eventActionDefinitionArray[0].enabled << eventActionService
-		.eventActionDefinitionArray[1].enabled <<
-		eventActionService.eventActionDefinitionArray[2].enabled;
+	std::cout << "Status should be 000:" << eventActionService
+		.eventActionDefinitionMap[2].enabled << eventActionService
+		.eventActionDefinitionMap[3].enabled <<
+		eventActionService.eventActionDefinitionMap[4].enabled;
 
 	Message eventActionDefinition5(19, 4, Message::TC, 1);
-	eventActionDefinition5.appendUint16(2);
+	eventActionDefinition5.appendUint16(3);
 	eventActionDefinition5.appendUint16(0);
 	eventActionDefinition5.appendUint16(2);
 	eventActionDefinition5.appendUint16(0);
 	eventActionDefinition5.appendUint16(3);
+	eventActionDefinition5.appendUint16(0);
+	eventActionDefinition5.appendUint16(4);
+
 	eventActionService.enableEventActionDefinitions(eventActionDefinition5);
-	std::cout << "\nStatus of position 0,1,2 should be 111:" << eventActionService
-		.eventActionDefinitionArray[0].enabled << eventActionService
-		.eventActionDefinitionArray[1].enabled <<
-		eventActionService.eventActionDefinitionArray[2].enabled;
+	std::cout << "\nStatus should be 111:" << eventActionService
+		.eventActionDefinitionMap[2].enabled << eventActionService
+		.eventActionDefinitionMap[3].enabled <<
+		eventActionService.eventActionDefinitionMap[4].enabled << "\n";
 
 	Message eventActionDefinition4(19, 2, Message::TC, 1);
 	eventActionDefinition4.appendUint16(1);
 	eventActionDefinition4.appendUint16(0);
 	eventActionDefinition4.appendUint16(2);
 
+	std::cout << "After this message there should be a failed start of execution error \n";
+	eventActionService.deleteEventActionDefinitions(eventActionDefinition4);
+
+	Message eventActionDefinition6(19, 5, Message::TC, 1);
+	eventActionDefinition4.appendUint16(1);
+	eventActionDefinition4.appendUint16(0);
+	eventActionDefinition4.appendUint16(2);
+	eventActionService.disableEventActionDefinitions(eventActionDefinition6);
+	std::cout << "After this message there should NOT be a failed start of execution error \n";
 	eventActionService.deleteEventActionDefinitions(eventActionDefinition4);
-	std::cout << "\nPositions 0,1 empty should be 11:" << static_cast<uint16_t>(eventActionService
-		.eventActionDefinitionArray[0].empty)
-	          << static_cast<uint16_t>(eventActionService.eventActionDefinitionArray[1].empty);
-
-	Message eventActionDefinition6(19, 3, Message::TC, 1);
-	eventActionService.deleteAllEventActionDefinitions(eventActionDefinition6);
-	std::cout << "\nPositions 0,1 empty should be 1:" << static_cast<uint16_t>(eventActionService
-		.eventActionDefinitionArray[0].empty);
 
 
 	return 0;
diff --git a/test/Services/EventActionService.cpp b/test/Services/EventActionService.cpp
index 843421b9..9c9366ab 100644
--- a/test/Services/EventActionService.cpp
+++ b/test/Services/EventActionService.cpp
@@ -11,7 +11,6 @@
 EventActionService & eventActionService = Services.eventAction;
 
 TEST_CASE("Add event-action definitions TC[19,1]", "[service][st09]") {
-	char checkstring[256];
 	Message message(19, 1, Message::TC, 0);
 	message.appendEnum16(0);
 	message.appendEnum16(2);
@@ -70,13 +69,20 @@ TEST_CASE("Delete event-action definitions TC[19,2]", "[service][st09]") {
 	message4.appendString(data);
 	eventActionService.addEventActionDefinitions(message4);
 
-	Message message(19, 2, Message::TC, 0);
+	Message message(19, 5, Message::TC, 0);
 	message.appendUint16(2);
 	message.appendEnum16(1);
 	message.appendEnum16(4);
 	message.appendEnum16(1);
 	message.appendEnum16(2);
-	eventActionService.deleteEventActionDefinitions(message);
+	eventActionService.disableEventActionDefinitions(message);
+	Message message5(19, 2, Message::TC, 0);
+	message5.appendUint16(2);
+	message5.appendEnum16(1);
+	message5.appendEnum16(4);
+	message5.appendEnum16(1);
+	message5.appendEnum16(2);
+	eventActionService.deleteEventActionDefinitions(message5);
 
 	CHECK(eventActionService.eventActionDefinitionMap[0].applicationId == 1);
 	CHECK(eventActionService.eventActionDefinitionMap[0].eventDefinitionID == 0);
@@ -160,16 +166,24 @@ TEST_CASE("Enable event-action definitions TC[19,4]", "[service][st09]") {
 	data = "00";
 	message1.appendString(data);
 	eventActionService.addEventActionDefinitions(message1);
-	Message message2(19, 4, Message::TC, 0);
+	Message message2(19, 5, Message::TC, 0);
 	message2.appendUint16(2);
 	message2.appendEnum16(1);
 	message2.appendEnum16(0);
 	message2.appendEnum16(1);
 	message2.appendEnum16(1);
-	eventActionService.enableEventActionDefinitions(message2);
+	eventActionService.disableEventActionDefinitions(message2);
+	CHECK(eventActionService.eventActionDefinitionMap[0].enabled == 0);
+	CHECK(eventActionService.eventActionDefinitionMap[1].enabled == 0);
+	Message message3(19, 4, Message::TC, 0);
+	message3.appendUint16(2);
+	message3.appendEnum16(1);
+	message3.appendEnum16(0);
+	message3.appendEnum16(1);
+	message3.appendEnum16(1);
+	eventActionService.enableEventActionDefinitions(message3);
 	CHECK(eventActionService.eventActionDefinitionMap[0].enabled == 1);
 	CHECK(eventActionService.eventActionDefinitionMap[1].enabled == 1);
-
 }
 
 TEST_CASE("Disable event-action definitions TC[19,5]", "[service][st09]") {
-- 
GitLab