#include "jsonio/JSONEmitter.h" #include "jsonserialization/JSONSerializationContext.h" #include "unittest/TestSuite.h" #include "utilities/IOUtilities.h" #include "utilities/printfFormats.h" #include #include #include #include static void verifyInit(JSONSerializationContext * context) { TestCase_assert(context->jmpBuf == NULL, "Expected NULL but got %p", context->jmpBuf); TestCase_assert(context->status == SERIALIZATION_ERROR_OK, "Expected %d but got %d", SERIALIZATION_ERROR_OK, context->status); TestCase_assert(context->vtable == &JSONSerializationContext_class, "Expected %p but got %p", &JSONSerializationContext_class, context->vtable); } static void testInit() { JSONSerializationContext context, * contextPtr; memset(&context, 0, sizeof(context)); stemobject_assign_vtable(context, JSONSerializationContext); JSONSerializationContext_init(&context); verifyInit(&context); JSONSerializationContext_dispose(&context); contextPtr = JSONSerializationContext_create(); TestCase_assert(contextPtr != NULL, "Expected non-NULL but got NULL"); if (contextPtr == NULL) {return;} // Suppress clang warning verifyInit(contextPtr); JSONSerializationContext_dispose(contextPtr); } static void testTopLevelContainers() { JSONSerializationContext * context; struct JSONNode * node; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginStructure, context, "key"); call_virtual(endStructure, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 0, "Expected 0 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems == NULL, "Expected NULL but got %p", node->subitems); JSONNode_dispose(node); context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginDictionary, context, "key"); call_virtual(endDictionary, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 0, "Expected 0 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems == NULL, "Expected NULL but got %p", node->subitems); JSONNode_dispose(node); context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginArray, context, "key"); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 0, "Expected 0 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems == NULL, "Expected NULL but got %p", node->subitems); JSONNode_dispose(node); } static void testNumberValues() { JSONSerializationContext * context; struct JSONNode * node; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginArray, context, "key"); call_virtual(writeInt8, context, "item", 0); call_virtual(writeUInt8, context, "item", 1); call_virtual(writeInt16, context, "item", 2); call_virtual(writeUInt16, context, "item", 3); call_virtual(writeInt32, context, "item", 4); call_virtual(writeUInt32, context, "item", 5); call_virtual(writeInt64, context, "item", 6); call_virtual(writeUInt64, context, "item", 7); call_virtual(writeFloat, context, "item", 8); call_virtual(writeDouble, context, "item", 9); call_virtual(writeFixed16_16, context, "item", 0xA0000); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 11, "Expected 11 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[0].type); TestCase_assert(node->subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[0].key); TestCase_assert(node->subitems[0].value.number == 0, "Expected 0 but got %g", node->subitems[0].value.number); TestCase_assert(node->subitems[1].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].type); TestCase_assert(node->subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[1].key); TestCase_assert(node->subitems[1].value.number == 1, "Expected 1 but got %g", node->subitems[1].value.number); TestCase_assert(node->subitems[2].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[2].type); TestCase_assert(node->subitems[2].key == NULL, "Expected NULL but got %p", node->subitems[2].key); TestCase_assert(node->subitems[2].value.number == 2, "Expected 2 but got %g", node->subitems[2].value.number); TestCase_assert(node->subitems[3].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[3].type); TestCase_assert(node->subitems[3].key == NULL, "Expected NULL but got %p", node->subitems[3].key); TestCase_assert(node->subitems[3].value.number == 3, "Expected 3 but got %g", node->subitems[3].value.number); TestCase_assert(node->subitems[4].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[4].type); TestCase_assert(node->subitems[4].key == NULL, "Expected NULL but got %p", node->subitems[4].key); TestCase_assert(node->subitems[4].value.number == 4, "Expected 4 but got %g", node->subitems[4].value.number); TestCase_assert(node->subitems[5].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[5].type); TestCase_assert(node->subitems[5].key == NULL, "Expected NULL but got %p", node->subitems[5].key); TestCase_assert(node->subitems[5].value.number == 5, "Expected 5 but got %g", node->subitems[5].value.number); TestCase_assert(node->subitems[6].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[6].type); TestCase_assert(node->subitems[6].key == NULL, "Expected NULL but got %p", node->subitems[6].key); TestCase_assert(node->subitems[6].value.number == 6, "Expected 6 but got %g", node->subitems[6].value.number); TestCase_assert(node->subitems[7].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[7].type); TestCase_assert(node->subitems[7].key == NULL, "Expected NULL but got %p", node->subitems[7].key); TestCase_assert(node->subitems[7].value.number == 7, "Expected 7 but got %g", node->subitems[7].value.number); TestCase_assert(node->subitems[8].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[8].type); TestCase_assert(node->subitems[8].key == NULL, "Expected NULL but got %p", node->subitems[8].key); TestCase_assert(node->subitems[8].value.number == 8, "Expected 8 but got %f", node->subitems[8].value.number); TestCase_assert(node->subitems[9].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[9].type); TestCase_assert(node->subitems[9].key == NULL, "Expected NULL but got %p", node->subitems[9].key); TestCase_assert(node->subitems[9].value.number == 9, "Expected 9 but got %f", node->subitems[9].value.number); TestCase_assert(node->subitems[10].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[10].type); TestCase_assert(node->subitems[10].key == NULL, "Expected NULL but got %p", node->subitems[10].key); TestCase_assert(node->subitems[10].stringLength == 7, "Expected 7 but got " SIZE_T_FORMAT, node->subitems[10].stringLength); TestCase_assert(!strcmp(node->subitems[10].value.string, "0xA0000"), "Expected \"0xA0000\" but got \"%s\"", node->subitems[10].value.string); JSONNode_dispose(node); context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginArray, context, "key"); call_virtual(writeInt8, context, "item", INT8_MIN); call_virtual(writeUInt8, context, "item", UINT8_MAX); call_virtual(writeInt16, context, "item", INT16_MIN); call_virtual(writeUInt16, context, "item", UINT16_MAX); call_virtual(writeInt32, context, "item", INT32_MIN); call_virtual(writeUInt32, context, "item", UINT32_MAX); call_virtual(writeInt64, context, "item", -(1ll << DBL_MANT_DIG)); call_virtual(writeUInt64, context, "item", 1ull << DBL_MANT_DIG); call_virtual(writeFloat, context, "item", FLT_MAX); call_virtual(writeDouble, context, "item", DBL_MAX); call_virtual(writeFixed16_16, context, "item", FIXED_16_16_MIN); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 11, "Expected 11 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[0].type); TestCase_assert(node->subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[0].key); TestCase_assert(node->subitems[0].value.number == INT8_MIN, "Expected %d but got %g", INT8_MIN, node->subitems[0].value.number); TestCase_assert(node->subitems[1].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].type); TestCase_assert(node->subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[1].key); TestCase_assert(node->subitems[1].value.number == UINT8_MAX, "Expected %d but got %g", UINT8_MAX, node->subitems[1].value.number); TestCase_assert(node->subitems[2].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[2].type); TestCase_assert(node->subitems[2].key == NULL, "Expected NULL but got %p", node->subitems[2].key); TestCase_assert(node->subitems[2].value.number == INT16_MIN, "Expected %d but got %g", INT16_MIN, node->subitems[2].value.number); TestCase_assert(node->subitems[3].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[3].type); TestCase_assert(node->subitems[3].key == NULL, "Expected NULL but got %p", node->subitems[3].key); TestCase_assert(node->subitems[3].value.number == UINT16_MAX, "Expected %d but got %g", UINT16_MAX, node->subitems[3].value.number); TestCase_assert(node->subitems[4].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[4].type); TestCase_assert(node->subitems[4].key == NULL, "Expected NULL but got %p", node->subitems[4].key); TestCase_assert(node->subitems[4].value.number == INT32_MIN, "Expected %d but got %g", INT32_MIN, node->subitems[4].value.number); TestCase_assert(node->subitems[5].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[5].type); TestCase_assert(node->subitems[5].key == NULL, "Expected NULL but got %p", node->subitems[5].key); TestCase_assert(node->subitems[5].value.number == UINT32_MAX, "Expected %d but got %g", UINT32_MAX, node->subitems[5].value.number); TestCase_assert(node->subitems[6].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[6].type); TestCase_assert(node->subitems[6].key == NULL, "Expected NULL but got %p", node->subitems[6].key); TestCase_assert(node->subitems[6].value.number == -(1ll << DBL_MANT_DIG), "Expected " LONG_LONG_FORMAT " but got %g", -(1ll << DBL_MANT_DIG), node->subitems[6].value.number); TestCase_assert(node->subitems[7].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[7].type); TestCase_assert(node->subitems[7].key == NULL, "Expected NULL but got %p", node->subitems[7].key); TestCase_assert(node->subitems[7].value.number == 1ull << DBL_MANT_DIG, "Expected " ULONG_LONG_FORMAT " but got %g", 1ull << DBL_MANT_DIG, node->subitems[7].value.number); TestCase_assert(node->subitems[8].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[8].type); TestCase_assert(node->subitems[8].key == NULL, "Expected NULL but got %p", node->subitems[8].key); TestCase_assert(node->subitems[8].value.number == FLT_MAX, "Expected %f but got %f", FLT_MAX, node->subitems[8].value.number); TestCase_assert(node->subitems[9].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[9].type); TestCase_assert(node->subitems[9].key == NULL, "Expected NULL but got %p", node->subitems[9].key); TestCase_assert(node->subitems[9].value.number == DBL_MAX, "Expected %f but got %f", DBL_MAX, node->subitems[9].value.number); TestCase_assert(node->subitems[10].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[10].type); TestCase_assert(node->subitems[10].key == NULL, "Expected NULL but got %p", node->subitems[10].key); TestCase_assert(node->subitems[10].stringLength == 10, "Expected 10 but got " SIZE_T_FORMAT, node->subitems[10].stringLength); TestCase_assert(!strcmp(node->subitems[10].value.string, "0x80000002"), "Expected \"0x80000002\" but got \"%s\"", node->subitems[10].value.string); JSONNode_dispose(node); } static void testLargeIntegerRepresentability() { JSONSerializationContext * context; struct JSONNode * node; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginArray, context, "key"); call_virtual(writeInt64, context, "item", -(1ll << DBL_MANT_DIG)); call_virtual(writeUInt64, context, "item", 1ull << DBL_MANT_DIG); call_virtual(writeInt64, context, "item", INT64_MIN + 1); call_virtual(writeUInt64, context, "item", UINT64_MAX); call_virtual(writeInt64, context, "item", -((1ll << DBL_MANT_DIG) + 1)); call_virtual(writeUInt64, context, "item", (1ull << DBL_MANT_DIG) + 1); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 6, "Expected 6 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[0].type); TestCase_assert(node->subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[0].key); TestCase_assert(node->subitems[0].value.number == -(1ll << DBL_MANT_DIG), "Expected " LONG_LONG_FORMAT " but got %g", -(1ll << DBL_MANT_DIG), node->subitems[0].value.number); TestCase_assert(node->subitems[1].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].type); TestCase_assert(node->subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[1].key); TestCase_assert(node->subitems[1].value.number == 1ull << DBL_MANT_DIG, "Expected " ULONG_LONG_FORMAT " but got %g", 1ull << DBL_MANT_DIG, node->subitems[1].value.number); TestCase_assert(node->subitems[2].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[2].type); TestCase_assert(node->subitems[2].key == NULL, "Expected NULL but got %p", node->subitems[2].key); TestCase_assert(node->subitems[2].stringLength == 20, "Expected 20 but got " SIZE_T_FORMAT, node->subitems[2].stringLength); TestCase_assert(!strcmp(node->subitems[2].value.string, "-9223372036854775807"), "Expected \"-9223372036854775807\" but got \"%s\"", node->subitems[2].value.string); TestCase_assert(node->subitems[3].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[3].type); TestCase_assert(node->subitems[3].key == NULL, "Expected NULL but got %p", node->subitems[3].key); TestCase_assert(node->subitems[3].stringLength == 20, "Expected 20 but got " SIZE_T_FORMAT, node->subitems[3].stringLength); TestCase_assert(!strcmp(node->subitems[3].value.string, "18446744073709551615"), "Expected \"18446744073709551615\" but got \"%s\"", node->subitems[3].value.string); TestCase_assert(node->subitems[4].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[4].type); TestCase_assert(node->subitems[4].key == NULL, "Expected NULL but got %p", node->subitems[4].key); TestCase_assert(node->subitems[4].stringLength == 17, "Expected 17 but got " SIZE_T_FORMAT, node->subitems[4].stringLength); TestCase_assert(!strcmp(node->subitems[4].value.string, "-9007199254740993"), "Expected \"-9007199254740993\" but got \"%s\"", node->subitems[4].value.string); TestCase_assert(node->subitems[5].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[5].type); TestCase_assert(node->subitems[5].key == NULL, "Expected NULL but got %p", node->subitems[5].key); TestCase_assert(node->subitems[5].stringLength == 16, "Expected 16 but got " SIZE_T_FORMAT, node->subitems[5].stringLength); TestCase_assert(!strcmp(node->subitems[5].value.string, "9007199254740993"), "Expected \"9007199254740993\" but got \"%s\"", node->subitems[5].value.string); JSONNode_dispose(node); } static void testStringValues() { JSONSerializationContext * context; struct JSONNode * node; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginArray, context, "key"); call_virtual(writeString, context, "item", "foo"); call_virtual(writeString, context, "item", "Hello, world!"); call_virtual(writeStringNullable, context, "item", "null"); call_virtual(writeStringNullable, context, "item", NULL); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 4, "Expected 4 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[0].type); TestCase_assert(node->subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[0].key); TestCase_assert(node->subitems[0].stringLength == 3, "Expected 3 but got " SIZE_T_FORMAT, node->subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[0].value.string, "foo"), "Expected \"foo\" but got \"%s\"", node->subitems[0].value.string); TestCase_assert(node->subitems[1].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].type); TestCase_assert(node->subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[1].key); TestCase_assert(node->subitems[1].stringLength == 13, "Expected 13 but got " SIZE_T_FORMAT, node->subitems[1].stringLength); TestCase_assert(!strcmp(node->subitems[1].value.string, "Hello, world!"), "Expected \"Hello, world!\" but got \"%s\"", node->subitems[1].value.string); TestCase_assert(node->subitems[2].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[2].type); TestCase_assert(node->subitems[2].key == NULL, "Expected NULL but got %p", node->subitems[2].key); TestCase_assert(node->subitems[2].stringLength == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[2].stringLength); TestCase_assert(!strcmp(node->subitems[2].value.string, "null"), "Expected \"null\" but got \"%s\"", node->subitems[2].value.string); TestCase_assert(node->subitems[3].type == JSON_TYPE_NULL, "Expected %d but got %d", JSON_TYPE_NULL, node->subitems[3].type); TestCase_assert(node->subitems[3].key == NULL, "Expected NULL but got %p", node->subitems[3].key); JSONNode_dispose(node); } static void testBlobValues() { JSONSerializationContext * context; struct JSONNode * node; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginArray, context, "key"); call_virtual(writeBlob, context, "item", "foo", 3); call_virtual(writeBlob, context, "item", "Hello, world!", 13); call_virtual(writeBlob, context, "item", NULL, 0); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 3, "Expected 3 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[0].type); TestCase_assert(node->subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[0].key); TestCase_assert(node->subitems[0].stringLength == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[0].value.string, "Zm9v"), "Expected \"Zm9v\" but got \"%s\"", node->subitems[0].value.string); TestCase_assert(node->subitems[1].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].type); TestCase_assert(node->subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[1].key); TestCase_assert(node->subitems[1].stringLength == 20, "Expected 20 but got " SIZE_T_FORMAT, node->subitems[1].stringLength); TestCase_assert(!strcmp(node->subitems[1].value.string, "SGVsbG8sIHdvcmxkIQ=="), "Expected \"SGVsbG8sIHdvcmxkIQ==\" but got \"%s\"", node->subitems[1].value.string); TestCase_assert(node->subitems[2].type == JSON_TYPE_NULL, "Expected %d but got %d", JSON_TYPE_NULL, node->subitems[2].type); TestCase_assert(node->subitems[2].key == NULL, "Expected NULL but got %p", node->subitems[2].key); JSONNode_dispose(node); } static void testBooleanValues() { JSONSerializationContext * context; struct JSONNode * node; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginArray, context, "key"); call_virtual(writeBoolean, context, "item", false); call_virtual(writeBoolean, context, "item", true); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 2, "Expected 2 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].type == JSON_TYPE_BOOLEAN, "Expected %d but got %d", JSON_TYPE_BOOLEAN, node->subitems[0].type); TestCase_assert(node->subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[0].key); TestCase_assert(node->subitems[0].value.boolean == false, "Expected false but got true"); TestCase_assert(node->subitems[1].type == JSON_TYPE_BOOLEAN, "Expected %d but got %d", JSON_TYPE_BOOLEAN, node->subitems[0].type); TestCase_assert(node->subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[0].key); TestCase_assert(node->subitems[1].value.boolean == true, "Expected true but got false"); JSONNode_dispose(node); } #define enumKV(value) #value, value #define ENUM_TEST_0 0 #define ENUM_TEST_1 1 #define ENUM_TEST_zero 0 #define ENUM_TEST_one 1 #define ENUM_TEST_two 2 static void testEnumerations() { JSONSerializationContext * context; struct JSONNode * node; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginArray, context, "key"); Serialization_enumKeyValue testEnumValues1[] = {{enumKV(ENUM_TEST_0)}, {enumKV(ENUM_TEST_1)}}; Serialization_enumKeyValue testEnumValues2[] = {{enumKV(ENUM_TEST_zero)}, {enumKV(ENUM_TEST_one)}, {enumKV(ENUM_TEST_two)}}; call_virtual(writeEnumeration, context, "item", ENUM_TEST_0, 2, testEnumValues1); call_virtual(writeEnumeration, context, "item", ENUM_TEST_1, 2, testEnumValues1); call_virtual(writeEnumeration, context, "item", ENUM_TEST_zero, 3, testEnumValues2); call_virtual(writeEnumeration, context, "item", ENUM_TEST_one, 3, testEnumValues2); call_virtual(writeEnumeration, context, "item", ENUM_TEST_two, 3, testEnumValues2); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 5, "Expected 5 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[0].type); TestCase_assert(node->subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[0].key); TestCase_assert(node->subitems[0].stringLength == 11, "Expected 11 but got " SIZE_T_FORMAT, node->subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[0].value.string, "ENUM_TEST_0"), "Expected \"ENUM_TEST_0\" but got \"%s\"", node->subitems[0].value.string); TestCase_assert(node->subitems[1].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].type); TestCase_assert(node->subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[1].key); TestCase_assert(node->subitems[1].stringLength == 11, "Expected 11 but got " SIZE_T_FORMAT, node->subitems[1].stringLength); TestCase_assert(!strcmp(node->subitems[1].value.string, "ENUM_TEST_1"), "Expected \"ENUM_TEST_1\" but got \"%s\"", node->subitems[1].value.string); TestCase_assert(node->subitems[2].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[2].type); TestCase_assert(node->subitems[2].key == NULL, "Expected NULL but got %p", node->subitems[2].key); TestCase_assert(node->subitems[2].stringLength == 14, "Expected 14 but got " SIZE_T_FORMAT, node->subitems[2].stringLength); TestCase_assert(!strcmp(node->subitems[2].value.string, "ENUM_TEST_zero"), "Expected \"ENUM_TEST_zero\" but got \"%s\"", node->subitems[2].value.string); TestCase_assert(node->subitems[3].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[3].type); TestCase_assert(node->subitems[3].key == NULL, "Expected NULL but got %p", node->subitems[3].key); TestCase_assert(node->subitems[3].stringLength == 13, "Expected 13 but got " SIZE_T_FORMAT, node->subitems[3].stringLength); TestCase_assert(!strcmp(node->subitems[3].value.string, "ENUM_TEST_one"), "Expected \"ENUM_TEST_one\" but got \"%s\"", node->subitems[3].value.string); TestCase_assert(node->subitems[4].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[4].type); TestCase_assert(node->subitems[4].key == NULL, "Expected NULL but got %p", node->subitems[4].key); TestCase_assert(node->subitems[4].stringLength == 13, "Expected 13 but got " SIZE_T_FORMAT, node->subitems[4].stringLength); TestCase_assert(!strcmp(node->subitems[4].value.string, "ENUM_TEST_two"), "Expected \"ENUM_TEST_two\" but got \"%s\"", node->subitems[4].value.string); JSONNode_dispose(node); context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); call_virtual(beginArray, context, "key"); call_virtual(writeEnumeration8, context, "item", ENUM_TEST_0, 2, testEnumValues1); call_virtual(writeEnumeration16, context, "item", ENUM_TEST_1, 2, testEnumValues1); call_virtual(writeEnumeration32, context, "item", ENUM_TEST_zero, 3, testEnumValues2); call_virtual(writeEnumeration8, context, "item", ENUM_TEST_one, 3, testEnumValues2); call_virtual(writeEnumeration16, context, "item", ENUM_TEST_two, 3, testEnumValues2); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 5, "Expected 5 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[0].type); TestCase_assert(node->subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[0].key); TestCase_assert(node->subitems[0].stringLength == 11, "Expected 11 but got " SIZE_T_FORMAT, node->subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[0].value.string, "ENUM_TEST_0"), "Expected \"ENUM_TEST_0\" but got \"%s\"", node->subitems[0].value.string); TestCase_assert(node->subitems[1].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].type); TestCase_assert(node->subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[1].key); TestCase_assert(node->subitems[1].stringLength == 11, "Expected 11 but got " SIZE_T_FORMAT, node->subitems[1].stringLength); TestCase_assert(!strcmp(node->subitems[1].value.string, "ENUM_TEST_1"), "Expected \"ENUM_TEST_1\" but got \"%s\"", node->subitems[1].value.string); TestCase_assert(node->subitems[2].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[2].type); TestCase_assert(node->subitems[2].key == NULL, "Expected NULL but got %p", node->subitems[2].key); TestCase_assert(node->subitems[2].stringLength == 14, "Expected 14 but got " SIZE_T_FORMAT, node->subitems[2].stringLength); TestCase_assert(!strcmp(node->subitems[2].value.string, "ENUM_TEST_zero"), "Expected \"ENUM_TEST_zero\" but got \"%s\"", node->subitems[2].value.string); TestCase_assert(node->subitems[3].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[3].type); TestCase_assert(node->subitems[3].key == NULL, "Expected NULL but got %p", node->subitems[3].key); TestCase_assert(node->subitems[3].stringLength == 13, "Expected 13 but got " SIZE_T_FORMAT, node->subitems[3].stringLength); TestCase_assert(!strcmp(node->subitems[3].value.string, "ENUM_TEST_one"), "Expected \"ENUM_TEST_one\" but got \"%s\"", node->subitems[3].value.string); TestCase_assert(node->subitems[4].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[4].type); TestCase_assert(node->subitems[4].key == NULL, "Expected NULL but got %p", node->subitems[4].key); TestCase_assert(node->subitems[4].stringLength == 13, "Expected 13 but got " SIZE_T_FORMAT, node->subitems[4].stringLength); TestCase_assert(!strcmp(node->subitems[4].value.string, "ENUM_TEST_two"), "Expected \"ENUM_TEST_two\" but got \"%s\"", node->subitems[4].value.string); JSONNode_dispose(node); } static void testBitfields() { JSONSerializationContext * context; struct JSONNode * node; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginArray, context, "key"); Serialization_bitName testBitNames1[] = {{"bit_0", 0}, {"bit_1", 1}, {"bit_2", 2}, {"bit_3", 3}, {"bit_4", 4}, {"bit_5", 5}, {"bit_6", 6}, {"bit_7", 7}}; call_virtual(writeBitfield8, context, NULL, 0xAA, 8, testBitNames1); Serialization_bitName testBitNames2[] = {{"bit0", 0}, {"bit1", 1}, {"bit2", 2}, {"bit3", 3}, {"bit4", 4}, {"bit5", 5}, {"bit6", 6}}; call_virtual(writeBitfield8, context, NULL, 0x57, 7, testBitNames2); Serialization_bitName testBitNames3[] = {{"0", 0}, {"1", 1}, {"2", 2}, {"3", 3}, {"4", 4}, {"5", 5}, {"6", 6}, {"7", 7}, {"8", 8}, {"9", 9}, {"A", 10}, {"B", 11}, {"C", 12}, {"D", 13}, {"E", 14}, {"F", 15}}; call_virtual(writeBitfield16, context, NULL, 0xF001, 16, testBitNames3); Serialization_bitName testBitNames4[] = {{"b0", 0}, {"b1", 1}, {"b2", 2}, {"b3", 3}, {"b4", 4}, {"b5", 5}}; call_virtual(writeBitfield16, context, NULL, 0x000F, 6, testBitNames4); Serialization_bitName testBitNames5[] = {{"0", 0}, {"1", 1}, {"2", 2}, {"3", 3}, {"4", 4}, {"5", 5}, {"6", 6}, {"7", 7}, {"8", 8}, {"9", 9}, {"A", 10}, {"B", 11}, {"C", 12}, {"D", 13}, {"E", 14}, {"F", 15}, {"10", 16}, {"11", 17}, {"12", 18}, {"13", 19}, {"14", 20}, {"15", 21}, {"16", 22}, {"17", 23}, {"18", 24}, {"19", 25}, {"1A", 26}, {"1B", 27}, {"1C", 28}, {"1D", 29}, {"1E", 30}, {"1F", 31}}; call_virtual(writeBitfield32, context, NULL, 0xF0000001, 32, testBitNames5); call_virtual(writeBitfield32, context, NULL, 0x0000001E, 6, testBitNames4); Serialization_bitName testBitNames6[] = {{"0", 0}, {"1", 1}, {"2", 2}, {"3", 3}, {"4", 4}, {"5", 5}, {"6", 6}, {"7", 7}, {"8", 8}, {"9", 9}, {"A", 10}, {"B", 11}, {"C", 12}, {"D", 13}, {"E", 14}, {"F", 15}, {"10", 16}, {"11", 17}, {"12", 18}, {"13", 19}, {"14", 20}, {"15", 21}, {"16", 22}, {"17", 23}, {"18", 24}, {"19", 25}, {"1A", 26}, {"1B", 27}, {"1C", 28}, {"1D", 29}, {"1E", 30}, {"1F", 31}, {"20", 32}, {"21", 33}, {"22", 34}, {"23", 35}, {"24", 36}, {"25", 37}, {"26", 38}, {"27", 39}, {"28", 40}, {"29", 41}, {"2A", 42}, {"2B", 43}, {"2C", 44}, {"2D", 45}, {"2E", 46}, {"2F", 47}, {"30", 48}, {"31", 49}, {"32", 50}, {"33", 51}, {"34", 52}, {"35", 53}, {"36", 54}, {"37", 55}, {"38", 56}, {"39", 57}, {"3A", 58}, {"3B", 59}, {"3C", 60}, {"3D", 61}, {"3E", 62}, {"3F", 63}}; call_virtual(writeBitfield64, context, NULL, 0xF000000000000001ull, 64, testBitNames6); call_virtual(writeBitfield64, context, NULL, 0x000000000000003Cull, 6, testBitNames4); call_virtual(writeBitfield8, context, "item", 0x00, 0, NULL); call_virtual(writeBitfield16, context, "item", 0x0000, 0, NULL); call_virtual(writeBitfield32, context, "item", 0x00000000, 0, NULL); call_virtual(writeBitfield64, context, "item", 0x0000000000000000ull, 0, NULL); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 12, "Expected 12 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[0].type); TestCase_assert(node->subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[0].key); TestCase_assert(node->subitems[0].value.count == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[0].value.count); TestCase_assert(node->subitems[0].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[0].subitems[0].type); TestCase_assert(node->subitems[0].subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[0].subitems[0].key); TestCase_assert(node->subitems[0].subitems[0].stringLength == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[0].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[0].subitems[0].value.string, "bit_1"), "Expected \"bit_1\" but got \"%s\"", node->subitems[0].subitems[0].value.string); TestCase_assert(node->subitems[0].subitems[1].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[0].subitems[1].type); TestCase_assert(node->subitems[0].subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[0].subitems[1].key); TestCase_assert(node->subitems[0].subitems[1].stringLength == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[0].subitems[1].stringLength); TestCase_assert(!strcmp(node->subitems[0].subitems[1].value.string, "bit_3"), "Expected \"bit_3\" but got \"%s\"", node->subitems[0].subitems[1].value.string); TestCase_assert(node->subitems[0].subitems[2].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[0].subitems[2].type); TestCase_assert(node->subitems[0].subitems[2].key == NULL, "Expected NULL but got %p", node->subitems[0].subitems[2].key); TestCase_assert(node->subitems[0].subitems[2].stringLength == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[0].subitems[2].stringLength); TestCase_assert(!strcmp(node->subitems[0].subitems[2].value.string, "bit_5"), "Expected \"bit_5\" but got \"%s\"", node->subitems[0].subitems[2].value.string); TestCase_assert(node->subitems[0].subitems[3].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[0].subitems[3].type); TestCase_assert(node->subitems[0].subitems[3].key == NULL, "Expected NULL but got %p", node->subitems[0].subitems[3].key); TestCase_assert(node->subitems[0].subitems[3].stringLength == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[0].subitems[3].stringLength); TestCase_assert(!strcmp(node->subitems[0].subitems[3].value.string, "bit_7"), "Expected \"bit_7\" but got \"%s\"", node->subitems[0].subitems[3].value.string); TestCase_assert(node->subitems[1].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[1].type); TestCase_assert(node->subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[1].key); TestCase_assert(node->subitems[1].value.count == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[1].value.count); TestCase_assert(node->subitems[1].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[0].type); TestCase_assert(node->subitems[1].subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[1].subitems[0].key); TestCase_assert(node->subitems[1].subitems[0].stringLength == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[1].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[0].value.string, "bit0"), "Expected \"bit0\" but got \"%s\"", node->subitems[1].subitems[0].value.string); TestCase_assert(node->subitems[1].subitems[1].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[1].type); TestCase_assert(node->subitems[1].subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[1].subitems[1].key); TestCase_assert(node->subitems[1].subitems[1].stringLength == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[1].value.string, "bit1"), "Expected \"bit1\" but got \"%s\"", node->subitems[1].subitems[1].value.string); TestCase_assert(node->subitems[1].subitems[2].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[2].type); TestCase_assert(node->subitems[1].subitems[2].key == NULL, "Expected NULL but got %p", node->subitems[1].subitems[2].key); TestCase_assert(node->subitems[1].subitems[2].stringLength == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[1].subitems[2].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[2].value.string, "bit2"), "Expected \"bit2\" but got \"%s\"", node->subitems[1].subitems[2].value.string); TestCase_assert(node->subitems[1].subitems[3].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[3].type); TestCase_assert(node->subitems[1].subitems[3].key == NULL, "Expected NULL but got %p", node->subitems[1].subitems[3].key); TestCase_assert(node->subitems[1].subitems[3].stringLength == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[1].subitems[3].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[3].value.string, "bit4"), "Expected \"bit4\" but got \"%s\"", node->subitems[1].subitems[3].value.string); TestCase_assert(node->subitems[1].subitems[4].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[4].type); TestCase_assert(node->subitems[1].subitems[4].key == NULL, "Expected NULL but got %p", node->subitems[1].subitems[4].key); TestCase_assert(node->subitems[1].subitems[4].stringLength == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[1].subitems[4].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[4].value.string, "bit6"), "Expected \"bit6\" but got \"%s\"", node->subitems[1].subitems[4].value.string); TestCase_assert(node->subitems[2].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[2].type); TestCase_assert(node->subitems[2].key == NULL, "Expected NULL but got %p", node->subitems[2].key); TestCase_assert(node->subitems[2].value.count == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[2].value.count); TestCase_assert(node->subitems[2].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[2].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[2].subitems[0].type); TestCase_assert(node->subitems[2].subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[2].subitems[0].key); TestCase_assert(node->subitems[2].subitems[0].stringLength == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[2].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[2].subitems[0].value.string, "0"), "Expected \"0\" but got \"%s\"", node->subitems[2].subitems[0].value.string); TestCase_assert(node->subitems[2].subitems[1].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[2].subitems[1].type); TestCase_assert(node->subitems[2].subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[2].subitems[1].key); TestCase_assert(node->subitems[2].subitems[1].stringLength == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[2].subitems[1].stringLength); TestCase_assert(!strcmp(node->subitems[2].subitems[1].value.string, "C"), "Expected \"C\" but got \"%s\"", node->subitems[2].subitems[1].value.string); TestCase_assert(node->subitems[2].subitems[2].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[2].subitems[2].type); TestCase_assert(node->subitems[2].subitems[2].key == NULL, "Expected NULL but got %p", node->subitems[2].subitems[2].key); TestCase_assert(node->subitems[2].subitems[2].stringLength == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[2].subitems[2].stringLength); TestCase_assert(!strcmp(node->subitems[2].subitems[2].value.string, "D"), "Expected \"D\" but got \"%s\"", node->subitems[2].subitems[2].value.string); TestCase_assert(node->subitems[2].subitems[3].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[2].subitems[3].type); TestCase_assert(node->subitems[2].subitems[3].key == NULL, "Expected NULL but got %p", node->subitems[2].subitems[3].key); TestCase_assert(node->subitems[2].subitems[3].stringLength == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[2].subitems[3].stringLength); TestCase_assert(!strcmp(node->subitems[2].subitems[3].value.string, "E"), "Expected \"E\" but got \"%s\"", node->subitems[2].subitems[3].value.string); TestCase_assert(node->subitems[2].subitems[4].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[2].subitems[4].type); TestCase_assert(node->subitems[2].subitems[4].key == NULL, "Expected NULL but got %p", node->subitems[2].subitems[4].key); TestCase_assert(node->subitems[2].subitems[4].stringLength == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[2].subitems[4].stringLength); TestCase_assert(!strcmp(node->subitems[2].subitems[4].value.string, "F"), "Expected \"F\" but got \"%s\"", node->subitems[2].subitems[4].value.string); TestCase_assert(node->subitems[3].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[3].type); TestCase_assert(node->subitems[3].key == NULL, "Expected NULL but got %p", node->subitems[3].key); TestCase_assert(node->subitems[3].value.count == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[3].value.count); TestCase_assert(node->subitems[3].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[3].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[3].subitems[0].type); TestCase_assert(node->subitems[3].subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[3].subitems[0].key); TestCase_assert(node->subitems[3].subitems[0].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[3].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[3].subitems[0].value.string, "b0"), "Expected \"b0\" but got \"%s\"", node->subitems[3].subitems[0].value.string); TestCase_assert(node->subitems[3].subitems[1].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[3].subitems[1].type); TestCase_assert(node->subitems[3].subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[3].subitems[1].key); TestCase_assert(node->subitems[3].subitems[1].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[3].subitems[1].stringLength); TestCase_assert(!strcmp(node->subitems[3].subitems[1].value.string, "b1"), "Expected \"b1\" but got \"%s\"", node->subitems[3].subitems[1].value.string); TestCase_assert(node->subitems[3].subitems[2].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[3].subitems[2].type); TestCase_assert(node->subitems[3].subitems[2].key == NULL, "Expected NULL but got %p", node->subitems[3].subitems[2].key); TestCase_assert(node->subitems[3].subitems[2].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[3].subitems[2].stringLength); TestCase_assert(!strcmp(node->subitems[3].subitems[2].value.string, "b2"), "Expected \"b2\" but got \"%s\"", node->subitems[3].subitems[2].value.string); TestCase_assert(node->subitems[3].subitems[3].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[3].subitems[3].type); TestCase_assert(node->subitems[3].subitems[3].key == NULL, "Expected NULL but got %p", node->subitems[3].subitems[3].key); TestCase_assert(node->subitems[3].subitems[3].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[3].subitems[3].stringLength); TestCase_assert(!strcmp(node->subitems[3].subitems[3].value.string, "b3"), "Expected \"b3\" but got \"%s\"", node->subitems[3].subitems[3].value.string); TestCase_assert(node->subitems[4].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[4].type); TestCase_assert(node->subitems[4].key == NULL, "Expected NULL but got %p", node->subitems[4].key); TestCase_assert(node->subitems[4].value.count == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[4].value.count); TestCase_assert(node->subitems[4].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[4].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[4].subitems[0].type); TestCase_assert(node->subitems[4].subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[4].subitems[0].key); TestCase_assert(node->subitems[4].subitems[0].stringLength == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[4].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[4].subitems[0].value.string, "0"), "Expected \"0\" but got \"%s\"", node->subitems[4].subitems[0].value.string); TestCase_assert(node->subitems[4].subitems[1].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[4].subitems[1].type); TestCase_assert(node->subitems[4].subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[4].subitems[1].key); TestCase_assert(node->subitems[4].subitems[1].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[4].subitems[1].stringLength); TestCase_assert(!strcmp(node->subitems[4].subitems[1].value.string, "1C"), "Expected \"1C\" but got \"%s\"", node->subitems[4].subitems[1].value.string); TestCase_assert(node->subitems[4].subitems[2].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[4].subitems[2].type); TestCase_assert(node->subitems[4].subitems[2].key == NULL, "Expected NULL but got %p", node->subitems[4].subitems[2].key); TestCase_assert(node->subitems[4].subitems[2].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[4].subitems[2].stringLength); TestCase_assert(!strcmp(node->subitems[4].subitems[2].value.string, "1D"), "Expected \"1D\" but got \"%s\"", node->subitems[4].subitems[2].value.string); TestCase_assert(node->subitems[4].subitems[3].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[4].subitems[3].type); TestCase_assert(node->subitems[4].subitems[3].key == NULL, "Expected NULL but got %p", node->subitems[4].subitems[3].key); TestCase_assert(node->subitems[4].subitems[3].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[4].subitems[3].stringLength); TestCase_assert(!strcmp(node->subitems[4].subitems[3].value.string, "1E"), "Expected \"1E\" but got \"%s\"", node->subitems[4].subitems[3].value.string); TestCase_assert(node->subitems[4].subitems[4].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[4].subitems[4].type); TestCase_assert(node->subitems[4].subitems[4].key == NULL, "Expected NULL but got %p", node->subitems[4].subitems[4].key); TestCase_assert(node->subitems[4].subitems[4].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[4].subitems[4].stringLength); TestCase_assert(!strcmp(node->subitems[4].subitems[4].value.string, "1F"), "Expected \"1F\" but got \"%s\"", node->subitems[4].subitems[4].value.string); TestCase_assert(node->subitems[5].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[5].type); TestCase_assert(node->subitems[5].key == NULL, "Expected NULL but got %p", node->subitems[5].key); TestCase_assert(node->subitems[5].value.count == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[5].value.count); TestCase_assert(node->subitems[5].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[5].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[5].subitems[0].type); TestCase_assert(node->subitems[5].subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[5].subitems[0].key); TestCase_assert(node->subitems[5].subitems[0].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[5].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[5].subitems[0].value.string, "b1"), "Expected \"b1\" but got \"%s\"", node->subitems[5].subitems[0].value.string); TestCase_assert(node->subitems[5].subitems[1].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[5].subitems[1].type); TestCase_assert(node->subitems[5].subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[5].subitems[1].key); TestCase_assert(node->subitems[5].subitems[1].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[5].subitems[1].stringLength); TestCase_assert(!strcmp(node->subitems[5].subitems[1].value.string, "b2"), "Expected \"b2\" but got \"%s\"", node->subitems[5].subitems[1].value.string); TestCase_assert(node->subitems[5].subitems[2].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[5].subitems[2].type); TestCase_assert(node->subitems[5].subitems[2].key == NULL, "Expected NULL but got %p", node->subitems[5].subitems[2].key); TestCase_assert(node->subitems[5].subitems[2].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[5].subitems[2].stringLength); TestCase_assert(!strcmp(node->subitems[5].subitems[2].value.string, "b3"), "Expected \"b3\" but got \"%s\"", node->subitems[5].subitems[2].value.string); TestCase_assert(node->subitems[5].subitems[3].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[5].subitems[3].type); TestCase_assert(node->subitems[5].subitems[3].key == NULL, "Expected NULL but got %p", node->subitems[5].subitems[3].key); TestCase_assert(node->subitems[5].subitems[3].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[5].subitems[3].stringLength); TestCase_assert(!strcmp(node->subitems[5].subitems[3].value.string, "b4"), "Expected \"b4\" but got \"%s\"", node->subitems[5].subitems[3].value.string); TestCase_assert(node->subitems[6].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[6].type); TestCase_assert(node->subitems[6].key == NULL, "Expected NULL but got %p", node->subitems[6].key); TestCase_assert(node->subitems[6].value.count == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[6].value.count); TestCase_assert(node->subitems[6].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[6].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[6].subitems[0].type); TestCase_assert(node->subitems[6].subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[6].subitems[0].key); TestCase_assert(node->subitems[6].subitems[0].stringLength == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[6].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[6].subitems[0].value.string, "0"), "Expected \"0\" but got \"%s\"", node->subitems[6].subitems[0].value.string); TestCase_assert(node->subitems[6].subitems[1].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[6].subitems[1].type); TestCase_assert(node->subitems[6].subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[6].subitems[1].key); TestCase_assert(node->subitems[6].subitems[1].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[6].subitems[1].stringLength); TestCase_assert(!strcmp(node->subitems[6].subitems[1].value.string, "3C"), "Expected \"3C\" but got \"%s\"", node->subitems[6].subitems[1].value.string); TestCase_assert(node->subitems[6].subitems[2].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[6].subitems[2].type); TestCase_assert(node->subitems[6].subitems[2].key == NULL, "Expected NULL but got %p", node->subitems[6].subitems[2].key); TestCase_assert(node->subitems[6].subitems[2].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[6].subitems[2].stringLength); TestCase_assert(!strcmp(node->subitems[6].subitems[2].value.string, "3D"), "Expected \"3D\" but got \"%s\"", node->subitems[6].subitems[2].value.string); TestCase_assert(node->subitems[6].subitems[3].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[6].subitems[3].type); TestCase_assert(node->subitems[6].subitems[3].key == NULL, "Expected NULL but got %p", node->subitems[6].subitems[3].key); TestCase_assert(node->subitems[6].subitems[3].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[6].subitems[3].stringLength); TestCase_assert(!strcmp(node->subitems[6].subitems[3].value.string, "3E"), "Expected \"3E\" but got \"%s\"", node->subitems[6].subitems[3].value.string); TestCase_assert(node->subitems[6].subitems[4].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[6].subitems[4].type); TestCase_assert(node->subitems[6].subitems[4].key == NULL, "Expected NULL but got %p", node->subitems[6].subitems[4].key); TestCase_assert(node->subitems[6].subitems[4].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[6].subitems[4].stringLength); TestCase_assert(!strcmp(node->subitems[6].subitems[4].value.string, "3F"), "Expected \"3F\" but got \"%s\"", node->subitems[6].subitems[4].value.string); TestCase_assert(node->subitems[7].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[7].type); TestCase_assert(node->subitems[7].key == NULL, "Expected NULL but got %p", node->subitems[7].key); TestCase_assert(node->subitems[7].value.count == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[7].value.count); TestCase_assert(node->subitems[7].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[7].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[7].subitems[0].type); TestCase_assert(node->subitems[7].subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[7].subitems[0].key); TestCase_assert(node->subitems[7].subitems[0].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[7].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[7].subitems[0].value.string, "b2"), "Expected \"b2\" but got \"%s\"", node->subitems[7].subitems[0].value.string); TestCase_assert(node->subitems[7].subitems[1].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[7].subitems[1].type); TestCase_assert(node->subitems[7].subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[7].subitems[1].key); TestCase_assert(node->subitems[7].subitems[1].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[7].subitems[1].stringLength); TestCase_assert(!strcmp(node->subitems[7].subitems[1].value.string, "b3"), "Expected \"b3\" but got \"%s\"", node->subitems[7].subitems[1].value.string); TestCase_assert(node->subitems[7].subitems[2].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[7].subitems[2].type); TestCase_assert(node->subitems[7].subitems[2].key == NULL, "Expected NULL but got %p", node->subitems[7].subitems[2].key); TestCase_assert(node->subitems[7].subitems[2].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[7].subitems[2].stringLength); TestCase_assert(!strcmp(node->subitems[7].subitems[2].value.string, "b4"), "Expected \"b4\" but got \"%s\"", node->subitems[7].subitems[2].value.string); TestCase_assert(node->subitems[7].subitems[3].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[7].subitems[3].type); TestCase_assert(node->subitems[7].subitems[3].key == NULL, "Expected NULL but got %p", node->subitems[7].subitems[3].key); TestCase_assert(node->subitems[7].subitems[3].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[7].subitems[3].stringLength); TestCase_assert(!strcmp(node->subitems[7].subitems[3].value.string, "b5"), "Expected \"b5\" but got \"%s\"", node->subitems[7].subitems[3].value.string); TestCase_assert(node->subitems[8].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[8].type); TestCase_assert(node->subitems[8].key == NULL, "Expected NULL but got %p", node->subitems[8].key); TestCase_assert(node->subitems[8].value.count == 0, "Expected 0 but got " SIZE_T_FORMAT, node->subitems[8].value.count); TestCase_assert(node->subitems[8].subitems == NULL, "Expected NULL but got %p", node->subitems[8].subitems); TestCase_assert(node->subitems[9].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[9].type); TestCase_assert(node->subitems[9].key == NULL, "Expected NULL but got %p", node->subitems[9].key); TestCase_assert(node->subitems[9].value.count == 0, "Expected 0 but got " SIZE_T_FORMAT, node->subitems[9].value.count); TestCase_assert(node->subitems[9].subitems == NULL, "Expected NULL but got %p", node->subitems[9].subitems); TestCase_assert(node->subitems[10].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[10].type); TestCase_assert(node->subitems[10].key == NULL, "Expected NULL but got %p", node->subitems[10].key); TestCase_assert(node->subitems[10].value.count == 0, "Expected 0 but got " SIZE_T_FORMAT, node->subitems[10].value.count); TestCase_assert(node->subitems[10].subitems == NULL, "Expected NULL but got %p", node->subitems[10].subitems); TestCase_assert(node->subitems[11].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[11].type); TestCase_assert(node->subitems[11].key == NULL, "Expected NULL but got %p", node->subitems[11].key); TestCase_assert(node->subitems[11].value.count == 0, "Expected 0 but got " SIZE_T_FORMAT, node->subitems[11].value.count); TestCase_assert(node->subitems[11].subitems == NULL, "Expected NULL but got %p", node->subitems[11].subitems); JSONNode_dispose(node); } static void testArrays() { JSONSerializationContext * context; struct JSONNode * node; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginArray, context, "key"); call_virtual(beginArray, context, "item"); call_virtual(endArray, context); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[0].type); TestCase_assert(node->subitems[0].key == NULL, "Expected NULL but got \"%s\"", node->subitems[0].key); TestCase_assert(node->subitems[0].value.count == 0, "Expected 0 but got " SIZE_T_FORMAT, node->subitems[0].value.count); TestCase_assert(node->subitems[0].subitems == NULL, "Expected NULL but got %p", node->subitems[0].subitems); JSONNode_dispose(node); Serialization_enumKeyValue enumValue = {"enum", 12}; Serialization_bitName bitName8 = {"13", 0}; Serialization_bitName bitName16 = {"14", 0}; Serialization_bitName bitName32 = {"15", 0}; Serialization_bitName bitName64 = {"16", 0}; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginArray, context, "key"); call_virtual(beginArray, context, "item"); call_virtual(writeInt8, context, "item", 0); call_virtual(endArray, context); call_virtual(beginArray, context, "item"); call_virtual(writeUInt8, context, "item", 1); call_virtual(beginArray, context, "item"); call_virtual(writeInt16, context, "item", 2); call_virtual(writeUInt16, context, "item", 3); call_virtual(writeInt32, context, "item", 4); call_virtual(writeUInt32, context, "item", 5); call_virtual(writeInt64, context, "item", 6); call_virtual(writeUInt64, context, "item", 7); call_virtual(endArray, context); call_virtual(writeFloat, context, "item", 8); call_virtual(writeDouble, context, "item", 9); call_virtual(writeFixed16_16, context, "item", 0xA0000); call_virtual(writeString, context, "item", "10"); call_virtual(writeStringNullable, context, "item", NULL); call_virtual(writeBoolean, context, "item", true); call_virtual(writeEnumeration, context, "item", 12, 1, &enumValue); call_virtual(writeBitfield8, context, "item", 1, 1, &bitName8); call_virtual(writeBitfield16, context, "item", 1, 1, &bitName16); call_virtual(writeBitfield32, context, "item", 1, 1, &bitName32); call_virtual(writeBitfield64, context, "item", 1, 1, &bitName64); call_virtual(endArray, context); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 2, "Expected 2 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[0].type); TestCase_assert(node->subitems[0].key == NULL, "Expected NULL but got \"%s\"", node->subitems[0].key); TestCase_assert(node->subitems[0].value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[0].value.count); TestCase_assert(node->subitems[0].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].subitems[0].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[0].subitems[0].type); TestCase_assert(node->subitems[0].subitems[0].key == NULL, "Expected NULL but got \"%s\"", node->subitems[0].subitems[0].key); TestCase_assert(node->subitems[0].subitems[0].value.number == 0, "Expected 0 but got %g", node->subitems[0].subitems[0].value.number); TestCase_assert(node->subitems[1].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[1].type); TestCase_assert(node->subitems[1].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].key); TestCase_assert(node->subitems[1].value.count == 13, "Expected 13 but got " SIZE_T_FORMAT, node->subitems[1].value.count); TestCase_assert(node->subitems[1].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[0].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[0].type); TestCase_assert(node->subitems[1].subitems[0].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[0].key); TestCase_assert(node->subitems[1].subitems[0].value.number == 1, "Expected 1 but got %g", node->subitems[1].subitems[0].value.number); TestCase_assert(node->subitems[1].subitems[1].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[1].subitems[1].type); TestCase_assert(node->subitems[1].subitems[1].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[1].key); TestCase_assert(node->subitems[1].subitems[1].value.count == 6, "Expected 6 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].value.count); TestCase_assert(node->subitems[1].subitems[1].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[1].subitems[0].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[0].type); TestCase_assert(node->subitems[1].subitems[1].subitems[0].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[1].subitems[0].key); TestCase_assert(node->subitems[1].subitems[1].subitems[0].value.number == 2, "Expected 2 but got %g", node->subitems[1].subitems[1].subitems[0].value.number); TestCase_assert(node->subitems[1].subitems[1].subitems[1].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[1].type); TestCase_assert(node->subitems[1].subitems[1].subitems[1].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[1].subitems[1].key); TestCase_assert(node->subitems[1].subitems[1].subitems[1].value.number == 3, "Expected 3 but got %g", node->subitems[1].subitems[1].subitems[1].value.number); TestCase_assert(node->subitems[1].subitems[1].subitems[2].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[2].type); TestCase_assert(node->subitems[1].subitems[1].subitems[2].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[1].subitems[2].key); TestCase_assert(node->subitems[1].subitems[1].subitems[2].value.number == 4, "Expected 4 but got %g", node->subitems[1].subitems[1].subitems[2].value.number); TestCase_assert(node->subitems[1].subitems[1].subitems[3].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[3].type); TestCase_assert(node->subitems[1].subitems[1].subitems[3].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[1].subitems[3].key); TestCase_assert(node->subitems[1].subitems[1].subitems[3].value.number == 5, "Expected 5 but got %g", node->subitems[1].subitems[1].subitems[3].value.number); TestCase_assert(node->subitems[1].subitems[1].subitems[4].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[4].type); TestCase_assert(node->subitems[1].subitems[1].subitems[4].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[1].subitems[4].key); TestCase_assert(node->subitems[1].subitems[1].subitems[4].value.number == 6, "Expected 6 but got %g", node->subitems[1].subitems[1].subitems[4].value.number); TestCase_assert(node->subitems[1].subitems[1].subitems[5].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[5].type); TestCase_assert(node->subitems[1].subitems[1].subitems[5].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[1].subitems[5].key); TestCase_assert(node->subitems[1].subitems[1].subitems[5].value.number == 7, "Expected 7 but got %g", node->subitems[1].subitems[1].subitems[5].value.number); TestCase_assert(node->subitems[1].subitems[2].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[2].type); TestCase_assert(node->subitems[1].subitems[2].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[2].key); TestCase_assert(node->subitems[1].subitems[2].value.number == 8, "Expected 8 but got %g", node->subitems[1].subitems[2].value.number); TestCase_assert(node->subitems[1].subitems[3].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[3].type); TestCase_assert(node->subitems[1].subitems[3].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[3].key); TestCase_assert(node->subitems[1].subitems[3].value.number == 9, "Expected 9 but got %g", node->subitems[1].subitems[3].value.number); TestCase_assert(node->subitems[1].subitems[4].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[4].type); TestCase_assert(node->subitems[1].subitems[4].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[4].key); TestCase_assert(node->subitems[1].subitems[4].stringLength == 7, "Expected 7 but got " SIZE_T_FORMAT, node->subitems[1].subitems[4].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[4].value.string, "0xA0000"), "Expected \"0xA0000\" but got \"%s\"", node->subitems[1].subitems[4].value.string); TestCase_assert(node->subitems[1].subitems[5].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[5].type); TestCase_assert(node->subitems[1].subitems[5].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[5].key); TestCase_assert(node->subitems[1].subitems[5].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[1].subitems[5].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[5].value.string, "10"), "Expected \"10\" but got \"%s\"", node->subitems[1].subitems[5].value.string); TestCase_assert(node->subitems[1].subitems[6].type == JSON_TYPE_NULL, "Expected %d but got %d", JSON_TYPE_NULL, node->subitems[1].subitems[6].type); TestCase_assert(node->subitems[1].subitems[6].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[6].key); TestCase_assert(node->subitems[1].subitems[7].type == JSON_TYPE_BOOLEAN, "Expected %d but got %d", JSON_TYPE_BOOLEAN, node->subitems[1].subitems[7].type); TestCase_assert(node->subitems[1].subitems[7].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[7].key); TestCase_assert(node->subitems[1].subitems[7].value.boolean == true, "Expected true but got false"); TestCase_assert(node->subitems[1].subitems[8].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[8].type); TestCase_assert(node->subitems[1].subitems[8].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[8].key); TestCase_assert(node->subitems[1].subitems[8].stringLength == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[1].subitems[8].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[8].value.string, "enum"), "Expected \"enum\" but got \"%s\"", node->subitems[1].subitems[8].value.string); TestCase_assert(node->subitems[1].subitems[9].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[1].subitems[9].type); TestCase_assert(node->subitems[1].subitems[9].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[9].key); TestCase_assert(node->subitems[1].subitems[9].value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[1].subitems[9].value.count); TestCase_assert(node->subitems[1].subitems[9].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[9].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[9].subitems[0].type); TestCase_assert(node->subitems[1].subitems[9].subitems[0].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[9].subitems[0].key); TestCase_assert(node->subitems[1].subitems[9].subitems[0].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[1].subitems[9].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[9].subitems[0].value.string, "13"), "Expected \"13\" but got \"%s\"", node->subitems[1].subitems[9].subitems[0].value.string); TestCase_assert(node->subitems[1].subitems[10].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[1].subitems[10].type); TestCase_assert(node->subitems[1].subitems[10].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[10].key); TestCase_assert(node->subitems[1].subitems[10].value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[1].subitems[10].value.count); TestCase_assert(node->subitems[1].subitems[10].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[10].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[10].subitems[0].type); TestCase_assert(node->subitems[1].subitems[10].subitems[0].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[10].subitems[0].key); TestCase_assert(node->subitems[1].subitems[10].subitems[0].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[1].subitems[10].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[10].subitems[0].value.string, "14"), "Expected \"14\" but got \"%s\"", node->subitems[1].subitems[10].subitems[0].value.string); TestCase_assert(node->subitems[1].subitems[11].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[1].subitems[11].type); TestCase_assert(node->subitems[1].subitems[11].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[11].key); TestCase_assert(node->subitems[1].subitems[11].value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[1].subitems[11].value.count); TestCase_assert(node->subitems[1].subitems[11].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[11].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[11].subitems[0].type); TestCase_assert(node->subitems[1].subitems[11].subitems[0].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[11].subitems[0].key); TestCase_assert(node->subitems[1].subitems[11].subitems[0].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[1].subitems[11].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[11].subitems[0].value.string, "15"), "Expected \"15\" but got \"%s\"", node->subitems[1].subitems[11].subitems[0].value.string); TestCase_assert(node->subitems[1].subitems[12].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[1].subitems[12].type); TestCase_assert(node->subitems[1].subitems[12].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[12].key); TestCase_assert(node->subitems[1].subitems[12].value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[1].subitems[12].value.count); TestCase_assert(node->subitems[1].subitems[12].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[12].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[12].subitems[0].type); TestCase_assert(node->subitems[1].subitems[12].subitems[0].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[12].subitems[0].key); TestCase_assert(node->subitems[1].subitems[12].subitems[0].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[1].subitems[12].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[12].subitems[0].value.string, "16"), "Expected \"16\" but got \"%s\"", node->subitems[1].subitems[12].subitems[0].value.string); JSONNode_dispose(node); } static void testStructures() { JSONSerializationContext * context; struct JSONNode * node; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginStructure, context, "key"); call_virtual(beginStructure, context, "item"); call_virtual(endStructure, context); call_virtual(endStructure, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->subitems[0].type); TestCase_assert(node->subitems[0].keyLength == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[0].keyLength); TestCase_assert(!strcmp(node->subitems[0].key, "item"), "Expected \"item\" but got \"%s\"", node->subitems[0].key); TestCase_assert(node->subitems[0].value.count == 0, "Expected 0 but got " SIZE_T_FORMAT, node->subitems[0].value.count); TestCase_assert(node->subitems[0].subitems == NULL, "Expected NULL but got %p", node->subitems[0].subitems); JSONNode_dispose(node); Serialization_enumKeyValue enumValue = {"enum", 12}; Serialization_bitName bitName8 = {"13", 0}; Serialization_bitName bitName16 = {"14", 0}; Serialization_bitName bitName32 = {"15", 0}; Serialization_bitName bitName64 = {"16", 0}; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginStructure, context, "key"); call_virtual(beginStructure, context, "struct1"); call_virtual(writeInt8, context, "int8", 0); call_virtual(endStructure, context); call_virtual(beginStructure, context, "struct2"); call_virtual(writeUInt8, context, "uint8", 1); call_virtual(beginStructure, context, "struct3"); call_virtual(writeInt16, context, "int16", 2); call_virtual(writeUInt16, context, "uint16", 3); call_virtual(writeInt32, context, "int32", 4); call_virtual(writeUInt32, context, "uint32", 5); call_virtual(writeInt64, context, "int64", 6); call_virtual(writeUInt64, context, "uint64", 7); call_virtual(endStructure, context); call_virtual(writeFloat, context, "float", 8); call_virtual(writeDouble, context, "double", 9); call_virtual(writeString, context, "string", "10"); call_virtual(writeStringNullable, context, "string_null", NULL); call_virtual(writeBoolean, context, "boolean", true); call_virtual(writeEnumeration, context, "enumeration", 12, 1, &enumValue); call_virtual(writeBitfield8, context, "bitfield8", 1, 1, &bitName8); call_virtual(writeBitfield16, context, "bitfield16", 1, 1, &bitName16); call_virtual(writeBitfield32, context, "bitfield32", 1, 1, &bitName32); call_virtual(writeBitfield64, context, "bitfield64", 1, 1, &bitName64); call_virtual(writeFixed16_16, context, "fixed16_16", 0xA0000); call_virtual(endStructure, context); call_virtual(endStructure, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 2, "Expected 2 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->subitems[0].type); TestCase_assert(node->subitems[0].keyLength == 7, "Expected 7 but got " SIZE_T_FORMAT, node->subitems[0].keyLength); TestCase_assert(!strcmp(node->subitems[0].key, "struct1"), "Expected \"struct1\" but got \"%s\"", node->subitems[0].key); TestCase_assert(node->subitems[0].value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[0].value.count); TestCase_assert(node->subitems[0].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].subitems[0].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[0].subitems[0].type); TestCase_assert(node->subitems[0].subitems[0].keyLength == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[0].subitems[0].keyLength); TestCase_assert(!strcmp(node->subitems[0].subitems[0].key, "int8"), "Expected \"int8\" but got \"%s\"", node->subitems[0].subitems[0].key); TestCase_assert(node->subitems[0].subitems[0].value.number == 0, "Expected 0 but got %g", node->subitems[0].subitems[0].value.number); TestCase_assert(node->subitems[1].type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->subitems[1].type); TestCase_assert(node->subitems[1].keyLength == 7, "Expected 7 but got " SIZE_T_FORMAT, node->subitems[1].keyLength); TestCase_assert(!strcmp(node->subitems[1].key, "struct2"), "Expected \"struct2\" but got \"%s\"", node->subitems[1].key); TestCase_assert(node->subitems[1].value.count == 13, "Expected 13 but got " SIZE_T_FORMAT, node->subitems[1].value.count); TestCase_assert(node->subitems[1].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[0].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[0].type); TestCase_assert(node->subitems[1].subitems[0].keyLength == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[1].subitems[0].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[0].key, "uint8"), "Expected \"uint8\" but got \"%s\"", node->subitems[1].subitems[0].key); TestCase_assert(node->subitems[1].subitems[0].value.number == 1, "Expected 1 but got %g", node->subitems[1].subitems[0].value.number); TestCase_assert(node->subitems[1].subitems[1].type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->subitems[1].subitems[1].type); TestCase_assert(node->subitems[1].subitems[1].keyLength == 7, "Expected 7 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[1].key, "struct3"), "Expected \"struct3\" but got \"%s\"", node->subitems[1].subitems[1].key); TestCase_assert(node->subitems[1].subitems[1].value.count == 6, "Expected 6 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].value.count); TestCase_assert(node->subitems[1].subitems[1].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[1].subitems[0].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[0].type); TestCase_assert(node->subitems[1].subitems[1].subitems[0].keyLength == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].subitems[0].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[1].subitems[0].key, "int16"), "Expected \"int16\" but got \"%s\"", node->subitems[1].subitems[1].subitems[0].key); TestCase_assert(node->subitems[1].subitems[1].subitems[0].value.number == 2, "Expected 2 but got %g", node->subitems[1].subitems[1].subitems[0].value.number); TestCase_assert(node->subitems[1].subitems[1].subitems[1].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[1].type); TestCase_assert(node->subitems[1].subitems[1].subitems[1].keyLength == 6, "Expected 6 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].subitems[1].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[1].subitems[1].key, "uint16"), "Expected \"uint16\" but got \"%s\"", node->subitems[1].subitems[1].subitems[1].key); TestCase_assert(node->subitems[1].subitems[1].subitems[1].value.number == 3, "Expected 3 but got %g", node->subitems[1].subitems[1].subitems[1].value.number); TestCase_assert(node->subitems[1].subitems[1].subitems[2].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[2].type); TestCase_assert(node->subitems[1].subitems[1].subitems[2].keyLength == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].subitems[2].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[1].subitems[2].key, "int32"), "Expected \"int32\" but got \"%s\"", node->subitems[1].subitems[1].subitems[2].key); TestCase_assert(node->subitems[1].subitems[1].subitems[2].value.number == 4, "Expected 4 but got %g", node->subitems[1].subitems[1].subitems[2].value.number); TestCase_assert(node->subitems[1].subitems[1].subitems[3].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[3].type); TestCase_assert(node->subitems[1].subitems[1].subitems[3].keyLength == 6, "Expected 6 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].subitems[3].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[1].subitems[3].key, "uint32"), "Expected \"uint32\" but got \"%s\"", node->subitems[1].subitems[1].subitems[3].key); TestCase_assert(node->subitems[1].subitems[1].subitems[3].value.number == 5, "Expected 5 but got %g", node->subitems[1].subitems[1].subitems[3].value.number); TestCase_assert(node->subitems[1].subitems[1].subitems[4].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[4].type); TestCase_assert(node->subitems[1].subitems[1].subitems[4].keyLength == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].subitems[4].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[1].subitems[4].key, "int64"), "Expected \"int64\" but got \"%s\"", node->subitems[1].subitems[1].subitems[4].key); TestCase_assert(node->subitems[1].subitems[1].subitems[4].value.number == 6, "Expected 6 but got %g", node->subitems[1].subitems[1].subitems[4].value.number); TestCase_assert(node->subitems[1].subitems[1].subitems[5].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[5].type); TestCase_assert(node->subitems[1].subitems[1].subitems[5].keyLength == 6, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].subitems[5].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[1].subitems[5].key, "uint64"), "Expected \"uint64\" but got \"%s\"", node->subitems[1].subitems[1].subitems[5].key); TestCase_assert(node->subitems[1].subitems[1].subitems[5].value.number == 7, "Expected 7 but got %g", node->subitems[1].subitems[1].subitems[5].value.number); TestCase_assert(node->subitems[1].subitems[2].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[2].type); TestCase_assert(node->subitems[1].subitems[2].keyLength == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[1].subitems[2].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[2].key, "float"), "Expected \"float\" but got \"%s\"", node->subitems[1].subitems[2].key); TestCase_assert(node->subitems[1].subitems[2].value.number == 8, "Expected 8 but got %g", node->subitems[1].subitems[2].value.number); TestCase_assert(node->subitems[1].subitems[3].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[3].type); TestCase_assert(node->subitems[1].subitems[3].keyLength == 6, "Expected 6 but got " SIZE_T_FORMAT, node->subitems[1].subitems[3].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[3].key, "double"), "Expected \"double\" but got \"%s\"", node->subitems[1].subitems[3].key); TestCase_assert(node->subitems[1].subitems[3].value.number == 9, "Expected 9 but got %g", node->subitems[1].subitems[3].value.number); TestCase_assert(node->subitems[1].subitems[4].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[4].type); TestCase_assert(node->subitems[1].subitems[4].keyLength == 6, "Expected 6 but got " SIZE_T_FORMAT, node->subitems[1].subitems[4].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[4].key, "string"), "Expected \"string\" but got \"%s\"", node->subitems[1].subitems[4].key); TestCase_assert(node->subitems[1].subitems[4].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[1].subitems[4].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[4].value.string, "10"), "Expected \"10\" but got \"%s\"", node->subitems[1].subitems[4].value.string); TestCase_assert(node->subitems[1].subitems[5].type == JSON_TYPE_NULL, "Expected %d but got %d", JSON_TYPE_NULL, node->subitems[1].subitems[5].type); TestCase_assert(node->subitems[1].subitems[5].keyLength == 11, "Expected 11 but got " SIZE_T_FORMAT, node->subitems[1].subitems[5].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[5].key, "string_null"), "Expected \"string_null\" but got \"%s\"", node->subitems[1].subitems[5].key); TestCase_assert(node->subitems[1].subitems[6].type == JSON_TYPE_BOOLEAN, "Expected %d but got %d", JSON_TYPE_BOOLEAN, node->subitems[1].subitems[6].type); TestCase_assert(node->subitems[1].subitems[6].keyLength == 7, "Expected 7 but got " SIZE_T_FORMAT, node->subitems[1].subitems[6].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[6].key, "boolean"), "Expected \"boolean\" but got \"%s\"", node->subitems[1].subitems[6].key); TestCase_assert(node->subitems[1].subitems[6].value.boolean == true, "Expected true but got false"); TestCase_assert(node->subitems[1].subitems[7].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[7].type); TestCase_assert(node->subitems[1].subitems[7].keyLength == 11, "Expected 11 but got " SIZE_T_FORMAT, node->subitems[1].subitems[7].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[7].key, "enumeration"), "Expected \"enumeration\" but got \"%s\"", node->subitems[1].subitems[7].key); TestCase_assert(node->subitems[1].subitems[7].stringLength == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[1].subitems[7].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[7].value.string, "enum"), "Expected \"enum\" but got \"%s\"", node->subitems[1].subitems[7].value.string); TestCase_assert(node->subitems[1].subitems[8].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[1].subitems[8].type); TestCase_assert(node->subitems[1].subitems[8].keyLength == 9, "Expected 9 but got " SIZE_T_FORMAT, node->subitems[1].subitems[8].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[8].key, "bitfield8"), "Expected \"bitfield8\" but got \"%s\"", node->subitems[1].subitems[8].key); TestCase_assert(node->subitems[1].subitems[8].value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[1].subitems[8].value.count); TestCase_assert(node->subitems[1].subitems[8].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[8].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[8].subitems[0].type); TestCase_assert(node->subitems[1].subitems[8].subitems[0].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[8].subitems[0].key); TestCase_assert(node->subitems[1].subitems[8].subitems[0].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[1].subitems[8].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[8].subitems[0].value.string, "13"), "Expected \"13\" but got \"%s\"", node->subitems[1].subitems[8].subitems[0].value.string); TestCase_assert(node->subitems[1].subitems[9].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[1].subitems[9].type); TestCase_assert(node->subitems[1].subitems[9].keyLength == 10, "Expected 10 but got " SIZE_T_FORMAT, node->subitems[1].subitems[9].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[9].key, "bitfield16"), "Expected \"bitfield16\" but got \"%s\"", node->subitems[1].subitems[9].key); TestCase_assert(node->subitems[1].subitems[9].value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[1].subitems[9].value.count); TestCase_assert(node->subitems[1].subitems[9].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[9].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[9].subitems[0].type); TestCase_assert(node->subitems[1].subitems[9].subitems[0].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[9].subitems[0].key); TestCase_assert(node->subitems[1].subitems[9].subitems[0].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[1].subitems[9].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[9].subitems[0].value.string, "14"), "Expected \"14\" but got \"%s\"", node->subitems[1].subitems[9].subitems[0].value.string); TestCase_assert(node->subitems[1].subitems[10].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[1].subitems[10].type); TestCase_assert(node->subitems[1].subitems[10].keyLength == 10, "Expected 10 but got " SIZE_T_FORMAT, node->subitems[1].subitems[10].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[10].key, "bitfield32"), "Expected \"bitfield32\" but got \"%s\"", node->subitems[1].subitems[10].key); TestCase_assert(node->subitems[1].subitems[10].value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[1].subitems[10].value.count); TestCase_assert(node->subitems[1].subitems[10].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[10].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[10].subitems[0].type); TestCase_assert(node->subitems[1].subitems[10].subitems[0].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[10].subitems[0].key); TestCase_assert(node->subitems[1].subitems[10].subitems[0].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[1].subitems[10].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[10].subitems[0].value.string, "15"), "Expected \"15\" but got \"%s\"", node->subitems[1].subitems[10].subitems[0].value.string); TestCase_assert(node->subitems[1].subitems[11].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[1].subitems[11].type); TestCase_assert(node->subitems[1].subitems[11].keyLength == 10, "Expected 10 but got " SIZE_T_FORMAT, node->subitems[1].subitems[11].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[11].key, "bitfield64"), "Expected \"bitfield64\" but got \"%s\"", node->subitems[1].subitems[11].key); TestCase_assert(node->subitems[1].subitems[11].value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[1].subitems[11].value.count); TestCase_assert(node->subitems[1].subitems[11].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[11].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[11].subitems[0].type); TestCase_assert(node->subitems[1].subitems[11].subitems[0].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[11].subitems[0].key); TestCase_assert(node->subitems[1].subitems[11].subitems[0].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[1].subitems[11].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[11].subitems[0].value.string, "16"), "Expected \"16\" but got \"%s\"", node->subitems[1].subitems[11].subitems[0].value.string); TestCase_assert(node->subitems[1].subitems[12].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[12].type); TestCase_assert(node->subitems[1].subitems[12].keyLength == 10, "Expected 10 but got " SIZE_T_FORMAT, node->subitems[1].subitems[12].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[12].key, "fixed16_16"), "Expected \"fixed16_16\" but got \"%s\"", node->subitems[1].subitems[12].key); TestCase_assert(node->subitems[1].subitems[12].stringLength == 7, "Expected 7 but got " SIZE_T_FORMAT, node->subitems[1].subitems[12].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[12].value.string, "0xA0000"), "Expected \"0xA0000\" but got \"%s\"", node->subitems[1].subitems[12].value.string); JSONNode_dispose(node); } static void testDictionaries() { JSONSerializationContext * context; struct JSONNode * node; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginDictionary, context, "key"); call_virtual(beginDictionary, context, "item"); call_virtual(endDictionary, context); call_virtual(endDictionary, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->subitems[0].type); TestCase_assert(node->subitems[0].keyLength == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[0].keyLength); TestCase_assert(!strcmp(node->subitems[0].key, "item"), "Expected \"item\" but got \"%s\"", node->subitems[0].key); TestCase_assert(node->subitems[0].value.count == 0, "Expected 0 but got " SIZE_T_FORMAT, node->subitems[0].value.count); TestCase_assert(node->subitems[0].subitems == NULL, "Expected NULL but got %p", node->subitems[0].subitems); JSONNode_dispose(node); Serialization_enumKeyValue enumValue = {"enum", 12}; Serialization_bitName bitName8 = {"13", 0}; Serialization_bitName bitName16 = {"14", 0}; Serialization_bitName bitName32 = {"15", 0}; Serialization_bitName bitName64 = {"16", 0}; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginDictionary, context, "key"); call_virtual(beginDictionary, context, "struct1"); call_virtual(writeInt8, context, "int8", 0); call_virtual(endDictionary, context); call_virtual(beginDictionary, context, "struct2"); call_virtual(writeUInt8, context, "uint8", 1); call_virtual(beginDictionary, context, "struct3"); call_virtual(writeInt16, context, "int16", 2); call_virtual(writeUInt16, context, "uint16", 3); call_virtual(writeInt32, context, "int32", 4); call_virtual(writeUInt32, context, "uint32", 5); call_virtual(writeInt64, context, "int64", 6); call_virtual(writeUInt64, context, "uint64", 7); call_virtual(endDictionary, context); call_virtual(writeFloat, context, "float", 8); call_virtual(writeDouble, context, "double", 9); call_virtual(writeString, context, "string", "10"); call_virtual(writeStringNullable, context, "string_null", NULL); call_virtual(writeBoolean, context, "boolean", true); call_virtual(writeEnumeration, context, "enumeration", 12, 1, &enumValue); call_virtual(writeBitfield8, context, "bitfield8", 1, 1, &bitName8); call_virtual(writeBitfield16, context, "bitfield16", 1, 1, &bitName16); call_virtual(writeBitfield32, context, "bitfield32", 1, 1, &bitName32); call_virtual(writeBitfield64, context, "bitfield64", 1, 1, &bitName64); call_virtual(writeFixed16_16, context, "fixed16_16", 0xA0000); call_virtual(endDictionary, context); call_virtual(endDictionary, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 2, "Expected 2 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->subitems[0].type); TestCase_assert(node->subitems[0].keyLength == 7, "Expected 7 but got " SIZE_T_FORMAT, node->subitems[0].keyLength); TestCase_assert(!strcmp(node->subitems[0].key, "struct1"), "Expected \"struct1\" but got \"%s\"", node->subitems[0].key); TestCase_assert(node->subitems[0].value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[0].value.count); TestCase_assert(node->subitems[0].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].subitems[0].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[0].subitems[0].type); TestCase_assert(node->subitems[0].subitems[0].keyLength == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[0].subitems[0].keyLength); TestCase_assert(!strcmp(node->subitems[0].subitems[0].key, "int8"), "Expected \"int8\" but got \"%s\"", node->subitems[0].subitems[0].key); TestCase_assert(node->subitems[0].subitems[0].value.number == 0, "Expected 0 but got %g", node->subitems[0].subitems[0].value.number); TestCase_assert(node->subitems[1].type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->subitems[1].type); TestCase_assert(node->subitems[1].keyLength == 7, "Expected 7 but got " SIZE_T_FORMAT, node->subitems[1].keyLength); TestCase_assert(!strcmp(node->subitems[1].key, "struct2"), "Expected \"struct2\" but got \"%s\"", node->subitems[1].key); TestCase_assert(node->subitems[1].value.count == 13, "Expected 13 but got " SIZE_T_FORMAT, node->subitems[1].value.count); TestCase_assert(node->subitems[1].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[0].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[0].type); TestCase_assert(node->subitems[1].subitems[0].keyLength == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[1].subitems[0].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[0].key, "uint8"), "Expected \"uint8\" but got \"%s\"", node->subitems[1].subitems[0].key); TestCase_assert(node->subitems[1].subitems[0].value.number == 1, "Expected 1 but got %g", node->subitems[1].subitems[0].value.number); TestCase_assert(node->subitems[1].subitems[1].type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->subitems[1].subitems[1].type); TestCase_assert(node->subitems[1].subitems[1].keyLength == 7, "Expected 7 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[1].key, "struct3"), "Expected \"struct3\" but got \"%s\"", node->subitems[1].subitems[1].key); TestCase_assert(node->subitems[1].subitems[1].value.count == 6, "Expected 6 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].value.count); TestCase_assert(node->subitems[1].subitems[1].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[1].subitems[0].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[0].type); TestCase_assert(node->subitems[1].subitems[1].subitems[0].keyLength == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].subitems[0].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[1].subitems[0].key, "int16"), "Expected \"int16\" but got \"%s\"", node->subitems[1].subitems[1].subitems[0].key); TestCase_assert(node->subitems[1].subitems[1].subitems[0].value.number == 2, "Expected 2 but got %g", node->subitems[1].subitems[1].subitems[0].value.number); TestCase_assert(node->subitems[1].subitems[1].subitems[1].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[1].type); TestCase_assert(node->subitems[1].subitems[1].subitems[1].keyLength == 6, "Expected 6 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].subitems[1].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[1].subitems[1].key, "uint16"), "Expected \"uint16\" but got \"%s\"", node->subitems[1].subitems[1].subitems[1].key); TestCase_assert(node->subitems[1].subitems[1].subitems[1].value.number == 3, "Expected 3 but got %g", node->subitems[1].subitems[1].subitems[1].value.number); TestCase_assert(node->subitems[1].subitems[1].subitems[2].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[2].type); TestCase_assert(node->subitems[1].subitems[1].subitems[2].keyLength == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].subitems[2].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[1].subitems[2].key, "int32"), "Expected \"int32\" but got \"%s\"", node->subitems[1].subitems[1].subitems[2].key); TestCase_assert(node->subitems[1].subitems[1].subitems[2].value.number == 4, "Expected 4 but got %g", node->subitems[1].subitems[1].subitems[2].value.number); TestCase_assert(node->subitems[1].subitems[1].subitems[3].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[3].type); TestCase_assert(node->subitems[1].subitems[1].subitems[3].keyLength == 6, "Expected 6 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].subitems[3].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[1].subitems[3].key, "uint32"), "Expected \"uint32\" but got \"%s\"", node->subitems[1].subitems[1].subitems[3].key); TestCase_assert(node->subitems[1].subitems[1].subitems[3].value.number == 5, "Expected 5 but got %g", node->subitems[1].subitems[1].subitems[3].value.number); TestCase_assert(node->subitems[1].subitems[1].subitems[4].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[4].type); TestCase_assert(node->subitems[1].subitems[1].subitems[4].keyLength == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].subitems[4].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[1].subitems[4].key, "int64"), "Expected \"int64\" but got \"%s\"", node->subitems[1].subitems[1].subitems[4].key); TestCase_assert(node->subitems[1].subitems[1].subitems[4].value.number == 6, "Expected 6 but got %g", node->subitems[1].subitems[1].subitems[4].value.number); TestCase_assert(node->subitems[1].subitems[1].subitems[5].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[1].subitems[5].type); TestCase_assert(node->subitems[1].subitems[1].subitems[5].keyLength == 6, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].subitems[5].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[1].subitems[5].key, "uint64"), "Expected \"uint64\" but got \"%s\"", node->subitems[1].subitems[1].subitems[5].key); TestCase_assert(node->subitems[1].subitems[1].subitems[5].value.number == 7, "Expected 7 but got %g", node->subitems[1].subitems[1].subitems[5].value.number); TestCase_assert(node->subitems[1].subitems[2].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[2].type); TestCase_assert(node->subitems[1].subitems[2].keyLength == 5, "Expected 5 but got " SIZE_T_FORMAT, node->subitems[1].subitems[2].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[2].key, "float"), "Expected \"float\" but got \"%s\"", node->subitems[1].subitems[2].key); TestCase_assert(node->subitems[1].subitems[2].value.number == 8, "Expected 8 but got %g", node->subitems[1].subitems[2].value.number); TestCase_assert(node->subitems[1].subitems[3].type == JSON_TYPE_NUMBER, "Expected %d but got %d", JSON_TYPE_NUMBER, node->subitems[1].subitems[3].type); TestCase_assert(node->subitems[1].subitems[3].keyLength == 6, "Expected 6 but got " SIZE_T_FORMAT, node->subitems[1].subitems[3].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[3].key, "double"), "Expected \"double\" but got \"%s\"", node->subitems[1].subitems[3].key); TestCase_assert(node->subitems[1].subitems[3].value.number == 9, "Expected 9 but got %g", node->subitems[1].subitems[3].value.number); TestCase_assert(node->subitems[1].subitems[4].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[4].type); TestCase_assert(node->subitems[1].subitems[4].keyLength == 6, "Expected 6 but got " SIZE_T_FORMAT, node->subitems[1].subitems[4].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[4].key, "string"), "Expected \"string\" but got \"%s\"", node->subitems[1].subitems[4].key); TestCase_assert(node->subitems[1].subitems[4].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[1].subitems[4].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[4].value.string, "10"), "Expected \"10\" but got \"%s\"", node->subitems[1].subitems[4].value.string); TestCase_assert(node->subitems[1].subitems[5].type == JSON_TYPE_NULL, "Expected %d but got %d", JSON_TYPE_NULL, node->subitems[1].subitems[5].type); TestCase_assert(node->subitems[1].subitems[5].keyLength == 11, "Expected 11 but got " SIZE_T_FORMAT, node->subitems[1].subitems[5].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[5].key, "string_null"), "Expected \"string_null\" but got \"%s\"", node->subitems[1].subitems[5].key); TestCase_assert(node->subitems[1].subitems[6].type == JSON_TYPE_BOOLEAN, "Expected %d but got %d", JSON_TYPE_BOOLEAN, node->subitems[1].subitems[6].type); TestCase_assert(node->subitems[1].subitems[6].keyLength == 7, "Expected 7 but got " SIZE_T_FORMAT, node->subitems[1].subitems[6].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[6].key, "boolean"), "Expected \"boolean\" but got \"%s\"", node->subitems[1].subitems[6].key); TestCase_assert(node->subitems[1].subitems[6].value.boolean == true, "Expected true but got false"); TestCase_assert(node->subitems[1].subitems[7].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[7].type); TestCase_assert(node->subitems[1].subitems[7].keyLength == 11, "Expected 11 but got " SIZE_T_FORMAT, node->subitems[1].subitems[7].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[7].key, "enumeration"), "Expected \"enumeration\" but got \"%s\"", node->subitems[1].subitems[7].key); TestCase_assert(node->subitems[1].subitems[7].stringLength == 4, "Expected 4 but got " SIZE_T_FORMAT, node->subitems[1].subitems[7].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[7].value.string, "enum"), "Expected \"enum\" but got \"%s\"", node->subitems[1].subitems[7].value.string); TestCase_assert(node->subitems[1].subitems[8].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[1].subitems[8].type); TestCase_assert(node->subitems[1].subitems[8].keyLength == 9, "Expected 9 but got " SIZE_T_FORMAT, node->subitems[1].subitems[8].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[8].key, "bitfield8"), "Expected \"bitfield8\" but got \"%s\"", node->subitems[1].subitems[8].key); TestCase_assert(node->subitems[1].subitems[8].value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[1].subitems[8].value.count); TestCase_assert(node->subitems[1].subitems[8].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[8].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[8].subitems[0].type); TestCase_assert(node->subitems[1].subitems[8].subitems[0].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[8].subitems[0].key); TestCase_assert(node->subitems[1].subitems[8].subitems[0].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[1].subitems[8].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[8].subitems[0].value.string, "13"), "Expected \"13\" but got \"%s\"", node->subitems[1].subitems[8].subitems[0].value.string); TestCase_assert(node->subitems[1].subitems[9].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[1].subitems[9].type); TestCase_assert(node->subitems[1].subitems[9].keyLength == 10, "Expected 10 but got " SIZE_T_FORMAT, node->subitems[1].subitems[9].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[9].key, "bitfield16"), "Expected \"bitfield16\" but got \"%s\"", node->subitems[1].subitems[9].key); TestCase_assert(node->subitems[1].subitems[9].value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[1].subitems[9].value.count); TestCase_assert(node->subitems[1].subitems[9].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[9].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[9].subitems[0].type); TestCase_assert(node->subitems[1].subitems[9].subitems[0].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[9].subitems[0].key); TestCase_assert(node->subitems[1].subitems[9].subitems[0].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[1].subitems[9].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[9].subitems[0].value.string, "14"), "Expected \"14\" but got \"%s\"", node->subitems[1].subitems[9].subitems[0].value.string); TestCase_assert(node->subitems[1].subitems[10].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[1].subitems[10].type); TestCase_assert(node->subitems[1].subitems[10].keyLength == 10, "Expected 10 but got " SIZE_T_FORMAT, node->subitems[1].subitems[10].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[10].key, "bitfield32"), "Expected \"bitfield32\" but got \"%s\"", node->subitems[1].subitems[10].key); TestCase_assert(node->subitems[1].subitems[10].value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[1].subitems[10].value.count); TestCase_assert(node->subitems[1].subitems[10].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[10].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[10].subitems[0].type); TestCase_assert(node->subitems[1].subitems[10].subitems[0].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[10].subitems[0].key); TestCase_assert(node->subitems[1].subitems[10].subitems[0].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[1].subitems[10].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[10].subitems[0].value.string, "15"), "Expected \"15\" but got \"%s\"", node->subitems[1].subitems[10].subitems[0].value.string); TestCase_assert(node->subitems[1].subitems[11].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[1].subitems[11].type); TestCase_assert(node->subitems[1].subitems[11].keyLength == 10, "Expected 10 but got " SIZE_T_FORMAT, node->subitems[1].subitems[11].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[11].key, "bitfield64"), "Expected \"bitfield64\" but got \"%s\"", node->subitems[1].subitems[11].key); TestCase_assert(node->subitems[1].subitems[11].value.count == 1, "Expected 1 but got " SIZE_T_FORMAT, node->subitems[1].subitems[11].value.count); TestCase_assert(node->subitems[1].subitems[11].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[11].subitems[0].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[11].subitems[0].type); TestCase_assert(node->subitems[1].subitems[11].subitems[0].key == NULL, "Expected NULL but got \"%s\"", node->subitems[1].subitems[11].subitems[0].key); TestCase_assert(node->subitems[1].subitems[11].subitems[0].stringLength == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[1].subitems[11].subitems[0].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[11].subitems[0].value.string, "16"), "Expected \"16\" but got \"%s\"", node->subitems[1].subitems[11].subitems[0].value.string); TestCase_assert(node->subitems[1].subitems[12].type == JSON_TYPE_STRING, "Expected %d but got %d", JSON_TYPE_STRING, node->subitems[1].subitems[12].type); TestCase_assert(node->subitems[1].subitems[12].keyLength == 10, "Expected 10 but got " SIZE_T_FORMAT, node->subitems[1].subitems[12].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[12].key, "fixed16_16"), "Expected \"string\" but got \"%s\"", node->subitems[1].subitems[12].key); TestCase_assert(node->subitems[1].subitems[12].stringLength == 7, "Expected 7 but got " SIZE_T_FORMAT, node->subitems[1].subitems[12].stringLength); TestCase_assert(!strcmp(node->subitems[1].subitems[12].value.string, "0xA0000"), "Expected \"0xA0000\" but got \"%s\"", node->subitems[1].subitems[12].value.string); JSONNode_dispose(node); } static void testMixedContainers() { JSONSerializationContext * context; struct JSONNode * node; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginArray, context, "outerArray"); call_virtual(beginStructure, context, "outerStruct"); call_virtual(beginArray, context, "innerArray"); call_virtual(endArray, context); call_virtual(beginDictionary, context, "innerDict"); call_virtual(endDictionary, context); call_virtual(endStructure, context); call_virtual(beginDictionary, context, "outerDict"); call_virtual(beginArray, context, "innerArray2"); call_virtual(endArray, context); call_virtual(beginStructure, context, "innerStruct"); call_virtual(endStructure, context); call_virtual(endDictionary, context); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node != NULL, "Expected non-NULL but got NULL"); if (node == NULL) {return;} // Suppress clang warning TestCase_assert(node->type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->type); TestCase_assert(node->key == NULL, "Expected NULL but got \"%s\"", node->key); TestCase_assert(node->value.count == 2, "Expected 2 but got " SIZE_T_FORMAT, node->value.count); TestCase_assert(node->subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->subitems[0].type); TestCase_assert(node->subitems[0].key == NULL, "Expected NULL but got %p", node->subitems[0].key); TestCase_assert(node->subitems[0].value.count == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[0].value.count); TestCase_assert(node->subitems[0].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[0].subitems[0].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[0].subitems[0].type); TestCase_assert(node->subitems[0].subitems[0].keyLength == 10, "Expected 10 but got " SIZE_T_FORMAT, node->subitems[0].subitems[0].keyLength); TestCase_assert(!strcmp(node->subitems[0].subitems[0].key, "innerArray"), "Expected \"innerArray\" but got \"%s\"", node->subitems[0].subitems[0].key); TestCase_assert(node->subitems[0].subitems[0].value.count == 0, "Expected 0 but got " SIZE_T_FORMAT, node->subitems[0].subitems[0].value.count); TestCase_assert(node->subitems[0].subitems[0].subitems == NULL, "Expected NULL but got %p", node->subitems[0].subitems[0].subitems); TestCase_assert(node->subitems[0].subitems[1].type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->subitems[0].subitems[1].type); TestCase_assert(node->subitems[0].subitems[1].keyLength == 9, "Expected 9 but got " SIZE_T_FORMAT, node->subitems[0].subitems[1].keyLength); TestCase_assert(!strcmp(node->subitems[0].subitems[1].key, "innerDict"), "Expected \"innerDict\" but got \"%s\"", node->subitems[0].subitems[1].key); TestCase_assert(node->subitems[0].subitems[1].value.count == 0, "Expected 0 but got " SIZE_T_FORMAT, node->subitems[0].subitems[1].value.count); TestCase_assert(node->subitems[0].subitems[1].subitems == NULL, "Expected NULL but got %p", node->subitems[0].subitems[1].subitems); TestCase_assert(node->subitems[1].type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->subitems[1].type); TestCase_assert(node->subitems[1].key == NULL, "Expected NULL but got %p", node->subitems[1].key); TestCase_assert(node->subitems[1].value.count == 2, "Expected 2 but got " SIZE_T_FORMAT, node->subitems[1].value.count); TestCase_assert(node->subitems[1].subitems != NULL, "Expected non-NULL but got NULL"); TestCase_assert(node->subitems[1].subitems[0].type == JSON_TYPE_ARRAY, "Expected %d but got %d", JSON_TYPE_ARRAY, node->subitems[1].subitems[0].type); TestCase_assert(node->subitems[1].subitems[0].keyLength == 11, "Expected 11 but got " SIZE_T_FORMAT, node->subitems[1].subitems[0].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[0].key, "innerArray2"), "Expected \"innerArray2\" but got \"%s\"", node->subitems[1].subitems[0].key); TestCase_assert(node->subitems[1].subitems[0].value.count == 0, "Expected 0 but got " SIZE_T_FORMAT, node->subitems[1].subitems[0].value.count); TestCase_assert(node->subitems[1].subitems[0].subitems == NULL, "Expected NULL but got %p", node->subitems[1].subitems[0].subitems); TestCase_assert(node->subitems[1].subitems[1].type == JSON_TYPE_OBJECT, "Expected %d but got %d", JSON_TYPE_OBJECT, node->subitems[1].subitems[1].type); TestCase_assert(node->subitems[1].subitems[1].keyLength == 11, "Expected 11 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].keyLength); TestCase_assert(!strcmp(node->subitems[1].subitems[1].key, "innerStruct"), "Expected \"innerStruct\" but got \"%s\"", node->subitems[1].subitems[1].key); TestCase_assert(node->subitems[1].subitems[1].value.count == 0, "Expected 0 but got " SIZE_T_FORMAT, node->subitems[1].subitems[1].value.count); TestCase_assert(node->subitems[1].subitems[1].subitems == NULL, "Expected NULL but got %p", node->subitems[1].subitems[1].subitems); JSONNode_dispose(node); } static void testWriteToString() { JSONSerializationContext * context; char * string; size_t length; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginArray, context, "key"); call_virtual(writeInt32, context, "item", 10); call_virtual(beginStructure, context, "item"); call_virtual(writeBoolean, context, "bool", false); call_virtual(writeString, context, "string", "Hello, world!"); call_virtual(endStructure, context); call_virtual(endArray, context); length = 0; string = JSONSerializationContext_writeToString(context, JSONEmitterFormat_compact, &length, NULL); TestCase_assert(string != NULL, "Expected non-NULL but got NULL"); TestCase_assert(!strcmp(string, "[10,{\"bool\":false,\"string\":\"Hello, world!\"}]"), "Expected \"[10,{\"bool\":false,\"string\":\"Hello, world!\"}]\" but got \"%s\"", string); TestCase_assert(length == 44, "Expected 44 but got " SIZE_T_FORMAT, length); free(string); length = 0; string = JSONSerializationContext_writeToString(context, JSONEmitterFormat_singleLine, &length, NULL); TestCase_assert(string != NULL, "Expected non-NULL but got NULL"); TestCase_assert(!strcmp(string, "[10, {\"bool\": false, \"string\": \"Hello, world!\"}]"), "Expected \"[10, {\"bool\": false, \"string\": \"Hello, world!\"}]\" but got \"%s\"", string); TestCase_assert(length == 48, "Expected 48 but got " SIZE_T_FORMAT, length); free(string); length = 0; string = JSONSerializationContext_writeToString(context, JSONEmitterFormat_multiLine, &length, NULL); TestCase_assert(string != NULL, "Expected non-NULL but got NULL"); TestCase_assert(!strcmp(string, "[\n\t10,\n\t{\n\t\t\"bool\": false,\n\t\t\"string\": \"Hello, world!\"\n\t}\n]"), "Expected \"[\n\t10,\n\t{\n\t\t\"bool\": false,\n\t\t\"string\": \"Hello, world!\"\n\t}\n]\" but got \"%s\"", string); TestCase_assert(length == 59, "Expected 59 but got " SIZE_T_FORMAT, length); free(string); call_virtual(dispose, context); } static void testWriteToFile() { JSONSerializationContext * context; const char * tempFilePath; int fd; bool success; char * string; size_t length; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginArray, context, "key"); call_virtual(writeInt32, context, "item", 10); call_virtual(beginStructure, context, "item"); call_virtual(writeBoolean, context, "bool", false); call_virtual(writeString, context, "string", "Hello, world!"); call_virtual(endStructure, context); call_virtual(endArray, context); tempFilePath = temporaryFilePath("tmpXXXXXX", &fd); success = JSONSerializationContext_writeToFile(context, JSONEmitterFormat_compact, tempFilePath, NULL); string = readFileSimple(tempFilePath, &length); close(fd); unlink(tempFilePath); TestCase_assert(success, "Expected true but got false"); TestCase_assert(length == 44, "Expected 44 but got " SIZE_T_FORMAT, length); TestCase_assert(string != NULL, "Expected non-NULL but got NULL"); TestCase_assert(!strncmp(string, "[10,{\"bool\":false,\"string\":\"Hello, world!\"}]", length), "Expected \"[10,{\"bool\":false,\"string\":\"Hello, world!\"}]\" but got \"%s\"", string); free(string); tempFilePath = temporaryFilePath("tmpXXXXXX", &fd); success = JSONSerializationContext_writeToFile(context, JSONEmitterFormat_singleLine, tempFilePath, NULL); string = readFileSimple(tempFilePath, &length); close(fd); unlink(tempFilePath); TestCase_assert(success, "Expected true but got false"); TestCase_assert(length == 48, "Expected 48 but got " SIZE_T_FORMAT, length); TestCase_assert(string != NULL, "Expected non-NULL but got NULL"); TestCase_assert(!strncmp(string, "[10, {\"bool\": false, \"string\": \"Hello, world!\"}]", length), "Expected \"[10, {\"bool\": false, \"string\": \"Hello, world!\"}]\" but got \"%s\"", string); free(string); tempFilePath = temporaryFilePath("tmpXXXXXX", &fd); success = JSONSerializationContext_writeToFile(context, JSONEmitterFormat_multiLine, tempFilePath, NULL); string = readFileSimple(tempFilePath, &length); close(fd); unlink(tempFilePath); TestCase_assert(success, "Expected true but got false"); TestCase_assert(length == 59, "Expected 59 but got " SIZE_T_FORMAT, length); TestCase_assert(string != NULL, "Expected non-NULL but got NULL"); TestCase_assert(!strncmp(string, "[\n\t10,\n\t{\n\t\t\"bool\": false,\n\t\t\"string\": \"Hello, world!\"\n\t}\n]", length), "Expected \"[\n\t10,\n\t{\n\t\t\"bool\": false,\n\t\t\"string\": \"Hello, world!\"\n\t}\n]\" but got \"%s\"", string); free(string); call_virtual(dispose, context); } static void testInvalidOperations() { JSONSerializationContext * context; struct JSONNode * node; // No data context = JSONSerializationContext_create(); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); // No top-level container #define _testNoTopLevelContainer(FUNCTION, ...) \ context = JSONSerializationContext_create(); \ call_virtual(FUNCTION, context, "key", __VA_ARGS__); \ node = JSONSerializationContext_writeToJSONNode(context); \ TestCase_assert(node == NULL, "Expected NULL but got %p", node); \ call_virtual(dispose, context); _testNoTopLevelContainer(writeInt8, 0) _testNoTopLevelContainer(writeUInt8, 0) _testNoTopLevelContainer(writeInt16, 0) _testNoTopLevelContainer(writeUInt16, 0) _testNoTopLevelContainer(writeInt32, 0) _testNoTopLevelContainer(writeUInt32, 0) _testNoTopLevelContainer(writeInt64, 0) _testNoTopLevelContainer(writeUInt64, 0) _testNoTopLevelContainer(writeFloat, 0) _testNoTopLevelContainer(writeDouble, 0) _testNoTopLevelContainer(writeFixed16_16, 0) _testNoTopLevelContainer(writeString, "") _testNoTopLevelContainer(writeStringNullable, NULL) _testNoTopLevelContainer(writeBoolean, false) _testNoTopLevelContainer(writeEnumeration, 0, 0, NULL) _testNoTopLevelContainer(writeBitfield8, 0, 0, NULL) _testNoTopLevelContainer(writeBitfield16, 0, 0, NULL) _testNoTopLevelContainer(writeBitfield32, 0, 0, NULL) _testNoTopLevelContainer(writeBitfield64, 0, 0, NULL) #undef _testNoTopLevelContainer // Unterminated array context = JSONSerializationContext_create(); call_virtual(beginArray, context, "key"); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); context = JSONSerializationContext_create(); call_virtual(beginArray, context, "key"); call_virtual(beginArray, context, "key"); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); // Unterminated structure context = JSONSerializationContext_create(); call_virtual(beginStructure, context, "key"); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); context = JSONSerializationContext_create(); call_virtual(beginStructure, context, "key"); call_virtual(beginStructure, context, "key"); call_virtual(endStructure, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); // Unterminated dictionary context = JSONSerializationContext_create(); call_virtual(beginDictionary, context, "key"); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); context = JSONSerializationContext_create(); call_virtual(beginDictionary, context, "key"); call_virtual(beginDictionary, context, "key"); call_virtual(endDictionary, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); // Wrong container type terminated #define _testWrongContainerTypeTerminatedOuter(CONTAINER_1, CONTAINER_2) \ context = JSONSerializationContext_create(); \ call_virtual(begin##CONTAINER_1, context, "key"); \ call_virtual(end##CONTAINER_2, context); \ node = JSONSerializationContext_writeToJSONNode(context); \ TestCase_assert(node == NULL, "Expected NULL but got %p", node); \ call_virtual(dispose, context); #define _testWrongContainerTypeTerminatedInner(CONTAINER_1, CONTAINER_2) \ context = JSONSerializationContext_create(); \ call_virtual(begin##CONTAINER_1, context, "key"); \ call_virtual(begin##CONTAINER_1, context, "key"); \ call_virtual(end##CONTAINER_2, context); \ call_virtual(end##CONTAINER_1, context); \ node = JSONSerializationContext_writeToJSONNode(context); \ TestCase_assert(node == NULL, "Expected NULL but got %p", node); \ call_virtual(dispose, context); _testWrongContainerTypeTerminatedOuter(Array, Structure) _testWrongContainerTypeTerminatedOuter(Array, Dictionary) _testWrongContainerTypeTerminatedOuter(Structure, Array) _testWrongContainerTypeTerminatedOuter(Structure, Dictionary) _testWrongContainerTypeTerminatedOuter(Dictionary, Array) _testWrongContainerTypeTerminatedOuter(Dictionary, Structure) _testWrongContainerTypeTerminatedInner(Array, Structure) _testWrongContainerTypeTerminatedInner(Array, Dictionary) _testWrongContainerTypeTerminatedInner(Structure, Array) _testWrongContainerTypeTerminatedInner(Structure, Dictionary) _testWrongContainerTypeTerminatedInner(Dictionary, Array) _testWrongContainerTypeTerminatedInner(Dictionary, Structure) #undef _testWrongContainerTypeTerminatedOuter #undef _testWrongContainerTypeTerminatedInner // Container underflow context = JSONSerializationContext_create(); call_virtual(beginArray, context, "key"); call_virtual(endArray, context); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); context = JSONSerializationContext_create(); call_virtual(beginStructure, context, "key"); call_virtual(endStructure, context); call_virtual(endStructure, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); context = JSONSerializationContext_create(); call_virtual(beginDictionary, context, "key"); call_virtual(endDictionary, context); call_virtual(endDictionary, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); // Second top-level container started context = JSONSerializationContext_create(); call_virtual(beginArray, context, "key"); call_virtual(endArray, context); call_virtual(beginArray, context, "key"); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); context = JSONSerializationContext_create(); call_virtual(beginStructure, context, "key"); call_virtual(endStructure, context); call_virtual(beginStructure, context, "key"); call_virtual(endStructure, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); context = JSONSerializationContext_create(); call_virtual(beginDictionary, context, "key"); call_virtual(endDictionary, context); call_virtual(beginDictionary, context, "key"); call_virtual(endDictionary, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); // Bit set in bitfield but list terminated before naming bit context = JSONSerializationContext_create(); call_virtual(beginArray, context, "key"); call_virtual(writeBitfield8, context, "item", 0x01, 0, NULL); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); context = JSONSerializationContext_create(); call_virtual(beginArray, context, "key"); Serialization_bitName bitName = {"bit0", 0}; call_virtual(writeBitfield16, context, "item", 0x0002, 1, &bitName); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); context = JSONSerializationContext_create(); call_virtual(beginArray, context, "key"); Serialization_bitName bitNames1[] = {{"bit0", 0}, {"bit1", 1}}; call_virtual(writeBitfield32, context, "item", 0x00000004, 2, bitNames1); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); context = JSONSerializationContext_create(); call_virtual(beginArray, context, "key"); Serialization_bitName bitNames2[] = {{"bit0", 0}, {"bit1", 1}, {"bit2", 2}}; call_virtual(writeBitfield64, context, "item", 0x0000000000000008ull, 3, bitNames2); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); // Bit names duplicated context = JSONSerializationContext_create(); call_virtual(beginArray, context, "key"); Serialization_bitName bitNames3[] = {{"bit0", 0}, {"bit0", 1}}; call_virtual(writeBitfield8, context, "item", 0x00, 2, bitNames3); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); context = JSONSerializationContext_create(); call_virtual(beginArray, context, "key"); call_virtual(writeBitfield16, context, "item", 0x0000, 2, bitNames3); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); context = JSONSerializationContext_create(); call_virtual(beginArray, context, "key"); call_virtual(writeBitfield32, context, "item", 0x00000000, 2, bitNames3); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); context = JSONSerializationContext_create(); call_virtual(beginArray, context, "key"); call_virtual(writeBitfield64, context, "item", 0x0000000000000000ull, 2, bitNames3); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); // Enum value not listed in args context = JSONSerializationContext_create(); call_virtual(beginArray, context, "key"); Serialization_enumKeyValue unlistedEnumValue = {"enum", 1}; call_virtual(writeEnumeration, context, "item", 0, 1, &unlistedEnumValue); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); // Duplicate enum values context = JSONSerializationContext_create(); call_virtual(beginArray, context, "key"); Serialization_enumKeyValue duplicateEnumValues[] = {{"enum0", 0}, {"enum1", 0}}; call_virtual(writeEnumeration, context, "item", 0, 2, duplicateEnumValues); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); context = JSONSerializationContext_create(); call_virtual(beginArray, context, "key"); Serialization_enumKeyValue duplicateEnumValues2[] = {{"enum0", 0}, {"enum1", 1}, {"enum2", 1}}; call_virtual(writeEnumeration, context, "item", 0, 3, duplicateEnumValues2); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); // Duplicate enum names context = JSONSerializationContext_create(); call_virtual(beginArray, context, "key"); Serialization_enumKeyValue duplicateEnumNames[] = {{"enum", 0}, {"enum", 1}}; call_virtual(writeEnumeration, context, "item", 0, 2, duplicateEnumNames); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); context = JSONSerializationContext_create(); call_virtual(beginArray, context, "key"); Serialization_enumKeyValue duplicateEnumNames2[] = {{"enum0", 0}, {"enum1", 1}, {"enum1", 2}}; call_virtual(writeEnumeration, context, "item", 0, 3, duplicateEnumNames2); call_virtual(endArray, context); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); call_virtual(dispose, context); #define _testNullObjectKey(CONTAINER, FUNCTION, ...) \ context = JSONSerializationContext_create(); \ call_virtual(begin##CONTAINER, context, "key"); \ call_virtual(FUNCTION, context, NULL, __VA_ARGS__); \ call_virtual(end##CONTAINER, context); \ node = JSONSerializationContext_writeToJSONNode(context); \ TestCase_assert(node == NULL, "Expected NULL but got %p", node); \ call_virtual(dispose, context); #define _testNullObjectKeyNoArgs(CONTAINER, FUNCTION, ...) \ context = JSONSerializationContext_create(); \ call_virtual(begin##CONTAINER, context, "key"); \ call_virtual(FUNCTION, context, NULL); \ call_virtual(end##CONTAINER, context); \ node = JSONSerializationContext_writeToJSONNode(context); \ TestCase_assert(node == NULL, "Expected NULL but got %p", node); \ call_virtual(dispose, context); Serialization_enumKeyValue enumValue = {"enum", 0}; // Null structure key _testNullObjectKeyNoArgs(Structure, beginArray) _testNullObjectKeyNoArgs(Structure, beginStructure) _testNullObjectKeyNoArgs(Structure, beginDictionary) _testNullObjectKey(Structure, writeInt8, 0) _testNullObjectKey(Structure, writeUInt8, 0) _testNullObjectKey(Structure, writeInt16, 0) _testNullObjectKey(Structure, writeUInt16, 0) _testNullObjectKey(Structure, writeInt32, 0) _testNullObjectKey(Structure, writeUInt32, 0) _testNullObjectKey(Structure, writeInt64, 0) _testNullObjectKey(Structure, writeUInt64, 0) _testNullObjectKey(Structure, writeFloat, 0) _testNullObjectKey(Structure, writeDouble, 0) _testNullObjectKey(Structure, writeFixed16_16, 0) _testNullObjectKey(Structure, writeString, "") _testNullObjectKey(Structure, writeStringNullable, NULL) _testNullObjectKey(Structure, writeBoolean, false) _testNullObjectKey(Structure, writeEnumeration, 0, 1, &enumValue) _testNullObjectKey(Structure, writeBitfield8, 0, 0, NULL) _testNullObjectKey(Structure, writeBitfield16, 0, 0, NULL) _testNullObjectKey(Structure, writeBitfield32, 0, 0, NULL) _testNullObjectKey(Structure, writeBitfield64, 0, 0, NULL) // Null dictionary key _testNullObjectKeyNoArgs(Dictionary, beginArray) _testNullObjectKeyNoArgs(Dictionary, beginStructure) _testNullObjectKeyNoArgs(Dictionary, beginDictionary) _testNullObjectKey(Dictionary, writeInt8, 0) _testNullObjectKey(Dictionary, writeUInt8, 0) _testNullObjectKey(Dictionary, writeInt16, 0) _testNullObjectKey(Dictionary, writeUInt16, 0) _testNullObjectKey(Dictionary, writeInt32, 0) _testNullObjectKey(Dictionary, writeUInt32, 0) _testNullObjectKey(Dictionary, writeInt64, 0) _testNullObjectKey(Dictionary, writeUInt64, 0) _testNullObjectKey(Dictionary, writeFloat, 0) _testNullObjectKey(Dictionary, writeDouble, 0) _testNullObjectKey(Dictionary, writeFixed16_16, 0) _testNullObjectKey(Dictionary, writeString, "") _testNullObjectKey(Dictionary, writeStringNullable, NULL) _testNullObjectKey(Dictionary, writeBoolean, false) _testNullObjectKey(Dictionary, writeEnumeration, 0, 1, &enumValue) _testNullObjectKey(Dictionary, writeBitfield8, 0, 0, NULL) _testNullObjectKey(Dictionary, writeBitfield16, 0, 0, NULL) _testNullObjectKey(Dictionary, writeBitfield32, 0, 0, NULL) _testNullObjectKey(Dictionary, writeBitfield64, 0, 0, NULL) #undef _testNullObjectKey #undef _testNullObjectKeyNoArgs } static void testErrorReporting() { JSONSerializationContext * context; struct JSONNode * node; const char * tempFilePath; int fd; bool success; char * string; jmp_buf jmpBuf; int status; context = JSONSerializationContext_create(); TestCase_assert(context->status == SERIALIZATION_ERROR_OK, "Expected %d but got %d", SERIALIZATION_ERROR_OK, context->status); node = JSONSerializationContext_writeToJSONNode(context); TestCase_assert(node == NULL, "Expected NULL but got %p", node); TestCase_assert(context->status == SERIALIZATION_ERROR_NO_TOP_LEVEL_CONTAINER, "Expected %d but got %d", SERIALIZATION_ERROR_NO_TOP_LEVEL_CONTAINER, context->status); call_virtual(dispose, context); context = JSONSerializationContext_create(); TestCase_assert(context->status == SERIALIZATION_ERROR_OK, "Expected %d but got %d", SERIALIZATION_ERROR_OK, context->status); string = JSONSerializationContext_writeToString(context, JSONEmitterFormat_compact, NULL, NULL); TestCase_assert(string == NULL, "Expected NULL but got %p", string); TestCase_assert(context->status == SERIALIZATION_ERROR_NO_TOP_LEVEL_CONTAINER, "Expected %d but got %d", SERIALIZATION_ERROR_NO_TOP_LEVEL_CONTAINER, context->status); call_virtual(dispose, context); context = JSONSerializationContext_create(); TestCase_assert(context->status == SERIALIZATION_ERROR_OK, "Expected %d but got %d", SERIALIZATION_ERROR_OK, context->status); tempFilePath = temporaryFilePath("tmpXXXXXX", &fd); success = JSONSerializationContext_writeToFile(context, JSONEmitterFormat_compact, tempFilePath, NULL); close(fd); unlink(tempFilePath); TestCase_assert(!success, "Expected false but got true"); TestCase_assert(context->status == SERIALIZATION_ERROR_NO_TOP_LEVEL_CONTAINER, "Expected %d but got %d", SERIALIZATION_ERROR_NO_TOP_LEVEL_CONTAINER, context->status); call_virtual(dispose, context); #define _testFailure(ERROR_STATUS, PREAMBLE_CODE, FAIL_CODE) \ context = JSONSerializationContext_create(); \ PREAMBLE_CODE \ TestCase_assert(context->status == SERIALIZATION_ERROR_OK, "Expected %d but got %d (OK)", SERIALIZATION_ERROR_OK, context->status); \ FAIL_CODE \ TestCase_assert(context->status == ERROR_STATUS, "Expected %d but got %d (context->status)", ERROR_STATUS, context->status); \ call_virtual(dispose, context); \ \ context = JSONSerializationContext_create(); \ context->jmpBuf = &jmpBuf; \ status = setjmp(jmpBuf); \ if (!status) { \ PREAMBLE_CODE \ TestCase_assert(context->status == SERIALIZATION_ERROR_OK, "Expected %d but got %d (OK setjmp)", SERIALIZATION_ERROR_OK, context->status); \ FAIL_CODE \ } \ TestCase_assert(status == ERROR_STATUS, "Expected %d but got %d (status setjmp)", ERROR_STATUS, status); \ TestCase_assert(context->status == ERROR_STATUS, "Expected %d but got %d (context->status setjmp)", ERROR_STATUS, context->status); \ call_virtual(dispose, context); Serialization_enumKeyValue enumValue = {"", 0}; _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeInt8, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeUInt8, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeInt16, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeUInt16, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeInt32, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeUInt32, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeInt64, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeUInt64, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeFloat, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeDouble, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeFixed16_16, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeString, context, "key", "");) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeStringNullable, context, "key", NULL);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeBoolean, context, "key", false);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeEnumeration, context, "key", 0, 1, &enumValue);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeBitfield8, context, "key", 0, 0, NULL);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeBitfield16, context, "key", 0, 0, NULL);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeBitfield32, context, "key", 0, 0, NULL);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, , call_virtual(writeBitfield64, context, "key", 0, 0, NULL);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeInt8, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeUInt8, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeInt16, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeUInt16, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeInt32, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeUInt32, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeInt64, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeUInt64, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeFloat, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeDouble, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeFixed16_16, context, "key", 0);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeString, context, "key", "");) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeStringNullable, context, "key", NULL);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeBoolean, context, "key", false);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeEnumeration, context, "key", 0, 1, &enumValue);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeBitfield8, context, "key", 0, 0, NULL);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeBitfield16, context, "key", 0, 0, NULL);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeBitfield32, context, "key", 0, 0, NULL);) _testFailure(SERIALIZATION_ERROR_NO_CONTAINER_STARTED, call_virtual(beginArray, context, ""); call_virtual(endArray, context);, call_virtual(writeBitfield64, context, "key", 0, 0, NULL);) _testFailure(SERIALIZATION_ERROR_CONTAINER_TYPE_MISMATCH, call_virtual(beginArray, context, "key");, call_virtual(endStructure, context);) _testFailure(SERIALIZATION_ERROR_CONTAINER_TYPE_MISMATCH, call_virtual(beginArray, context, "key"); call_virtual(beginArray, context, "key");, call_virtual(endStructure, context);) _testFailure(SERIALIZATION_ERROR_CONTAINER_TYPE_MISMATCH, call_virtual(beginArray, context, "key");, call_virtual(endDictionary, context);) _testFailure(SERIALIZATION_ERROR_CONTAINER_TYPE_MISMATCH, call_virtual(beginArray, context, "key"); call_virtual(beginArray, context, "key");, call_virtual(endDictionary, context);) _testFailure(SERIALIZATION_ERROR_CONTAINER_TYPE_MISMATCH, call_virtual(beginStructure, context, "key");, call_virtual(endArray, context);) _testFailure(SERIALIZATION_ERROR_CONTAINER_TYPE_MISMATCH, call_virtual(beginStructure, context, "key"); call_virtual(beginStructure, context, "key");, call_virtual(endArray, context);) _testFailure(SERIALIZATION_ERROR_CONTAINER_TYPE_MISMATCH, call_virtual(beginStructure, context, "key");, call_virtual(endDictionary, context);) _testFailure(SERIALIZATION_ERROR_CONTAINER_TYPE_MISMATCH, call_virtual(beginStructure, context, "key"); call_virtual(beginStructure, context, "key");, call_virtual(endDictionary, context);) _testFailure(SERIALIZATION_ERROR_CONTAINER_TYPE_MISMATCH, call_virtual(beginDictionary, context, "key");, call_virtual(endArray, context);) _testFailure(SERIALIZATION_ERROR_CONTAINER_TYPE_MISMATCH, call_virtual(beginDictionary, context, "key"); call_virtual(beginDictionary, context, "key");, call_virtual(endArray, context);) _testFailure(SERIALIZATION_ERROR_CONTAINER_TYPE_MISMATCH, call_virtual(beginDictionary, context, "key");, call_virtual(endStructure, context);) _testFailure(SERIALIZATION_ERROR_CONTAINER_TYPE_MISMATCH, call_virtual(beginDictionary, context, "key"); call_virtual(beginDictionary, context, "key");, call_virtual(endStructure, context);) _testFailure(SERIALIZATION_ERROR_CONTAINER_UNDERFLOW, , call_virtual(endArray, context);) _testFailure(SERIALIZATION_ERROR_CONTAINER_UNDERFLOW, , call_virtual(endDictionary, context);) _testFailure(SERIALIZATION_ERROR_CONTAINER_UNDERFLOW, , call_virtual(endStructure, context);) _testFailure(SERIALIZATION_ERROR_MULTIPLE_TOP_LEVEL_CONTAINERS, call_virtual(beginArray, context, "key"); call_virtual(endArray, context);, call_virtual(beginArray, context, "key");) _testFailure(SERIALIZATION_ERROR_MULTIPLE_TOP_LEVEL_CONTAINERS, call_virtual(beginStructure, context, "key"); call_virtual(endStructure, context);, call_virtual(beginStructure, context, "key");) _testFailure(SERIALIZATION_ERROR_MULTIPLE_TOP_LEVEL_CONTAINERS, call_virtual(beginDictionary, context, "key"); call_virtual(endDictionary, context);, call_virtual(beginDictionary, context, "key");) Serialization_bitName bitNames[] = {{"bit0", 0}, {"bit1", 1}, {"bit2", 2}}; _testFailure(SERIALIZATION_ERROR_UNNAMED_BIT, call_virtual(beginArray, context, "key");, call_virtual(writeBitfield8, context, "key", 0x08, 3, bitNames);) _testFailure(SERIALIZATION_ERROR_UNNAMED_BIT, call_virtual(beginArray, context, "key");, call_virtual(writeBitfield16, context, "key", 0x0004, 2, bitNames);) _testFailure(SERIALIZATION_ERROR_UNNAMED_BIT, call_virtual(beginArray, context, "key");, call_virtual(writeBitfield32, context, "key", 0x00000002, 1, bitNames);) _testFailure(SERIALIZATION_ERROR_UNNAMED_BIT, call_virtual(beginArray, context, "key");, call_virtual(writeBitfield64, context, "key", 0x0000000000000001ull, 0, NULL);) Serialization_bitName bitNamesWithDuplicate1[] = {{"bit0", 0}, {"bit0", 1}, {"bit1", 2}}; _testFailure(SERIALIZATION_ERROR_DUPLICATE_BIT, call_virtual(beginArray, context, "key");, call_virtual(writeBitfield8, context, "key", 0, 3, bitNamesWithDuplicate1);) Serialization_bitName bitNamesWithDuplicate2[] = {{"bit0", 0}, {"bit1", 1}, {"bit1", 2}}; _testFailure(SERIALIZATION_ERROR_DUPLICATE_BIT, call_virtual(beginArray, context, "key");, call_virtual(writeBitfield16, context, "key", 0, 3, bitNamesWithDuplicate2);) _testFailure(SERIALIZATION_ERROR_DUPLICATE_BIT, call_virtual(beginArray, context, "key");, call_virtual(writeBitfield32, context, "key", 0, 3, bitNamesWithDuplicate2);) _testFailure(SERIALIZATION_ERROR_DUPLICATE_BIT, call_virtual(beginArray, context, "key");, call_virtual(writeBitfield64, context, "key", 0, 2, bitNamesWithDuplicate1);) Serialization_enumKeyValue unnamedEnum = {"", 1}; _testFailure(SERIALIZATION_ERROR_ENUM_NOT_NAMED, call_virtual(beginArray, context, "key");, call_virtual(writeEnumeration, context, "key", 0, 1, &unnamedEnum);) Serialization_enumKeyValue duplicateEnumValues[] = {{"enum0", 0}, {"enum1", 0}}; _testFailure(SERIALIZATION_ERROR_DUPLICATE_ENUM_VALUE, call_virtual(beginArray, context, "key");, call_virtual(writeEnumeration, context, "key", 0, 2, duplicateEnumValues);) Serialization_enumKeyValue duplicateEnumNames[] = {{"enum0", 0}, {"enum0", 1}}; _testFailure(SERIALIZATION_ERROR_DUPLICATE_ENUM_NAME, call_virtual(beginArray, context, "key");, call_virtual(writeEnumeration, context, "key", 0, 2, duplicateEnumNames);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeInt8, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeUInt8, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeInt16, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeUInt16, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeInt32, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeUInt32, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeInt64, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeUInt64, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeFloat, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeDouble, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeFixed16_16, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeString, context, NULL, "");) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeStringNullable, context, NULL, NULL);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeBoolean, context, NULL, false);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeEnumeration, context, NULL, 0, 1, &enumValue);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeBitfield8, context, NULL, 0, 0, NULL);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeBitfield16, context, NULL, 0, 0, NULL);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeBitfield32, context, NULL, 0, 0, NULL);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginDictionary, context, "key");, call_virtual(writeBitfield64, context, NULL, 0, 0, NULL);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeInt8, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeUInt8, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeInt16, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeUInt16, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeInt32, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeUInt32, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeInt64, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeUInt64, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeFloat, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeDouble, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeFixed16_16, context, NULL, 0);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeString, context, NULL, "");) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeStringNullable, context, NULL, NULL);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeBoolean, context, NULL, false);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeEnumeration, context, NULL, 0, 1, &enumValue);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeBitfield8, context, NULL, 0, 0, NULL);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeBitfield16, context, NULL, 0, 0, NULL);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeBitfield32, context, NULL, 0, 0, NULL);) _testFailure(SERIALIZATION_ERROR_NULL_KEY, call_virtual(beginStructure, context, "key");, call_virtual(writeBitfield64, context, NULL, 0, 0, NULL);) #define _testFailureDuplicateStructureKey(FAIL_WRITE_CALL) \ _testFailure(JSON_SERIALIZATION_ERROR_DUPLICATE_STRUCTURE_KEY, \ call_virtual(beginStructure, context, "key"); \ call_virtual(writeBoolean, context, "key", false);, \ FAIL_WRITE_CALL;) \ _testFailure(JSON_SERIALIZATION_ERROR_DUPLICATE_STRUCTURE_KEY, \ call_virtual(beginStructure, context, "key"); \ call_virtual(writeBoolean, context, "key", false); \ call_virtual(writeBoolean, context, "key2", true);, \ FAIL_WRITE_CALL;) \ _testFailure(JSON_SERIALIZATION_ERROR_DUPLICATE_STRUCTURE_KEY, \ call_virtual(beginStructure, context, "key"); \ call_virtual(writeBoolean, context, "key2", false); \ call_virtual(writeBoolean, context, "key", true);, \ FAIL_WRITE_CALL;) _testFailureDuplicateStructureKey(call_virtual(writeInt8, context, "key", 0)) _testFailureDuplicateStructureKey(call_virtual(writeUInt8, context, "key", 0)) _testFailureDuplicateStructureKey(call_virtual(writeInt16, context, "key", 0)) _testFailureDuplicateStructureKey(call_virtual(writeUInt16, context, "key", 0)) _testFailureDuplicateStructureKey(call_virtual(writeInt32, context, "key", 0)) _testFailureDuplicateStructureKey(call_virtual(writeUInt32, context, "key", 0)) _testFailureDuplicateStructureKey(call_virtual(writeInt64, context, "key", 0)) _testFailureDuplicateStructureKey(call_virtual(writeUInt64, context, "key", 0)) _testFailureDuplicateStructureKey(call_virtual(writeFloat, context, "key", 0)) _testFailureDuplicateStructureKey(call_virtual(writeDouble, context, "key", 0)) _testFailureDuplicateStructureKey(call_virtual(writeFixed16_16, context, "key", 0)) _testFailureDuplicateStructureKey(call_virtual(writeString, context, "key", "")) _testFailureDuplicateStructureKey(call_virtual(writeStringNullable, context, "key", NULL)) _testFailureDuplicateStructureKey(call_virtual(writeBoolean, context, "key", false)) _testFailureDuplicateStructureKey(call_virtual(writeEnumeration, context, "key", 0, 1, &enumValue)) _testFailureDuplicateStructureKey(call_virtual(writeBitfield8, context, "key", 0, 0, NULL)) _testFailureDuplicateStructureKey(call_virtual(writeBitfield16, context, "key", 0, 0, NULL)) _testFailureDuplicateStructureKey(call_virtual(writeBitfield32, context, "key", 0, 0, NULL)) _testFailureDuplicateStructureKey(call_virtual(writeBitfield64, context, "key", 0, 0, NULL)) #undef _testFailureDuplicateStructureKey #undef _testFailure } static void testThatNodeIsCopiedWhenRequestedMultipleTimes() { JSONSerializationContext * context; struct JSONNode * node1, * node2; char * string1, * string2; Serialization_enumKeyValue enumValue = {"enum", 12}; Serialization_bitName bitName8 = {"13", 0}; Serialization_bitName bitName16 = {"14", 0}; Serialization_bitName bitName32 = {"15", 0}; Serialization_bitName bitName64 = {"16", 0}; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginArray, context, "key"); call_virtual(beginStructure, context, "item"); call_virtual(writeInt8, context, "item", 0); call_virtual(endStructure, context); call_virtual(beginArray, context, "item"); call_virtual(writeUInt8, context, "item", 1); call_virtual(beginDictionary, context, "item"); call_virtual(writeInt16, context, "item", 2); call_virtual(writeUInt16, context, "item", 3); call_virtual(writeInt32, context, "item", 4); call_virtual(writeUInt32, context, "item", 5); call_virtual(writeInt64, context, "item", 6); call_virtual(writeUInt64, context, "item", 7); call_virtual(endDictionary, context); call_virtual(writeFloat, context, "item", 8); call_virtual(writeDouble, context, "item", 9); call_virtual(writeString, context, "item", "10"); call_virtual(writeBoolean, context, "item", true); call_virtual(writeEnumeration, context, "item", 12, 1, &enumValue); call_virtual(writeBitfield8, context, "item", 1, 1, &bitName8); call_virtual(writeBitfield16, context, "item", 1, 1, &bitName16); call_virtual(writeBitfield32, context, "item", 1, 1, &bitName32); call_virtual(writeBitfield64, context, "item", 1, 1, &bitName64); call_virtual(writeFixed16_16, context, "item", 0xA0000); call_virtual(endArray, context); call_virtual(endArray, context); node1 = JSONSerializationContext_writeToJSONNode(context); node2 = JSONSerializationContext_writeToJSONNode(context); call_virtual(dispose, context); TestCase_assert(node1 != NULL, "Expected non-NULL but got NULL"); if (node1 == NULL) {return;} // Suppress clang warning TestCase_assert(node2 != NULL, "Expected non-NULL but got NULL"); if (node2 == NULL) {return;} // Suppress clang warning TestCase_assert(node1 != node2, "Pointers expected to differ, but didn't"); string1 = JSONEmitter_writeString(node1, JSONEmitterFormat_compact, NULL, NULL); TestCase_assert(string1 != NULL, "Expected non-NULL but got NULL"); string2 = JSONEmitter_writeString(node2, JSONEmitterFormat_compact, NULL, NULL); TestCase_assert(string2 != NULL, "Expected non-NULL but got NULL"); TestCase_assert(!strcmp(string1, string2), "Strings didn't match:\n %s\n %s", string1, string2); free(string1); free(string2); TestCase_assert(node1->subitems != node2->subitems, "Pointers expected to differ, but didn't"); TestCase_assert(node1->subitems[0].subitems != node2->subitems[0].subitems, "Pointers expected to differ, but didn't"); TestCase_assert(node1->subitems[0].subitems[0].key != node2->subitems[0].subitems[0].key, "Pointers expected to differ, but didn't"); TestCase_assert(node1->subitems[1].subitems != node2->subitems[1].subitems, "Pointers expected to differ, but didn't"); TestCase_assert(node1->subitems[1].subitems[1].subitems != node2->subitems[1].subitems[1].subitems, "Pointers expected to differ, but didn't"); TestCase_assert(node1->subitems[1].subitems[1].subitems[0].key != node2->subitems[1].subitems[1].subitems[0].key, "Pointers expected to differ, but didn't"); TestCase_assert(node1->subitems[1].subitems[1].subitems[1].key != node2->subitems[1].subitems[1].subitems[1].key, "Pointers expected to differ, but didn't"); TestCase_assert(node1->subitems[1].subitems[1].subitems[2].key != node2->subitems[1].subitems[1].subitems[2].key, "Pointers expected to differ, but didn't"); TestCase_assert(node1->subitems[1].subitems[1].subitems[3].key != node2->subitems[1].subitems[1].subitems[3].key, "Pointers expected to differ, but didn't"); TestCase_assert(node1->subitems[1].subitems[1].subitems[4].key != node2->subitems[1].subitems[1].subitems[4].key, "Pointers expected to differ, but didn't"); TestCase_assert(node1->subitems[1].subitems[1].subitems[5].key != node2->subitems[1].subitems[1].subitems[5].key, "Pointers expected to differ, but didn't"); TestCase_assert(node1->subitems[1].subitems[4].value.string != node2->subitems[1].subitems[4].value.string, "Pointers expected to differ, but didn't"); TestCase_assert(node1->subitems[1].subitems[6].value.string != node2->subitems[1].subitems[6].value.string, "Pointers expected to differ, but didn't"); TestCase_assert(node1->subitems[1].subitems[7].subitems[0].value.string != node2->subitems[1].subitems[7].subitems[0].value.string, "Pointers expected to differ, but didn't"); TestCase_assert(node1->subitems[1].subitems[8].subitems[0].value.string != node2->subitems[1].subitems[8].subitems[0].value.string, "Pointers expected to differ, but didn't"); TestCase_assert(node1->subitems[1].subitems[9].subitems[0].value.string != node2->subitems[1].subitems[9].subitems[0].value.string, "Pointers expected to differ, but didn't"); TestCase_assert(node1->subitems[1].subitems[10].subitems[0].value.string != node2->subitems[1].subitems[10].subitems[0].value.string, "Pointers expected to differ, but didn't"); TestCase_assert(node1->subitems[1].subitems[11].value.string != node2->subitems[1].subitems[11].value.string, "Pointers expected to differ, but didn't"); JSONNode_dispose(node1); JSONNode_dispose(node2); } static void testDuplicateKeysAllowedInDictionariesAfterWritingStructures() { JSONSerializationContext * context; context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginDictionary, context, ""); call_virtual(beginStructure, context, "a"); call_virtual(endStructure, context); call_virtual(beginStructure, context, "a"); call_virtual(endStructure, context); call_virtual(endDictionary, context); TestCase_assert(context->status == SERIALIZATION_ERROR_OK, "Expected %d but got %d", SERIALIZATION_ERROR_OK, context->status); call_virtual(dispose, context); context = JSONSerializationContext_create(); TestCase_assert(context != NULL, "Expected non-NULL but got NULL"); if (context == NULL) {return;} // Suppress clang warning call_virtual(beginDictionary, context, ""); call_virtual(beginDictionary, context, ""); call_virtual(beginStructure, context, "a"); call_virtual(endStructure, context); call_virtual(beginStructure, context, "a"); call_virtual(endStructure, context); call_virtual(endDictionary, context); call_virtual(endDictionary, context); TestCase_assert(context->status == SERIALIZATION_ERROR_OK, "Expected %d but got %d", SERIALIZATION_ERROR_OK, context->status); call_virtual(dispose, context); } TEST_SUITE(JSONSerializationContextTest, testInit, testTopLevelContainers, testNumberValues, testLargeIntegerRepresentability, testStringValues, testBlobValues, testBooleanValues, testEnumerations, testBitfields, testArrays, testStructures, testDictionaries, testMixedContainers, testWriteToString, testWriteToFile, testInvalidOperations, testErrorReporting, testThatNodeIsCopiedWhenRequestedMultipleTimes, testDuplicateKeysAllowedInDictionariesAfterWritingStructures)