mirror of
https://github.com/pocoproject/poco.git
synced 2025-03-29 02:45:21 +01:00
1385 lines
30 KiB
C++
1385 lines
30 KiB
C++
//
|
|
// 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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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::testComplexObject()
|
|
{
|
|
std::string json =
|
|
"{"
|
|
"\"id\": 1,"
|
|
"\"jsonrpc\": \"2.0\","
|
|
"\"total\": 1,"
|
|
"\"result\": ["
|
|
"{"
|
|
"\"id\": 1,"
|
|
"\"guid\": \"67acfb26-17eb-4a75-bdbd-f0669b7d8f73\","
|
|
"\"picture\": \"http://placehold.it/32x32\","
|
|
"\"age\": 40,"
|
|
"\"name\": \"Angelina Crossman\","
|
|
"\"gender\": \"female\","
|
|
"\"company\": \"Raylog\","
|
|
"\"phone\": \"892-470-2803\","
|
|
"\"email\": \"angelina@raylog.com\","
|
|
"\"address\": \"20726, CostaMesa, Horatio Streets\","
|
|
"\"about\": \"Consectetuer suscipit volutpat eros dolor euismod, "
|
|
"et dignissim in feugiat sed, ea tation exerci quis. Consectetuer, "
|
|
"dolor dolore ad vero ullamcorper, tincidunt facilisis at in facilisi, "
|
|
"iusto illum illum. Autem nibh, sed elit consequat volutpat tation, "
|
|
"nisl lorem lorem sed tation, facilisis dolore. Augue odio molestie, "
|
|
"dolor zzril nostrud aliquam sed, wisi dolor et ut iusto, ea. Magna "
|
|
"ex qui facilisi, hendrerit quis in eros ut, zzril nibh dolore nisl "
|
|
"suscipit, vulputate elit ut lobortis exerci, nulla dolore eros at "
|
|
"aliquam, ullamcorper vero ad iusto. Adipiscing, nisl eros exerci "
|
|
"nisl vel, erat in luptatum in duis, iusto.\","
|
|
"\"registered\": \"2008-04-09T11:13:17 +05:00\","
|
|
"\"tags\": ["
|
|
"\"ut\","
|
|
"\"accumsan\","
|
|
"\"feugait\","
|
|
"\"ex\","
|
|
"\"odio\","
|
|
"\"consequat\","
|
|
"\"delenit\""
|
|
"],"
|
|
"\"friends\": ["
|
|
"{"
|
|
"\"id\": 1,"
|
|
"\"name\": \"Hailey Hardman\""
|
|
"},"
|
|
"{"
|
|
"\"id\": 2,"
|
|
"\"name\": \"Bailey Oldridge\""
|
|
"},"
|
|
"{"
|
|
"\"id\": 3,"
|
|
"\"name\": \"Makayla Campbell\""
|
|
"}"
|
|
"]"
|
|
"}"
|
|
"]"
|
|
"}";
|
|
|
|
Parser parser;
|
|
Var result;
|
|
|
|
try
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
catch(JSONException& jsone)
|
|
{
|
|
std::cout << jsone.message() << std::endl;
|
|
assert(false);
|
|
}
|
|
|
|
assert(result.type() == typeid(Object::Ptr));
|
|
}
|
|
|
|
|
|
void JSONTest::testDoubleProperty()
|
|
{
|
|
std::string json = "{ \"test\" : 123.45 }";
|
|
Parser parser;
|
|
Var result;
|
|
|
|
try
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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::Ptr pHandler = new PrintHandler(ostr);
|
|
parser.setHandler(pHandler);
|
|
parser.parse(json);
|
|
assert (ostr.str() == "{\"name\":\"Homer\",\"age\":38,\"wife\":\"Marge\",\"age\":36,\"children\":[\"Bart\",\"Lisa\",\"Maggie\"]}");
|
|
|
|
pHandler->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"
|
|
"}"
|
|
);
|
|
|
|
pHandler->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"
|
|
"}"
|
|
);
|
|
|
|
pHandler->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
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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\" } } }";
|
|
|
|
ParseHandler::Ptr pHandler = new ParseHandler(true);
|
|
Parser parser(pHandler);
|
|
Var result;
|
|
|
|
try
|
|
{
|
|
result = parser.parse(json);
|
|
}
|
|
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::cout << ostr.str() << std::endl;
|
|
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
|
|
{
|
|
parser.parse(fis);
|
|
result = parser.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;
|
|
parser.allowNullByte(false);
|
|
Var result;
|
|
|
|
try
|
|
{
|
|
parser.parse(fis);
|
|
result = parser.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;
|
|
parser.allowNullByte(false);
|
|
Var result;
|
|
|
|
try
|
|
{
|
|
parser.parse(fis);
|
|
result = parser.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.tooOld?>You're too old.<?endif?>");
|
|
|
|
Object::Ptr data = new Object();
|
|
Object::Ptr person = new Object();
|
|
data->set("person", person);
|
|
person->set("name", "Franky");
|
|
person->set("tooOld", true);
|
|
std::ostringstream ostr;
|
|
tpl.render(data, ostr);
|
|
std::cout << ostr.str();
|
|
assert (ostr.str() == "Hello world! From Franky.\nYou're too old.");
|
|
}
|
|
|
|
|
|
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
|
|
{
|
|
parser.parse(json);
|
|
result = parser.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, testComplexObject);
|
|
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;
|
|
}
|