xref: /haiku/src/tests/kits/shared/JsonTextWriterTest.cpp (revision 68ea01249e1e2088933cb12f9c28d4e5c5d1c9ef)
1 /*
2  * Copyright 2017, Andrew Lindesay <apl@lindesay.co.nz>
3  * Distributed under the terms of the MIT License.
4  */
5 #include "JsonTextWriterTest.h"
6 
7 #include <AutoDeleter.h>
8 
9 #include <Json.h>
10 #include <JsonTextWriter.h>
11 
12 #include <cppunit/TestCaller.h>
13 #include <cppunit/TestSuite.h>
14 
15 #include "JsonSamples.h"
16 
17 
18 #define LOOPS_TEST_OBJECT_A_FOR_PERFORMANCE 100000
19 
20 
21 using namespace BPrivate;
22 
23 
24 JsonTextWriterTest::JsonTextWriterTest()
25 {
26 }
27 
28 
29 JsonTextWriterTest::~JsonTextWriterTest()
30 {
31 }
32 
33 
34 void
35 JsonTextWriterTest::TestArrayA()
36 {
37 	BMallocIO* outputData = new BMallocIO();
38 	ObjectDeleter<BMallocIO> outputDataDeleter(outputData);
39 	BJsonTextWriter writer(outputData);
40 
41 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteArrayStart());
42 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("1234"));
43 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteInteger(4567));
44 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteArrayStart());
45 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("A"));
46 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("b"));
47 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("C\xc3\xa9zanne"));
48 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteArrayEnd());
49 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteArrayEnd());
50 	writer.Complete();
51 
52 	BString outputString((char*)outputData->Buffer(),
53 		outputData->BufferLength());
54 	fprintf(stderr, "expected out >%s<\n", JSON_SAMPLE_ARRAY_A_EXPECTED_OUT);
55 	fprintf(stderr, "actual out   >%s< (%" B_PRIuSIZE ")\n", outputString.String(),
56 		outputData->BufferLength());
57 
58 	CPPUNIT_ASSERT_EQUAL(BString(JSON_SAMPLE_ARRAY_A_EXPECTED_OUT),
59 		outputString);
60 }
61 
62 
63 void
64 JsonTextWriterTest::TestObjectA()
65 {
66 	BMallocIO* outputData = new BMallocIO();
67 	ObjectDeleter<BMallocIO> outputDataDeleter(outputData);
68 	BJsonTextWriter writer(outputData);
69 
70 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteObjectStart());
71 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteObjectName("weather"));
72 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("raining"));
73 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteObjectName("humidity"));
74 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("too-high"));
75 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteObjectName("daysOfWeek"));
76 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteArrayStart());
77 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("MON"));
78 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("TUE"));
79 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("WED"));
80 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("THR"));
81 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteString("FRI"));
82 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteArrayEnd());
83 	CPPUNIT_ASSERT_EQUAL(B_OK, writer.WriteObjectEnd());
84 	writer.Complete();
85 
86 	BString outputString((char*)outputData->Buffer(),
87 		outputData->BufferLength());
88 	fprintf(stderr, "expected out >%s<\n", JSON_SAMPLE_OBJECT_A_EXPECTED_OUT);
89 	fprintf(stderr, "actual out   >%s< (%" B_PRIuSIZE ")\n", outputString.String(),
90 		outputData->BufferLength());
91 
92 	CPPUNIT_ASSERT_EQUAL(BString(JSON_SAMPLE_OBJECT_A_EXPECTED_OUT),
93 		outputString);
94 }
95 
96 
97 void
98 JsonTextWriterTest::TestObjectAForPerformance()
99 {
100 	int i;
101 
102 	for (i = 0; i < LOOPS_TEST_OBJECT_A_FOR_PERFORMANCE; i++) {
103 		TestObjectA();
104 	}
105 }
106 
107 
108 void
109 JsonTextWriterTest::TestInteger()
110 {
111 	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 
131 void
132 JsonTextWriterTest::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 
154 void
155 JsonTextWriterTest::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 
176 void
177 JsonTextWriterTest::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 
197 void
198 JsonTextWriterTest::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
223 JsonTextWriterTest::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 }