#include "dynamictypes/DataArray.h" #include "dynamictypes/DataAssociativeArray.h" #include "dynamictypes/DataHashTable.h" #include "dynamictypes/DataSerializer.h" #include "dynamictypes/DataValue.h" #include "serialization/TestDeserializationContext.h" #include "serialization/TestSerializationContext.h" #include "unittest/TestSuite.h" #include "utilities/printfFormats.h" #define enumKV(value) {#value, value} static Serialization_enumKeyValue dataTypeEnumValues[] = { enumKV(DATA_TYPE_BOOLEAN), enumKV(DATA_TYPE_INT8), enumKV(DATA_TYPE_UINT8), enumKV(DATA_TYPE_INT16), enumKV(DATA_TYPE_UINT16), enumKV(DATA_TYPE_INT32), enumKV(DATA_TYPE_UINT32), enumKV(DATA_TYPE_INT64), enumKV(DATA_TYPE_UINT64), enumKV(DATA_TYPE_FLOAT), enumKV(DATA_TYPE_DOUBLE), enumKV(DATA_TYPE_STRING), enumKV(DATA_TYPE_BLOB), enumKV(DATA_TYPE_HASH_TABLE), enumKV(DATA_TYPE_ARRAY), enumKV(DATA_TYPE_ASSOCIATIVE_ARRAY), enumKV(DATA_TYPE_FIXED_16_16) }; static void testSerializeGeneric() { DataValue value; TestSerializationContext * context; jmp_buf jmpEnv; const char ** keys; size_t keyCount, keyIndex; context = TestSerializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } value = valueCreateArray(arrayCreateWithValues( valueCreateBoolean(false), valueCreateBoolean(true), valueCreateInt8(0), valueCreateInt8(1), valueCreateUInt8(0), valueCreateUInt8(1), valueCreateInt16(0), valueCreateInt16(1), valueCreateUInt16(0), valueCreateUInt16(1), valueCreateInt32(0), valueCreateInt32(1), valueCreateUInt32(0), valueCreateUInt32(1), valueCreateInt64(0), valueCreateInt64(1), valueCreateUInt64(0), valueCreateUInt64(1), valueCreateFloat(0.0f), valueCreateFloat(1.0f), valueCreateDouble(0.0), valueCreateDouble(1.0), valueCreateFixed16_16(0x00000), valueCreateFixed16_16(0x10000), valueCreateString("a", DATA_USE_STRLEN, false, false), valueCreateString("foo", DATA_USE_STRLEN, false, false), valueCreateBlob("a", 1, false, false), valueCreateBlob("foo", 3, false, false) ), true, false); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "data"); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "array"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, false); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, true); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt8, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt8, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt8, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt8, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt16, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt16, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt16, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt16, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt32, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt32, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt32, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt32, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt64, NULL, 0ll); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt64, NULL, 1ll); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt64, NULL, 0ull); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt64, NULL, 1ull); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_FLOAT, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeFloat, NULL, 0.0f); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_FLOAT, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeFloat, NULL, 1.0f); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_DOUBLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeDouble, NULL, 0.0); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_DOUBLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeDouble, NULL, 1.0); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_FIXED_16_16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeFixed16_16, NULL, 0x00000); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_FIXED_16_16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeFixed16_16, NULL, 0x10000); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_STRING, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "a"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_STRING, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "foo"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BLOB, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBlob, NULL, "a", 1); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BLOB, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBlob, NULL, "foo", 3); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); DataValue_serializeGeneric(&value, (SerializationContext *) context); TestSerializationContext_finish(context); TestSerializationContext_dispose(context); valueDispose(&value); context = TestSerializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } value = valueCreateHashTable(hashCreateWithKeysAndValues( "bool_0", valueCreateBoolean(false), "bool_1", valueCreateBoolean(true), "int8_0", valueCreateInt8(0), "int8_1", valueCreateInt8(1), "uint8_0", valueCreateUInt8(0), "uint8_1", valueCreateUInt8(1), "int16_0", valueCreateInt16(0), "int16_1", valueCreateInt16(1), "uint16_0", valueCreateUInt16(0), "uint16_1", valueCreateUInt16(1), "int32_0", valueCreateInt32(0), "int32_1", valueCreateInt32(1), "uint32_0", valueCreateUInt32(0), "uint32_1", valueCreateUInt32(1), "int64_0", valueCreateInt64(0), "int64_1", valueCreateInt64(1), "uint64_0", valueCreateUInt64(0), "uint64_1", valueCreateUInt64(1), "float_0", valueCreateFloat(0.0f), "float_1", valueCreateFloat(1.0f), "double_0", valueCreateDouble(0.0), "double_1", valueCreateDouble(1.0), "fixed_0", valueCreateFixed16_16(0x00000), "fixed_1", valueCreateFixed16_16(0x10000), "string_a", valueCreateString("a", DATA_USE_STRLEN, false, false), "string_foo", valueCreateString("foo", DATA_USE_STRLEN, false, false), "blob_a", valueCreateBlob("a", 1, false, false), "blob_foo", valueCreateBlob("foo", 3, false, false), NULL), true, false); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "data"); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "structure"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); keys = hashGetKeys(value.value.hashTable, &keyCount); for (keyIndex = 0; keyIndex < keyCount; keyIndex++) { if (!strcmp(keys[keyIndex], "bool_0")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "bool_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, false); } else if (!strcmp(keys[keyIndex], "bool_1")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "bool_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, true); } else if (!strcmp(keys[keyIndex], "int8_0")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int8_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt8, NULL, 0); } else if (!strcmp(keys[keyIndex], "int8_1")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int8_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt8, NULL, 1); } else if (!strcmp(keys[keyIndex], "uint8_0")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "uint8_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt8, NULL, 0); } else if (!strcmp(keys[keyIndex], "uint8_1")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "uint8_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt8, NULL, 1); } else if (!strcmp(keys[keyIndex], "int16_0")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int16_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt16, NULL, 0); } else if (!strcmp(keys[keyIndex], "int16_1")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int16_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt16, NULL, 1); } else if (!strcmp(keys[keyIndex], "uint16_0")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "uint16_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt16, NULL, 0); } else if (!strcmp(keys[keyIndex], "uint16_1")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "uint16_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt16, NULL, 1); } else if (!strcmp(keys[keyIndex], "int32_0")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int32_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt32, NULL, 0); } else if (!strcmp(keys[keyIndex], "int32_1")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int32_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt32, NULL, 1); } else if (!strcmp(keys[keyIndex], "uint32_0")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "uint32_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt32, NULL, 0); } else if (!strcmp(keys[keyIndex], "uint32_1")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "uint32_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt32, NULL, 1); } else if (!strcmp(keys[keyIndex], "int64_0")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int64_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt64, NULL, 0ll); } else if (!strcmp(keys[keyIndex], "int64_1")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int64_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt64, NULL, 1ll); } else if (!strcmp(keys[keyIndex], "uint64_0")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "uint64_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt64, NULL, 0ull); } else if (!strcmp(keys[keyIndex], "uint64_1")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "uint64_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt64, NULL, 1ull); } else if (!strcmp(keys[keyIndex], "float_0")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "float_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_FLOAT, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeFloat, NULL, 0.0f); } else if (!strcmp(keys[keyIndex], "float_1")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "float_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_FLOAT, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeFloat, NULL, 1.0f); } else if (!strcmp(keys[keyIndex], "double_0")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "double_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_DOUBLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeDouble, NULL, 0.0); } else if (!strcmp(keys[keyIndex], "double_1")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "double_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_DOUBLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeDouble, NULL, 1.0); } else if (!strcmp(keys[keyIndex], "fixed_0")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "fixed_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_FIXED_16_16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeFixed16_16, NULL, 0x00000); } else if (!strcmp(keys[keyIndex], "fixed_1")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "fixed_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_FIXED_16_16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeFixed16_16, NULL, 0x10000); } else if (!strcmp(keys[keyIndex], "string_a")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "string_a"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_STRING, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "a"); } else if (!strcmp(keys[keyIndex], "string_foo")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "string_foo"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_STRING, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "foo"); } else if (!strcmp(keys[keyIndex], "blob_a")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "blob_a"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BLOB, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBlob, NULL, "a", 1); } else if (!strcmp(keys[keyIndex], "blob_foo")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "blob_foo"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BLOB, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBlob, NULL, "foo", 3); } } free(keys); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); DataValue_serializeGeneric(&value, (SerializationContext *) context); TestSerializationContext_finish(context); TestSerializationContext_dispose(context); valueDispose(&value); context = TestSerializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } value = valueCreateAssociativeArray(associativeArrayCreateWithKeysAndValues( "bool_0", valueCreateBoolean(false), "bool_1", valueCreateBoolean(true), "int8_0", valueCreateInt8(0), "int8_1", valueCreateInt8(1), "uint8_0", valueCreateUInt8(0), "uint8_1", valueCreateUInt8(1), "int16_0", valueCreateInt16(0), "int16_1", valueCreateInt16(1), "uint16_0", valueCreateUInt16(0), "uint16_1", valueCreateUInt16(1), "int32_0", valueCreateInt32(0), "int32_1", valueCreateInt32(1), "uint32_0", valueCreateUInt32(0), "uint32_1", valueCreateUInt32(1), "int64_0", valueCreateInt64(0), "int64_1", valueCreateInt64(1), "uint64_0", valueCreateUInt64(0), "uint64_1", valueCreateUInt64(1), "float_0", valueCreateFloat(0.0f), "float_1", valueCreateFloat(1.0f), "double_0", valueCreateDouble(0.0), "double_1", valueCreateDouble(1.0), "fixed_0", valueCreateFixed16_16(0x00000), "fixed_1", valueCreateFixed16_16(0x10000), "string_a", valueCreateString("a", DATA_USE_STRLEN, false, false), "string_foo", valueCreateString("foo", DATA_USE_STRLEN, false, false), "blob_a", valueCreateBlob("a", 1, false, false), "blob_foo", valueCreateBlob("foo", 3, false, false), NULL), true, false); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "data"); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "dictionary"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "bool_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, false); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "bool_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, true); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int8_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt8, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int8_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt8, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "uint8_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt8, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "uint8_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt8, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int16_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt16, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int16_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt16, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "uint16_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt16, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "uint16_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt16, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int32_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt32, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int32_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt32, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "uint32_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt32, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "uint32_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt32, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int64_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt64, NULL, 0ll); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int64_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt64, NULL, 1ll); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "uint64_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt64, NULL, 0ull); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "uint64_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_UINT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt64, NULL, 1ull); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "float_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_FLOAT, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeFloat, NULL, 0.0f); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "float_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_FLOAT, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeFloat, NULL, 1.0f); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "double_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_DOUBLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeDouble, NULL, 0.0); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "double_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_DOUBLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeDouble, NULL, 1.0); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "fixed_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_FIXED_16_16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeFixed16_16, NULL, 0x00000); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "fixed_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_FIXED_16_16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeFixed16_16, NULL, 0x10000); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "string_a"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_STRING, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "a"); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "string_foo"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_STRING, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "foo"); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "blob_a"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BLOB, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBlob, NULL, "a", 1); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "blob_foo"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BLOB, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBlob, NULL, "foo", 3); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); DataValue_serializeGeneric(&value, (SerializationContext *) context); TestSerializationContext_finish(context); TestSerializationContext_dispose(context); valueDispose(&value); context = TestSerializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } value = valueCreateArray(arrayCreateWithValues( valueCreateArray(arrayCreateWithValues( valueCreateBoolean(false) ), true, false), valueCreateHashTable(hashCreateWithKeysAndValues( "bool_1", valueCreateBoolean(true), NULL), true, false), valueCreateAssociativeArray(associativeArrayCreateWithKeysAndValues( "int8_0", valueCreateInt8(0), NULL), true, false) ), true, false); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "data"); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "array"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_ARRAY, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, false); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_HASH_TABLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "bool_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, true); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_ASSOCIATIVE_ARRAY, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int8_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt8, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); DataValue_serializeGeneric(&value, (SerializationContext *) context); TestSerializationContext_finish(context); TestSerializationContext_dispose(context); valueDispose(&value); context = TestSerializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } value = valueCreateHashTable(hashCreateWithKeysAndValues( "array", valueCreateArray(arrayCreateWithValues( valueCreateBoolean(false) ), true, false), "hash_table", valueCreateHashTable(hashCreateWithKeysAndValues( "bool_1", valueCreateBoolean(true), NULL), true, false), "associative_array", valueCreateAssociativeArray(associativeArrayCreateWithKeysAndValues( "int8_0", valueCreateInt8(0), NULL), true, false), NULL), true, false); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "data"); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "structure"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); keys = hashGetKeys(value.value.hashTable, &keyCount); for (keyIndex = 0; keyIndex < keyCount; keyIndex++) { if (!strcmp(keys[keyIndex], "array")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "array"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_ARRAY, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, false); call_virtual(expectCall, context, __LINE__, context->vtable->endArray, NULL); } else if (!strcmp(keys[keyIndex], "hash_table")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "hash_table"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_HASH_TABLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "bool_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, true); call_virtual(expectCall, context, __LINE__, context->vtable->endArray, NULL); } else if (!strcmp(keys[keyIndex], "associative_array")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "associative_array"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_ASSOCIATIVE_ARRAY, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int8_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt8, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->endArray, NULL); } } free(keys); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); DataValue_serializeGeneric(&value, (SerializationContext *) context); TestSerializationContext_finish(context); TestSerializationContext_dispose(context); valueDispose(&value); context = TestSerializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } value = valueCreateAssociativeArray(associativeArrayCreateWithKeysAndValues( "array", valueCreateArray(arrayCreateWithValues( valueCreateBoolean(false) ), true, false), "hash_table", valueCreateHashTable(hashCreateWithKeysAndValues( "bool_1", valueCreateBoolean(true), NULL), true, false), "associative_array", valueCreateAssociativeArray(associativeArrayCreateWithKeysAndValues( "int8_0", valueCreateInt8(0), NULL), true, false), NULL), true, false); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "data"); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "dictionary"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "array"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_ARRAY, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, false); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "hash_table"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_HASH_TABLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "bool_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, true); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "associative_array"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_ASSOCIATIVE_ARRAY, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "int8_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeInt8, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); DataValue_serializeGeneric(&value, (SerializationContext *) context); TestSerializationContext_finish(context); TestSerializationContext_dispose(context); valueDispose(&value); context = TestSerializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } value = valueCreateArray(arrayCreateWithValues( valueCreateBoolean(false), valueCreatePointer(NULL), valueCreateBoolean(true) ), true, false); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "data"); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "array"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, false); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, true); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); DataValue_serializeGeneric(&value, (SerializationContext *) context); TestSerializationContext_finish(context); TestSerializationContext_dispose(context); valueDispose(&value); context = TestSerializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } value = valueCreateHashTable(hashCreateWithKeysAndValues( "bool_0", valueCreateBoolean(false), "pointer_0", valueCreatePointer(NULL), "bool_1", valueCreateBoolean(true), NULL), true, false); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "data"); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "structure"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); keys = hashGetKeys(value.value.hashTable, &keyCount); for (keyIndex = 0; keyIndex < keyCount; keyIndex++) { if (!strcmp(keys[keyIndex], "bool_0")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "bool_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, false); } else if (!strcmp(keys[keyIndex], "bool_1")) { call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "bool_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, true); } } free(keys); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); DataValue_serializeGeneric(&value, (SerializationContext *) context); TestSerializationContext_finish(context); TestSerializationContext_dispose(context); valueDispose(&value); context = TestSerializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } value = valueCreateAssociativeArray(associativeArrayCreateWithKeysAndValues( "bool_0", valueCreateBoolean(false), "pointer_0", valueCreatePointer(NULL), "bool_1", valueCreateBoolean(true), NULL), true, false); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "data"); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "dictionary"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "bool_0"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, false); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, NULL, "bool_1"); call_virtual(expectCall, context, __LINE__, context->vtable->writeEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->writeBoolean, NULL, true); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); DataValue_serializeGeneric(&value, (SerializationContext *) context); TestSerializationContext_finish(context); TestSerializationContext_dispose(context); valueDispose(&value); } static void testDeserializeGeneric() { DataValue value, * hashTableValue; TestDeserializationContext * context; jmp_buf jmpEnv; const char ** keys; size_t keyIndex; unsigned int failIndex; context = TestDeserializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "data", 2); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "array"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 56); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBoolean, NULL, false); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBoolean, NULL, true); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt8, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt8, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt8, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt8, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt16, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt16, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt16, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt16, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt32, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt32, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt32, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt32, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt64, NULL, 0ll); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt64, NULL, 1ll); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt64, NULL, 0ull); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt64, NULL, 1ull); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_FLOAT, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readFloat, NULL, 0.0f); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_FLOAT, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readFloat, NULL, 1.0f); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_DOUBLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readDouble, NULL, 0.0); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_DOUBLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readDouble, NULL, 1.0); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_FIXED_16_16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readFixed16_16, NULL, 0x00000); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_FIXED_16_16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readFixed16_16, NULL, 0x10000); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_STRING, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "a"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_STRING, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "foo"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BLOB, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBlob, NULL, "a", 1); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BLOB, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBlob, NULL, "foo", 3); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); value = DataValue_deserializeGeneric((DeserializationContext *) context); TestCase_assert(value.type == DATA_TYPE_ARRAY, "Expected %d but got %d", DATA_TYPE_ARRAY, value.type); TestCase_assert(value.value.array->count == 28, "Expected 28 but got " SIZE_T_FORMAT, value.value.array->count); TestCase_assert(value.value.array->values[0].type == DATA_TYPE_BOOLEAN, "Expected %d but got %d", DATA_TYPE_BOOLEAN, value.value.array->values[0].type); TestCase_assert(!value.value.array->values[0].value.boolean, "Expected false but got true"); TestCase_assert(value.value.array->values[1].type == DATA_TYPE_BOOLEAN, "Expected %d but got %d", DATA_TYPE_BOOLEAN, value.value.array->values[1].type); TestCase_assert(value.value.array->values[1].value.boolean, "Expected true but got false"); TestCase_assert(value.value.array->values[2].type == DATA_TYPE_INT8, "Expected %d but got %d", DATA_TYPE_INT8, value.value.array->values[2].type); TestCase_assert(value.value.array->values[2].value.int8 == 0, "Expected 0 but got %d", value.value.array->values[2].value.int8); TestCase_assert(value.value.array->values[3].type == DATA_TYPE_INT8, "Expected %d but got %d", DATA_TYPE_INT8, value.value.array->values[3].type); TestCase_assert(value.value.array->values[3].value.int8 == 1, "Expected 1 but got %d", value.value.array->values[3].value.int8); TestCase_assert(value.value.array->values[4].type == DATA_TYPE_UINT8, "Expected %d but got %d", DATA_TYPE_UINT8, value.value.array->values[4].type); TestCase_assert(value.value.array->values[4].value.uint8 == 0, "Expected 0 but got %d", value.value.array->values[4].value.uint8); TestCase_assert(value.value.array->values[5].type == DATA_TYPE_UINT8, "Expected %d but got %d", DATA_TYPE_UINT8, value.value.array->values[5].type); TestCase_assert(value.value.array->values[5].value.uint8 == 1, "Expected 1 but got %d", value.value.array->values[5].value.uint8); TestCase_assert(value.value.array->values[6].type == DATA_TYPE_INT16, "Expected %d but got %d", DATA_TYPE_INT16, value.value.array->values[6].type); TestCase_assert(value.value.array->values[6].value.int16 == 0, "Expected 0 but got %d", value.value.array->values[6].value.int16); TestCase_assert(value.value.array->values[7].type == DATA_TYPE_INT16, "Expected %d but got %d", DATA_TYPE_INT16, value.value.array->values[7].type); TestCase_assert(value.value.array->values[7].value.int16 == 1, "Expected 1 but got %d", value.value.array->values[7].value.int16); TestCase_assert(value.value.array->values[8].type == DATA_TYPE_UINT16, "Expected %d but got %d", DATA_TYPE_UINT16, value.value.array->values[8].type); TestCase_assert(value.value.array->values[8].value.uint16 == 0, "Expected 0 but got %d", value.value.array->values[16].value.uint16); TestCase_assert(value.value.array->values[9].type == DATA_TYPE_UINT16, "Expected %d but got %d", DATA_TYPE_UINT16, value.value.array->values[9].type); TestCase_assert(value.value.array->values[9].value.uint16 == 1, "Expected 1 but got %d", value.value.array->values[9].value.uint16); TestCase_assert(value.value.array->values[10].type == DATA_TYPE_INT32, "Expected %d but got %d", DATA_TYPE_INT32, value.value.array->values[10].type); TestCase_assert(value.value.array->values[10].value.int32 == 0, "Expected 0 but got %d", value.value.array->values[10].value.int32); TestCase_assert(value.value.array->values[11].type == DATA_TYPE_INT32, "Expected %d but got %d", DATA_TYPE_INT32, value.value.array->values[11].type); TestCase_assert(value.value.array->values[11].value.int32 == 1, "Expected 1 but got %d", value.value.array->values[11].value.int32); TestCase_assert(value.value.array->values[12].type == DATA_TYPE_UINT32, "Expected %d but got %d", DATA_TYPE_UINT32, value.value.array->values[12].type); TestCase_assert(value.value.array->values[12].value.uint32 == 0, "Expected 0 but got %d", value.value.array->values[12].value.uint32); TestCase_assert(value.value.array->values[13].type == DATA_TYPE_UINT32, "Expected %d but got %d", DATA_TYPE_UINT32, value.value.array->values[13].type); TestCase_assert(value.value.array->values[13].value.uint32 == 1, "Expected 1 but got %d", value.value.array->values[13].value.uint32); TestCase_assert(value.value.array->values[14].type == DATA_TYPE_INT64, "Expected %d but got %d", DATA_TYPE_INT64, value.value.array->values[14].type); TestCase_assert(value.value.array->values[14].value.int64 == 0, "Expected 0 but got " INT64_FORMAT, value.value.array->values[14].value.int64); TestCase_assert(value.value.array->values[15].type == DATA_TYPE_INT64, "Expected %d but got %d", DATA_TYPE_INT64, value.value.array->values[15].type); TestCase_assert(value.value.array->values[15].value.int64 == 1, "Expected 1 but got " INT64_FORMAT, value.value.array->values[15].value.int64); TestCase_assert(value.value.array->values[16].type == DATA_TYPE_UINT64, "Expected %d but got %d", DATA_TYPE_UINT64, value.value.array->values[16].type); TestCase_assert(value.value.array->values[16].value.uint64 == 0, "Expected 0 but got " UINT64_FORMAT, value.value.array->values[16].value.uint64); TestCase_assert(value.value.array->values[17].type == DATA_TYPE_UINT64, "Expected %d but got %d", DATA_TYPE_UINT64, value.value.array->values[17].type); TestCase_assert(value.value.array->values[17].value.uint64 == 1, "Expected 1 but got " UINT64_FORMAT, value.value.array->values[17].value.uint64); TestCase_assert(value.value.array->values[18].type == DATA_TYPE_FLOAT, "Expected %d but got %d", DATA_TYPE_FLOAT, value.value.array->values[18].type); TestCase_assert(value.value.array->values[18].value.float32 == 0.0f, "Expected 0.0 but got %f", value.value.array->values[18].value.float32); TestCase_assert(value.value.array->values[19].type == DATA_TYPE_FLOAT, "Expected %d but got %d", DATA_TYPE_FLOAT, value.value.array->values[19].type); TestCase_assert(value.value.array->values[19].value.float32 == 1.0f, "Expected 1.0 but got %f", value.value.array->values[19].value.float32); TestCase_assert(value.value.array->values[20].type == DATA_TYPE_DOUBLE, "Expected %d but got %d", DATA_TYPE_DOUBLE, value.value.array->values[20].type); TestCase_assert(value.value.array->values[20].value.float64 == 0.0, "Expected 0.0 but got %f", value.value.array->values[20].value.float64); TestCase_assert(value.value.array->values[21].type == DATA_TYPE_DOUBLE, "Expected %d but got %d", DATA_TYPE_DOUBLE, value.value.array->values[21].type); TestCase_assert(value.value.array->values[21].value.float64 == 1.0, "Expected 1.0 but got %f", value.value.array->values[21].value.float64); TestCase_assert(value.value.array->values[22].type == DATA_TYPE_FIXED_16_16, "Expected %d but got %d", DATA_TYPE_FIXED_16_16, value.value.array->values[22].type); TestCase_assert(value.value.array->values[22].value.fixed == 0x00000, "Expected 0x00000 but got 0x%05X", value.value.array->values[22].value.fixed); TestCase_assert(value.value.array->values[23].type == DATA_TYPE_FIXED_16_16, "Expected %d but got %d", DATA_TYPE_FIXED_16_16, value.value.array->values[23].type); TestCase_assert(value.value.array->values[23].value.fixed == 0x10000, "Expected 0x10000 but got 0x%05X", value.value.array->values[23].value.fixed); TestCase_assert(value.value.array->values[24].type == DATA_TYPE_STRING, "Expected %d but got %d", DATA_TYPE_STRING, value.value.array->values[24].type); TestCase_assert(!strcmp(value.value.array->values[24].value.string, "a"), "Expected \"a\" but got \"%s\"", value.value.array->values[24].value.string); TestCase_assert(value.value.array->values[25].type == DATA_TYPE_STRING, "Expected %d but got %d", DATA_TYPE_STRING, value.value.array->values[25].type); TestCase_assert(!strcmp(value.value.array->values[25].value.string, "foo"), "Expected \"foo\" but got \"%s\"", value.value.array->values[25].value.string); TestCase_assert(value.value.array->values[26].type == DATA_TYPE_BLOB, "Expected %d but got %d", DATA_TYPE_BLOB, value.value.array->values[26].type); TestCase_assert(value.value.array->values[26].value.blob.length == 1, "Expected 1 but got " SIZE_T_FORMAT, value.value.array->values[26].value.blob.length); TestCase_assert(!memcmp(value.value.array->values[26].value.blob.bytes, "a", 1), "Expected \"a\" but got \"%.*s\"", (int) value.value.array->values[26].value.blob.length, (char *) value.value.array->values[26].value.blob.bytes); TestCase_assert(value.value.array->values[27].type == DATA_TYPE_BLOB, "Expected %d but got %d", DATA_TYPE_BLOB, value.value.array->values[27].type); TestCase_assert(value.value.array->values[27].value.blob.length == 3, "Expected 3 but got " SIZE_T_FORMAT, value.value.array->values[27].value.blob.length); TestCase_assert(!memcmp(value.value.array->values[27].value.blob.bytes, "foo", 3), "Expected \"foo\" but got \"%.*s\"", (int) value.value.array->values[27].value.blob.length, (char *) value.value.array->values[27].value.blob.bytes); TestDeserializationContext_finish(context); TestDeserializationContext_dispose(context); valueDispose(&value); context = TestDeserializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "data", 2); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "structure"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 84); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "bool_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBoolean, NULL, false); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "bool_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBoolean, NULL, true); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int8_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt8, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int8_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt8, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "uint8_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt8, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "uint8_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt8, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int16_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt16, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int16_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt16, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "uint16_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt16, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "uint16_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt16, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int32_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt32, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int32_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt32, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "uint32_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt32, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "uint32_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt32, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int64_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt64, NULL, 0ll); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int64_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt64, NULL, 1ll); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "uint64_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt64, NULL, 0ull); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "uint64_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt64, NULL, 1ull); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "float_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_FLOAT, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readFloat, NULL, 0.0f); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "float_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_FLOAT, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readFloat, NULL, 1.0f); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "double_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_DOUBLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readDouble, NULL, 0.0); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "double_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_DOUBLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readDouble, NULL, 1.0); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "fixed_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_FIXED_16_16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readFixed16_16, NULL, 0x00000); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "fixed_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_FIXED_16_16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readFixed16_16, NULL, 0x10000); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "string_a"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_STRING, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "a"); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "string_foo"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_STRING, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "foo"); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "blob_a"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BLOB, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBlob, NULL, "a", 1); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "blob_foo"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BLOB, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBlob, NULL, "foo", 3); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); value = DataValue_deserializeGeneric((DeserializationContext *) context); TestCase_assert(value.type == DATA_TYPE_HASH_TABLE, "Expected %d but got %d", DATA_TYPE_HASH_TABLE, value.type); TestCase_assertSizeEqual(hashGetCount(value.value.hashTable), 28); size_t keyCount; keys = hashGetKeys(value.value.hashTable, &keyCount); for (keyIndex = 0; keyIndex < keyCount; keyIndex++) { hashTableValue = hashGet(value.value.hashTable, keys[keyIndex]); if (!strcmp(keys[keyIndex], "bool_0")) { TestCase_assert(hashTableValue->type == DATA_TYPE_BOOLEAN, "Expected %d but got %d", DATA_TYPE_BOOLEAN, hashTableValue->type); TestCase_assert(!hashTableValue->value.boolean, "Expected false but got true"); } else if (!strcmp(keys[keyIndex], "bool_1")) { TestCase_assert(hashTableValue->type == DATA_TYPE_BOOLEAN, "Expected %d but got %d", DATA_TYPE_BOOLEAN, hashTableValue->type); TestCase_assert(hashTableValue->value.boolean, "Expected true but got false"); } else if (!strcmp(keys[keyIndex], "int8_0")) { TestCase_assert(hashTableValue->type == DATA_TYPE_INT8, "Expected %d but got %d", DATA_TYPE_INT8, hashTableValue->type); TestCase_assert(hashTableValue->value.int8 == 0, "Expected 0 but got %d", hashTableValue->value.int8); } else if (!strcmp(keys[keyIndex], "int8_1")) { TestCase_assert(hashTableValue->type == DATA_TYPE_INT8, "Expected %d but got %d", DATA_TYPE_INT8, hashTableValue->type); TestCase_assert(hashTableValue->value.int8 == 1, "Expected 1 but got %d", hashTableValue->value.int8); } else if (!strcmp(keys[keyIndex], "uint8_0")) { TestCase_assert(hashTableValue->type == DATA_TYPE_UINT8, "Expected %d but got %d", DATA_TYPE_UINT8, hashTableValue->type); TestCase_assert(hashTableValue->value.uint8 == 0, "Expected 0 but got %d", hashTableValue->value.uint8); } else if (!strcmp(keys[keyIndex], "uint8_1")) { TestCase_assert(hashTableValue->type == DATA_TYPE_UINT8, "Expected %d but got %d", DATA_TYPE_UINT8, hashTableValue->type); TestCase_assert(hashTableValue->value.uint8 == 1, "Expected 1 but got %d", hashTableValue->value.uint8); } else if (!strcmp(keys[keyIndex], "int16_0")) { TestCase_assert(hashTableValue->type == DATA_TYPE_INT16, "Expected %d but got %d", DATA_TYPE_INT16, hashTableValue->type); TestCase_assert(hashTableValue->value.int16 == 0, "Expected 0 but got %d", hashTableValue->value.int16); } else if (!strcmp(keys[keyIndex], "int16_1")) { TestCase_assert(hashTableValue->type == DATA_TYPE_INT16, "Expected %d but got %d", DATA_TYPE_INT16, hashTableValue->type); TestCase_assert(hashTableValue->value.int16 == 1, "Expected 1 but got %d", hashTableValue->value.int16); } else if (!strcmp(keys[keyIndex], "uint16_0")) { TestCase_assert(hashTableValue->type == DATA_TYPE_UINT16, "Expected %d but got %d", DATA_TYPE_UINT16, hashTableValue->type); TestCase_assert(hashTableValue->value.uint16 == 0, "Expected 0 but got %d", hashTableValue->value.uint16); } else if (!strcmp(keys[keyIndex], "uint16_1")) { TestCase_assert(hashTableValue->type == DATA_TYPE_UINT16, "Expected %d but got %d", DATA_TYPE_UINT16, hashTableValue->type); TestCase_assert(hashTableValue->value.uint16 == 1, "Expected 1 but got %d", hashTableValue->value.uint16); } else if (!strcmp(keys[keyIndex], "int32_0")) { TestCase_assert(hashTableValue->type == DATA_TYPE_INT32, "Expected %d but got %d", DATA_TYPE_INT32, hashTableValue->type); TestCase_assert(hashTableValue->value.int32 == 0, "Expected 0 but got %d", hashTableValue->value.int32); } else if (!strcmp(keys[keyIndex], "int32_1")) { TestCase_assert(hashTableValue->type == DATA_TYPE_INT32, "Expected %d but got %d", DATA_TYPE_INT32, hashTableValue->type); TestCase_assert(hashTableValue->value.int32 == 1, "Expected 1 but got %d", hashTableValue->value.int32); } else if (!strcmp(keys[keyIndex], "uint32_0")) { TestCase_assert(hashTableValue->type == DATA_TYPE_UINT32, "Expected %d but got %d", DATA_TYPE_UINT32, hashTableValue->type); TestCase_assert(hashTableValue->value.uint32 == 0, "Expected 0 but got %d", hashTableValue->value.uint32); } else if (!strcmp(keys[keyIndex], "uint32_1")) { TestCase_assert(hashTableValue->type == DATA_TYPE_UINT32, "Expected %d but got %d", DATA_TYPE_UINT32, hashTableValue->type); TestCase_assert(hashTableValue->value.uint32 == 1, "Expected 1 but got %d", hashTableValue->value.uint32); } else if (!strcmp(keys[keyIndex], "int64_0")) { TestCase_assert(hashTableValue->type == DATA_TYPE_INT64, "Expected %d but got %d", DATA_TYPE_INT64, hashTableValue->type); TestCase_assert(hashTableValue->value.int64 == 0, "Expected 0 but got " INT64_FORMAT, hashTableValue->value.int64); } else if (!strcmp(keys[keyIndex], "int64_1")) { TestCase_assert(hashTableValue->type == DATA_TYPE_INT64, "Expected %d but got %d", DATA_TYPE_INT64, hashTableValue->type); TestCase_assert(hashTableValue->value.int64 == 1, "Expected 1 but got " INT64_FORMAT, hashTableValue->value.int64); } else if (!strcmp(keys[keyIndex], "uint64_0")) { TestCase_assert(hashTableValue->type == DATA_TYPE_UINT64, "Expected %d but got %d", DATA_TYPE_UINT64, hashTableValue->type); TestCase_assert(hashTableValue->value.uint64 == 0, "Expected 0 but got " UINT64_FORMAT, hashTableValue->value.uint64); } else if (!strcmp(keys[keyIndex], "uint64_1")) { TestCase_assert(hashTableValue->type == DATA_TYPE_UINT64, "Expected %d but got %d", DATA_TYPE_UINT64, hashTableValue->type); TestCase_assert(hashTableValue->value.uint64 == 1, "Expected 1 but got " UINT64_FORMAT, hashTableValue->value.uint64); } else if (!strcmp(keys[keyIndex], "float_0")) { TestCase_assert(hashTableValue->type == DATA_TYPE_FLOAT, "Expected %d but got %d", DATA_TYPE_FLOAT, hashTableValue->type); TestCase_assert(hashTableValue->value.float32 == 0.0f, "Expected 0.0 but got %f", hashTableValue->value.float32); } else if (!strcmp(keys[keyIndex], "float_1")) { TestCase_assert(hashTableValue->type == DATA_TYPE_FLOAT, "Expected %d but got %d", DATA_TYPE_FLOAT, hashTableValue->type); TestCase_assert(hashTableValue->value.float32 == 1.0f, "Expected 1.0 but got %f", hashTableValue->value.float32); } else if (!strcmp(keys[keyIndex], "double_0")) { TestCase_assert(hashTableValue->type == DATA_TYPE_DOUBLE, "Expected %d but got %d", DATA_TYPE_DOUBLE, hashTableValue->type); TestCase_assert(hashTableValue->value.float64 == 0.0, "Expected 0.0 but got %f", hashTableValue->value.float64); } else if (!strcmp(keys[keyIndex], "double_1")) { TestCase_assert(hashTableValue->type == DATA_TYPE_DOUBLE, "Expected %d but got %d", DATA_TYPE_DOUBLE, hashTableValue->type); TestCase_assert(hashTableValue->value.float64 == 1.0, "Expected 1.0 but got %f", hashTableValue->value.float64); } else if (!strcmp(keys[keyIndex], "fixed_0")) { TestCase_assert(hashTableValue->type == DATA_TYPE_FIXED_16_16, "Expected %d but got %d", DATA_TYPE_FIXED_16_16, hashTableValue->type); TestCase_assert(hashTableValue->value.fixed == 0x00000, "Expected 0x00000 but got 0x%05X", hashTableValue->value.fixed); } else if (!strcmp(keys[keyIndex], "fixed_1")) { TestCase_assert(hashTableValue->type == DATA_TYPE_FIXED_16_16, "Expected %d but got %d", DATA_TYPE_FIXED_16_16, hashTableValue->type); TestCase_assert(hashTableValue->value.fixed == 0x10000, "Expected 0x10000 but got 0x%05X", hashTableValue->value.fixed); } else if (!strcmp(keys[keyIndex], "string_a")) { TestCase_assert(hashTableValue->type == DATA_TYPE_STRING, "Expected %d but got %d", DATA_TYPE_STRING, hashTableValue->type); TestCase_assert(!strcmp(hashTableValue->value.string, "a"), "Expected \"a\" but got \"%s\"", hashTableValue->value.string); } else if (!strcmp(keys[keyIndex], "string_foo")) { TestCase_assert(hashTableValue->type == DATA_TYPE_STRING, "Expected %d but got %d", DATA_TYPE_STRING, hashTableValue->type); TestCase_assert(!strcmp(hashTableValue->value.string, "foo"), "Expected \"foo\" but got \"%s\"", hashTableValue->value.string); } else if (!strcmp(keys[keyIndex], "blob_a")) { TestCase_assert(hashTableValue->type == DATA_TYPE_BLOB, "Expected %d but got %d", DATA_TYPE_BLOB, hashTableValue->type); TestCase_assert(hashTableValue->value.blob.length == 1, "Expected 1 but got " SIZE_T_FORMAT, hashTableValue->value.blob.length); TestCase_assert(!memcmp(hashTableValue->value.blob.bytes, "a", 1), "Expected \"a\" but got \"%.*s\"", (int) hashTableValue->value.blob.length, (char *) hashTableValue->value.blob.bytes); } else if (!strcmp(keys[keyIndex], "blob_foo")) { TestCase_assert(hashTableValue->type == DATA_TYPE_BLOB, "Expected %d but got %d", DATA_TYPE_BLOB, hashTableValue->type); TestCase_assert(hashTableValue->value.blob.length == 3, "Expected 3 but got " SIZE_T_FORMAT, hashTableValue->value.blob.length); TestCase_assert(!memcmp(hashTableValue->value.blob.bytes, "foo", 3), "Expected \"foo\" but got \"%.*s\"", (int) hashTableValue->value.blob.length, (char *) hashTableValue->value.blob.bytes); } else { TestCase_assert(false, "Unexpected key in hash table: \"%s\"", keys[keyIndex]); } } free(keys); TestDeserializationContext_finish(context); TestDeserializationContext_dispose(context); valueDispose(&value); context = TestDeserializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "data", 2); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "dictionary"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 84); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "bool_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBoolean, NULL, false); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "bool_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBoolean, NULL, true); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int8_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt8, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int8_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt8, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "uint8_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt8, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "uint8_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt8, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int16_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt16, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int16_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt16, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "uint16_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt16, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "uint16_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt16, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int32_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt32, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int32_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt32, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "uint32_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt32, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "uint32_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT32, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt32, NULL, 1); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int64_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt64, NULL, 0ll); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int64_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt64, NULL, 1ll); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "uint64_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt64, NULL, 0ull); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "uint64_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_UINT64, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt64, NULL, 1ull); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "float_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_FLOAT, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readFloat, NULL, 0.0f); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "float_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_FLOAT, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readFloat, NULL, 1.0f); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "double_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_DOUBLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readDouble, NULL, 0.0); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "double_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_DOUBLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readDouble, NULL, 1.0); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "fixed_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_FIXED_16_16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readFixed16_16, NULL, 0x00000); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "fixed_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_FIXED_16_16, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readFixed16_16, NULL, 0x10000); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "string_a"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_STRING, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "a"); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "string_foo"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_STRING, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "foo"); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "blob_a"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BLOB, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBlob, NULL, "a", 1); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "blob_foo"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BLOB, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBlob, NULL, "foo", 3); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); value = DataValue_deserializeGeneric((DeserializationContext *) context); TestCase_assert(value.type == DATA_TYPE_ASSOCIATIVE_ARRAY, "Expected %d but got %d", DATA_TYPE_ASSOCIATIVE_ARRAY, value.type); TestCase_assert(value.value.associativeArray->count == 28, "Expected 28 but got " SIZE_T_FORMAT, value.value.associativeArray->count); TestCase_assert(!strcmp(value.value.associativeArray->keys[0], "bool_0"), "Expected \"bool_0\" but got \"%s\"", value.value.associativeArray->keys[0]); TestCase_assert(value.value.associativeArray->values[0].type == DATA_TYPE_BOOLEAN, "Expected %d but got %d", DATA_TYPE_BOOLEAN, value.value.associativeArray->values[0].type); TestCase_assert(!value.value.associativeArray->values[0].value.boolean, "Expected false but got true"); TestCase_assert(!strcmp(value.value.associativeArray->keys[1], "bool_1"), "Expected \"bool_1\" but got \"%s\"", value.value.associativeArray->keys[1]); TestCase_assert(value.value.associativeArray->values[1].type == DATA_TYPE_BOOLEAN, "Expected %d but got %d", DATA_TYPE_BOOLEAN, value.value.associativeArray->values[1].type); TestCase_assert(value.value.associativeArray->values[1].value.boolean, "Expected true but got false"); TestCase_assert(!strcmp(value.value.associativeArray->keys[2], "int8_0"), "Expected \"int8_0\" but got \"%s\"", value.value.associativeArray->keys[2]); TestCase_assert(value.value.associativeArray->values[2].type == DATA_TYPE_INT8, "Expected %d but got %d", DATA_TYPE_INT8, value.value.associativeArray->values[2].type); TestCase_assert(value.value.associativeArray->values[2].value.int8 == 0, "Expected 0 but got %d", value.value.associativeArray->values[2].value.int8); TestCase_assert(!strcmp(value.value.associativeArray->keys[3], "int8_1"), "Expected \"int8_1\" but got \"%s\"", value.value.associativeArray->keys[3]); TestCase_assert(value.value.associativeArray->values[3].type == DATA_TYPE_INT8, "Expected %d but got %d", DATA_TYPE_INT8, value.value.associativeArray->values[3].type); TestCase_assert(value.value.associativeArray->values[3].value.int8 == 1, "Expected 1 but got %d", value.value.associativeArray->values[3].value.int8); TestCase_assert(!strcmp(value.value.associativeArray->keys[4], "uint8_0"), "Expected \"uint8_0\" but got \"%s\"", value.value.associativeArray->keys[4]); TestCase_assert(value.value.associativeArray->values[4].type == DATA_TYPE_UINT8, "Expected %d but got %d", DATA_TYPE_UINT8, value.value.associativeArray->values[4].type); TestCase_assert(value.value.associativeArray->values[4].value.uint8 == 0, "Expected 0 but got %d", value.value.associativeArray->values[4].value.uint8); TestCase_assert(!strcmp(value.value.associativeArray->keys[5], "uint8_1"), "Expected \"uint8_1\" but got \"%s\"", value.value.associativeArray->keys[5]); TestCase_assert(value.value.associativeArray->values[5].type == DATA_TYPE_UINT8, "Expected %d but got %d", DATA_TYPE_UINT8, value.value.associativeArray->values[5].type); TestCase_assert(value.value.associativeArray->values[5].value.uint8 == 1, "Expected 1 but got %d", value.value.associativeArray->values[5].value.uint8); TestCase_assert(!strcmp(value.value.associativeArray->keys[6], "int16_0"), "Expected \"int16_0\" but got \"%s\"", value.value.associativeArray->keys[6]); TestCase_assert(value.value.associativeArray->values[6].type == DATA_TYPE_INT16, "Expected %d but got %d", DATA_TYPE_INT16, value.value.associativeArray->values[6].type); TestCase_assert(value.value.associativeArray->values[6].value.int16 == 0, "Expected 0 but got %d", value.value.associativeArray->values[6].value.int16); TestCase_assert(!strcmp(value.value.associativeArray->keys[7], "int16_1"), "Expected \"int16_1\" but got \"%s\"", value.value.associativeArray->keys[7]); TestCase_assert(value.value.associativeArray->values[7].type == DATA_TYPE_INT16, "Expected %d but got %d", DATA_TYPE_INT16, value.value.associativeArray->values[7].type); TestCase_assert(value.value.associativeArray->values[7].value.int16 == 1, "Expected 1 but got %d", value.value.associativeArray->values[7].value.int16); TestCase_assert(!strcmp(value.value.associativeArray->keys[8], "uint16_0"), "Expected \"uint16_0\" but got \"%s\"", value.value.associativeArray->keys[8]); TestCase_assert(value.value.associativeArray->values[8].type == DATA_TYPE_UINT16, "Expected %d but got %d", DATA_TYPE_UINT16, value.value.associativeArray->values[8].type); TestCase_assert(value.value.associativeArray->values[8].value.uint16 == 0, "Expected 0 but got %d", value.value.associativeArray->values[16].value.uint16); TestCase_assert(!strcmp(value.value.associativeArray->keys[9], "uint16_1"), "Expected \"uint16_1\" but got \"%s\"", value.value.associativeArray->keys[9]); TestCase_assert(value.value.associativeArray->values[9].type == DATA_TYPE_UINT16, "Expected %d but got %d", DATA_TYPE_UINT16, value.value.associativeArray->values[9].type); TestCase_assert(value.value.associativeArray->values[9].value.uint16 == 1, "Expected 1 but got %d", value.value.associativeArray->values[9].value.uint16); TestCase_assert(!strcmp(value.value.associativeArray->keys[10], "int32_0"), "Expected \"int32_0\" but got \"%s\"", value.value.associativeArray->keys[10]); TestCase_assert(value.value.associativeArray->values[10].type == DATA_TYPE_INT32, "Expected %d but got %d", DATA_TYPE_INT32, value.value.associativeArray->values[10].type); TestCase_assert(value.value.associativeArray->values[10].value.int32 == 0, "Expected 0 but got %d", value.value.associativeArray->values[10].value.int32); TestCase_assert(!strcmp(value.value.associativeArray->keys[11], "int32_1"), "Expected \"int32_1\" but got \"%s\"", value.value.associativeArray->keys[11]); TestCase_assert(value.value.associativeArray->values[11].type == DATA_TYPE_INT32, "Expected %d but got %d", DATA_TYPE_INT32, value.value.associativeArray->values[11].type); TestCase_assert(value.value.associativeArray->values[11].value.int32 == 1, "Expected 1 but got %d", value.value.associativeArray->values[11].value.int32); TestCase_assert(!strcmp(value.value.associativeArray->keys[12], "uint32_0"), "Expected \"uint32_0\" but got \"%s\"", value.value.associativeArray->keys[12]); TestCase_assert(value.value.associativeArray->values[12].type == DATA_TYPE_UINT32, "Expected %d but got %d", DATA_TYPE_UINT32, value.value.associativeArray->values[12].type); TestCase_assert(value.value.associativeArray->values[12].value.uint32 == 0, "Expected 0 but got %d", value.value.associativeArray->values[12].value.uint32); TestCase_assert(!strcmp(value.value.associativeArray->keys[13], "uint32_1"), "Expected \"uint32_1\" but got \"%s\"", value.value.associativeArray->keys[13]); TestCase_assert(value.value.associativeArray->values[13].type == DATA_TYPE_UINT32, "Expected %d but got %d", DATA_TYPE_UINT32, value.value.associativeArray->values[13].type); TestCase_assert(value.value.associativeArray->values[13].value.uint32 == 1, "Expected 1 but got %d", value.value.associativeArray->values[13].value.uint32); TestCase_assert(!strcmp(value.value.associativeArray->keys[14], "int64_0"), "Expected \"int64_0\" but got \"%s\"", value.value.associativeArray->keys[14]); TestCase_assert(value.value.associativeArray->values[14].type == DATA_TYPE_INT64, "Expected %d but got %d", DATA_TYPE_INT64, value.value.associativeArray->values[14].type); TestCase_assert(value.value.associativeArray->values[14].value.int64 == 0, "Expected 0 but got " INT64_FORMAT, value.value.associativeArray->values[14].value.int64); TestCase_assert(!strcmp(value.value.associativeArray->keys[15], "int64_1"), "Expected \"int64_1\" but got \"%s\"", value.value.associativeArray->keys[15]); TestCase_assert(value.value.associativeArray->values[15].type == DATA_TYPE_INT64, "Expected %d but got %d", DATA_TYPE_INT64, value.value.associativeArray->values[15].type); TestCase_assert(value.value.associativeArray->values[15].value.int64 == 1, "Expected 1 but got " INT64_FORMAT, value.value.associativeArray->values[15].value.int64); TestCase_assert(!strcmp(value.value.associativeArray->keys[16], "uint64_0"), "Expected \"uint64_0\" but got \"%s\"", value.value.associativeArray->keys[16]); TestCase_assert(value.value.associativeArray->values[16].type == DATA_TYPE_UINT64, "Expected %d but got %d", DATA_TYPE_UINT64, value.value.associativeArray->values[16].type); TestCase_assert(value.value.associativeArray->values[16].value.uint64 == 0, "Expected 0 but got " UINT64_FORMAT, value.value.associativeArray->values[16].value.uint64); TestCase_assert(!strcmp(value.value.associativeArray->keys[17], "uint64_1"), "Expected \"uint64_1\" but got \"%s\"", value.value.associativeArray->keys[17]); TestCase_assert(value.value.associativeArray->values[17].type == DATA_TYPE_UINT64, "Expected %d but got %d", DATA_TYPE_UINT64, value.value.associativeArray->values[17].type); TestCase_assert(value.value.associativeArray->values[17].value.uint64 == 1, "Expected 1 but got " UINT64_FORMAT, value.value.associativeArray->values[17].value.uint64); TestCase_assert(!strcmp(value.value.associativeArray->keys[18], "float_0"), "Expected \"float_0\" but got \"%s\"", value.value.associativeArray->keys[18]); TestCase_assert(value.value.associativeArray->values[18].type == DATA_TYPE_FLOAT, "Expected %d but got %d", DATA_TYPE_FLOAT, value.value.associativeArray->values[18].type); TestCase_assert(value.value.associativeArray->values[18].value.float32 == 0.0f, "Expected 0.0 but got %f", value.value.associativeArray->values[18].value.float32); TestCase_assert(!strcmp(value.value.associativeArray->keys[19], "float_1"), "Expected \"float_1\" but got \"%s\"", value.value.associativeArray->keys[19]); TestCase_assert(value.value.associativeArray->values[19].type == DATA_TYPE_FLOAT, "Expected %d but got %d", DATA_TYPE_FLOAT, value.value.associativeArray->values[19].type); TestCase_assert(value.value.associativeArray->values[19].value.float32 == 1.0f, "Expected 1.0 but got %f", value.value.associativeArray->values[19].value.float32); TestCase_assert(!strcmp(value.value.associativeArray->keys[20], "double_0"), "Expected \"double_0\" but got \"%s\"", value.value.associativeArray->keys[20]); TestCase_assert(value.value.associativeArray->values[20].type == DATA_TYPE_DOUBLE, "Expected %d but got %d", DATA_TYPE_DOUBLE, value.value.associativeArray->values[20].type); TestCase_assert(value.value.associativeArray->values[20].value.float64 == 0.0, "Expected 0.0 but got %f", value.value.associativeArray->values[20].value.float64); TestCase_assert(!strcmp(value.value.associativeArray->keys[21], "double_1"), "Expected \"double_1\" but got \"%s\"", value.value.associativeArray->keys[21]); TestCase_assert(value.value.associativeArray->values[21].type == DATA_TYPE_DOUBLE, "Expected %d but got %d", DATA_TYPE_DOUBLE, value.value.associativeArray->values[21].type); TestCase_assert(value.value.associativeArray->values[21].value.float64 == 1.0, "Expected 1.0 but got %f", value.value.associativeArray->values[21].value.float64); TestCase_assert(!strcmp(value.value.associativeArray->keys[22], "fixed_0"), "Expected \"fixed_0\" but got \"%s\"", value.value.associativeArray->keys[22]); TestCase_assert(value.value.associativeArray->values[22].type == DATA_TYPE_FIXED_16_16, "Expected %d but got %d", DATA_TYPE_FIXED_16_16, value.value.associativeArray->values[22].type); TestCase_assert(value.value.associativeArray->values[22].value.fixed == 0x00000, "Expected 0x00000 but got 0x%05X", value.value.associativeArray->values[22].value.fixed); TestCase_assert(!strcmp(value.value.associativeArray->keys[23], "fixed_1"), "Expected \"fixed_1\" but got \"%s\"", value.value.associativeArray->keys[23]); TestCase_assert(value.value.associativeArray->values[23].type == DATA_TYPE_FIXED_16_16, "Expected %d but got %d", DATA_TYPE_FIXED_16_16, value.value.associativeArray->values[23].type); TestCase_assert(value.value.associativeArray->values[23].value.fixed == 0x10000, "Expected 0x10000 but got 0x%05X", value.value.associativeArray->values[23].value.fixed); TestCase_assert(!strcmp(value.value.associativeArray->keys[24], "string_a"), "Expected \"string_a\" but got \"%s\"", value.value.associativeArray->keys[24]); TestCase_assert(value.value.associativeArray->values[24].type == DATA_TYPE_STRING, "Expected %d but got %d", DATA_TYPE_STRING, value.value.associativeArray->values[24].type); TestCase_assert(!strcmp(value.value.associativeArray->values[24].value.string, "a"), "Expected \"a\" but got \"%s\"", value.value.associativeArray->values[24].value.string); TestCase_assert(!strcmp(value.value.associativeArray->keys[25], "string_foo"), "Expected \"string_foo\" but got \"%s\"", value.value.associativeArray->keys[25]); TestCase_assert(value.value.associativeArray->values[25].type == DATA_TYPE_STRING, "Expected %d but got %d", DATA_TYPE_STRING, value.value.associativeArray->values[25].type); TestCase_assert(!strcmp(value.value.associativeArray->values[25].value.string, "foo"), "Expected \"foo\" but got \"%s\"", value.value.associativeArray->values[25].value.string); TestCase_assert(!strcmp(value.value.associativeArray->keys[26], "blob_a"), "Expected \"blob_a\" but got \"%s\"", value.value.associativeArray->keys[26]); TestCase_assert(value.value.associativeArray->values[26].type == DATA_TYPE_BLOB, "Expected %d but got %d", DATA_TYPE_BLOB, value.value.associativeArray->values[26].type); TestCase_assert(value.value.associativeArray->values[26].value.blob.length == 1, "Expected 1 but got " SIZE_T_FORMAT, value.value.associativeArray->values[26].value.blob.length); TestCase_assert(!memcmp(value.value.associativeArray->values[26].value.blob.bytes, "a", 1), "Expected \"a\" but got \"%.*s\"", (int) value.value.associativeArray->values[26].value.blob.length, (char *) value.value.associativeArray->values[26].value.blob.bytes); TestCase_assert(!strcmp(value.value.associativeArray->keys[27], "blob_foo"), "Expected \"blob_foo\" but got \"%s\"", value.value.associativeArray->keys[27]); TestCase_assert(value.value.associativeArray->values[27].type == DATA_TYPE_BLOB, "Expected %d but got %d", DATA_TYPE_BLOB, value.value.associativeArray->values[27].type); TestCase_assert(value.value.associativeArray->values[27].value.blob.length == 3, "Expected 3 but got " SIZE_T_FORMAT, value.value.associativeArray->values[27].value.blob.length); TestCase_assert(!memcmp(value.value.associativeArray->values[27].value.blob.bytes, "foo", 3), "Expected \"foo\" but got \"%.*s\"", (int) value.value.associativeArray->values[27].value.blob.length, (char *) value.value.associativeArray->values[27].value.blob.bytes); TestDeserializationContext_finish(context); TestDeserializationContext_dispose(context); valueDispose(&value); context = TestDeserializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "data", 2); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "array"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 6); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_ARRAY, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 2); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBoolean, NULL, false); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_HASH_TABLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 3); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "bool_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBoolean, NULL, true); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_ASSOCIATIVE_ARRAY, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 3); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int8_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt8, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); value = DataValue_deserializeGeneric((DeserializationContext *) context); TestCase_assert(value.type == DATA_TYPE_ARRAY, "Expected %d but got %d", DATA_TYPE_ARRAY, value.type); TestCase_assert(value.value.array->count == 3, "Expected 3 but got " SIZE_T_FORMAT, value.value.array->count); TestCase_assert(value.value.array->values[0].type == DATA_TYPE_ARRAY, "Expected %d but got %d", DATA_TYPE_ARRAY, value.value.array->values[0].type); TestCase_assert(value.value.array->values[0].value.array->count == 1, "Expected 1 but got " SIZE_T_FORMAT, value.value.array->values[0].value.array->count); TestCase_assert(value.value.array->values[0].value.array->values[0].type == DATA_TYPE_BOOLEAN, "Expected %d but got %d", DATA_TYPE_BOOLEAN, value.value.array->values[0].value.array->values[0].type); TestCase_assert(!value.value.array->values[0].value.array->values[0].value.boolean, "Expected false but got true"); TestCase_assert(value.value.array->values[1].type == DATA_TYPE_HASH_TABLE, "Expected %d but got %d", DATA_TYPE_HASH_TABLE, value.value.array->values[1].type); TestCase_assertSizeEqual(hashGetCount(value.value.array->values[1].value.hashTable), 1); hashTableValue = hashGet(value.value.array->values[1].value.hashTable, "bool_1"); TestCase_assert(hashTableValue != NULL, "Expected non-NULL but got NULL"); TestCase_assert(hashTableValue->type == DATA_TYPE_BOOLEAN, "Expected %d but got %d", DATA_TYPE_BOOLEAN, hashTableValue->type); TestCase_assert(hashTableValue->value.boolean, "Expected true but got false"); TestCase_assert(value.value.array->values[2].type == DATA_TYPE_ASSOCIATIVE_ARRAY, "Expected %d but got %d", DATA_TYPE_ASSOCIATIVE_ARRAY, value.value.array->values[2].type); TestCase_assert(value.value.array->values[2].value.associativeArray->count == 1, "Expected 1 but got " SIZE_T_FORMAT, value.value.array->values[2].value.associativeArray->count); TestCase_assert(!strcmp(value.value.array->values[2].value.associativeArray->keys[0], "int8_0"), "Expected \"int8_0\" but got \"%s\"", value.value.array->values[2].value.associativeArray->keys[0]); TestCase_assert(value.value.array->values[2].value.associativeArray->values[0].type == DATA_TYPE_INT8, "Expected %d but got %d", DATA_TYPE_INT8, value.value.array->values[2].value.associativeArray->values[0].type); TestCase_assert(value.value.array->values[2].value.associativeArray->values[0].value.int8 == 0, "Expected 0 but got %d", value.value.array->values[2].value.associativeArray->values[0].value.int8); TestDeserializationContext_finish(context); TestDeserializationContext_dispose(context); valueDispose(&value); context = TestDeserializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "data", 2); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "structure"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 9); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "array"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_ARRAY, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 2); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBoolean, NULL, false); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "hash_table"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_HASH_TABLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 3); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "bool_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBoolean, NULL, true); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "associative_array"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_ASSOCIATIVE_ARRAY, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 3); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int8_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt8, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); value = DataValue_deserializeGeneric((DeserializationContext *) context); TestCase_assert(value.type == DATA_TYPE_HASH_TABLE, "Expected %d but got %d", DATA_TYPE_HASH_TABLE, value.type); TestCase_assertSizeEqual(hashGetCount(value.value.hashTable), 3); keys = hashGetKeys(value.value.hashTable, &keyCount); for (keyIndex = 0; keyIndex < keyCount; keyIndex++) { hashTableValue = hashGet(value.value.hashTable, keys[keyIndex]); if (!strcmp(keys[keyIndex], "array")) { TestCase_assert(hashTableValue->type == DATA_TYPE_ARRAY, "Expected %d but got %d", DATA_TYPE_ARRAY, hashTableValue->type); TestCase_assert(hashTableValue->value.array->count == 1, "Expected 1 but got " SIZE_T_FORMAT, hashTableValue->value.array->count); TestCase_assert(hashTableValue->value.array->values[0].type == DATA_TYPE_BOOLEAN, "Expected %d but got %d", DATA_TYPE_BOOLEAN, hashTableValue->value.array->values[0].type); TestCase_assert(!hashTableValue->value.array->values[0].value.boolean, "Expected false but got true"); } else if (!strcmp(keys[keyIndex], "hash_table")) { TestCase_assert(hashTableValue->type == DATA_TYPE_HASH_TABLE, "Expected %d but got %d", DATA_TYPE_HASH_TABLE, hashTableValue->type); TestCase_assertSizeEqual(hashGetCount(hashTableValue->value.hashTable), 1); hashTableValue = hashGet(hashTableValue->value.hashTable, "bool_1"); TestCase_assert(hashTableValue != NULL, "Expected non-NULL but got NULL"); TestCase_assert(hashTableValue->type == DATA_TYPE_BOOLEAN, "Expected %d but got %d", DATA_TYPE_BOOLEAN, hashTableValue->type); TestCase_assert(hashTableValue->value.boolean, "Expected true but got false"); } else if (!strcmp(keys[keyIndex], "associative_array")) { TestCase_assert(hashTableValue->type == DATA_TYPE_ASSOCIATIVE_ARRAY, "Expected %d but got %d", DATA_TYPE_ASSOCIATIVE_ARRAY, hashTableValue->type); TestCase_assert(hashTableValue->value.associativeArray->count == 1, "Expected 1 but got " SIZE_T_FORMAT, hashTableValue->value.associativeArray->count); TestCase_assert(!strcmp(hashTableValue->value.associativeArray->keys[0], "int8_0"), "Expected \"int8_0\" but got \"%s\"", hashTableValue->value.associativeArray->keys[0]); TestCase_assert(hashTableValue->value.associativeArray->values[0].type == DATA_TYPE_INT8, "Expected %d but got %d", DATA_TYPE_INT8, hashTableValue->value.associativeArray->values[0].type); TestCase_assert(hashTableValue->value.associativeArray->values[0].value.int8 == 0, "Expected 0 but got %d", hashTableValue->value.associativeArray->values[0].value.int8); } else { TestCase_assert(false, "Unexpected key in hash table: \"%s\"", keys[keyIndex]); } } free(keys); TestDeserializationContext_finish(context); TestDeserializationContext_dispose(context); valueDispose(&value); context = TestDeserializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "data", 2); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "dictionary"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 9); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "array"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_ARRAY, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 2); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBoolean, NULL, false); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "hash_table"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_HASH_TABLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 3); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "bool_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBoolean, NULL, true); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "associative_array"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_ASSOCIATIVE_ARRAY, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 3); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int8_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt8, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); value = DataValue_deserializeGeneric((DeserializationContext *) context); TestCase_assert(value.type == DATA_TYPE_ASSOCIATIVE_ARRAY, "Expected %d but got %d", DATA_TYPE_ASSOCIATIVE_ARRAY, value.type); TestCase_assert(value.value.associativeArray->count == 3, "Expected 3 but got " SIZE_T_FORMAT, value.value.associativeArray->count); TestCase_assert(value.value.associativeArray->values[0].type == DATA_TYPE_ARRAY, "Expected %d but got %d", DATA_TYPE_ARRAY, value.value.associativeArray->values[0].type); TestCase_assert(!strcmp(value.value.associativeArray->keys[0], "array"), "Expected \"array\" but got \"%s\"", value.value.associativeArray->keys[0]); TestCase_assert(value.value.associativeArray->values[0].value.array->count == 1, "Expected 1 but got " SIZE_T_FORMAT, value.value.associativeArray->values[0].value.array->count); TestCase_assert(value.value.associativeArray->values[0].value.array->values[0].type == DATA_TYPE_BOOLEAN, "Expected %d but got %d", DATA_TYPE_BOOLEAN, value.value.associativeArray->values[0].value.array->values[0].type); TestCase_assert(!value.value.associativeArray->values[0].value.array->values[0].value.boolean, "Expected false but got true"); TestCase_assert(!strcmp(value.value.associativeArray->keys[1], "hash_table"), "Expected \"hash_table\" but got \"%s\"", value.value.associativeArray->keys[1]); TestCase_assert(value.value.associativeArray->values[1].type == DATA_TYPE_HASH_TABLE, "Expected %d but got %d", DATA_TYPE_HASH_TABLE, value.value.associativeArray->values[1].type); TestCase_assertSizeEqual(hashGetCount(value.value.associativeArray->values[1].value.hashTable), 1); hashTableValue = hashGet(value.value.associativeArray->values[1].value.hashTable, "bool_1"); TestCase_assert(hashTableValue != NULL, "Expected non-NULL but got NULL"); TestCase_assert(hashTableValue->type == DATA_TYPE_BOOLEAN, "Expected %d but got %d", DATA_TYPE_BOOLEAN, hashTableValue->type); TestCase_assert(hashTableValue->value.boolean, "Expected true but got false"); TestCase_assert(!strcmp(value.value.associativeArray->keys[2], "associative_array"), "Expected \"associative_array\" but got \"%s\"", value.value.associativeArray->keys[2]); TestCase_assert(value.value.associativeArray->values[2].type == DATA_TYPE_ASSOCIATIVE_ARRAY, "Expected %d but got %d", DATA_TYPE_ASSOCIATIVE_ARRAY, value.value.associativeArray->values[2].type); TestCase_assert(value.value.associativeArray->values[2].value.associativeArray->count == 1, "Expected 1 but got " SIZE_T_FORMAT, value.value.associativeArray->values[2].value.associativeArray->count); TestCase_assert(!strcmp(value.value.associativeArray->values[2].value.associativeArray->keys[0], "int8_0"), "Expected \"int8_0\" but got \"%s\"", value.value.associativeArray->values[2].value.associativeArray->keys[0]); TestCase_assert(value.value.associativeArray->values[2].value.associativeArray->values[0].type == DATA_TYPE_INT8, "Expected %d but got %d", DATA_TYPE_INT8, value.value.associativeArray->values[2].value.associativeArray->values[0].type); TestCase_assert(value.value.associativeArray->values[2].value.associativeArray->values[0].value.int8 == 0, "Expected 0 but got %d", value.value.associativeArray->values[2].value.associativeArray->values[0].value.int8); TestDeserializationContext_finish(context); TestDeserializationContext_dispose(context); valueDispose(&value); for (failIndex = 0; failIndex < 22; failIndex++) { context = TestDeserializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s (failIndex %u)", context->error, failIndex); } call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "data", 2); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "array"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 6); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_ARRAY, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 2); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBoolean, NULL, false); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_HASH_TABLE, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 3); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "bool_1"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_BOOLEAN, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readBoolean, NULL, true); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_ASSOCIATIVE_ARRAY, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, NULL, 3); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "int8_0"); call_virtual(expectCall, context, __LINE__, context->vtable->readEnumeration, NULL, DATA_TYPE_INT8, sizeof(dataTypeEnumValues) / sizeof(dataTypeEnumValues[0]), dataTypeEnumValues); call_virtual(expectCall, context, __LINE__, context->vtable->readInt8, NULL, 0); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(failNthCall, context, failIndex, 1); value = DataValue_deserializeGeneric((DeserializationContext *) context); call_virtual(dispose, context); TestCase_assert(value.type == DATA_TYPE_BOOLEAN && !value.value.boolean, "DataValue_deserializeGeneric didn't return false when deserialization call %d failed", failIndex); } } static void testSerializeWithSchema(void) { DataValueSchemaField subitemFields[] = { {DATA_TYPE_UINT16, "id", valueCreateUInt16(0), 0, NULL, NULL} }; DataValueSchema * subitemSchema = DataValueSchema_create(sizeof(subitemFields) / sizeof(subitemFields[0]), subitemFields); DataValueSchemaField fields[] = { {DATA_TYPE_STRING, "name", valueCreateString("", 0, false, false), 0, NULL, NULL}, {DATA_TYPE_ARRAY, "properties", valueCreateBoolean(false), 0, NULL, subitemSchema} }; DataValueSchema * schema = DataValueSchema_create(sizeof(fields) / sizeof(fields[0]), fields); DataValueSchema_dispose(subitemSchema); DataValue value = valueCreateHashTable(hashCreateWithKeysAndValues( "name", valueCreateString("Hello", DATA_USE_STRLEN, false, false), "properties", valueCreateArray(arrayCreateWithValues( valueCreateUInt16(4), valueCreateUInt16(7) ), true, false), NULL), true, false); jmp_buf jmpEnv; TestSerializationContext * context = TestSerializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } call_virtual(expectCall, context, __LINE__, context->vtable->beginStructure, "data"); call_virtual(expectCall, context, __LINE__, context->vtable->writeString, "name", "Hello"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "properties"); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt16, NULL, 4); call_virtual(expectCall, context, __LINE__, context->vtable->writeUInt16, NULL, 7); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endStructure); bool success = DataValue_serializeWithSchema(&value, schema, "data", context); TestCase_assertBoolTrue(success); TestSerializationContext_finish(context); TestSerializationContext_dispose(context); valueDispose(&value); DataValueSchema_dispose(schema); } static void testDeserializeWithSchema(void) { DataValueSchemaField subitemFields[] = { {DATA_TYPE_UINT16, "id", valueCreateUInt16(0), 0, NULL, NULL} }; DataValueSchema * subitemSchema = DataValueSchema_create(sizeof(subitemFields) / sizeof(subitemFields[0]), subitemFields); DataValueSchemaField fields[] = { {DATA_TYPE_STRING, "name", valueCreateString("", 0, false, false), 0, NULL, NULL}, {DATA_TYPE_ARRAY, "properties", valueCreateBoolean(false), 0, NULL, subitemSchema} }; DataValueSchema * schema = DataValueSchema_create(sizeof(fields) / sizeof(fields[0]), fields); DataValueSchema_dispose(subitemSchema); jmp_buf jmpEnv; TestDeserializationContext * context = TestDeserializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } call_virtual(expectCall, context, __LINE__, context->vtable->beginStructure, "data"); call_virtual(expectCall, context, __LINE__, context->vtable->readString, "name", "Hello"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "properties", 2); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt16, NULL, 4); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt16, NULL, 7); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->endStructure); DataValue value = DataValue_deserializeWithSchema(schema, "data", DATA_TYPE_HASH_TABLE, context, false); TestCase_assertIntEqual(value.type, DATA_TYPE_HASH_TABLE); TestCase_assertSizeEqual(hashGetCount(value.value.hashTable), 2); DataValue * nameValue = hashGet(value.value.hashTable, "name"); TestCase_assertPointerNonNULL(nameValue); TestCase_assertIntEqual(nameValue->type, DATA_TYPE_STRING); TestCase_assertStringEqual(nameValue->value.string, "Hello"); DataValue * propertiesValue = hashGet(value.value.hashTable, "properties"); TestCase_assertPointerNonNULL(propertiesValue); TestCase_assertIntEqual(propertiesValue->type, DATA_TYPE_ARRAY); DataArray * propertiesArray = propertiesValue->value.array; TestCase_assertSizeEqual(propertiesArray->count, 2); TestCase_assertIntEqual(propertiesArray->values[0].type, DATA_TYPE_UINT16); TestCase_assertUIntEqual(propertiesArray->values[0].value.uint16, 4); TestCase_assertIntEqual(propertiesArray->values[1].type, DATA_TYPE_UINT16); TestCase_assertUIntEqual(propertiesArray->values[1].value.uint16, 7); TestDeserializationContext_finish(context); TestDeserializationContext_dispose(context); valueDispose(&value); DataValueSchema_dispose(schema); } static void setExpectedTolerantDeserializationCalls(TestDeserializationContext * context) { call_virtual(expectCall, context, __LINE__, context->vtable->beginStructure, "data"); call_virtual(expectCall, context, __LINE__, context->vtable->readString, "name", "Hello"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "properties", 4); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt16, NULL, 4); call_virtual(expectCall, context, __LINE__, context->vtable->readString, NULL, "first"); call_virtual(expectCall, context, __LINE__, context->vtable->readFloat, NULL, 0.25f); call_virtual(expectCall, context, __LINE__, context->vtable->readUInt16, NULL, 7); call_virtual(expectCall, context, __LINE__, context->vtable->endArray); call_virtual(expectCall, context, __LINE__, context->vtable->readInt32, "int", 8); call_virtual(expectCall, context, __LINE__, context->vtable->endStructure); } static void testTolerantDeserializeWithSchema(void) { DataValueSchemaField subitemFields[] = { {DATA_TYPE_UINT16, "id", valueCreateUInt16(5), 0, NULL, NULL}, {DATA_TYPE_STRING, "name", valueCreateString("unspecified", DATA_USE_STRLEN, false, false), 0, NULL, NULL}, {DATA_TYPE_FLOAT, "value", valueCreateFloat(1.5f), 0, NULL, NULL} }; DataValueSchema * subitemSchema = DataValueSchema_create(sizeof(subitemFields) / sizeof(subitemFields[0]), subitemFields); DataValueSchemaField fields[] = { {DATA_TYPE_STRING, "name", valueCreateString("nothing", DATA_USE_STRLEN, false, false), 0, NULL, NULL}, {DATA_TYPE_ARRAY, "properties", valueCreateBoolean(false), 0, NULL, subitemSchema}, {DATA_TYPE_INT32, "int", valueCreateInt32(3), 0, NULL, NULL} }; DataValueSchema * schema = DataValueSchema_create(sizeof(fields) / sizeof(fields[0]), fields); DataValueSchema_dispose(subitemSchema); jmp_buf jmpEnv; TestDeserializationContext * context = TestDeserializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } setExpectedTolerantDeserializationCalls(context); DataValue value = DataValue_deserializeWithSchema(schema, "data", DATA_TYPE_HASH_TABLE, context, true); TestCase_assertIntEqual(value.type, DATA_TYPE_HASH_TABLE); TestCase_assertSizeEqual(hashGetCount(value.value.hashTable), 3); DataValue * nameValue = hashGet(value.value.hashTable, "name"); TestCase_assertPointerNonNULL(nameValue); TestCase_assertIntEqual(nameValue->type, DATA_TYPE_STRING); TestCase_assertStringEqual(nameValue->value.string, "Hello"); DataValue * propertiesValue = hashGet(value.value.hashTable, "properties"); TestCase_assertPointerNonNULL(propertiesValue); TestCase_assertIntEqual(propertiesValue->type, DATA_TYPE_ARRAY); DataArray * propertiesArray = propertiesValue->value.array; TestCase_assertSizeEqual(propertiesArray->count, 4); TestCase_assertIntEqual(propertiesArray->values[0].type, DATA_TYPE_UINT16); TestCase_assertUIntEqual(propertiesArray->values[0].value.uint16, 4); TestCase_assertIntEqual(propertiesArray->values[1].type, DATA_TYPE_STRING); TestCase_assertStringEqual(propertiesArray->values[1].value.string, "first"); TestCase_assertIntEqual(propertiesArray->values[2].type, DATA_TYPE_FLOAT); TestCase_assertFloatEqual(propertiesArray->values[2].value.float32, 0.25f); TestCase_assertIntEqual(propertiesArray->values[3].type, DATA_TYPE_UINT16); TestCase_assertUIntEqual(propertiesArray->values[3].value.uint16, 7); DataValue * intValue = hashGet(value.value.hashTable, "int"); TestCase_assertPointerNonNULL(intValue); TestCase_assertIntEqual(intValue->type, DATA_TYPE_INT32); TestCase_assertIntEqual(intValue->value.int32, 8); TestDeserializationContext_finish(context); TestDeserializationContext_dispose(context); valueDispose(&value); context = TestDeserializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } setExpectedTolerantDeserializationCalls(context); call_virtual(failNthCall, context, 1, SERIALIZATION_ERROR_KEY_NOT_FOUND); value = DataValue_deserializeWithSchema(schema, "data", DATA_TYPE_HASH_TABLE, context, true); TestCase_assertIntEqual(value.type, DATA_TYPE_HASH_TABLE); TestCase_assertSizeEqual(hashGetCount(value.value.hashTable), 3); nameValue = hashGet(value.value.hashTable, "name"); TestCase_assertPointerNonNULL(nameValue); TestCase_assertIntEqual(nameValue->type, DATA_TYPE_STRING); TestCase_assertStringEqual(nameValue->value.string, "nothing"); propertiesValue = hashGet(value.value.hashTable, "properties"); TestCase_assertPointerNonNULL(propertiesValue); TestCase_assertIntEqual(propertiesValue->type, DATA_TYPE_ARRAY); propertiesArray = propertiesValue->value.array; TestCase_assertSizeEqual(propertiesArray->count, 4); TestCase_assertIntEqual(propertiesArray->values[0].type, DATA_TYPE_UINT16); TestCase_assertUIntEqual(propertiesArray->values[0].value.uint16, 4); TestCase_assertIntEqual(propertiesArray->values[1].type, DATA_TYPE_STRING); TestCase_assertStringEqual(propertiesArray->values[1].value.string, "first"); TestCase_assertIntEqual(propertiesArray->values[2].type, DATA_TYPE_FLOAT); TestCase_assertFloatEqual(propertiesArray->values[2].value.float32, 0.25f); TestCase_assertIntEqual(propertiesArray->values[3].type, DATA_TYPE_UINT16); TestCase_assertUIntEqual(propertiesArray->values[3].value.uint16, 7); intValue = hashGet(value.value.hashTable, "int"); TestCase_assertPointerNonNULL(intValue); TestCase_assertIntEqual(intValue->type, DATA_TYPE_INT32); TestCase_assertIntEqual(intValue->value.int32, 8); TestDeserializationContext_finish(context); TestDeserializationContext_dispose(context); valueDispose(&value); context = TestDeserializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } setExpectedTolerantDeserializationCalls(context); call_virtual(failNthCall, context, 5, SERIALIZATION_ERROR_INCORRECT_TYPE); value = DataValue_deserializeWithSchema(schema, "data", DATA_TYPE_HASH_TABLE, context, true); TestCase_assertIntEqual(value.type, DATA_TYPE_HASH_TABLE); TestCase_assertSizeEqual(hashGetCount(value.value.hashTable), 3); nameValue = hashGet(value.value.hashTable, "name"); TestCase_assertPointerNonNULL(nameValue); TestCase_assertIntEqual(nameValue->type, DATA_TYPE_STRING); TestCase_assertStringEqual(nameValue->value.string, "Hello"); propertiesValue = hashGet(value.value.hashTable, "properties"); TestCase_assertPointerNonNULL(propertiesValue); TestCase_assertIntEqual(propertiesValue->type, DATA_TYPE_ARRAY); propertiesArray = propertiesValue->value.array; TestCase_assertSizeEqual(propertiesArray->count, 4); TestCase_assertIntEqual(propertiesArray->values[0].type, DATA_TYPE_UINT16); TestCase_assertUIntEqual(propertiesArray->values[0].value.uint16, 4); TestCase_assertIntEqual(propertiesArray->values[1].type, DATA_TYPE_STRING); TestCase_assertStringEqual(propertiesArray->values[1].value.string, "first"); TestCase_assertIntEqual(propertiesArray->values[2].type, DATA_TYPE_FLOAT); TestCase_assertFloatEqual(propertiesArray->values[2].value.float32, 1.5f); TestCase_assertIntEqual(propertiesArray->values[3].type, DATA_TYPE_UINT16); TestCase_assertUIntEqual(propertiesArray->values[3].value.uint16, 7); intValue = hashGet(value.value.hashTable, "int"); TestCase_assertPointerNonNULL(intValue); TestCase_assertIntEqual(intValue->type, DATA_TYPE_INT32); TestCase_assertIntEqual(intValue->value.int32, 8); TestDeserializationContext_finish(context); TestDeserializationContext_dispose(context); valueDispose(&value); context = TestDeserializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } setExpectedTolerantDeserializationCalls(context); call_virtual(failNthCall, context, 8, SERIALIZATION_ERROR_END_OF_CONTAINER); value = DataValue_deserializeWithSchema(schema, "data", DATA_TYPE_HASH_TABLE, context, true); TestCase_assertIntEqual(value.type, DATA_TYPE_HASH_TABLE); TestCase_assertSizeEqual(hashGetCount(value.value.hashTable), 3); nameValue = hashGet(value.value.hashTable, "name"); TestCase_assertPointerNonNULL(nameValue); TestCase_assertIntEqual(nameValue->type, DATA_TYPE_STRING); TestCase_assertStringEqual(nameValue->value.string, "Hello"); propertiesValue = hashGet(value.value.hashTable, "properties"); TestCase_assertPointerNonNULL(propertiesValue); TestCase_assertIntEqual(propertiesValue->type, DATA_TYPE_ARRAY); propertiesArray = propertiesValue->value.array; TestCase_assertSizeEqual(propertiesArray->count, 4); TestCase_assertIntEqual(propertiesArray->values[0].type, DATA_TYPE_UINT16); TestCase_assertUIntEqual(propertiesArray->values[0].value.uint16, 4); TestCase_assertIntEqual(propertiesArray->values[1].type, DATA_TYPE_STRING); TestCase_assertStringEqual(propertiesArray->values[1].value.string, "first"); TestCase_assertIntEqual(propertiesArray->values[2].type, DATA_TYPE_FLOAT); TestCase_assertFloatEqual(propertiesArray->values[2].value.float32, 0.25f); TestCase_assertIntEqual(propertiesArray->values[3].type, DATA_TYPE_UINT16); TestCase_assertUIntEqual(propertiesArray->values[3].value.uint16, 7); intValue = hashGet(value.value.hashTable, "int"); TestCase_assertPointerNonNULL(intValue); TestCase_assertIntEqual(intValue->type, DATA_TYPE_INT32); TestCase_assertIntEqual(intValue->value.int32, 3); TestDeserializationContext_finish(context); TestDeserializationContext_dispose(context); valueDispose(&value); context = TestDeserializationContext_create(&jmpEnv); if (setjmp(jmpEnv) != 0) { TestCase_assert(false, "%s", context->error); } call_virtual(expectCall, context, __LINE__, context->vtable->beginStructure, "data"); call_virtual(expectCall, context, __LINE__, context->vtable->readString, "name", "Hello"); call_virtual(expectCall, context, __LINE__, context->vtable->beginArray, "properties", 4); call_virtual(expectCall, context, __LINE__, context->vtable->readInt32, "int", 8); call_virtual(expectCall, context, __LINE__, context->vtable->endStructure); call_virtual(failNthCall, context, 2, SERIALIZATION_ERROR_INCORRECT_TYPE); value = DataValue_deserializeWithSchema(schema, "data", DATA_TYPE_HASH_TABLE, context, true); TestCase_assertIntEqual(value.type, DATA_TYPE_HASH_TABLE); TestCase_assertSizeEqual(hashGetCount(value.value.hashTable), 3); nameValue = hashGet(value.value.hashTable, "name"); TestCase_assertPointerNonNULL(nameValue); TestCase_assertIntEqual(nameValue->type, DATA_TYPE_STRING); TestCase_assertStringEqual(nameValue->value.string, "Hello"); propertiesValue = hashGet(value.value.hashTable, "properties"); TestCase_assertPointerNonNULL(propertiesValue); TestCase_assertIntEqual(propertiesValue->type, DATA_TYPE_ARRAY); propertiesArray = propertiesValue->value.array; TestCase_assertSizeEqual(propertiesArray->count, 0); intValue = hashGet(value.value.hashTable, "int"); TestCase_assertPointerNonNULL(intValue); TestCase_assertIntEqual(intValue->type, DATA_TYPE_INT32); TestCase_assertIntEqual(intValue->value.int32, 8); TestDeserializationContext_finish(context); TestDeserializationContext_dispose(context); valueDispose(&value); DataValueSchema_dispose(schema); } TEST_SUITE(DataSerializerTest, testSerializeGeneric, testDeserializeGeneric, testSerializeWithSchema, testDeserializeWithSchema, testTolerantDeserializeWithSchema)