| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393 |
- //
- // JSONTest.cpp
- //
- // $Id: //poco/1.4/XML/testsuite/src/JSONTest.cpp#1 $
- //
- // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
- // and Contributors.
- //
- // Permission is hereby granted, free of charge, to any person or organization
- // obtaining a copy of the software and accompanying documentation covered by
- // this license (the "Software") to use, reproduce, display, distribute,
- // execute, and transmit the Software, and to prepare derivative works of the
- // Software, and to permit third-parties to whom the Software is furnished to
- // do so, all subject to the following:
- //
- // The copyright notices in the Software and this entire statement, including
- // the above license grant, this restriction and the following disclaimer,
- // must be included in all copies of the Software, in whole or in part, and
- // all derivative works of the Software, unless such copies or derivative
- // works are solely in the form of machine-executable object code generated by
- // a source language processor.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
- // SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
- // FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
- // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- // DEALINGS IN THE SOFTWARE.
- //
- #include "JSONTest.h"
- #include "CppUnit/TestCaller.h"
- #include "CppUnit/TestSuite.h"
- #include "Poco/JSON/Object.h"
- #include "Poco/JSON/Parser.h"
- #include "Poco/JSON/Query.h"
- #include "Poco/JSON/JSONException.h"
- #include "Poco/JSON/Stringifier.h"
- #include "Poco/JSON/ParseHandler.h"
- #include "Poco/JSON/PrintHandler.h"
- #include "Poco/JSON/Template.h"
- #include "Poco/Path.h"
- #include "Poco/Environment.h"
- #include "Poco/File.h"
- #include "Poco/FileStream.h"
- #include "Poco/Glob.h"
- #include "Poco/UTF8Encoding.h"
- #include "Poco/Latin1Encoding.h"
- #include "Poco/TextConverter.h"
- #include <set>
- using namespace Poco::JSON;
- using namespace Poco::Dynamic;
- JSONTest::JSONTest(const std::string& name): CppUnit::TestCase("JSON")
- {
- }
- JSONTest::~JSONTest()
- {
- }
- void JSONTest::setUp()
- {
- }
- void JSONTest::tearDown()
- {
- }
- void JSONTest::testNullProperty()
- {
- std::string json = "{ \"test\" : null }";
- 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(Object::Ptr));
- Object::Ptr object = result.extract<Object::Ptr>();
- assert(object->isNull("test"));
- Var test = object->get("test");
- assert(test.isEmpty());
- }
- void JSONTest::testTrueProperty()
- {
- std::string json = "{ \"test\" : true }";
- 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(Object::Ptr));
- Object::Ptr object = result.extract<Object::Ptr>();
- Var test = object->get("test");
- assert(test.type() == typeid(bool));
- bool value = test;
- assert(value);
- }
- void JSONTest::testFalseProperty()
- {
- std::string json = "{ \"test\" : false }";
- 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(Object::Ptr));
- Object::Ptr object = result.extract<Object::Ptr>();
- Var test = object->get("test");
- assert(test.type() == typeid(bool));
- bool value = test;
- assert(!value);
- }
- void JSONTest::testNumberProperty()
- {
- std::string json = "{ \"test\" : 1969 }";
- 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(Object::Ptr));
- Object::Ptr object = result.extract<Object::Ptr>();
- Var test = object->get("test");
- assert(test.isInteger());
- int value = test;
- assert(value == 1969);
- }
- void JSONTest::testUnsignedNumberProperty()
- {
- // 4294967295 == unsigned(-1)
- std::string json = "{ \"test\" : 4294967295 }";
- 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(Object::Ptr));
- Object::Ptr object = result.extract<Object::Ptr>();
- Var test = object->get("test");
- assert(test.isInteger());
- unsigned value = test;
- assert(value == -1);
- }
- #if defined(POCO_HAVE_INT64)
- void JSONTest::testNumber64Property()
- {
- std::string json = "{ \"test\" : -5000000000000000 }";
- 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(Object::Ptr));
- Object::Ptr object = result.extract<Object::Ptr>();
- Var test = object->get("test");
- assert(test.isInteger());
- Poco::Int64 value = test;
- assert(value == -5000000000000000);
- }
- void JSONTest::testUnsignedNumber64Property()
- {
- // 18446744073709551615 == UInt64(-1)
- std::string json = "{ \"test\" : 18446744073709551615 }";
- 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(Object::Ptr));
- Object::Ptr object = result.extract<Object::Ptr>();
- Var test = object->get("test");
- assert(test.isInteger());
- Poco::UInt64 value = test;
- assert(value == -1);
- }
- #endif
- void JSONTest::testStringProperty()
- {
- std::string json = "{ \"test\" : \"value\" }";
- 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(Object::Ptr));
- Object::Ptr object = result.extract<Object::Ptr>();
- Var test = object->get("test");
- assert(test.isString());
- std::string value = test.convert<std::string>();
- assert(value.compare("value") == 0);
- }
- void JSONTest::testEmptyObject()
- {
- std::string json = "{}";
- 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(Object::Ptr));
- Object::Ptr object = result.extract<Object::Ptr>();
- assert(object->size() == 0);
- }
- void JSONTest::testDoubleProperty()
- {
- std::string json = "{ \"test\" : 123.45 }";
- 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(Object::Ptr));
- Object::Ptr object = result.extract<Object::Ptr>();
- Var test = object->get("test");
- assert(test.isNumeric());
- double value = test;
- assert(value == 123.45);
- }
- void JSONTest::testDouble2Property()
- {
- std::string json = "{ \"test\" : 12e34 }";
- 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(Object::Ptr));
- Object::Ptr object = result.extract<Object::Ptr>();
- Var test = object->get("test");
- assert(test.isNumeric());
- double value = test;
- assert(value >= 1.99e34 && value <= 12.01e34);
- }
- void JSONTest::testDouble3Property()
- {
- std::string json = "{ \"test\" : 12e-34 }";
- 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(Object::Ptr));
- Object::Ptr object = result.extract<Object::Ptr>();
- Var test = object->get("test");
- assert(test.isNumeric());
- double value = test;
- assert(value == 12e-34);
- }
- void JSONTest::testObjectProperty()
- {
- std::string json = "{ \"test\" : { \"property\" : \"value\" } }";
- 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(Object::Ptr));
-
- Object::Ptr object = result.extract<Object::Ptr>();
- assert (object->isObject("test"));
- assert (!object->isArray("test"));
- Var test = object->get("test");
- assert(test.type() == typeid(Object::Ptr));
- object = test.extract<Object::Ptr>();
- test = object->get("property");
- assert(test.isString());
- std::string value = test.convert<std::string>();
- assert(value.compare("value") == 0);
- }
- void JSONTest::testObjectArray()
- {
- std::string json = "{ \"test\" : { \"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(Object::Ptr));
- Object::Ptr object = result.extract<Object::Ptr>();
- assert(object->isObject("test"));
- object = object->getObject("test");
- assert(!object->isObject("test1"));
- assert(object->isArray("test1"));
- assert(!object->isObject("test2"));
- assert(!object->isArray("test2"));
- }
- 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 = "[]";
- 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 array = result.extract<Array::Ptr>();
- assert(array->size() == 0);
- }
- void JSONTest::testNestedArray()
- {
- std::string json = "[[[[]]]]";
- 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 array = result.extract<Array::Ptr>();
- assert(array->size() == 1);
- }
- void JSONTest::testNullElement()
- {
- std::string json = "[ null ]";
- 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 array = result.extract<Array::Ptr>();
- assert(array->isNull(0));
- Var test = array->get(0);
- assert(test.isEmpty());
- }
- void JSONTest::testTrueElement()
- {
- std::string json = "[ true ]";
- 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 array = result.extract<Array::Ptr>();
- Var test = array->get(0);
- assert(test.type() == typeid(bool));
- bool value = test;
- assert(value);
- }
- void JSONTest::testFalseElement()
- {
- std::string json = "[ false ]";
- 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 array = result.extract<Array::Ptr>();
- Var test = array->get(0);
- assert(test.type() == typeid(bool));
- bool value = test;
- assert(!value);
- }
- void JSONTest::testNumberElement()
- {
- std::string json = "[ 1969 ]";
- 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 array = result.extract<Array::Ptr>();
- Var test = array->get(0);
- assert(test.isInteger());
- int value = test;
- assert(value == 1969);
- }
- void JSONTest::testStringElement()
- {
- std::string json = "[ \"value\" ]";
- 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 array = result.extract<Array::Ptr>();
- Var test = array->get(0);
- assert(test.isString());
- std::string value = test.convert<std::string>();
- assert(value.compare("value") == 0);
- }
- void JSONTest::testEmptyObjectElement()
- {
- std::string json = "[{}]";
- 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 array = result.extract<Array::Ptr>();
- Object::Ptr object = array->getObject(0);
- assert(object->size() == 0);
- }
- void JSONTest::testDoubleElement()
- {
- std::string json = "[ 123.45 ]";
- 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 array = result.extract<Array::Ptr>();
- Var test = array->get(0);
- assert(test.isNumeric());
- double value = test;
- assert(value == 123.45);
- }
- void JSONTest::testOptValue()
- {
- std::string json = "{ }";
- 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(Object::Ptr));
- Object::Ptr object = result.extract<Object::Ptr>();
- int n = object->optValue("test", 123);
- assert(n == 123);
- }
- void JSONTest::testQuery()
- {
- std::string json = "{ \"name\" : \"Franky\", \"children\" : [ \"Jonas\", \"Ellen\" ] }";
- 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(Object::Ptr));
- Query query(result);
- std::string firstChild = query.findValue("children[0]", "");
- assert(firstChild.compare("Jonas") == 0);
- }
- 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 = "{ \"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;
- 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);
- 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);
- 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"
- "}");
- }
- void JSONTest::testValidJanssonFiles()
- {
- Poco::Path pathPattern(getTestFilesPath("valid"));
- std::set<std::string> paths;
- Poco::Glob::glob(pathPattern, paths);
- for(std::set<std::string>::iterator it = paths.begin(); it != paths.end(); ++it)
- {
- Poco::Path filePath(*it, "input");
- if ( filePath.isFile() )
- {
- Poco::File inputFile(filePath);
- if ( inputFile.exists() )
- {
- Poco::FileInputStream fis(filePath.toString());
- std::cout << filePath.toString() << std::endl;
- Parser parser;
- Var result;
- try
- {
- ParseHandler handler;
- parser.setHandler(&handler);
- parser.parse(fis);
- result = handler.result();
- std::cout << "Ok!" << std::endl;
- }
- catch(JSONException& jsone)
- {
- std::string err = jsone.displayText();
- std::cout << "Failed:" << err << std::endl;
- fail (err);
- }
- catch(Poco::Exception& e)
- {
- std::string err = e.displayText();
- std::cout << "Failed:" << err << std::endl;
- fail (err);
- }
- }
- }
- }
- }
- void JSONTest::testInvalidJanssonFiles()
- {
- Poco::Path pathPattern(getTestFilesPath("invalid"));
- std::set<std::string> paths;
- Poco::Glob::glob(pathPattern, paths);
- for(std::set<std::string>::iterator it = paths.begin(); it != paths.end(); ++it)
- {
- Poco::Path filePath(*it, "input");
- if ( filePath.isFile() )
- {
- Poco::File inputFile(filePath);
- if ( inputFile.exists() )
- {
- Poco::FileInputStream fis(filePath.toString());
- std::cout << filePath.toString() << std::endl;
- Parser parser;
- Var result;
- try
- {
- ParseHandler handler;
- parser.setHandler(&handler);
- parser.parse(fis);
- result = handler.result();
- // We shouldn't get here.
- std::cout << "We didn't get an exception. This is the result: " << result.convert<std::string>() << std::endl;
- fail(result.convert<std::string>());
- }
- catch(JSONException&)
- {
- continue;
- }
- catch(Poco::SyntaxException&)
- { }
- }
- }
- }
- }
- void JSONTest::testInvalidUnicodeJanssonFiles()
- {
- Poco::Path pathPattern(getTestFilesPath("invalid-unicode"));
- std::set<std::string> paths;
- Poco::Glob::glob(pathPattern, paths);
- for(std::set<std::string>::iterator it = paths.begin(); it != paths.end(); ++it)
- {
- Poco::Path filePath(*it, "input");
- if ( filePath.isFile() )
- {
- Poco::File inputFile(filePath);
- if ( inputFile.exists() )
- {
- Poco::FileInputStream fis(filePath.toString());
- std::cout << filePath.toString() << std::endl;
- Parser parser;
- Var result;
- try
- {
- ParseHandler handler;
- parser.setHandler(&handler);
- parser.parse(fis);
- result = handler.result();
- // We shouldn't get here.
- std::cout << "We didn't get an exception. This is the result: " << result.convert<std::string>() << std::endl;
- fail(result.convert<std::string>());
- }
- catch(JSONException&)
- {
- continue;
- }
- catch(Poco::SyntaxException&)
- { }
- }
- }
- }
- }
- void JSONTest::testTemplate()
- {
- Template tpl;
- tpl.parse("Hello world! From <?= person.name ?>\n<?if person.toOld ?>You're too old<?endif?>\n");
- Object::Ptr data = new Object();
- Object::Ptr person = new Object();
- data->set("person", person);
- person->set("name", "Franky");
- person->set("toOld", true);
- tpl.render(data, std::cout);
- }
- void JSONTest::testUnicode()
- {
- const unsigned char supp[] = {0x61, 0xE1, 0xE9, 0x78, 0xED, 0xF3, 0xFA, 0x0};
- std::string text((const char*) supp);
- std::string json = "{ \"test\" : \"a\\u00E1\\u00E9x\\u00ED\\u00F3\\u00FA\" }";
- 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(Object::Ptr));
- Object::Ptr object = result.extract<Object::Ptr>();
- Var test = object->get("test");
- Poco::Latin1Encoding latin1;
- Poco::UTF8Encoding utf8;
- Poco::TextConverter converter(latin1, utf8);
- std::string original;
- converter.convert(text, original);
- assert(test.convert<std::string>() == original);
- }
- std::string JSONTest::getTestFilesPath(const std::string& type)
- {
- std::ostringstream ostr;
- ostr << "data/" << type << '/';
- std::string validDir(ostr.str());
- Poco::Path pathPattern(validDir);
- if (Poco::File(pathPattern).exists())
- {
- validDir += '*';
- return validDir;
- }
- ostr.str("");
- ostr << "/JSON/testsuite/data/" << type << '/';
- validDir = Poco::Environment::get("POCO_BASE") + ostr.str();
- pathPattern = validDir;
- if (Poco::File(pathPattern).exists())
- validDir += '*';
- else
- {
- std::cout << "Can't find " << validDir << std::endl;
- throw Poco::NotFoundException("cannot locate directory containing valid JSON test files");
- }
- return validDir;
- }
- CppUnit::Test* JSONTest::suite()
- {
- CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("JSONTest");
- CppUnit_addTest(pSuite, JSONTest, testNullProperty);
- CppUnit_addTest(pSuite, JSONTest, testTrueProperty);
- CppUnit_addTest(pSuite, JSONTest, testFalseProperty);
- CppUnit_addTest(pSuite, JSONTest, testNumberProperty);
- CppUnit_addTest(pSuite, JSONTest, testUnsignedNumberProperty);
- #if defined(POCO_HAVE_INT64)
- CppUnit_addTest(pSuite, JSONTest, testNumber64Property);
- CppUnit_addTest(pSuite, JSONTest, testUnsignedNumber64Property);
- #endif
- CppUnit_addTest(pSuite, JSONTest, testStringProperty);
- CppUnit_addTest(pSuite, JSONTest, testEmptyObject);
- CppUnit_addTest(pSuite, JSONTest, testDoubleProperty);
- CppUnit_addTest(pSuite, JSONTest, testDouble2Property);
- 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);
- CppUnit_addTest(pSuite, JSONTest, testTrueElement);
- CppUnit_addTest(pSuite, JSONTest, testFalseElement);
- CppUnit_addTest(pSuite, JSONTest, testNumberElement);
- CppUnit_addTest(pSuite, JSONTest, testStringElement);
- CppUnit_addTest(pSuite, JSONTest, testEmptyObjectElement);
- 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);
- CppUnit_addTest(pSuite, JSONTest, testTemplate);
- CppUnit_addTest(pSuite, JSONTest, testUnicode);
- return pSuite;
- }
|