// // SerializerTests.cpp // // Copyright 2022 Dale Glass // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // #include "SerializerTests.h" #include #include #include QTEST_GUILESS_MAIN(SerializerTests) void SerializerTests::initTestCase() { } void SerializerTests::testCreate() { DataSerializer s; QCOMPARE(s.length(), 0); QCOMPARE(s.capacity(), DataSerializer::DEFAULT_SIZE); QCOMPARE(s.isEmpty(), true); DataDeserializer d(s); QCOMPARE(d.length(), 0); } void SerializerTests::testAdd() { DataSerializer s; s << (qint8)1; QCOMPARE(s.length(), 1); QCOMPARE(s.isEmpty(), false); s << (quint8)-1; QCOMPARE(s.length(), 2); s << (qint16)0xaabb; QCOMPARE(s.length(), 4); s << (quint16)-18000; QCOMPARE(s.length(), 6); s << (qint32)0xCCDDEEFF; QCOMPARE(s.length(), 10); s << (quint32)-1818000000; QCOMPARE(s.length(), 14); s << "Hello, world!"; QCOMPARE(s.length(), 28); glm::vec3 v{1.f,2.f,3.f}; s << v; QCOMPARE(s.length(), 40); s << 1.2345f; QCOMPARE(s.length(), 44); qDebug() << s; } void SerializerTests::testAddAndRead() { DataSerializer s; glm::vec3 v3_a{1.f, 3.1415f, 2.71828f}; glm::vec3 v3_b; glm::vec4 v4_a{3.1415f, 2.71828f, 1.4142f, 1.6180f}; glm::vec4 v4_b; glm::ivec2 iv2_a{10, 24}; glm::ivec2 iv2_b; float f_a = 1.2345f; float f_b; s << (qint8)1; s << (qint16)0xaabb; s << (qint32)0xccddeeff; s << v3_a; s << v4_a; s << iv2_a; s << f_a; qint8 i8; qint16 i16; qint32 i32; DataDeserializer d(s); d >> i8; d >> i16; d >> i32; d >> v3_b; d >> v4_b; d >> iv2_b; d >> f_b; qDebug() << d; QCOMPARE(i8, (qint8)1); QCOMPARE(i16, (qint16)0xaabb); QCOMPARE(i32, (qint32)0xccddeeff); QCOMPARE(v3_a, v3_b); QCOMPARE(v4_a, v4_b); QCOMPARE(iv2_a, iv2_b); QCOMPARE(f_a, f_b); } void SerializerTests::testReadPastEnd() { DataSerializer s; qint8 i8; qint16 i16; s << (qint8)1; DataDeserializer d(s); d >> i8; QCOMPARE(d.pos(), 1); d.rewind(); d >> i16; QCOMPARE(d.pos(), 0); } void SerializerTests::testWritePastEnd() { qint8 i8 = 255; qint16 i16 = 65535; char buf[16]; // 1 byte buffer, we can write 1 byte memset(buf, 0, sizeof(buf)); DataSerializer s1(buf, 1); s1 << i8; QCOMPARE(s1.pos(), 1); QCOMPARE(s1.isOverflow(), false); QCOMPARE(buf[0], i8); // 1 byte buffer, we can't write 2 bytes memset(buf, 0, sizeof(buf)); DataSerializer s2(buf, 1); s2 << i16; QCOMPARE(s2.pos(), 0); QCOMPARE(s2.isOverflow(), true); QCOMPARE(buf[0], 0); // We didn't write QCOMPARE(buf[1], 0); } void SerializerTests::benchmarkEncodingDynamicAlloc() { QBENCHMARK { DataSerializer s; glm::vec3 v3_a{1.f, 3.1415f, 2.71828f}; glm::vec3 v3_b; glm::vec4 v4_a{3.1415f, 2.71828f, 1.4142f, 1.6180f}; glm::vec4 v4_b; glm::ivec2 iv2_a{10, 24}; glm::ivec2 iv2_b; s << (qint8)1; s << (qint16)0xaabb; s << (qint32)0xccddeeff; s << v3_a; s << v4_a; s << iv2_a; } } void SerializerTests::benchmarkEncodingStaticAlloc() { char buf[1024]; QBENCHMARK { DataSerializer s(buf, sizeof(buf)); glm::vec3 v3_a{1.f, 3.1415f, 2.71828f}; glm::vec3 v3_b; glm::vec4 v4_a{3.1415f, 2.71828f, 1.4142f, 1.6180f}; glm::vec4 v4_b; glm::ivec2 iv2_a{10, 24}; glm::ivec2 iv2_b; s << (qint8)1; s << (qint16)0xaabb; s << (qint32)0xccddeeff; s << v3_a; s << v4_a; s << iv2_a; } } void SerializerTests::benchmarkDecoding() { DataSerializer s; qint8 q8 = 1; qint16 q16 = 0xaabb; qint32 q32 = 0xccddeeff; glm::vec3 v3_a{1.f, 3.1415f, 2.71828f}; glm::vec3 v3_b; glm::vec4 v4_a{3.1415f, 2.71828f, 1.4142f, 1.6180f}; glm::vec4 v4_b; glm::ivec2 iv2_a{10, 24}; glm::ivec2 iv2_b; s << q8; s << q16; s << q32; s << v3_a; s << v4_a; s << iv2_a; QBENCHMARK { DataDeserializer d(s); d >> q8; d >> q16; d >> q32; d >> v3_a; d >> v4_a; d >> iv2_a; } } void SerializerTests::cleanupTestCase() { }