blob: 0e084067cbdf13134b0653efd6ab6ce8d45efe83 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 fortiss GmbH
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Alois Zoitl - initial API and implementation and/or initial documentation
*******************************************************************************/
#include <boost/test/unit_test.hpp>
#include "../../../src/core/datatypes/forte_struct.h"
#include "../../../src/core/datatypes/forte_bool.h"
#include "../../../src/core/datatypes/forte_int.h"
#include "../../../src/core/datatypes/forte_real.h"
#include "../../../src/core/datatypes/forte_string.h"
#include "../../../src/core/datatypes/forte_array.h"
#include "../../../src/core/typelib.h"
#ifdef FORTE_ENABLE_GENERATED_SOURCE_CPP
#include "CIEC_STRUCT_test_gen.cpp"
#endif
/***********************************************************/
class CIEC_TestStruct1 : public CIEC_STRUCT {
DECLARE_FIRMWARE_DATATYPE(TestStruct1)
;
public:
CIEC_TestStruct1();
virtual ~CIEC_TestStruct1() {
}
private:
static const CStringDictionary::TStringId scm_unElementTypes[];
static const CStringDictionary::TStringId scm_unElementNames[];
};
const CStringDictionary::TStringId CIEC_TestStruct1::scm_unElementTypes[] = { g_nStringIdSTRING, g_nStringIdBOOL, g_nStringIdINT };
const CStringDictionary::TStringId CIEC_TestStruct1::scm_unElementNames[] = { g_nStringIdVal1, g_nStringIdVal2, g_nStringIdVal3 };
DEFINE_FIRMWARE_DATATYPE(TestStruct1, g_nStringIdTestStruct1)
CIEC_TestStruct1::CIEC_TestStruct1() :
CIEC_STRUCT(g_nStringIdTestStruct1, 3, scm_unElementTypes, scm_unElementNames, e_APPLICATION + e_CONSTRUCTED + 1) {
}
/***********************************************************/
class CIEC_TestStruct2 : public CIEC_STRUCT{
DECLARE_FIRMWARE_DATATYPE(TestStruct2)
;
public:
CIEC_TestStruct2();
virtual ~CIEC_TestStruct2(){
}
private:
static const CStringDictionary::TStringId scm_unElementTypes[];
static const CStringDictionary::TStringId scm_unElementNames[];
};
const CStringDictionary::TStringId CIEC_TestStruct2::scm_unElementTypes[] = { g_nStringIdREAL, g_nStringIdINT, g_nStringIdBOOL, g_nStringIdINT };
const CStringDictionary::TStringId CIEC_TestStruct2::scm_unElementNames[] = { g_nStringIdVal1, g_nStringIdVal2, g_nStringIdVal3, g_nStringIdVal4 };
DEFINE_FIRMWARE_DATATYPE(TestStruct2, g_nStringIdTestStruct2)
CIEC_TestStruct2::CIEC_TestStruct2() :
CIEC_STRUCT(g_nStringIdTestStruct2, 4, scm_unElementTypes, scm_unElementNames, e_APPLICATION + e_CONSTRUCTED + 1) {
}
/***********************************************************/
class CIEC_TestStruct3 : public CIEC_STRUCT{
DECLARE_FIRMWARE_DATATYPE(TestStruct3);
/* Struct:
* val1 : String[3]
* val3 : BOOL
* val3 : INT[1]
*/
public:
CIEC_TestStruct3();
virtual ~CIEC_TestStruct3(){
}
CIEC_STRING& val11(){
return *static_cast<CIEC_STRING*>((*static_cast<CIEC_ARRAY *>(&getMembers()[0]))[0]);
}
CIEC_STRING& val12(){
return *static_cast<CIEC_STRING*>((*static_cast<CIEC_ARRAY *>(&getMembers()[0]))[1]);
}
CIEC_BOOL& val2(){
return *static_cast<CIEC_BOOL*>(&getMembers()[1]);
}
CIEC_INT& val31(){
return *static_cast<CIEC_INT*>((*static_cast<CIEC_ARRAY *>(&getMembers()[2]))[0]);
}
static const unsigned int sizeOfFirstArray = 2;
static const unsigned int sizeOfSecondArray = 1;
private:
static const CStringDictionary::TStringId scm_unElementTypes[];
static const CStringDictionary::TStringId scm_unElementNames[];
static CIEC_STRUCT::TStructInitialValues scmInitialValues[];
};
const CStringDictionary::TStringId CIEC_TestStruct3::scm_unElementTypes[] = { g_nStringIdARRAY, sizeOfFirstArray, g_nStringIdSTRING, g_nStringIdBOOL, g_nStringIdARRAY, sizeOfSecondArray, g_nStringIdINT };
const CStringDictionary::TStringId CIEC_TestStruct3::scm_unElementNames[] = { g_nStringIdVal1, g_nStringIdVal2, g_nStringIdVal3 };
CIEC_STRUCT::TStructInitialValues CIEC_TestStruct3::scmInitialValues[] = { 0, "true", "[9]" };
DEFINE_FIRMWARE_DATATYPE(TestStruct3, g_nStringIdTestStruct3)
CIEC_TestStruct3::CIEC_TestStruct3() :
CIEC_STRUCT(g_nStringIdTestStruct3, 3, scm_unElementTypes, scm_unElementNames, e_APPLICATION + e_CONSTRUCTED + 1, scmInitialValues) {
}
class CIEC_TestStruct4 : public CIEC_STRUCT { //undefined data types
DECLARE_FIRMWARE_DATATYPE(TestStruct4)
/* Struct:
* val1 : String[3]
* val3 : BOOL
* val3 : INT
*/
public:
CIEC_TestStruct4();
virtual ~CIEC_TestStruct4() {
}
CIEC_STRING& val11() {
return *static_cast<CIEC_STRING*>((*static_cast<CIEC_ARRAY *>(&getMembers()[0]))[0]);
}
CIEC_STRING& val12() {
return *static_cast<CIEC_STRING*>((*static_cast<CIEC_ARRAY *>(&getMembers()[0]))[1]);
}
CIEC_BOOL& val2() {
return *static_cast<CIEC_BOOL*>(&getMembers()[1]);
}
CIEC_INT& val3() {
return *static_cast<CIEC_INT*>(&getMembers()[1]);
}
static const unsigned int sizeOfFirstArray = 2;
private:
static const CStringDictionary::TStringId scm_unElementTypes[];
static const CStringDictionary::TStringId scm_unElementNames[];
static CIEC_STRUCT::TStructInitialValues scmInitialValues[];
};
const CStringDictionary::TStringId CIEC_TestStruct4::scm_unElementTypes[] = { g_nStringIdARRAY, sizeOfFirstArray, g_nStringIdSTRING, g_nStringIdBOOL,
g_nStringIdUNDEFINEDDATATYPE };
const CStringDictionary::TStringId CIEC_TestStruct4::scm_unElementNames[] = { g_nStringIdVal1, g_nStringIdVal2, g_nStringIdVal3 };
CIEC_STRUCT::TStructInitialValues CIEC_TestStruct4::scmInitialValues[] = { "['a', 'b', '']", 0, "9" };
DEFINE_FIRMWARE_DATATYPE(TestStruct4, g_nStringIdTestStruct4)
CIEC_TestStruct4::CIEC_TestStruct4() :
CIEC_STRUCT(g_nStringIdTestStruct4, 3, scm_unElementTypes, scm_unElementNames, e_APPLICATION + e_CONSTRUCTED + 1, scmInitialValues) {
}
BOOST_AUTO_TEST_SUITE (CIEC_STRUCT_function_test)
//*********************** TESTS *************************************************************************************************/
void setDataTestStruct1(CIEC_TestStruct1 &paStruct, const char* paVal1, bool paVal2, int paVal3){
(* static_cast<CIEC_STRING *>(paStruct.getMemberNamed(g_nStringIdVal1))) = paVal1;
(* static_cast<CIEC_BOOL *>(paStruct.getMemberNamed(g_nStringIdVal2))) = paVal2;
(* static_cast<CIEC_INT *>(paStruct.getMemberNamed(g_nStringIdVal3))) = static_cast<TForteInt16>(paVal3);
}
const char cTestStringData[] = "Check string!";
const char cTestStringData2[] = "Check string 2!";
void setupTestStruct1_TestDataSet1(CIEC_TestStruct1 &paStruct){
setDataTestStruct1(paStruct, cTestStringData, true, 24534);
}
void checkTestStruct1_InitialValues(CIEC_TestStruct1 &paStruct){
BOOST_CHECK_EQUAL((*static_cast<CIEC_STRING *>(paStruct.getMemberNamed(g_nStringIdVal1))).length(), 0);
BOOST_CHECK_EQUAL(false, (*static_cast<CIEC_BOOL *>(paStruct.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(0, (*static_cast<CIEC_INT *>(paStruct.getMemberNamed(g_nStringIdVal3))));
}
void checkTestStruct1_TestDataSet1(CIEC_TestStruct1 &paStruct){
BOOST_CHECK_EQUAL(strcmp((*static_cast<CIEC_STRING *>(paStruct.getMemberNamed(g_nStringIdVal1))).getValue(), cTestStringData), 0);
BOOST_CHECK_EQUAL(true, (*static_cast<CIEC_BOOL *>(paStruct.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(24534, (*static_cast<CIEC_INT *>(paStruct.getMemberNamed(g_nStringIdVal3))));
}
void setDataTestStruct2(CIEC_TestStruct2&paStruct, float paVal1, int paVal2, bool paVal3, int paVal4){
(*static_cast<CIEC_REAL *>(paStruct.getMemberNamed(g_nStringIdVal1))) = paVal1;
(*static_cast<CIEC_INT *>(paStruct.getMemberNamed(g_nStringIdVal2))) = static_cast<TForteInt16>(paVal2);
(*static_cast<CIEC_BOOL *>(paStruct.getMemberNamed(g_nStringIdVal3))) = paVal3;
(*static_cast<CIEC_INT *>(paStruct.getMemberNamed(g_nStringIdVal4))) = static_cast<TForteInt16>(paVal4);
}
void setupTestStruct2_TestDataSet1(CIEC_TestStruct2 &paStruct){
setDataTestStruct2(paStruct, 3.1415f, 256, true, 31234);
}
void checkTestStruct2_InitialValues(CIEC_TestStruct2 &pa_stStruct){
BOOST_CHECK_EQUAL(0.0f, (*static_cast<CIEC_REAL *>(pa_stStruct.getMemberNamed(g_nStringIdVal1))));
BOOST_CHECK_EQUAL(0, (*static_cast<CIEC_INT *>(pa_stStruct.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(false, (*static_cast<CIEC_BOOL *>(pa_stStruct.getMemberNamed(g_nStringIdVal3))));
BOOST_CHECK_EQUAL(0, (*static_cast<CIEC_INT *>(pa_stStruct.getMemberNamed(g_nStringIdVal4))));
}
void checkTestStruct2_TestDataSet1(CIEC_TestStruct2 &pa_stStruct){
BOOST_CHECK_EQUAL(3.1415f, (*static_cast<CIEC_REAL *>(pa_stStruct.getMemberNamed(g_nStringIdVal1))));
BOOST_CHECK_EQUAL(256, (*static_cast<CIEC_INT *>(pa_stStruct.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(true, (*static_cast<CIEC_BOOL *>(pa_stStruct.getMemberNamed(g_nStringIdVal3))));
BOOST_CHECK_EQUAL(31234, (*static_cast<CIEC_INT *>(pa_stStruct.getMemberNamed(g_nStringIdVal4))));
}
void setDataTestStruct3(CIEC_TestStruct3&paStruct, const char* paVal11, const char* paVal12, bool paVal2, int paVal31){
paStruct.val11() = paVal11;
paStruct.val12() = paVal12;
paStruct.val2() = paVal2;
paStruct.val31() = static_cast<TForteInt16>(paVal31);
}
void setupTestStruct3_TestDataSet1(CIEC_TestStruct3 &paStruct){
setDataTestStruct3(paStruct, cTestStringData, cTestStringData2, true, 24534);
}
void checkTestStruct3_InitialValues(CIEC_TestStruct3 &pa_stStruct){
BOOST_CHECK_EQUAL(0, pa_stStruct.val12().length());
BOOST_CHECK_EQUAL(0, pa_stStruct.val11().length());
BOOST_CHECK_EQUAL(true, pa_stStruct.val2());
BOOST_CHECK_EQUAL(9, pa_stStruct.val31());
}
void checkTestStruct3_TestDataSet1(CIEC_TestStruct3 &pa_stStruct){
BOOST_CHECK_EQUAL(strcmp(pa_stStruct.val11().getValue(), cTestStringData), 0);
BOOST_CHECK_EQUAL(strcmp(pa_stStruct.val12().getValue(), cTestStringData2), 0);
BOOST_CHECK_EQUAL(1, pa_stStruct.val2());
BOOST_CHECK_EQUAL(24534, pa_stStruct.val31());
}
BOOST_AUTO_TEST_CASE(Struct_element_access_test){
CIEC_TestStruct1 stStruct1;
CIEC_TestStruct2 stStruct2;
CIEC_TestStruct3 stStruct3;
BOOST_CHECK_EQUAL(stStruct1.getDataTypeID(), CIEC_ANY::e_STRUCT);
BOOST_CHECK_EQUAL(stStruct2.getDataTypeID(), CIEC_ANY::e_STRUCT);
BOOST_CHECK_EQUAL(stStruct3.getDataTypeID(), CIEC_ANY::e_STRUCT);
//***************** Test struct 1 ********************************************************
BOOST_CHECK_EQUAL(stStruct1.getMemberNamed(g_nStringIdVal1)->getDataTypeID(), CIEC_ANY::e_STRING);
BOOST_CHECK_EQUAL(stStruct1.getMemberNamed(g_nStringIdVal2)->getDataTypeID(), CIEC_ANY::e_BOOL);
BOOST_CHECK_EQUAL(stStruct1.getMemberNamed(g_nStringIdVal3)->getDataTypeID(), CIEC_ANY::e_INT);
BOOST_CHECK_EQUAL(stStruct1.getMembers()[0].getDataTypeID(), CIEC_ANY::e_STRING);
BOOST_CHECK_EQUAL(stStruct1.getMembers()[1].getDataTypeID(), CIEC_ANY::e_BOOL);
BOOST_CHECK_EQUAL(stStruct1.getMembers()[2].getDataTypeID(), CIEC_ANY::e_INT);
checkTestStruct1_InitialValues(stStruct1);
char cTest[] = "Check string!";
(*static_cast<CIEC_STRING *>(stStruct1.getMemberNamed(g_nStringIdVal1))) = cTest;
BOOST_CHECK_EQUAL(strcmp((*static_cast<CIEC_STRING *>(stStruct1.getMemberNamed(g_nStringIdVal1))).getValue(), cTest), 0);
BOOST_CHECK_EQUAL(false, (*static_cast<CIEC_BOOL *>(stStruct1.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(0, (*static_cast<CIEC_INT *>(stStruct1.getMemberNamed(g_nStringIdVal3))));
(*static_cast<CIEC_BOOL *>(stStruct1.getMemberNamed(g_nStringIdVal2))) = true;
BOOST_CHECK_EQUAL(strcmp((*static_cast<CIEC_STRING *>(stStruct1.getMemberNamed(g_nStringIdVal1))).getValue(), cTest), 0);
BOOST_CHECK_EQUAL(true, (*static_cast<CIEC_BOOL *>(stStruct1.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(0, (*static_cast<CIEC_INT *>(stStruct1.getMemberNamed(g_nStringIdVal3))));
(*static_cast<CIEC_INT *>(stStruct1.getMemberNamed(g_nStringIdVal3))) = 24534;
BOOST_CHECK_EQUAL(strcmp((*static_cast<CIEC_STRING *>(stStruct1.getMemberNamed(g_nStringIdVal1))).getValue(), cTest), 0);
BOOST_CHECK_EQUAL(true, (*static_cast<CIEC_BOOL *>(stStruct1.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(24534, (*static_cast<CIEC_INT *>(stStruct1.getMemberNamed(g_nStringIdVal3))));
//***************** Test struct 2 ********************************************************
BOOST_CHECK_EQUAL(stStruct2.getMemberNamed(g_nStringIdVal1)->getDataTypeID(), CIEC_ANY::e_REAL);
BOOST_CHECK_EQUAL(stStruct2.getMemberNamed(g_nStringIdVal2)->getDataTypeID(), CIEC_ANY::e_INT);
BOOST_CHECK_EQUAL(stStruct2.getMemberNamed(g_nStringIdVal3)->getDataTypeID(), CIEC_ANY::e_BOOL);
BOOST_CHECK_EQUAL(stStruct2.getMemberNamed(g_nStringIdVal4)->getDataTypeID(), CIEC_ANY::e_INT);
BOOST_CHECK_EQUAL(stStruct2.getMembers()[0].getDataTypeID(), CIEC_ANY::e_REAL);
BOOST_CHECK_EQUAL(stStruct2.getMembers()[1].getDataTypeID(), CIEC_ANY::e_INT);
BOOST_CHECK_EQUAL(stStruct2.getMembers()[2].getDataTypeID(), CIEC_ANY::e_BOOL);
BOOST_CHECK_EQUAL(stStruct2.getMembers()[3].getDataTypeID(), CIEC_ANY::e_INT);
checkTestStruct2_InitialValues(stStruct2);
(*static_cast<CIEC_REAL *>(stStruct2.getMemberNamed(g_nStringIdVal1))) = 3.1415f;
BOOST_CHECK_EQUAL(3.1415f, (*static_cast<CIEC_REAL *>(stStruct2.getMemberNamed(g_nStringIdVal1))));
BOOST_CHECK_EQUAL(0, (*static_cast<CIEC_INT *>(stStruct2.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(false, (*static_cast<CIEC_BOOL *>(stStruct2.getMemberNamed(g_nStringIdVal3))));
BOOST_CHECK_EQUAL(0, (*static_cast<CIEC_INT *>(stStruct2.getMemberNamed(g_nStringIdVal4))));
(*static_cast<CIEC_INT *>(stStruct2.getMemberNamed(g_nStringIdVal2))) = 256;
BOOST_CHECK_EQUAL(3.1415f, (*static_cast<CIEC_REAL *>(stStruct2.getMemberNamed(g_nStringIdVal1))));
BOOST_CHECK_EQUAL(256, (*static_cast<CIEC_INT *>(stStruct2.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(false, (*static_cast<CIEC_BOOL *>(stStruct2.getMemberNamed(g_nStringIdVal3))));
BOOST_CHECK_EQUAL(0, (*static_cast<CIEC_INT *>(stStruct2.getMemberNamed(g_nStringIdVal4))));
(*static_cast<CIEC_BOOL *>(stStruct2.getMemberNamed(g_nStringIdVal3))) = true;
BOOST_CHECK_EQUAL(3.1415f, (*static_cast<CIEC_REAL *>(stStruct2.getMemberNamed(g_nStringIdVal1))));
BOOST_CHECK_EQUAL(256, (*static_cast<CIEC_INT *>(stStruct2.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(true, (*static_cast<CIEC_BOOL *>(stStruct2.getMemberNamed(g_nStringIdVal3))));
BOOST_CHECK_EQUAL(0, (*static_cast<CIEC_INT *>(stStruct2.getMemberNamed(g_nStringIdVal4))));
(*static_cast<CIEC_INT *>(stStruct2.getMemberNamed(g_nStringIdVal4))) = 31234;
BOOST_CHECK_EQUAL(3.1415f, (*static_cast<CIEC_REAL *>(stStruct2.getMemberNamed(g_nStringIdVal1))));
BOOST_CHECK_EQUAL(256, (*static_cast<CIEC_INT *>(stStruct2.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(true, (*static_cast<CIEC_BOOL *>(stStruct2.getMemberNamed(g_nStringIdVal3))));
BOOST_CHECK_EQUAL(31234, (*static_cast<CIEC_INT *>(stStruct2.getMemberNamed(g_nStringIdVal4))));
//***************** Test struct 3 ********************************************************
char cTest2[] = "Check string 2!";
BOOST_CHECK_EQUAL(stStruct3.getMemberNamed(g_nStringIdVal1)->getDataTypeID(), CIEC_ANY::e_ARRAY);
BOOST_CHECK_EQUAL(stStruct3.getMembers()[0].getDataTypeID(), CIEC_ANY::e_ARRAY);
for(size_t i = 0; i < CIEC_TestStruct3::sizeOfFirstArray; i++){
BOOST_CHECK_EQUAL((*static_cast<CIEC_ARRAY *>(stStruct3.getMemberNamed(g_nStringIdVal1)))[i]->getDataTypeID(), CIEC_ANY::e_STRING);
BOOST_CHECK_EQUAL((*static_cast<CIEC_ARRAY *>(&stStruct3.getMembers()[0]))[i]->getDataTypeID(), CIEC_ANY::e_STRING);
}
BOOST_CHECK_EQUAL(stStruct3.getMemberNamed(g_nStringIdVal2)->getDataTypeID(), CIEC_ANY::e_BOOL);
BOOST_CHECK_EQUAL(stStruct3.getMembers()[1].getDataTypeID(), CIEC_ANY::e_BOOL);
BOOST_CHECK_EQUAL(stStruct3.getMemberNamed(g_nStringIdVal3)->getDataTypeID(), CIEC_ANY::e_ARRAY);
for(size_t i = 0; i < CIEC_TestStruct3::sizeOfSecondArray; i++){
BOOST_CHECK_EQUAL((*static_cast<CIEC_ARRAY *>(stStruct3.getMemberNamed(g_nStringIdVal3)))[i]->getDataTypeID(), CIEC_ANY::e_INT);
BOOST_CHECK_EQUAL((*static_cast<CIEC_ARRAY *>(&stStruct3.getMembers()[2]))[i]->getDataTypeID(), CIEC_ANY::e_INT);
}
checkTestStruct3_InitialValues(stStruct3);
stStruct3.val11() = cTest;
BOOST_CHECK_EQUAL(strcmp(stStruct3.val11().getValue(), cTest), 0);
BOOST_CHECK_EQUAL(stStruct3.val12().length(), 0);
BOOST_CHECK_EQUAL(true, stStruct3.val2());
BOOST_CHECK_EQUAL(9, stStruct3.val31());
stStruct3.val12() = cTest2;
BOOST_CHECK_EQUAL(strcmp(stStruct3.val11().getValue(), cTest), 0);
BOOST_CHECK_EQUAL(strcmp(stStruct3.val12().getValue(), cTest2), 0);
BOOST_CHECK_EQUAL(true, stStruct3.val2());
BOOST_CHECK_EQUAL(9, stStruct3.val31());
stStruct3.val2() = false;
BOOST_CHECK_EQUAL(strcmp(stStruct3.val11().getValue(), cTest), 0);
BOOST_CHECK_EQUAL(strcmp(stStruct3.val12().getValue(), cTest2), 0);
BOOST_CHECK_EQUAL(false, stStruct3.val2());
BOOST_CHECK_EQUAL(9, stStruct3.val31());
stStruct3.val31() = 24534;
BOOST_CHECK_EQUAL(strcmp(stStruct3.val11().getValue(), cTest), 0);
BOOST_CHECK_EQUAL(strcmp(stStruct3.val12().getValue(), cTest2), 0);
BOOST_CHECK_EQUAL(false, stStruct3.val2());
BOOST_CHECK_EQUAL(24534, stStruct3.val31());
}
BOOST_AUTO_TEST_CASE(Struct_copy_test_teststruct1){
CIEC_TestStruct1 stStruct1;
CIEC_TestStruct1 stStruct2;
setupTestStruct1_TestDataSet1(stStruct1);
checkTestStruct1_TestDataSet1(stStruct1);
checkTestStruct1_InitialValues(stStruct2);
//self assign
stStruct1 = stStruct1;
checkTestStruct1_TestDataSet1(stStruct1);
//default initialized self assign
stStruct2 = stStruct2;
checkTestStruct1_InitialValues(stStruct2);
//copy struct via assignment operator
stStruct2 = stStruct1;
checkTestStruct1_TestDataSet1(stStruct2);
CIEC_TestStruct1 stStruct3(stStruct1);
checkTestStruct1_TestDataSet1 (stStruct3);
CIEC_TestStruct1 stStruct4;
stStruct4.setValue(stStruct1);
checkTestStruct1_TestDataSet1 (stStruct4);
}
BOOST_AUTO_TEST_CASE(Struct_copy_test_teststruct2){
CIEC_TestStruct2 stStruct1;
CIEC_TestStruct2 stStruct2;
setupTestStruct2_TestDataSet1(stStruct1);
checkTestStruct2_InitialValues(stStruct2);
//self assign
stStruct1 = stStruct1;
checkTestStruct2_TestDataSet1(stStruct1);
//default initialized self assign
stStruct2 = stStruct2;
checkTestStruct2_InitialValues(stStruct2);
//copy struct via assignment operator
stStruct2 = stStruct1;
checkTestStruct2_TestDataSet1(stStruct2);
CIEC_TestStruct2 stStruct3(stStruct1);
checkTestStruct2_TestDataSet1 (stStruct3);
CIEC_TestStruct2 stStruct4;
stStruct4.setValue(stStruct1);
checkTestStruct2_TestDataSet1 (stStruct4);
}
BOOST_AUTO_TEST_CASE(Struct_copy_test_teststruct3){
CIEC_TestStruct3 stStruct1;
CIEC_TestStruct3 stStruct2;
setupTestStruct3_TestDataSet1(stStruct1);
checkTestStruct3_InitialValues(stStruct2);
//self assign
stStruct1 = stStruct1;
checkTestStruct3_TestDataSet1(stStruct1);
//default initialized self assign
stStruct2 = stStruct2;
checkTestStruct3_InitialValues(stStruct2);
//copy struct via assignment operator
stStruct2 = stStruct1;
checkTestStruct3_TestDataSet1(stStruct2);
CIEC_TestStruct3 stStruct3(stStruct1);
checkTestStruct3_TestDataSet1 (stStruct3);
CIEC_TestStruct3 stStruct4;
stStruct4.setValue(stStruct1);
checkTestStruct3_TestDataSet1 (stStruct4);
CIEC_TestStruct2 stStructOtherType;
stStruct4.setValue(stStructOtherType); //shouldn't change or break anything
checkTestStruct3_TestDataSet1 (stStruct4);
CIEC_INT notStructType;
stStruct4.setValue(notStructType); //shouldn't change or break anything
checkTestStruct3_TestDataSet1 (stStruct4);
}
const char cTestFromString_String1[] = "String1";
const char cTestFromString_String2[] = "String2";
void checkTestStruct1_fromStringTestData(CIEC_TestStruct1 &pa_stStruct){
BOOST_CHECK_EQUAL(strcmp((*static_cast<CIEC_STRING *>(pa_stStruct.getMemberNamed(g_nStringIdVal1))).getValue(), cTestFromString_String1), 0);
BOOST_CHECK_EQUAL(true, (*static_cast<CIEC_BOOL *>(pa_stStruct.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(23451, (*static_cast<CIEC_INT *>(pa_stStruct.getMemberNamed(g_nStringIdVal3))));
}
BOOST_AUTO_TEST_CASE(Struct_fromString_TestStruct1){
CIEC_TestStruct1 stStruct1;
CIEC_TestStruct1 stStruct2; //emtpy struct for resting the values after each parse
const char cTestString1[] = { "(Val1:='String1',Val2:=true,Val3:=23451)" };
const char cTestString2[] = { "( Val1:='String1', Val2:=true, Val3 :=23451)" };
const char cTestString3[] = { "(Val1:='String1' , Val2:=true, Val3:= 23451)" };
const char cTestString4[] = { "( Val1:= 'String1',Val2:= true, Val3:=23451)" };
const char cTestString5[] = { "(Val1:='String1', Val2 := true,Val3:=23451)" };
const char cTestString6[] = { "(Val1:='String1', Val2:=true, Val3:= 23451 )" };
const char cTestString7[] = { "(Val2:=true, Val1:='String1', Val3:= 23451)" };
const char cTestString8[] = { "(Val2:=true, Val3:= 23451, Val1:='String1')" };
const char cTestString9[] = { "(Val3:= 23451, Val1:='String1', Val2:=true)" };
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString1), strlen(cTestString1));
checkTestStruct1_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString2), strlen(cTestString2));
checkTestStruct1_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString3), strlen(cTestString3));
checkTestStruct1_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString4), strlen(cTestString4));
checkTestStruct1_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString5), strlen(cTestString5));
checkTestStruct1_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString6), strlen(cTestString6));
checkTestStruct1_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString7), strlen(cTestString7));
checkTestStruct1_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString8), strlen(cTestString8));
checkTestStruct1_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString9), strlen(cTestString9));
checkTestStruct1_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
const char cTestString10[] = { "(Val1:='String1',Val2:=true)" }; //missing last value
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString10), strlen(cTestString10));
BOOST_CHECK_EQUAL(strcmp((*static_cast<CIEC_STRING *>(stStruct1.getMemberNamed(g_nStringIdVal1))).getValue(), cTestFromString_String1), 0);
BOOST_CHECK_EQUAL(true, (*static_cast<CIEC_BOOL *>(stStruct1.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(0, (*static_cast<CIEC_INT *>(stStruct1.getMemberNamed(g_nStringIdVal3))));
stStruct1 = stStruct2;
const char cTestString11[] = { "(Val1:='String1',Val3:=23451)" }; //missing value in the middle
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString11), strlen(cTestString11));
BOOST_CHECK_EQUAL(strcmp((*static_cast<CIEC_STRING *>(stStruct1.getMemberNamed(g_nStringIdVal1))).getValue(), cTestFromString_String1), 0);
BOOST_CHECK_EQUAL(false, (*static_cast<CIEC_BOOL *>(stStruct1.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(23451, (*static_cast<CIEC_INT *>(stStruct1.getMemberNamed(g_nStringIdVal3))));
stStruct1 = stStruct2;
const char cTestString12[] = { "(Val2:=true,Val3:=23451)" }; //missing first value
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString12), strlen(cTestString12));
BOOST_CHECK_EQUAL(strcmp((*static_cast<CIEC_STRING *>(stStruct1.getMemberNamed(g_nStringIdVal1))).getValue(), ""), 0);
BOOST_CHECK_EQUAL(true, (*static_cast<CIEC_BOOL *>(stStruct1.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(23451, (*static_cast<CIEC_INT *>(stStruct1.getMemberNamed(g_nStringIdVal3))));
stStruct1 = stStruct2;
const char cTestString13[] = { "(Val2:=true)" }; //missing two values
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString13), strlen(cTestString13));
BOOST_CHECK_EQUAL(strcmp((*static_cast<CIEC_STRING *>(stStruct1.getMemberNamed(g_nStringIdVal1))).getValue(), ""), 0);
BOOST_CHECK_EQUAL(true, (*static_cast<CIEC_BOOL *>(stStruct1.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(0, (*static_cast<CIEC_INT *>(stStruct1.getMemberNamed(g_nStringIdVal3))));
stStruct1 = stStruct2;
const char cTestString14[] = { "()" }; //missing all values
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString14), strlen(cTestString14));
checkTestStruct1_InitialValues(stStruct1);
//don't initialize structure for next tests
BOOST_CHECK_EQUAL(stStruct1.fromString("(Val3:=23451)"), strlen("(Val3:=23451)"));
BOOST_CHECK_EQUAL(strcmp((*static_cast<CIEC_STRING *>(stStruct1.getMemberNamed(g_nStringIdVal1))).getValue(), ""), 0);
BOOST_CHECK_EQUAL(false, (*static_cast<CIEC_BOOL *>(stStruct1.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(23451, (*static_cast<CIEC_INT *>(stStruct1.getMemberNamed(g_nStringIdVal3))));
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString13), strlen(cTestString13)); //"(Val2:=true)"
BOOST_CHECK_EQUAL(strcmp((*static_cast<CIEC_STRING *>(stStruct1.getMemberNamed(g_nStringIdVal1))).getValue(), ""), 0);
BOOST_CHECK_EQUAL(true, (*static_cast<CIEC_BOOL *>(stStruct1.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(23451, (*static_cast<CIEC_INT *>(stStruct1.getMemberNamed(g_nStringIdVal3)))); //keeps old value
BOOST_CHECK_EQUAL(stStruct1.fromString("(Val1:='String1')"), strlen("(Val1:='String1')")); //"(Val1:='String1')"
BOOST_CHECK_EQUAL(strcmp((*static_cast<CIEC_STRING *>(stStruct1.getMemberNamed(g_nStringIdVal1))).getValue(), cTestFromString_String1), 0);
BOOST_CHECK_EQUAL(true, (*static_cast<CIEC_BOOL *>(stStruct1.getMemberNamed(g_nStringIdVal2)))); //keeps old value
BOOST_CHECK_EQUAL(23451, (*static_cast<CIEC_INT *>(stStruct1.getMemberNamed(g_nStringIdVal3)))); //keeps old value
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString14), strlen(cTestString14));
BOOST_CHECK_EQUAL(strcmp((*static_cast<CIEC_STRING *>(stStruct1.getMemberNamed(g_nStringIdVal1))).getValue(), cTestFromString_String1), 0); //keeps old value
BOOST_CHECK_EQUAL(true, (*static_cast<CIEC_BOOL *>(stStruct1.getMemberNamed(g_nStringIdVal2)))); //keeps old value
BOOST_CHECK_EQUAL(23451, (*static_cast<CIEC_INT *>(stStruct1.getMemberNamed(g_nStringIdVal3)))); //keeps old value
//negative tests: these strings should produce error responses
const char cTestStringNIO1[] = { "(Val1:='String1', Val2:=true, Val3:=23451, seppi)" };
const char cTestStringNIO2[] = { "(Val1:='String1', Val2:=1234, Val3:=23451)" };
const char cTestStringNIO3[] = { "(Val1:='String1', Val2:=true, Val3:=23.3)" };
const char cTestStringNIO4[] = { "(Val4:='String1', Val2:=true, Val3:=23.3)" };
const char cTestStringNIO5[] = { "(Val2:='String1', Val2:=true, Val3:=23451)" };
const char cTestStringNIO6[] = { "(Val1:='String1', Val3:=true, Val1:=23451)" };
const char cTestStringNIO7[] = { "Val1:='String1',Val2:=true,Val3:=23451)" }; //missing opening (
const char cTestStringNIO8[] = { "(Val1:='String1',Val2:=true,Val3:=23451" }; //missing closing )
const char cTestStringNIO9[] = { "(Val1:='String1',Val2x:=true,Val3:=23451)" }; //wrong identifier
const char cTestStringNIO10[] = { "(Val1:='String1',Val2=true,Val3:=23451)" }; //wrong assigner
const char cTestStringNIO11[] = { "(Val1:='String1',Val2::true,Val3:=23451)" }; //wrong assigner 2
const char cTestStringNIO12[] = { "(Val1:='String1',Val123456789012345678901234567890:=true,Val3:=23451)" }; //identifier too long
const char cTestStringNIO13[] = { "(Val1:='String1',Val1):=true,Val3:=23451)" }; //identifier with closing )
const char cTestStringNIO14[] = { "(Val1:='String1',Val1:=true,Val3" }; //identifier without value
const char cTestStringNIO15[] = { "(Val1:='String1',Val1:=)true,Val3:=23451)" }; //closing ) after assigner
const char cTestStringNIO16[] = { "(Val1:='String1',Val1:=true,Val3:=" }; //end of string after assigner
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO1), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO2), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO3), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO4), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO5), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO6), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO7), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO8), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO9), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO10), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO11), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO12), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO13), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO14), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO15), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO16), -1);
}
void checkTestStruct2_fromStringTestData(CIEC_TestStruct2 &pa_stStruct){
BOOST_CHECK_EQUAL(15.65789f, (*static_cast<CIEC_REAL *>(pa_stStruct.getMemberNamed(g_nStringIdVal1))));
BOOST_CHECK_EQUAL(32765, (*static_cast<CIEC_INT *>(pa_stStruct.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(true, (*static_cast<CIEC_BOOL *>(pa_stStruct.getMemberNamed(g_nStringIdVal3))));
BOOST_CHECK_EQUAL(13, (*static_cast<CIEC_INT *>(pa_stStruct.getMemberNamed(g_nStringIdVal4))));
}
BOOST_AUTO_TEST_CASE(Struct_fromString_TestStruct2){
CIEC_TestStruct2 stStruct1;
CIEC_TestStruct2 stStruct2; //emtpy struct for resting the values after each parse
const char cTestString1[] = { "(Val1:=15.65789,Val2:=32765,Val3:=TRUE, Val4:=13)" };
const char cTestString2[] = { "(Val1 := 15.65789 , Val2:= 32765,Val3:= TRUE, Val4:=13)" };
const char cTestString3[] = { "(Val1:=15.65789, Val2 := 32765 , Val3 := TRUE, Val4:=13 )" };
const char cTestString4[] = { "( Val1:=15.65789 , Val2 := 32765,Val3:=TRUE, Val4:=13)" };
const char cTestString5[] = { "( Val1:=15.65789 , Val2:=32765,Val3:=TRUE, Val4:=13)" };
const char cTestString6[] = { "(Val3:=TRUE, Val1:=15.65789,Val2:=32765,Val4:=13)" };
const char cTestString7[] = { "(Val1:=15.65789,Val3:=TRUE, Val4:=13,Val2:=32765)" };
const char cTestString8[] = { "(Val1:=15.65789,Val2:=32765,Val3:=TRUE, Val4:=13)" };
const char cTestString9[] = { "(Val1:=15.65789, Val4:=13,Val3:=TRUE, Val2:=32765)" };
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString1), strlen(cTestString1));
checkTestStruct2_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString2), strlen(cTestString2));
checkTestStruct2_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString3), strlen(cTestString3));
checkTestStruct2_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString4), strlen(cTestString4));
checkTestStruct2_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString5), strlen(cTestString5));
checkTestStruct2_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString6), strlen(cTestString6));
checkTestStruct2_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString7), strlen(cTestString7));
checkTestStruct2_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString8), strlen(cTestString8));
checkTestStruct2_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString9), strlen(cTestString9));
checkTestStruct2_fromStringTestData(stStruct1);
stStruct1 = stStruct2;
const char cTestStringNIO1[] = { "(Val1:=15.65789,Val2:=3,Val3:=TRUE, Val4:=13, seppi)" };
const char cTestStringNIO2[] = { "(Hansi:=15.65789,Val2:=true,Val3:=TRUE, Val4:=13)" };
const char cTestStringNIO3[] = { "(Val1:='test',Val2:=true,Val3:=TRUE, Val4:=13)" };
const char cTestStringNIO4[] = { "(Val1:=15.65789 Val2:=23,Val3:=TRUE, Val4:=13)" };
const char cTestStringNIO5[] = { "(Val1:=15.65789,Val2:=true,Val3:=TRUE, Val4:=13.13)" };
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO1), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO2), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO3), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO4), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO5), -1);
}
void checkTestStruct3_fromStringTestData(CIEC_TestStruct3 &pa_stStruct){
BOOST_CHECK_EQUAL(strcmp(pa_stStruct.val11().getValue(), cTestFromString_String1), 0);
BOOST_CHECK_EQUAL(strcmp(pa_stStruct.val12().getValue(), cTestFromString_String2), 0);
BOOST_CHECK_EQUAL(true, pa_stStruct.val2());
BOOST_CHECK_EQUAL(13, pa_stStruct.val31());
}
BOOST_AUTO_TEST_CASE(Struct_fromString_TestStruct3) {
CIEC_TestStruct3 stStruct1;
CIEC_TestStruct3 stStruct2; //emtpy struct for resting the values after each parse
const char cTestString1[] = { "(Val1:=[\'String1\',\'String2\'],Val2:=TRUE,Val3:=[13])" };
const char cTestString2[] = { "(Val1 := [\'String1\',\'String2\'] , Val2:= TRUE, Val3:= [13])" };
const char cTestString3[] = { "(Val1:=[\'String1\',\'String2\'], Val2 := TRUE , Val3 := [13] )" };
const char cTestString4[] = { "( Val1:=[\'String1\',\'String2\'] , Val2 := TRUE, Val3:=[13])" };
const char cTestString5[] = { "( Val1:=[\'String1\',\'String2\'] , Val2:=TRUE, Val3:=[13])" };
const char cTestString6[] = { "(Val3:=[13], Val1:=[\'String1\',\'String2\'],Val2:=TRUE)" };
const char cTestString7[] = { "(Val1:=[\'String1\',\'String2\'],Val3:=[13], Val2:=TRUE)" };
const char cTestString8[] = { "(Val1:=[\'String1\',\'String2\'],Val2:=TRUE, Val3:=[13])" };
const char cTestString9[] = { "(Val1:=[\'String1\',\'String2\'], Val3:=[13], Val2:=TRUE)" };
BOOST_CHECK_EQUAL(stStruct1.getASN1StructType(), 64 + 32 + 1); //CIEC_STRUCT::e_APPLICATION + CIEC_STRUCT::e_CONSTRUCTED + 1
BOOST_CHECK_EQUAL(stStruct1.getStructSize(), 3);
const CStringDictionary::TStringId* names = stStruct1.elementNames();
BOOST_CHECK_EQUAL(names[0], g_nStringIdVal1);
BOOST_CHECK_EQUAL(names[1], g_nStringIdVal2);
BOOST_CHECK_EQUAL(names[2], g_nStringIdVal3);
BOOST_CHECK_EQUAL(stStruct1.getStructTypeNameID(), g_nStringIdTestStruct3);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString1), strlen(cTestString1));
checkTestStruct3_fromStringTestData (stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString2), strlen(cTestString2));
checkTestStruct3_fromStringTestData (stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString3), strlen(cTestString3));
checkTestStruct3_fromStringTestData (stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString4), strlen(cTestString4));
checkTestStruct3_fromStringTestData (stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString5), strlen(cTestString5));
checkTestStruct3_fromStringTestData (stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString6), strlen(cTestString6));
checkTestStruct3_fromStringTestData (stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString7), strlen(cTestString7));
checkTestStruct3_fromStringTestData (stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString8), strlen(cTestString8));
checkTestStruct3_fromStringTestData (stStruct1);
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString9), strlen(cTestString9));
checkTestStruct3_fromStringTestData (stStruct1);
stStruct1 = stStruct2;
const char cTestString10[] = { "(Val2:=TRUE,Val3:=[13])" }; //missing first value, without initializer, other two with initializer
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString10), strlen(cTestString10));
BOOST_CHECK_EQUAL(strcmp(stStruct1.val11().getValue(), ""), 0);
BOOST_CHECK_EQUAL(strcmp(stStruct1.val12().getValue(), ""), 0);
BOOST_CHECK_EQUAL(true, stStruct1.val2());
BOOST_CHECK_EQUAL(13, stStruct1.val31());
stStruct1 = stStruct2;
const char cTestString11[] = { "(Val1:=[\'String1\',\'String2\'],Val3:=[13])" }; //missing value in the middle, with initializer
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString11), strlen(cTestString11));
BOOST_CHECK_EQUAL(strcmp(stStruct1.val11().getValue(), cTestFromString_String1), 0);
BOOST_CHECK_EQUAL(strcmp(stStruct1.val12().getValue(), cTestFromString_String2), 0);
BOOST_CHECK_EQUAL(true, stStruct1.val2());
BOOST_CHECK_EQUAL(13, stStruct1.val31());
stStruct1 = stStruct2;
const char cTestString12[] = { "(Val1:=[\'String1\',\'String2\'],Val2:=TRUE)" }; //missing last value, with initializer
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString12), strlen(cTestString12));
BOOST_CHECK_EQUAL(strcmp(stStruct1.val11().getValue(), cTestFromString_String1), 0);
BOOST_CHECK_EQUAL(strcmp(stStruct1.val12().getValue(), cTestFromString_String2), 0);
BOOST_CHECK_EQUAL(true, stStruct1.val2());
BOOST_CHECK_EQUAL(9, stStruct1.val31());
stStruct1 = stStruct2;
const char cTestString13[] = { "(Val1:=[\'String1\',\'String2\'])" }; //missing two values with initializer
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString13), strlen(cTestString13));
BOOST_CHECK_EQUAL(strcmp(stStruct1.val11().getValue(), cTestFromString_String1), 0);
BOOST_CHECK_EQUAL(strcmp(stStruct1.val12().getValue(), cTestFromString_String2), 0);
BOOST_CHECK_EQUAL(true, stStruct1.val2());
BOOST_CHECK_EQUAL(9, stStruct1.val31());
stStruct1 = stStruct2;
const char cTestString14[] = { "(Val2:=FALSE)" }; //missing two values, one with and the other without initializer
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString14), strlen(cTestString14));
BOOST_CHECK_EQUAL(strcmp(stStruct1.val11().getValue(), ""), 0);
BOOST_CHECK_EQUAL(strcmp(stStruct1.val12().getValue(), ""), 0);
BOOST_CHECK_EQUAL(false, stStruct1.val2());
BOOST_CHECK_EQUAL(9, stStruct1.val31());
stStruct1 = stStruct2;
const char cTestString15[] = { "()" }; //missing all values
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString15), strlen(cTestString15));
BOOST_CHECK_EQUAL(strcmp(stStruct1.val11().getValue(), ""), 0);
BOOST_CHECK_EQUAL(strcmp(stStruct1.val12().getValue(), ""), 0);
BOOST_CHECK_EQUAL(true, stStruct1.val2());
BOOST_CHECK_EQUAL(9, stStruct1.val31());
stStruct1 = stStruct2;
const char cTestString16[] = { "(Val1:=[\'String1\',\'String2\'],Val2:=TRUE,Val3:=[13],Val2:=FALSE)" }; //identifier duplicate. No error and take last value?
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString16), strlen(cTestString16));
BOOST_CHECK_EQUAL(strcmp(stStruct1.val11().getValue(), cTestFromString_String1), 0);
BOOST_CHECK_EQUAL(strcmp(stStruct1.val12().getValue(), cTestFromString_String2), 0);
BOOST_CHECK_EQUAL(false, stStruct1.val2());
BOOST_CHECK_EQUAL(13, stStruct1.val31());
//don't initialize structure for next tests
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString12), strlen(cTestString12)); //"(Val1:=[\'String1\',\'String2\'],Val2:=TRUE)"
BOOST_CHECK_EQUAL(strcmp(stStruct1.val11().getValue(), cTestFromString_String1), 0); //keeps old value
BOOST_CHECK_EQUAL(strcmp(stStruct1.val12().getValue(), cTestFromString_String2), 0); //keeps old value
BOOST_CHECK_EQUAL(true, (*static_cast<CIEC_BOOL *>(stStruct1.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(13, stStruct1.val31()); //keeps old value
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString14), strlen(cTestString14)); //"(Val2:=FALSE)"
BOOST_CHECK_EQUAL(strcmp(stStruct1.val11().getValue(), cTestFromString_String1), 0); //keeps old value
BOOST_CHECK_EQUAL(strcmp(stStruct1.val12().getValue(), cTestFromString_String2), 0); //keeps old value
BOOST_CHECK_EQUAL(false, (*static_cast<CIEC_BOOL *>(stStruct1.getMemberNamed(g_nStringIdVal2))));
BOOST_CHECK_EQUAL(13, stStruct1.val31()); //keeps old value
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestString15), strlen(cTestString15)); //"()"
BOOST_CHECK_EQUAL(strcmp(stStruct1.val11().getValue(), cTestFromString_String1), 0); //keeps old value
BOOST_CHECK_EQUAL(strcmp(stStruct1.val12().getValue(), cTestFromString_String2), 0); //keeps old value
BOOST_CHECK_EQUAL(false, (*static_cast<CIEC_BOOL *>(stStruct1.getMemberNamed(g_nStringIdVal2)))); //keeps old value
BOOST_CHECK_EQUAL(13, stStruct1.val31()); //keeps old value
const char cTestStringNIO1[] = { "(Val1:=[\'String1\',\'String2\'],Val2:=TRUE,Val3:=[13], seppi)" };
const char cTestStringNIO2[] = { "(Hansi:=[\'String1\',\'String2\'],Val2:=TRUE,Val3:=[13])" };
const char cTestStringNIO3[] = { "(Val1:='test',Val2:=TRUE,Val3:=[13])" };
const char cTestStringNIO4[] = { "(Val1:=[\'String1\',\'String2\'] Val2:=23,Val3:=[13])" };
const char cTestStringNIO5[] = { "(Val1:=15.65789,Val2:=TRUE,Val3:=13)" };
stStruct1 = stStruct2;
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO1), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO2), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO3), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO4), -1);
BOOST_CHECK_EQUAL(stStruct1.fromString(cTestStringNIO5), -1);
}
void toStringTest_testStruct1(const char* pa_acVal1, bool pa_nVal2, int pa_nVal3, const char* pa_acResult){
CIEC_TestStruct1 stStruct;
BOOST_CHECK_EQUAL(stStruct.getToStringBufferSize(), sizeof("(Val1:='',Val2:=FALSE,Val3:=+32767)"));
int nResultLenght = static_cast<int>(strlen(pa_acResult));
char acBuffer[50];
for(int i = (nResultLenght + 1); i < 50; i++){
setDataTestStruct1(stStruct, pa_acVal1, pa_nVal2, pa_nVal3);
BOOST_CHECK_EQUAL(stStruct.toString(acBuffer, i), nResultLenght);
BOOST_CHECK_EQUAL(strcmp(acBuffer, pa_acResult), 0);
BOOST_CHECK_EQUAL(stStruct.getToStringBufferSize(), sizeof("(Val1:='',Val2:=FALSE,Val3:=+32767)") + strlen(pa_acVal1));
}
for(int i = 0; i <= nResultLenght; i++){
BOOST_CHECK_EQUAL(stStruct.toString(acBuffer, i), -1);
}
}
BOOST_AUTO_TEST_CASE(Struct_toString_TestStruct1){
toStringTest_testStruct1("", false, 0, "(Val1:='',Val2:=FALSE,Val3:=0)");
toStringTest_testStruct1("", true, 0, "(Val1:='',Val2:=TRUE,Val3:=0)");
toStringTest_testStruct1("Hansi Test", true, 0, "(Val1:='Hansi Test',Val2:=TRUE,Val3:=0)");
toStringTest_testStruct1("", true, 2345, "(Val1:='',Val2:=TRUE,Val3:=2345)");
}
void toStringTest_testStruct2(float pa_fVal1, int pa_nVal2, bool pa_bVal3, int pa_nVal4, const char* pa_acResult){
CIEC_TestStruct2 stStruct;
BOOST_CHECK_EQUAL(stStruct.getToStringBufferSize(), sizeof("(Val1:=123456789.123,Val2:=+32767,Val3:=FALSE,Val4:=+32767)"));
int nResultLenght = static_cast<int>(strlen(pa_acResult));
char acBuffer[60];
for(int i = (nResultLenght + 1); i < 60; i++){
setDataTestStruct2(stStruct, pa_fVal1, pa_nVal2, pa_bVal3, pa_nVal4);
BOOST_CHECK_EQUAL(stStruct.toString(acBuffer, i), nResultLenght);
BOOST_CHECK_EQUAL(strcmp(acBuffer, pa_acResult), 0);
BOOST_CHECK_EQUAL(stStruct.getToStringBufferSize(), sizeof("(Val1:=123456789.123,Val2:=+32767,Val3:=FALSE,Val4:=+32767)"));
}
for(int i = 0; i <= nResultLenght; i++){
BOOST_CHECK_EQUAL(stStruct.toString(acBuffer, i), -1);
}
}
BOOST_AUTO_TEST_CASE(Struct_toString_TestStruct2){
toStringTest_testStruct2(0.0f, 0, false, 0, "(Val1:=0,Val2:=0,Val3:=FALSE,Val4:=0)");
toStringTest_testStruct2(0.0f, 0, true, 0, "(Val1:=0,Val2:=0,Val3:=TRUE,Val4:=0)");
toStringTest_testStruct2(0.0f, 32767, false, -32768, "(Val1:=0,Val2:=32767,Val3:=FALSE,Val4:=-32768)");
toStringTest_testStruct2(1345.13f, 32767, false, -32768, "(Val1:=1345.13,Val2:=32767,Val3:=FALSE,Val4:=-32768)");
toStringTest_testStruct2(1345.13f, -32767, false, -32768, "(Val1:=1345.13,Val2:=-32767,Val3:=FALSE,Val4:=-32768)");
}
void toStringTest_testStruct3(const char* pa_acVal11, const char* pa_acVal12, bool pa_nVal2, int pa_nVal3, const char* pa_acResult){
CIEC_TestStruct3 stStruct;
BOOST_CHECK_EQUAL(stStruct.getToStringBufferSize(), sizeof("(Val1:=['',''],Val2:=FALSE,Val3:=[+32767])"));
int nResultLenght = static_cast<int>(strlen(pa_acResult));
char acBuffer[70];
for(int i = (nResultLenght + 1); i < 70; i++){
setDataTestStruct3(stStruct, pa_acVal11, pa_acVal12, pa_nVal2, pa_nVal3);
BOOST_CHECK_EQUAL(stStruct.toString(acBuffer, i), nResultLenght);
BOOST_CHECK_EQUAL(strcmp(acBuffer, pa_acResult), 0);
BOOST_CHECK_EQUAL(stStruct.getToStringBufferSize(), sizeof("(Val1:=['',''],Val2:=FALSE,Val3:=[+32767])") + strlen(pa_acVal11) + strlen(pa_acVal12));
}
for(int i = 0; i <= nResultLenght; i++){
BOOST_CHECK_EQUAL(stStruct.toString(acBuffer, i), -1);
}
}
BOOST_AUTO_TEST_CASE(Struct_toString_TestStruct3){
CIEC_TestStruct3 stStruct;
const char* initialString = "(Val1:=['',''],Val2:=TRUE,Val3:=[9])";
char acBuffer[70];
BOOST_CHECK_EQUAL(stStruct.toString(acBuffer, 70), strlen(initialString));
BOOST_CHECK_EQUAL(strcmp(acBuffer, initialString), 0);
BOOST_CHECK_EQUAL(stStruct.getToStringBufferSize(), sizeof("(Val1:=['',''],Val2:=FALSE,Val3:=[+32767])"));
toStringTest_testStruct3("", "", false, 0, "(Val1:=['',''],Val2:=FALSE,Val3:=[0])");
toStringTest_testStruct3("", "", true, 0, "(Val1:=['',''],Val2:=TRUE,Val3:=[0])");
toStringTest_testStruct3("Hansi Test", "", true, 0, "(Val1:=['Hansi Test',''],Val2:=TRUE,Val3:=[0])");
toStringTest_testStruct3("Hansi Test", "Hansi Test 2", true, 0, "(Val1:=['Hansi Test','Hansi Test 2'],Val2:=TRUE,Val3:=[0])");
toStringTest_testStruct3("", "", true, 2345, "(Val1:=['',''],Val2:=TRUE,Val3:=[2345])");
}
void checkEmptyStruct(CIEC_STRUCT& paStruct) {
BOOST_CHECK_EQUAL(paStruct.getASN1StructType(), 0);
BOOST_CHECK_EQUAL(paStruct.getStructSize(), 0);
const CStringDictionary::TStringId* names = paStruct.elementNames();
BOOST_CHECK(0 == paStruct.elementNames());
BOOST_CHECK_EQUAL(paStruct.getStructTypeNameID(), 0);
BOOST_CHECK_EQUAL(paStruct.getDataTypeID(), CIEC_ANY::e_STRUCT);
BOOST_CHECK(0 == paStruct.getMembers());
BOOST_CHECK(0 == paStruct.getMemberNamed(0));
char acBuffer[3];
BOOST_CHECK_EQUAL(paStruct.getToStringBufferSize(), sizeof("()"));
BOOST_CHECK_EQUAL(paStruct.toString(acBuffer, 3), 2);
BOOST_CHECK_EQUAL(strcmp(acBuffer, "()"), 0);
}
BOOST_AUTO_TEST_CASE(Struct_EmptyStruct) {
CIEC_STRUCT nTest(0, 0, 0, 0, 64 + 32 + 1); //CIEC_STRUCT::e_APPLICATION + CIEC_STRUCT::e_CONSTRUCTED + 1
checkEmptyStruct(nTest);
CIEC_STRUCT nTest1(nTest);
checkEmptyStruct(nTest1);
}
BOOST_AUTO_TEST_CASE(Struct_UndefinedDataTypes) {
CIEC_TestStruct4 nTest;
checkEmptyStruct(nTest);
}
BOOST_AUTO_TEST_SUITE_END()