Skip to content

Commit

Permalink
Fix parsing of structured values in ANY variant
Browse files Browse the repository at this point in the history
  • Loading branch information
mx990 authored and azoitl committed Sep 13, 2024
1 parent 880f464 commit 10bae20
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 4 deletions.
12 changes: 8 additions & 4 deletions src/core/datatypes/forte_any_variant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,18 +238,22 @@ const CIEC_ANY &CIEC_ANY_VARIANT::unwrap() const {
}

int CIEC_ANY_VARIANT::fromString(const char *paValue) {
int nRetVal = -1;
int retVal = -1;
const char *hashPos = strchr(paValue, '#');
if (nullptr != hashPos) {
CStringDictionary::TStringId typeNameId = parseTypeName(paValue, hashPos);
CIEC_ANY::EDataTypeID dataTypeId = CIEC_ANY_ELEMENTARY::getElementaryDataTypeId(typeNameId);
if (setDefaultValue(dataTypeId)) {
CIEC_ANY &value = unwrap();
nRetVal = value.fromString(paValue);
retVal = value.fromString(paValue);
} else {
CIEC_ANY *value = CTypeLib::createDataTypeInstance(typeNameId, nullptr);
if (value) {
nRetVal = value->fromString(paValue);
retVal = value->fromString(hashPos + 1); // start after '#'
if(retVal < 0) {
return retVal;
}
retVal += static_cast<int>(hashPos - paValue + 1); // add count for type including '#'
switch (value->getDataTypeID()) {
case e_ARRAY:
operator=(CIEC_ANY_UNIQUE_PTR<CIEC_ARRAY>(
Expand All @@ -265,7 +269,7 @@ int CIEC_ANY_VARIANT::fromString(const char *paValue) {
}
}
}
return nRetVal;
return retVal;
}

int CIEC_ANY_VARIANT::toString(char *paValue, size_t paBufferSize) const {
Expand Down
52 changes: 52 additions & 0 deletions tests/core/datatypes/CIEC_ANY_VARIANT_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,57 @@
#include "forte_boost_output_support.h"
#include "../../../src/core/datatypes/forte_any_variant.h"

#ifdef FORTE_ENABLE_GENERATED_SOURCE_CPP
#include "CIEC_ANY_VARIANT_test_gen.cpp"
#endif

class CIEC_AnyTestStruct : public CIEC_STRUCT {
DECLARE_FIRMWARE_DATATYPE(AnyTestStruct)
public:
CIEC_STRING Var1;
CIEC_BOOL Var2;
CIEC_INT Var3;

CIEC_AnyTestStruct() = default;

size_t getStructSize() const override {
return 3;
}

const CStringDictionary::TStringId* elementNames() const override {
return scmElementNames;
}

CStringDictionary::TStringId getStructTypeNameID() const override {
return g_nStringIdAnyTestStruct;
}

CIEC_ANY *getMember(size_t paMemberIndex) override {
switch(paMemberIndex) {
case 0: return &Var1;
case 1: return &Var2;
case 2: return &Var3;
}
return nullptr;
}

const CIEC_ANY *getMember(size_t paMemberIndex) const override {
switch(paMemberIndex) {
case 0: return &Var1;
case 1: return &Var2;
case 2: return &Var3;
}
return nullptr;
}

private:
static const CStringDictionary::TStringId scmElementNames[];
};

const CStringDictionary::TStringId CIEC_AnyTestStruct::scmElementNames[] = { g_nStringIdVar1, g_nStringIdVar2, g_nStringIdVar3 };

DEFINE_FIRMWARE_DATATYPE(AnyTestStruct, g_nStringIdAnyTestStruct)

BOOST_AUTO_TEST_SUITE(CIEC_ANY_VARIANT_function_test)

BOOST_AUTO_TEST_CASE(Type_test) {
Expand Down Expand Up @@ -103,6 +154,7 @@ BOOST_AUTO_TEST_SUITE(CIEC_ANY_VARIANT_function_test)
checkStringConversion(test, "LINT#123123123123", CIEC_ANY::e_LINT);
checkStringConversion(test, "ULINT#123123123123123", CIEC_ANY::e_ULINT);
checkStringConversion(test, "LWORD#123123123123123", CIEC_ANY::e_LWORD);
checkStringConversion(test, "AnyTestStruct#(Var1:='test',Var2:=TRUE,Var3:=17)", CIEC_ANY::e_STRUCT);
}

BOOST_AUTO_TEST_CASE(Equality_test) {
Expand Down

0 comments on commit 10bae20

Please sign in to comment.