Preserve entries order in DynamicStruct #2410 (#2413)

* Preserve entries order in DynamicStruct #2410

* disable C++11 default

* ifdef C++11 code
This commit is contained in:
Aleksandar Fabijanic
2018-08-01 08:06:59 -07:00
committed by GitHub
parent 6107b43a7b
commit 231ef2762d
11 changed files with 825 additions and 73 deletions

View File

@@ -20,7 +20,6 @@
#include <utility>
#if defined(_MSC_VER) && _MSC_VER < 1400
#pragma warning(disable:4800)//forcing value to bool 'true' or 'false'
#endif
@@ -2256,6 +2255,34 @@ void VarTest::testDynamicStructBasics()
}
void VarTest::testOrderedDynamicStructBasics()
{
#ifdef POCO_ENABLE_CPP11
OrderedDynamicStruct aStruct;
assertTrue(aStruct.empty());
assertTrue(aStruct.size() == 0);
assertTrue(aStruct.members().empty());
aStruct.insert("First Name", "Little");
assertTrue(!aStruct.empty());
assertTrue(aStruct.size() == 1);
assertTrue(*(aStruct.members().begin()) == "First Name");
assertTrue(aStruct["First Name"] == "Little");
aStruct.insert("Last Name", "POCO");
assertTrue(aStruct.members().size() == 2);
aStruct.erase("First Name");
assertTrue(aStruct.size() == 1);
assertTrue(*(aStruct.members().begin()) == "Last Name");
aStruct.insert("Age", 1);
assertTrue(aStruct["Age"] == 1);
assertTrue(aStruct.members().size() == 2);
assertTrue(*(aStruct.members().begin()) == "Last Name");
aStruct.clear();
assertTrue(aStruct.size() == 0);
#endif // POCO_ENABLE_CPP11
}
void VarTest::testDynamicStructString()
{
DynamicStruct aStruct;
@@ -2290,6 +2317,45 @@ void VarTest::testDynamicStructString()
}
void VarTest::testOrderedDynamicStructString()
{
#ifdef POCO_ENABLE_CPP11
OrderedDynamicStruct aStruct;
aStruct["First Name"] = "Junior";
aStruct["Last Name"] = "POCO";
Var a1(aStruct);
assertTrue(a1["First Name"] == "Junior");
assertTrue(a1["Last Name"] == "POCO");
a1["First Name"] = "Senior";
assertTrue(a1["First Name"] == "Senior");
testGetIdxMustThrow(a1, 0);
typedef Struct<std::string, OrderedMap<std::string, Var>, OrderedSet<std::string> > OrderedStruct;
OrderedStruct s1;
s1["1"] = 1;
s1["2"] = 2;
s1["3"] = 3;
OrderedStruct s2(s1);
assertTrue(s2["1"] == 1);
assertTrue(s2["2"] == 2);
assertTrue(s2["3"] == 3);
OrderedMap<std::string, int> m1;
m1["2"] = 2;
m1["1"] = 1;
m1["3"] = 3;
assertTrue (m1.begin()->first == "2");
assertTrue(m1.begin()->second == 2);
OrderedStruct m2(m1);
assertTrue(m2["1"] == 1);
assertTrue(m2["2"] == 2);
assertTrue(m2["3"] == 3);
#endif // POCO_ENABLE_CPP11
}
void VarTest::testDynamicStructInt()
{
Dynamic::Struct<int> aStruct;
@@ -2325,6 +2391,47 @@ void VarTest::testDynamicStructInt()
}
void VarTest::testOrderedDynamicStructInt()
{
#ifdef POCO_ENABLE_CPP11
typedef Struct<int, OrderedMap<int, Var>, OrderedSet<int> > OrderedStruct;
OrderedStruct aStruct;
aStruct[0] = "POCO";
aStruct[1] = "Junior";
aStruct[2] = 100;
aStruct[3] = 10;
Var a1(aStruct);
assertTrue(a1[0] == "POCO");
assertTrue(a1[1] == "Junior");
assertTrue(a1[2] == 100);
assertTrue(a1[3] == 10);
a1[0] = "Senior";
assertTrue(a1[0] == "Senior");
OrderedStruct s1;
s1[1] = "1";
s1[2] = "2";
s1[3] = "3";
OrderedStruct s2(s1);
assertTrue(s2[1] == "1");
assertTrue(s2[2] == "2");
assertTrue(s2[3] == "3");
OrderedMap<int, std::string> m1;
m1[1] = "2";
m1[2] = "1";
m1[3] = "3";
OrderedStruct m2(m1);
assertTrue(m2[1] == "2");
assertTrue(m2[2] == "1");
assertTrue(m2[3] == "3");
#endif // POCO_ENABLE_CPP11
}
void VarTest::testDynamicPair()
{
Pair<int> aPair;
@@ -2414,6 +2521,22 @@ void VarTest::testStructToString()
}
void VarTest::testOrderedStructToString()
{
#ifdef POCO_ENABLE_CPP11
OrderedDynamicStruct aStruct;
aStruct["First Name"] = "Junior";
aStruct["Last Name"] = "POCO";
aStruct["Age"] = 1;
Var a1(aStruct);
std::string res = a1.convert<std::string>();
std::string expected = "{ \"First Name\" : \"Junior\", \"Last Name\" : \"POCO\", \"Age\" : 1 }";
assertTrue(res == expected);
assertTrue(aStruct.toString() == res);
#endif // POCO_ENABLE_CPP11
}
void VarTest::testStructToStringEscape()
{
DynamicStruct aStruct;
@@ -2959,11 +3082,15 @@ CppUnit::Test* VarTest::suite()
CppUnit_addTest(pSuite, VarTest, testArrayIdxOperator);
CppUnit_addTest(pSuite, VarTest, testDynamicPair);
CppUnit_addTest(pSuite, VarTest, testDynamicStructBasics);
CppUnit_addTest(pSuite, VarTest, testOrderedDynamicStructBasics);
CppUnit_addTest(pSuite, VarTest, testDynamicStructString);
CppUnit_addTest(pSuite, VarTest, testOrderedDynamicStructString);
CppUnit_addTest(pSuite, VarTest, testDynamicStructInt);
CppUnit_addTest(pSuite, VarTest, testOrderedDynamicStructInt);
CppUnit_addTest(pSuite, VarTest, testArrayToString);
CppUnit_addTest(pSuite, VarTest, testArrayToStringEscape);
CppUnit_addTest(pSuite, VarTest, testStructToString);
CppUnit_addTest(pSuite, VarTest, testOrderedStructToString);
CppUnit_addTest(pSuite, VarTest, testStructToStringEscape);
CppUnit_addTest(pSuite, VarTest, testArrayOfStructsToString);
CppUnit_addTest(pSuite, VarTest, testStructWithArraysToString);