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}