155714Skris/*
255714Skris * Copyright 2017, Andrew Lindesay <apl@lindesay.co.nz>
355714Skris * Distributed under the terms of the MIT License.
455714Skris */
555714Skris#include "JsonTextWriterTest.h"
655714Skris
755714Skris#include <AutoDeleter.h>
8296465Sdelphij
955714Skris#include <Json.h>
1055714Skris#include <JsonTextWriter.h>
1155714Skris
1255714Skris#include <cppunit/TestCaller.h>
1355714Skris#include <cppunit/TestSuite.h>
1455714Skris
15296465Sdelphij#include "JsonSamples.h"
1655714Skris
1755714Skris
1855714Skris#define LOOPS_TEST_OBJECT_A_FOR_PERFORMANCE 100000
1955714Skris
2055714Skris
2155714Skrisusing namespace BPrivate;
22296465Sdelphij
2355714Skris
2455714SkrisJsonTextWriterTest::JsonTextWriterTest()
2555714Skris{
2655714Skris}
2755714Skris
2855714Skris
2955714SkrisJsonTextWriterTest::~JsonTextWriterTest()
3055714Skris{
3155714Skris}
3255714Skris
3355714Skris
3455714Skrisvoid
3555714SkrisJsonTextWriterTest::TestArrayA()
3655714Skris{
37296465Sdelphij	BMallocIO* outputData = new BMallocIO();
3855714Skris	ObjectDeleter<BMallocIO> outputDataDeleter(outputData);
3955714Skris	BJsonTextWriter writer(outputData);
40296465Sdelphij
4155714Skris	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteArrayStart());
4255714Skris	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("1234"));
4355714Skris	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteInteger(4567));
4455714Skris	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteArrayStart());
4555714Skris	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("A"));
4655714Skris	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("b"));
4755714Skris	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("C\xc3\xa9zanne"));
4855714Skris	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteArrayEnd());
4955714Skris	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteArrayEnd());
5055714Skris	writer.Complete();
5155714Skris
52296465Sdelphij	BString outputString((char*)outputData->Buffer(),
5355714Skris		outputData->BufferLength());
5455714Skris	fprintf(stderr, "expected out >%s<\n", JSON_SAMPLE_ARRAY_A_EXPECTED_OUT);
5555714Skris	fprintf(stderr, "actual out   >%s< (%" B_PRIuSIZE ")\n", outputString.String(),
5655714Skris		outputData->BufferLength());
5755714Skris
5855714Skris	CPPUNIT_ASSERT_EQUAL(BString(JSON_SAMPLE_ARRAY_A_EXPECTED_OUT),
5955714Skris		outputString);
60296465Sdelphij}
6155714Skris
62296465Sdelphij
63296465Sdelphijvoid
6455714SkrisJsonTextWriterTest::TestObjectA()
65296465Sdelphij{
6655714Skris	BMallocIO* outputData = new BMallocIO();
67296465Sdelphij	ObjectDeleter<BMallocIO> outputDataDeleter(outputData);
68296465Sdelphij	BJsonTextWriter writer(outputData);
69296465Sdelphij
70296465Sdelphij	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteObjectStart());
71160814Ssimon	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteObjectName("weather"));
72296465Sdelphij	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("raining"));
73296465Sdelphij	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteObjectName("humidity"));
74296465Sdelphij	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("too-high"));
75296465Sdelphij	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteObjectName("daysOfWeek"));
76296465Sdelphij	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteArrayStart());
7755714Skris	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("MON"));
7868651Skris	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("TUE"));
7968651Skris	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("WED"));
8068651Skris	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("THR"));
8168651Skris	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("FRI"));
82296465Sdelphij	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteArrayEnd());
83296465Sdelphij	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteObjectEnd());
84296465Sdelphij	writer.Complete();
85296465Sdelphij
86296465Sdelphij	BString outputString((char*)outputData->Buffer(),
87296465Sdelphij		outputData->BufferLength());
88296465Sdelphij	fprintf(stderr, "expected out >%s<\n", JSON_SAMPLE_OBJECT_A_EXPECTED_OUT);
89296465Sdelphij	fprintf(stderr, "actual out   >%s< (%" B_PRIuSIZE ")\n", outputString.String(),
90296465Sdelphij		outputData->BufferLength());
91296465Sdelphij
92296465Sdelphij	CPPUNIT_ASSERT_EQUAL(BString(JSON_SAMPLE_OBJECT_A_EXPECTED_OUT),
9355714Skris		outputString);
94296465Sdelphij}
95296465Sdelphij
9655714Skris
97109998Smarkmvoid
98296465SdelphijJsonTextWriterTest::TestObjectAForPerformance()
99296465Sdelphij{
100100936Snectar	int i;
101160814Ssimon
102160814Ssimon	for (i = 0; i < LOOPS_TEST_OBJECT_A_FOR_PERFORMANCE; i++) {
103296465Sdelphij		TestObjectA();
104160814Ssimon	}
105160814Ssimon}
106160814Ssimon
10755714Skris
10855714Skrisvoid
10955714SkrisJsonTextWriterTest::TestInteger()
11055714Skris{
11155714Skris	BMallocIO* outputData = new BMallocIO();
112	ObjectDeleter<BMallocIO> outputDataDeleter(outputData);
113	BJsonTextWriter writer(outputData);
114	static const char* expectedOut = JSON_SAMPLE_NUMBER_B_EXPECTED_OUT;
115
116	CPPUNIT_ASSERT_EQUAL(B_OK,
117		writer.WriteInteger(JSON_SAMPLE_NUMBER_B_LITERAL));
118	writer.Complete();
119
120	BString outputString((char *)outputData->Buffer(),
121		outputData->BufferLength());
122	fprintf(stderr, "expected out >%s<\n", expectedOut);
123	fprintf(stderr, "actual out   >%s< (%" B_PRIuSIZE ")\n", outputString.String(),
124		outputData->BufferLength());
125
126	CPPUNIT_ASSERT_EQUAL(BString(expectedOut),
127		outputString);
128}
129
130
131void
132JsonTextWriterTest::TestDouble()
133{
134	BMallocIO* outputData = new BMallocIO();
135	ObjectDeleter<BMallocIO> outputDataDeleter(outputData);
136	BJsonTextWriter writer(outputData);
137	static const char* expectedOut = "3.142857";
138
139	CPPUNIT_ASSERT_EQUAL(B_OK,
140		writer.WriteDouble(JSON_SAMPLE_NUMBER_A_LITERAL));
141	writer.Complete();
142
143	BString outputString((char *)outputData->Buffer(),
144		outputData->BufferLength());
145	fprintf(stderr, "expected out >%s<\n", expectedOut);
146	fprintf(stderr, "actual out   >%s< (%" B_PRIuSIZE ")\n", outputString.String(),
147		outputData->BufferLength());
148
149	CPPUNIT_ASSERT_EQUAL(BString(expectedOut),
150		outputString);
151}
152
153
154void
155JsonTextWriterTest::TestFalse()
156{
157	BMallocIO* outputData = new BMallocIO();
158	ObjectDeleter<BMallocIO> outputDataDeleter(outputData);
159	BJsonTextWriter writer(outputData);
160	static const char* expectedOut = "false";
161
162	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteFalse());
163	writer.Complete();
164
165	BString outputString((char*)outputData->Buffer(),
166		outputData->BufferLength());
167	fprintf(stderr, "expected out >%s<\n", expectedOut);
168	fprintf(stderr, "actual out   >%s< (%" B_PRIuSIZE ")\n",
169		outputString.String(), outputData->BufferLength());
170
171	CPPUNIT_ASSERT_EQUAL(BString(expectedOut),
172		outputString);
173}
174
175
176void
177JsonTextWriterTest::TestStringGeneric(const char *input,
178	const char *expectedOut)
179{
180	BMallocIO* outputData = new BMallocIO();
181	ObjectDeleter<BMallocIO> outputDataDeleter(outputData);
182	BJsonTextWriter writer(outputData);
183
184	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString(input));
185	writer.Complete();
186
187	BString outputString((char*)outputData->Buffer(),
188		outputData->BufferLength());
189	fprintf(stderr, "expected out >%s<\n", expectedOut);
190	fprintf(stderr, "actual out   >%s< (%" B_PRIuSIZE ")\n",
191		outputString.String(), outputData->BufferLength());
192
193	CPPUNIT_ASSERT_EQUAL(BString(expectedOut),
194		outputString);
195}
196
197void
198JsonTextWriterTest::TestString()
199{
200	TestStringGeneric(
201		"\"Eichh\xc3\xb6rnchen\"\nsind\nTiere.",
202		"\"\\\"Eichh\\u00f6rnchen\\\"\\nsind\\nTiere.\"");
203		// complex example with unicode, escapes and simple sequences.
204	TestStringGeneric("", "\"\"");
205	TestStringGeneric("Press \"C\" to continue",
206		"\"Press \\\"C\\\" to continue\"");
207		// test of a simple string of one character enclosed with escape
208		// characters to check handling of one character simple sub-sequences.
209	TestStringGeneric("\xc3\xb6", "\"\\u00f6\"");
210		// test of a unicode character on its own.
211	TestStringGeneric("simple", "\"simple\"");
212		// test of a simple string that contains no escapes or anything complex.
213	TestStringGeneric("\t", "\"\\t\"");
214		// test of a single escape character.
215	TestStringGeneric("\007B", "\"B\"");
216		// contains an illegal character which should be ignored.
217	TestStringGeneric("X", "\"X\"");
218		// a simple string with a single character
219}
220
221
222/*static*/ void
223JsonTextWriterTest::AddTests(BTestSuite& parent)
224{
225	CppUnit::TestSuite& suite = *new CppUnit::TestSuite(
226		"JsonTextWriterTest");
227
228	suite.addTest(new CppUnit::TestCaller<JsonTextWriterTest>(
229		"JsonTextWriterTest::TestDouble",
230		&JsonTextWriterTest::TestDouble));
231
232	suite.addTest(new CppUnit::TestCaller<JsonTextWriterTest>(
233		"JsonTextWriterTest::TestInteger",
234		&JsonTextWriterTest::TestInteger));
235
236	suite.addTest(new CppUnit::TestCaller<JsonTextWriterTest>(
237		"JsonTextWriterTest::TestFalse",
238		&JsonTextWriterTest::TestFalse));
239
240	suite.addTest(new CppUnit::TestCaller<JsonTextWriterTest>(
241		"JsonTextWriterTest::TestString",
242		&JsonTextWriterTest::TestString));
243
244	suite.addTest(new CppUnit::TestCaller<JsonTextWriterTest>(
245		"JsonTextWriterTest::TestArrayA",
246		&JsonTextWriterTest::TestArrayA));
247
248	suite.addTest(new CppUnit::TestCaller<JsonTextWriterTest>(
249		"JsonTextWriterTest::TestObjectA",
250		&JsonTextWriterTest::TestObjectA));
251
252//	suite.addTest(new CppUnit::TestCaller<JsonTextWriterTest>(
253//		"JsonTextWriterTest::TestObjectAForPerformance",
254//		&JsonTextWriterTest::TestObjectAForPerformance));
255
256	parent.addTest("JsonTextWriterTest", &suite);
257}