#include #include #include #include #include "./core/serialize/serialize_value.h" #include "./core/serializer.h" #include "./core/value.h" using namespace Splash; /*************/ TEST_CASE("Testing type change") { SUBCASE("Converting from a bool") { auto value = Value(true); CHECK(value.as() == true); CHECK(value.as() == "true"); } SUBCASE("Converting from a float") { auto value = Value(5.f); CHECK(value.as() == 5); CHECK(value.as() == 5); CHECK(value.as() == 5.f); CHECK(value.as().find("5.0") == 0); } SUBCASE("Converting from a integer") { auto value = Value(5); CHECK(value.as() == 5); CHECK(value.as() == 5); CHECK(value.as() == 5.f); CHECK(value.as().find("5") == 0); } SUBCASE("Converting from a string") { auto value = Value("15"); CHECK(value.as() == 15); CHECK(value.as() == 15); CHECK(value.as() == 15.f); CHECK(value.as() == "15"); } } /*************/ bool compareIntToValues(const std::vector& a, const Values& b) { if (a.size() != b.size()) return false; int index = 0; for (const auto& value : b) { if (a[index] != value.as()) return false; ++index; } return true; } TEST_CASE("Testing initialization from iterators") { auto buffer = std::vector((size_t)128); std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution dist(0, 512); for (auto& b : buffer) b = dist(gen); auto values = Value(buffer.begin(), buffer.end()); CHECK(compareIntToValues(buffer, values.as())); CHECK(values.size() == buffer.size()); } /*************/ TEST_CASE("Testing Values comparison") { auto values = Value(); for (int i = 0; i < 128; ++i) values.as().push_back(7); auto valueInt = Value(42); auto valueFloat = Value(M_PI); auto valueString = Value("Le train de tes injures roule sur le rail de mon indifférence"); CHECK(values == values); CHECK(valueInt == 42); CHECK(valueFloat == M_PI); CHECK(valueString == "Le train de tes injures roule sur le rail de mon indifférence"); CHECK(values != valueInt); CHECK(valueString != valueFloat); } /*************/ TEST_CASE("Testing buffer in Value") { Value::Buffer buffer(256); std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution dist(0, 255); for (uint32_t i = 0; i < buffer.size(); ++i) buffer[i] = dist(gen); Value value(buffer); bool isEqual = true; for (uint32_t i = 0; i < buffer.size(); ++i) isEqual &= (buffer[i] == value.as()[i]); CHECK(isEqual); auto otherValue = value; CHECK(otherValue == value); isEqual = true; for (uint32_t i = 0; i < buffer.size(); ++i) isEqual &= (buffer[i] == otherValue.as()[i]); CHECK(isEqual); } /*************/ TEST_CASE("Testing Value serialization") { std::string testString("One to rule them all"); CHECK(Serial::getSize(Value(true)) == sizeof(Value::Type) + sizeof(bool)); CHECK(Serial::getSize(Value(42)) == sizeof(Value::Type) + sizeof(int64_t)); CHECK(Serial::getSize(Value(2.71828f)) == sizeof(Value::Type) + sizeof(double)); CHECK(Serial::getSize(Value(testString)) == sizeof(Value::Type) + sizeof(uint32_t) + testString.size() * sizeof(char)); CHECK(Serial::getSize(Value(Values({3.14159f, 42, testString}))) == sizeof(Value::Type) + sizeof(uint32_t) + sizeof(Value::Type) * 3 + sizeof(double) + sizeof(int64_t) + sizeof(uint32_t) + sizeof(char) * testString.size()); { std::vector buffer; Serial::serialize(Value(42), buffer); auto bufferPtr = buffer.data(); CHECK(*reinterpret_cast(bufferPtr) == Value::Type::integer); bufferPtr += sizeof(Value::Type); CHECK(*reinterpret_cast(bufferPtr) == 42); } { std::vector buffer; Serial::serialize(Value(3.14159), buffer); auto bufferPtr = buffer.data(); CHECK(*reinterpret_cast(bufferPtr) == Value::Type::real); bufferPtr += sizeof(Value::Type); CHECK(*reinterpret_cast(bufferPtr) == 3.14159); } { std::vector buffer; Serial::serialize(Value(testString), buffer); auto bufferPtr = buffer.data(); CHECK(*reinterpret_cast(bufferPtr) == Value::Type::string); bufferPtr += sizeof(Value::Type); auto stringLength = *reinterpret_cast(bufferPtr); CHECK(stringLength == testString.size()); bufferPtr += sizeof(uint32_t); CHECK(std::string(reinterpret_cast(bufferPtr), stringLength) == testString); } { std::vector buffer; auto data = Value(Values({42, 3.14159})); Serial::serialize(data, buffer); auto bufferPtr = buffer.data(); CHECK(*reinterpret_cast(bufferPtr) == Value::Type::values); bufferPtr += sizeof(Value::Type); CHECK(*reinterpret_cast(bufferPtr) == data.size()); bufferPtr += sizeof(uint32_t); CHECK(*reinterpret_cast(bufferPtr) == Value::Type::integer); bufferPtr += sizeof(Value::Type); CHECK(*reinterpret_cast(bufferPtr) == data.as()[0].as()); bufferPtr += sizeof(int64_t); CHECK(*reinterpret_cast(bufferPtr) == Value::Type::real); bufferPtr += sizeof(Value::Type); CHECK(*reinterpret_cast(bufferPtr) == data.as()[1].as()); } { std::vector buffer; auto data = Value(false); Serial::serialize(data, buffer); auto outData = Serial::deserialize(buffer); CHECK(data == outData); } { std::vector buffer; auto data = Value(42); Serial::serialize(data, buffer); auto outData = Serial::deserialize(buffer); CHECK(data == outData); } { std::vector buffer; auto data = Value(3.14159); Serial::serialize(data, buffer); auto outData = Serial::deserialize(buffer); CHECK(data == outData); } { std::vector buffer; auto data = Value(testString); Serial::serialize(data, buffer); auto outData = Serial::deserialize(buffer); CHECK(data == outData); } { std::vector buffer; auto data = Value(Values({42, 2.71828, testString})); Serial::serialize(data, buffer); auto outData = Serial::deserialize(buffer); CHECK(data == outData); } { Value::Buffer inputBuffer(256); std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution dist(0, 255); for (uint32_t i = 0; i < inputBuffer.size(); ++i) inputBuffer[i] = dist(gen); std::vector buffer; auto data = Value(inputBuffer); Serial::serialize(data, buffer); auto outData = Serial::deserialize(buffer); CHECK(data == outData); } }