GH #119: JSON::Object holds values in ordered map

- fixed GH #119: JSON::Object holds values in ordered map
- added PrintHandler
- renamed DefaultHandler to ParseHandler
- redefined DefaultHandler as typedef to ParseHandler
This commit is contained in:
aleks-f
2013-03-16 11:33:27 -05:00
parent fe6715890c
commit 42ff341cb9
34 changed files with 1249 additions and 328 deletions

View File

@@ -39,7 +39,8 @@
#include "Poco/JSON/Query.h"
#include "Poco/JSON/JSONException.h"
#include "Poco/JSON/Stringifier.h"
#include "Poco/JSON/DefaultHandler.h"
#include "Poco/JSON/ParseHandler.h"
#include "Poco/JSON/PrintHandler.h"
#include "Poco/JSON/Template.h"
#include "Poco/Path.h"
@@ -87,7 +88,7 @@ void JSONTest::testNullProperty()
Var result;
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -114,7 +115,7 @@ void JSONTest::testTrueProperty()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -143,7 +144,7 @@ void JSONTest::testFalseProperty()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -172,7 +173,7 @@ void JSONTest::testNumberProperty()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -202,7 +203,7 @@ void JSONTest::testUnsignedNumberProperty()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -233,7 +234,7 @@ void JSONTest::testNumber64Property()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -263,7 +264,7 @@ void JSONTest::testUnsignedNumber64Property()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -294,7 +295,7 @@ void JSONTest::testStringProperty()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -323,7 +324,7 @@ void JSONTest::testEmptyObject()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -349,7 +350,7 @@ void JSONTest::testDoubleProperty()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -378,7 +379,7 @@ void JSONTest::testDouble2Property()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -407,7 +408,7 @@ void JSONTest::testDouble3Property()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -436,7 +437,7 @@ void JSONTest::testObjectProperty()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -472,7 +473,7 @@ void JSONTest::testObjectArray()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -494,6 +495,37 @@ void JSONTest::testObjectArray()
}
void JSONTest::testArrayOfObjects()
{
std::string json = "[ {\"test\" : 0}, { \"test1\" : [1, 2, 3], \"test2\" : 4 } ]";
Parser parser;
Var result;
try
{
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
}
catch(JSONException& jsone)
{
std::cout << jsone.message() << std::endl;
assert(false);
}
assert(result.type() == typeid(Array::Ptr));
Array::Ptr arr = result.extract<Array::Ptr>();
Object::Ptr object = arr->getObject(0);
assert (object->getValue<int>("test") == 0);
object = arr->getObject(1);
arr = object->getArray("test1");
result = arr->get(0);
assert (result == 1);
}
void JSONTest::testEmptyArray()
{
std::string json = "[]";
@@ -502,7 +534,7 @@ void JSONTest::testEmptyArray()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -528,7 +560,7 @@ void JSONTest::testNestedArray()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -554,7 +586,7 @@ void JSONTest::testNullElement()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -582,7 +614,7 @@ void JSONTest::testTrueElement()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -611,7 +643,7 @@ void JSONTest::testFalseElement()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -640,7 +672,7 @@ void JSONTest::testNumberElement()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -669,7 +701,7 @@ void JSONTest::testStringElement()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -698,7 +730,7 @@ void JSONTest::testEmptyObjectElement()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -725,7 +757,7 @@ void JSONTest::testDoubleElement()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -754,7 +786,7 @@ void JSONTest::testOptValue()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -781,7 +813,7 @@ void JSONTest::testQuery()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -801,15 +833,77 @@ void JSONTest::testQuery()
}
void JSONTest::testPrintHandler()
{
std::string json = "{ \"name\" : \"Homer\", \"age\" : 38, \"wife\" : \"Marge\", \"age\" : 36, \"children\" : [ \"Bart\", \"Lisa\", \"Maggie\" ] }";
Parser parser;
std::ostringstream ostr;
PrintHandler handler(ostr);
parser.setHandler(&handler);
parser.parse(json);
assert (ostr.str() == "{\"name\":\"Homer\",\"age\":38,\"wife\":\"Marge\",\"age\":36,\"children\":[\"Bart\",\"Lisa\",\"Maggie\"]}");
handler.setIndent(1);
ostr.str("");
parser.parse(json);
assert (ostr.str() == "{\n"
" \"name\" : \"Homer\",\n"
" \"age\" : 38,\n"
" \"wife\" : \"Marge\",\n"
" \"age\" : 36,\n"
" \"children\" : [\n"
" \"Bart\",\n"
" \"Lisa\",\n"
" \"Maggie\"\n"
" ]\n"
"}"
);
handler.setIndent(2);
ostr.str("");
parser.parse(json);
assert (ostr.str() == "{\n"
" \"name\" : \"Homer\",\n"
" \"age\" : 38,\n"
" \"wife\" : \"Marge\",\n"
" \"age\" : 36,\n"
" \"children\" : [\n"
" \"Bart\",\n"
" \"Lisa\",\n"
" \"Maggie\"\n"
" ]\n"
"}"
);
handler.setIndent(4);
ostr.str("");
parser.parse(json);
assert (ostr.str() == "{\n"
" \"name\" : \"Homer\",\n"
" \"age\" : 38,\n"
" \"wife\" : \"Marge\",\n"
" \"age\" : 36,\n"
" \"children\" : [\n"
" \"Bart\",\n"
" \"Lisa\",\n"
" \"Maggie\"\n"
" ]\n"
"}"
);
}
void JSONTest::testStringify()
{
std::string json = "{ \"name\" : \"Franky\", \"children\" : [ \"Jonas\", \"Ellen\" ] }";
std::string json = "{ \"Simpsons\" : { \"husband\" : { \"name\" : \"Homer\" , \"age\" : 38 }, \"wife\" : { \"name\" : \"Marge\", \"age\" : 36 }, "
"\"children\" : [ \"Bart\", \"Lisa\", \"Maggie\" ], "
"\"address\" : { \"number\" : 742, \"street\" : \"Evergreen Terrace\", \"town\" : \"Springfield\" } } }";
Parser parser;
Var result;
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -822,9 +916,221 @@ void JSONTest::testStringify()
assert(result.type() == typeid(Object::Ptr));
std::ostringstream ostr;
Stringifier::condense(result, ostr);
std::string str = "{"
"\"Simpsons\":{"
"\"address\":{"
"\"number\":742,"
"\"street\":\"Evergreen Terrace\","
"\"town\":\"Springfield\""
"},"
"\"children\":["
"\"Bart\","
"\"Lisa\","
"\"Maggie\"],"
"\"husband\":{"
"\"age\":38,"
"\"name\":\"Homer\""
"},"
"\"wife\":{"
"\"age\":36,\"name\":\"Marge\""
"}}}";
assert (ostr.str() == str);
ostr.str("");
Stringifier::stringify(result, ostr);
//TODO: need map that does not order for internal container
assert (ostr.str() == "{\"name\":\"Franky\",\"children\":[\"Jonas\",\"Ellen\"]}");
assert (ostr.str() == str);
ostr.str("");
Stringifier::stringify(result, ostr, 1);
str = "{\n"
" \"Simpsons\" : {\n"
" \"address\" : {\n"
" \"number\" : 742,\n"
" \"street\" : \"Evergreen Terrace\",\n"
" \"town\" : \"Springfield\"\n"
" },\n"
" \"children\" : [\n"
" \"Bart\",\n"
" \"Lisa\",\n"
" \"Maggie\"\n"
" ],\n"
" \"husband\" : {\n"
" \"age\" : 38,\n"
" \"name\" : \"Homer\"\n"
" },\n"
" \"wife\" : {\n"
" \"age\" : 36,\n"
" \"name\" : \"Marge\"\n"
" }\n"
" }\n"
"}";
assert (ostr.str() == str);
ostr.str("");
Stringifier::stringify(result, ostr, 2);
str = "{\n"
" \"Simpsons\" : {\n"
" \"address\" : {\n"
" \"number\" : 742,\n"
" \"street\" : \"Evergreen Terrace\",\n"
" \"town\" : \"Springfield\"\n"
" },\n"
" \"children\" : [\n"
" \"Bart\",\n"
" \"Lisa\",\n"
" \"Maggie\"\n"
" ],\n"
" \"husband\" : {\n"
" \"age\" : 38,\n"
" \"name\" : \"Homer\"\n"
" },\n"
" \"wife\" : {\n"
" \"age\" : 36,\n"
" \"name\" : \"Marge\"\n"
" }\n"
" }\n"
"}";
assert (ostr.str() == str);
ostr.str("");
Stringifier::stringify(result, ostr, 4);
str = "{\n"
" \"Simpsons\" : {\n"
" \"address\" : {\n"
" \"number\" : 742,\n"
" \"street\" : \"Evergreen Terrace\",\n"
" \"town\" : \"Springfield\"\n"
" },\n"
" \"children\" : [\n"
" \"Bart\",\n"
" \"Lisa\",\n"
" \"Maggie\"\n"
" ],\n"
" \"husband\" : {\n"
" \"age\" : 38,\n"
" \"name\" : \"Homer\"\n"
" },\n"
" \"wife\" : {\n"
" \"age\" : 36,\n"
" \"name\" : \"Marge\"\n"
" }\n"
" }\n"
"}";
assert (ostr.str() == str);
}
void JSONTest::testStringifyPreserveOrder()
{
std::string json = "{ \"Simpsons\" : { \"husband\" : { \"name\" : \"Homer\" , \"age\" : 38 }, \"wife\" : { \"name\" : \"Marge\", \"age\" : 36 }, "
"\"children\" : [ \"Bart\", \"Lisa\", \"Maggie\" ], "
"\"address\" : { \"number\" : 742, \"street\" : \"Evergreen Terrace\", \"town\" : \"Springfield\" } } }";
Parser parser;
Var result;
try
{
ParseHandler handler(true);
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
}
catch(JSONException& jsone)
{
std::cout << jsone.message() << std::endl;
assert(false);
}
assert(result.type() == typeid(Object::Ptr));
std::ostringstream ostr;
Stringifier::condense(result, ostr);
assert (ostr.str() == "{\"Simpsons\":{\"husband\":{\"name\":\"Homer\",\"age\":38},\"wife\":{\"name\":\"Marge\",\"age\":36},"
"\"children\":[\"Bart\",\"Lisa\",\"Maggie\"],"
"\"address\":{\"number\":742,\"street\":\"Evergreen Terrace\",\"town\":\"Springfield\"}}}");
ostr.str("");
Stringifier::stringify(result, ostr);
assert (ostr.str() == "{\"Simpsons\":{\"husband\":{\"name\":\"Homer\",\"age\":38},\"wife\":{\"name\":\"Marge\",\"age\":36},"
"\"children\":[\"Bart\",\"Lisa\",\"Maggie\"],"
"\"address\":{\"number\":742,\"street\":\"Evergreen Terrace\",\"town\":\"Springfield\"}}}");
ostr.str("");
Stringifier::stringify(result, ostr, 1);
assert (ostr.str() == "{\n"
" \"Simpsons\" : {\n"
" \"husband\" : {\n"
" \"name\" : \"Homer\",\n"
" \"age\" : 38\n"
" },\n"
" \"wife\" : {\n"
" \"name\" : \"Marge\",\n"
" \"age\" : 36\n"
" },\n"
" \"children\" : [\n"
" \"Bart\",\n"
" \"Lisa\",\n"
" \"Maggie\"\n"
" ],\n"
" \"address\" : {\n"
" \"number\" : 742,\n"
" \"street\" : \"Evergreen Terrace\",\n"
" \"town\" : \"Springfield\"\n"
" }\n"
" }\n"
"}");
ostr.str("");
Stringifier::stringify(result, ostr, 2);
assert (ostr.str() == "{\n"
" \"Simpsons\" : {\n"
" \"husband\" : {\n"
" \"name\" : \"Homer\",\n"
" \"age\" : 38\n"
" },\n"
" \"wife\" : {\n"
" \"name\" : \"Marge\",\n"
" \"age\" : 36\n"
" },\n"
" \"children\" : [\n"
" \"Bart\",\n"
" \"Lisa\",\n"
" \"Maggie\"\n"
" ],\n"
" \"address\" : {\n"
" \"number\" : 742,\n"
" \"street\" : \"Evergreen Terrace\",\n"
" \"town\" : \"Springfield\"\n"
" }\n"
" }\n"
"}");
ostr.str("");
Stringifier::stringify(result, ostr, 4);
assert (ostr.str() == "{\n"
" \"Simpsons\" : {\n"
" \"husband\" : {\n"
" \"name\" : \"Homer\",\n"
" \"age\" : 38\n"
" },\n"
" \"wife\" : {\n"
" \"name\" : \"Marge\",\n"
" \"age\" : 36\n"
" },\n"
" \"children\" : [\n"
" \"Bart\",\n"
" \"Lisa\",\n"
" \"Maggie\"\n"
" ],\n"
" \"address\" : {\n"
" \"number\" : 742,\n"
" \"street\" : \"Evergreen Terrace\",\n"
" \"town\" : \"Springfield\"\n"
" }\n"
" }\n"
"}");
}
@@ -852,7 +1158,7 @@ void JSONTest::testValidJanssonFiles()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(fis);
result = handler.result();
@@ -900,7 +1206,7 @@ void JSONTest::testInvalidJanssonFiles()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(fis);
result = handler.result();
@@ -944,7 +1250,7 @@ void JSONTest::testInvalidUnicodeJanssonFiles()
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(fis);
result = handler.result();
@@ -977,6 +1283,7 @@ void JSONTest::testTemplate()
tpl.render(data, std::cout);
}
void JSONTest::testUnicode()
{
const unsigned char supp[] = {0x61, 0xE1, 0xE9, 0x78, 0xED, 0xF3, 0xFA, 0x0};
@@ -988,7 +1295,7 @@ void JSONTest::testUnicode()
Var result;
try
{
DefaultHandler handler;
ParseHandler handler;
parser.setHandler(&handler);
parser.parse(json);
result = handler.result();
@@ -1012,6 +1319,7 @@ void JSONTest::testUnicode()
assert(test.convert<std::string>() == original);
}
std::string JSONTest::getTestFilesPath(const std::string& type)
{
std::ostringstream ostr;
@@ -1060,6 +1368,7 @@ CppUnit::Test* JSONTest::suite()
CppUnit_addTest(pSuite, JSONTest, testDouble3Property);
CppUnit_addTest(pSuite, JSONTest, testObjectProperty);
CppUnit_addTest(pSuite, JSONTest, testObjectArray);
CppUnit_addTest(pSuite, JSONTest, testArrayOfObjects);
CppUnit_addTest(pSuite, JSONTest, testEmptyArray);
CppUnit_addTest(pSuite, JSONTest, testNestedArray);
CppUnit_addTest(pSuite, JSONTest, testNullElement);
@@ -1071,7 +1380,9 @@ CppUnit::Test* JSONTest::suite()
CppUnit_addTest(pSuite, JSONTest, testDoubleElement);
CppUnit_addTest(pSuite, JSONTest, testOptValue);
CppUnit_addTest(pSuite, JSONTest, testQuery);
CppUnit_addTest(pSuite, JSONTest, testPrintHandler);
CppUnit_addTest(pSuite, JSONTest, testStringify);
CppUnit_addTest(pSuite, JSONTest, testStringifyPreserveOrder);
CppUnit_addTest(pSuite, JSONTest, testValidJanssonFiles);
CppUnit_addTest(pSuite, JSONTest, testInvalidJanssonFiles);
CppUnit_addTest(pSuite, JSONTest, testInvalidUnicodeJanssonFiles);

View File

@@ -62,6 +62,7 @@ public:
void testDouble3Property();
void testObjectProperty();
void testObjectArray();
void testArrayOfObjects();
void testEmptyArray();
void testNestedArray();
void testNullElement();
@@ -73,7 +74,9 @@ public:
void testDoubleElement();
void testOptValue();
void testQuery();
void testPrintHandler();
void testStringify();
void testStringifyPreserveOrder();
void testValidJanssonFiles();
void testInvalidJanssonFiles();