module; #include #include #include export module Packet_test; import MMO.Packet; import std; // Encodes TEST(DataEncoding, uint8Min) { std::vector encoded; EXPECT_EQ(MMO::Networking::encodeValue(std::numeric_limits::min(), encoded), 1); EXPECT_EQ(encoded, std::vector{0b10000000}); encoded.clear(); } TEST(DataEncoding, uint8Max) { std::vector encoded; EXPECT_EQ(MMO::Networking::encodeValue(std::numeric_limits::max(), encoded), 2); EXPECT_EQ(encoded, std::vector({ 0b01111111, 0b10000001})); encoded.clear(); } TEST(DataEncoding, int8Min) { std::vector encoded; EXPECT_EQ(MMO::Networking::encodeValue(std::numeric_limits::min(), encoded), 2); EXPECT_EQ(encoded, std::vector({ 0b01000000, 0b11111110})); encoded.clear(); } TEST(DataEncoding, int8Max) { std::vector encoded; EXPECT_EQ(MMO::Networking::encodeValue(std::numeric_limits::max(), encoded), 2); EXPECT_EQ(encoded, std::vector({ 0b00111111,0b10000001,})); encoded.clear(); } TEST(DataEncoding, uint16Min) { std::vector encoded; EXPECT_EQ(MMO::Networking::encodeValue(std::numeric_limits::min(), encoded), 1); EXPECT_EQ(encoded, std::vector{0b10000000}); encoded.clear(); } TEST(DataEncoding, uint16Max) { std::vector encoded; EXPECT_EQ(MMO::Networking::encodeValue(std::numeric_limits::max(), encoded), 3); EXPECT_EQ(encoded, std::vector({ 0b01111111, 0b01111111, 0b10000011})); encoded.clear(); } TEST(DataEncoding, int16Min) { std::vector encoded; EXPECT_EQ(MMO::Networking::encodeValue(std::numeric_limits::min(), encoded), 3); EXPECT_EQ(encoded, std::vector({ 0b01000000, 0, 0b11111100})); encoded.clear(); } TEST(DataEncoding, int16Max) { std::vector encoded; EXPECT_EQ(MMO::Networking::encodeValue(std::numeric_limits::max(), encoded), 3); EXPECT_EQ(encoded, std::vector({ 0b00111111, 0b01111111, 0b10000011})); encoded.clear(); } TEST(DataEncoding, uint32Min) { std::vector encoded; EXPECT_EQ(MMO::Networking::encodeValue(std::numeric_limits::min(), encoded), 1); EXPECT_EQ(encoded, std::vector{0b10000000}); encoded.clear(); } TEST(DataEncoding, uint32Max) { std::vector encoded; EXPECT_EQ(MMO::Networking::encodeValue(std::numeric_limits::max(), encoded), 5); EXPECT_EQ(encoded, std::vector({ 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b10001111})); encoded.clear(); } TEST(DataEncoding, int32Min) { std::vector encoded; EXPECT_EQ(MMO::Networking::encodeValue(std::numeric_limits::min(), encoded), 5); EXPECT_EQ(encoded, std::vector({ 0b01000000, 0, 0, 0, 0b11110000})); encoded.clear(); } TEST(DataEncoding, int32Max) { std::vector encoded; EXPECT_EQ(MMO::Networking::encodeValue(std::numeric_limits::max(), encoded), 5); EXPECT_EQ(encoded, std::vector({ 0b00111111, 0b01111111, 0b01111111, 0b01111111, 0b10001111})); encoded.clear(); } TEST(DataEncoding, uint64Min) { std::vector encoded; EXPECT_EQ(MMO::Networking::encodeValue(std::numeric_limits::min(), encoded), 1); EXPECT_EQ(encoded, std::vector{0b10000000}); encoded.clear(); } TEST(DataEncoding, uint64Max) { std::vector encoded; EXPECT_EQ(MMO::Networking::encodeValue(std::numeric_limits::max(), encoded), 10); EXPECT_EQ(encoded, std::vector({ 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b10000001})); encoded.clear(); } TEST(DataEncoding, int64Min) { std::vector encoded; EXPECT_EQ(MMO::Networking::encodeValue(std::numeric_limits::min(), encoded), 10); EXPECT_EQ(encoded, std::vector({0b01000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11111110})); encoded.clear(); } TEST(DataEncoding, int64Max) { std::vector encoded; EXPECT_EQ(MMO::Networking::encodeValue(std::numeric_limits::max(), encoded), 10); EXPECT_EQ(encoded, std::vector({ 0b00111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b10000001})); encoded.clear(); } TEST(DataEncoding, float0) { const auto value = 0.0f; std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) EXPECT_EQ(MMO::Networking::encodeValue(value, encoded), 1); EXPECT_EQ(encoded, std::vector({ 0b11111111})); encoded.clear(); } TEST(DataEncoding, floatMin) { const auto value = std::numeric_limits::min(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) EXPECT_EQ(MMO::Networking::encodeValue(value, encoded), 6); EXPECT_EQ(encoded, std::vector({ 0b01000010, 0b11111110, 0, 0, 0, 0b10001000})); encoded.clear(); } TEST(DataEncoding, floatLowest) { const auto value = std::numeric_limits::lowest(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) EXPECT_EQ(MMO::Networking::encodeValue(value, encoded), 6); EXPECT_EQ(encoded, std::vector({ 0b00111111, 0b10000001, 0b01000001, 0 ,0, 0b11110000})); encoded.clear(); } TEST(DataEncoding, floatMax) { const auto value = std::numeric_limits::max(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) EXPECT_EQ(MMO::Networking::encodeValue(value, encoded), 6); EXPECT_EQ(encoded, std::vector({ 0b00111111, 0b10000001, 0b00111111, 0b01111111, 0b01111111, 0b10001111})); encoded.clear(); } TEST(DataEncoding, floatNan) { const auto value = std::numeric_limits::quiet_NaN(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) EXPECT_EQ(MMO::Networking::encodeValue(value, encoded), 3); EXPECT_EQ(encoded, std::vector({ 0b01000000, 0b11111110, 0b10000010})); encoded.clear(); } TEST(DataEncoding, floatInfPositive) { const auto value = std::numeric_limits::infinity(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) EXPECT_EQ(MMO::Networking::encodeValue(value, encoded), 3); EXPECT_EQ(encoded, std::vector({ 0b01000000, 0b11111110, 0b10000001})); encoded.clear(); } TEST(DataEncoding, floatInfNegative) { const auto value = -std::numeric_limits::infinity(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) EXPECT_EQ(MMO::Networking::encodeValue(value, encoded), 3); EXPECT_EQ(encoded, std::vector({ 0b01000000, 0b11111110, 0b10000000})); encoded.clear(); } TEST(DataEncoding, double0) { const double value = 0.0; std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) EXPECT_EQ(MMO::Networking::encodeValue(value, encoded), 1); EXPECT_EQ(encoded, std::vector({ 0b10000000 })); encoded.clear(); } TEST(DataEncoding, doubleMin) { const auto value = std::numeric_limits::min(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) EXPECT_EQ(MMO::Networking::encodeValue(value, encoded), 10); EXPECT_EQ(encoded, std::vector({ 0b01000011, 0b11110000, 0, 0, 0, 0,0,0,0,0b10010000})); encoded.clear(); } TEST(DataEncoding, doubleLowest) { const auto value = std::numeric_limits::lowest(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) EXPECT_EQ(MMO::Networking::encodeValue(value, encoded), 10); EXPECT_EQ(encoded, std::vector({ 0, 0b10010000, 0b01000001,0, 0 ,0,0,0,0, 0b11100000})); encoded.clear(); } TEST(DataEncoding, doubleMax) { const auto value = std::numeric_limits::max(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) EXPECT_EQ(MMO::Networking::encodeValue(value, encoded), 10); EXPECT_EQ(encoded, std::vector({ 0, 0b10010000, 0b00111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b10011111})); encoded.clear(); } TEST(DataEncoding, doubleNan) { const auto value = std::numeric_limits::quiet_NaN(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) EXPECT_EQ(MMO::Networking::encodeValue(value, encoded), 3); EXPECT_EQ(encoded, std::vector({ 0b01000000, 0b11100000, 0b10000010})); encoded.clear(); } TEST(DataEncoding, doubleInfPositive) { const auto value = std::numeric_limits::infinity(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) EXPECT_EQ(MMO::Networking::encodeValue(value, encoded), 3); EXPECT_EQ(encoded, std::vector({ 0b01000000, 0b11100000, 0b10000001})); encoded.clear(); } TEST(DataEncoding, doubleInfNegative) { const auto value = -std::numeric_limits::infinity(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) EXPECT_EQ(MMO::Networking::encodeValue(value, encoded), 3); EXPECT_EQ(encoded, std::vector({ 0b01000000, 0b11100000, 0b10000000})); encoded.clear(); } // Decodes TEST(DataDecoding, uint8Min) { std::vector encoded = { 0b10000000 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::min()); } TEST(DataDecoding, uint8Max) { std::vector encoded = { 0b01111111, 0b10000001 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::max()); } TEST(DataDecoding, int8Min) { std::vector encoded = { 0b01000000, 0b11111110 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::min()); } TEST(DataDecoding, int8Max) { std::vector encoded = { 0b00111111, 0b10000001, }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::max()); } TEST(DataDecoding, uint16Min) { std::vector encoded = { 0b10000000 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::min()); } TEST(DataDecoding, uint16Max) { std::vector encoded = { 0b01111111, 0b01111111, 0b10000011 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::max()); } TEST(DataDecoding, int16Min) { std::vector encoded = { 0b01000000, 0, 0b11111100 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::min()); } TEST(DataDecoding, int16Max) { std::vector encoded = { 0b00111111, 0b01111111, 0b10000011 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::max()); } TEST(DataDecoding, uint32Min) { std::vector encoded = { 0b10000000 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::min()); } TEST(DataDecoding, uint32Max) { std::vector encoded = { 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b10001111 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::max()); } TEST(DataDecoding, int32Min) { std::vector encoded = { 0b01000000, 0, 0, 0, 0b11110000 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::min()); } TEST(DataDecoding, int32Max) { std::vector encoded = { 0b00111111, 0b01111111, 0b01111111, 0b01111111, 0b10001111 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::max()); } TEST(DataDecoding, uint64Min) { std::vector encoded = { 0b10000000 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::min()); } TEST(DataDecoding, uint64Max) { std::vector encoded = { 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b10000001 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::max()); } TEST(DataDecoding, int64Min) { std::vector encoded = { 0b01000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11111110 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::min()); } TEST(DataDecoding, int64Max) { std::vector encoded = { 0b00111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b10000001 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::max()); } TEST(DataDecoding, float0) { std::vector encoded = { 0b11111111 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), 0.0f); } TEST(DataDecoding, floatMin) { std::vector encoded = { 0b01000010, 0b11111110, 0, 0, 0, 0b10001000 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::min()); } TEST(DataDecoding, floatLowest) { std::vector encoded = { 0b00111111, 0b10000001, 0b01000001, 0, 0, 0b11110000 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::lowest()); } TEST(DataDecoding, floatMax) { std::vector encoded = { 0b00111111, 0b10000001, 0b00111111, 0b01111111, 0b01111111, 0b10001111 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::max()); } TEST(DataDecoding, floatNan) { std::vector encoded = { 0b01000000, 0b11111110, 0b10000010 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_TRUE(std::isnan(value.value())); } TEST(DataDecoding, floatInfPositive) { std::vector encoded = { 0b01000000, 0b11111110, 0b10000001 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::infinity()); } TEST(DataDecoding, floatInfNegative) { std::vector encoded = { 0b01000000, 0b11111110, 0b10000000 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), -std::numeric_limits::infinity()); } TEST(DataDecoding, double0) { std::vector encoded = { 0b10000000 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), 0.0f); } TEST(DataDecoding, doubleMin) { std::vector encoded = { 0b01000011, 0b11110000, 0, 0, 0, 0, 0, 0, 0, 0b10010000 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::min()); } TEST(DataDecoding, doubleLowest) { std::vector encoded = { 0, 0b10010000, 0b01000001, 0, 0, 0, 0, 0, 0, 0b11100000 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::lowest()); } TEST(DataDecoding, doubleMax) { std::vector encoded = { 0, 0b10010000, 0b00111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b01111111, 0b10011111 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::max()); } TEST(DataDecoding, doubleNan) { std::vector encoded = { 0b01000000, 0b11100000, 0b10000010 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_TRUE(std::isnan(value.value())); } TEST(DataDecoding, doubleInfPositive) { std::vector encoded = { 0b01000000, 0b11100000, 0b10000001 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), std::numeric_limits::infinity()); } TEST(DataDecoding, doubleInfNegative) { std::vector encoded = { 0b01000000, 0b11100000, 0b10000000 }; int read = 0; auto value = MMO::Networking::decodeValue(encoded, read); EXPECT_TRUE(value.has_value()); EXPECT_EQ(read, encoded.size()); EXPECT_EQ(value.value(), -std::numeric_limits::infinity()); } template T randomValue() { std::random_device rd; std::mt19937_64 gen(rd()); std::uniform_int_distribution, int64_t, uint64_t>> dis( std::numeric_limits::min(), std::numeric_limits::max()); return static_cast(dis(gen)); } const auto valueAttempts = 100; TEST(DataEnDecoding, uint8) { for (int i = 0; i < valueAttempts; ++i) { const auto value = randomValue(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } } TEST(DataEnDecoding, int8) { for (int i = 0; i < valueAttempts; ++i) { const auto value = randomValue(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } } TEST(DataEnDecoding, uint16) { for (int i = 0; i < valueAttempts; ++i) { const auto value = randomValue(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } } TEST(DataEnDecoding, int16) { for (int i = 0; i < valueAttempts; ++i) { const auto value = randomValue(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } } TEST(DataEnDecoding, uint32) { for (int i = 0; i < valueAttempts; ++i) { const auto value = randomValue(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } } TEST(DataEnDecoding, int32) { for (int i = 0; i < valueAttempts; ++i) { const auto value = randomValue(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } } TEST(DataEnDecoding, uint64) { for (int i = 0; i < valueAttempts; ++i) { const auto value = randomValue(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } } TEST(DataEnDecoding, int64) { for (int i = 0; i < valueAttempts; ++i) { const auto value = randomValue(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } } TEST(DataEnDecoding, floats) { for (int i = 0; i < valueAttempts; ++i) { const auto value = static_cast(randomValue()) / (static_cast(randomValue()) + 1); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } } TEST(DataEnDecoding, float0) { const auto value = 0.0f; std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } TEST(DataEnDecoding, floatMin) { const auto value = std::numeric_limits::min(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } TEST(DataEnDecoding, floatLowest) { const auto value = std::numeric_limits::lowest(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } TEST(DataEnDecoding, floatMax) { const auto value = std::numeric_limits::min(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } TEST(DataEnDecoding, floatNan) { const auto value = std::numeric_limits::quiet_NaN(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_TRUE(std::isnan(decoded.value())); } TEST(DataEnDecoding, floatInfPositive) { const auto value = std::numeric_limits::infinity(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } TEST(DataEnDecoding, floatInfNegative) { const auto value = -std::numeric_limits::infinity(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } TEST(DataEnDecoding, doubles) { for (int i = 0; i < valueAttempts; ++i) { const auto value = static_cast(randomValue()) / (static_cast(randomValue()) + 1); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } } TEST(DataEnDecoding, double0) { const auto value = 0.0; std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } TEST(DataEnDecoding, doubleMin) { const auto value = std::numeric_limits::min(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } TEST(DataEnDecoding, doubleLowest) { const auto value = std::numeric_limits::lowest(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } TEST(DataEnDecoding, doubleMax) { const auto value = std::numeric_limits::min(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } TEST(DataEnDecoding, doubleNan) { const auto value = std::numeric_limits::quiet_NaN(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_TRUE(std::isnan(decoded.value())); } TEST(DataEnDecoding, doubleInfPositive) { const auto value = std::numeric_limits::infinity(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } TEST(DataEnDecoding, doubleInfNegative) { const auto value = -std::numeric_limits::infinity(); std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } TEST(DataEnDecoding, arrayOfValue) { const std::vector value{ randomValue(), randomValue(), randomValue(), randomValue(), randomValue(), randomValue(), }; std::vector encoded; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) MMO::Networking::encodeValue(value, encoded); auto decoded = MMO::Networking::decodeValue>(encoded); EXPECT_TRUE(decoded.has_value()); EXPECT_EQ(decoded.value(), value); } TEST(MultiWriteTest, outOfOrderIsInOrder) { const std::vector value{ randomValue(), randomValue(), randomValue(), randomValue(), randomValue(), randomValue(), }; std::vector encodedInOrder; std::vector encodedOutOrder; // Length is variable so we can't predict it (easily, there is math for it but I've lost it) for (const auto& v : value) { MMO::Networking::encodeValue(v, encodedInOrder); } for (int i = static_cast(value.size()) - 1; i >= 0; --i) { MMO::Networking::encodeValue(value[i], encodedOutOrder, 0); } EXPECT_EQ(encodedInOrder, encodedOutOrder); } TEST(Packet, CreateFrom) { MMO::Networking::Packet packet; packet.write(0xDEADBEEF); packet.write(-1); auto packetData = packet.finalizePacket(); auto packet2Exp = MMO::Networking::Packet::createPacket(packetData); EXPECT_TRUE(packet2Exp.has_value()); auto packet2 = packet2Exp.value(); { auto readValue = packet2.read(); EXPECT_TRUE(readValue.has_value()); EXPECT_EQ(*readValue, 0xDEADBEEF); } { auto readValue = packet2.read(); EXPECT_TRUE(readValue.has_value()); EXPECT_EQ(*readValue, -1); } }