Просмотр исходного кода

Unit tests for encoding/decoding Variant

Anton Ivanov 4 лет назад
Родитель
Сommit
69b554e92d
1 измененных файлов с 171 добавлено и 0 удалено
  1. 171 0
      tests/test_marshalls.h

+ 171 - 0
tests/test_marshalls.h

@@ -153,6 +153,177 @@ TEST_CASE("[Marshalls] C string encoding") {
 	CHECK(data[4] == 't');
 	CHECK(data[5] == '\0');
 }
+
+TEST_CASE("[Marshalls] NIL Variant encoding") {
+	int r_len;
+	Variant variant;
+	uint8_t buffer[4];
+
+	CHECK(encode_variant(variant, buffer, r_len) == OK);
+	CHECK_MESSAGE(r_len == 4, "Length == 4 bytes for Variant::Type");
+	CHECK_MESSAGE(buffer[0] == 0x00, "Variant::NIL");
+	CHECK(buffer[1] == 0x00);
+	CHECK(buffer[2] == 0x00);
+	CHECK(buffer[3] == 0x00);
+	// No value
+}
+
+TEST_CASE("[Marshalls] INT 32 bit Variant encoding") {
+	int r_len;
+	Variant variant(0x12345678);
+	uint8_t buffer[8];
+
+	CHECK(encode_variant(variant, buffer, r_len) == OK);
+	CHECK_MESSAGE(r_len == 8, "Length == 4 bytes for Variant::Type + 4 bytes for int32_t");
+	CHECK_MESSAGE(buffer[0] == 0x02, "Variant::INT");
+	CHECK(buffer[1] == 0x00);
+	CHECK(buffer[2] == 0x00);
+	CHECK(buffer[3] == 0x00);
+	// Check value
+	CHECK(buffer[4] == 0x78);
+	CHECK(buffer[5] == 0x56);
+	CHECK(buffer[6] == 0x34);
+	CHECK(buffer[7] == 0x12);
+}
+
+TEST_CASE("[Marshalls] INT 64 bit Variant encoding") {
+	int r_len;
+	Variant variant(uint64_t(0x0f123456789abcdef));
+	uint8_t buffer[12];
+
+	CHECK(encode_variant(variant, buffer, r_len) == OK);
+	CHECK_MESSAGE(r_len == 12, "Length == 4 bytes for Variant::Type + 8 bytes for int64_t");
+	CHECK_MESSAGE(buffer[0] == 0x02, "Variant::INT");
+	CHECK(buffer[1] == 0x00);
+	CHECK_MESSAGE(buffer[2] == 0x01, "ENCODE_FLAG_64");
+	CHECK(buffer[3] == 0x00);
+	// Check value
+	CHECK(buffer[4] == 0xef);
+	CHECK(buffer[5] == 0xcd);
+	CHECK(buffer[6] == 0xab);
+	CHECK(buffer[7] == 0x89);
+	CHECK(buffer[8] == 0x67);
+	CHECK(buffer[9] == 0x45);
+	CHECK(buffer[10] == 0x23);
+	CHECK(buffer[11] == 0xf1);
+}
+
+TEST_CASE("[Marshalls] FLOAT single precision Variant encoding") {
+	int r_len;
+	Variant variant(0.15625f);
+	uint8_t buffer[8];
+
+	CHECK(encode_variant(variant, buffer, r_len) == OK);
+	CHECK_MESSAGE(r_len == 8, "Length == 4 bytes for Variant::Type + 4 bytes for float");
+	CHECK_MESSAGE(buffer[0] == 0x03, "Variant::FLOAT");
+	CHECK(buffer[1] == 0x00);
+	CHECK(buffer[2] == 0x00);
+	CHECK(buffer[3] == 0x00);
+	// Check value
+	CHECK(buffer[4] == 0x00);
+	CHECK(buffer[5] == 0x00);
+	CHECK(buffer[6] == 0x20);
+	CHECK(buffer[7] == 0x3e);
+}
+
+TEST_CASE("[Marshalls] FLOAT double precision Variant encoding") {
+	int r_len;
+	Variant variant(0.33333333333333333);
+	uint8_t buffer[12];
+
+	CHECK(encode_variant(variant, buffer, r_len) == OK);
+	CHECK_MESSAGE(r_len == 12, "Length == 4 bytes for Variant::Type + 8 bytes for double");
+	CHECK_MESSAGE(buffer[0] == 0x03, "Variant::FLOAT");
+	CHECK(buffer[1] == 0x00);
+	CHECK_MESSAGE(buffer[2] == 0x01, "ENCODE_FLAG_64");
+	CHECK(buffer[3] == 0x00);
+	// Check value
+	CHECK(buffer[4] == 0x55);
+	CHECK(buffer[5] == 0x55);
+	CHECK(buffer[6] == 0x55);
+	CHECK(buffer[7] == 0x55);
+	CHECK(buffer[8] == 0x55);
+	CHECK(buffer[9] == 0x55);
+	CHECK(buffer[10] == 0xd5);
+	CHECK(buffer[11] == 0x3f);
+}
+
+TEST_CASE("[Marshalls] Invalid data Variant decoding") {
+	Variant variant;
+	int r_len = 0;
+	uint8_t some_buffer[1] = { 0x00 };
+	uint8_t out_of_range_type_buffer[4] = { 0xff }; // Greater than Variant::VARIANT_MAX
+
+	CHECK(decode_variant(variant, some_buffer, /* less than 4 */ 1, &r_len) == ERR_INVALID_DATA);
+	CHECK(r_len == 0);
+
+	CHECK(decode_variant(variant, out_of_range_type_buffer, 4, &r_len) == ERR_INVALID_DATA);
+	CHECK(r_len == 0);
+}
+
+TEST_CASE("[Marshalls] NIL Variant decoding") {
+	Variant variant;
+	int r_len;
+	uint8_t buffer[] = {
+		0x00, 0x00, 0x00, 0x00 // Variant::NIL
+	};
+
+	CHECK(decode_variant(variant, buffer, 4, &r_len) == OK);
+	CHECK(r_len == 4);
+	CHECK(variant == Variant());
+}
+
+TEST_CASE("[Marshalls] INT 32 bit Variant decoding") {
+	Variant variant;
+	int r_len;
+	uint8_t buffer[] = {
+		0x02, 0x00, 0x00, 0x00, // Variant::INT
+		0x78, 0x56, 0x34, 0x12 // value
+	};
+
+	CHECK(decode_variant(variant, buffer, 8, &r_len) == OK);
+	CHECK(r_len == 8);
+	CHECK(variant == Variant(0x12345678));
+}
+
+TEST_CASE("[Marshalls] INT 64 bit Variant decoding") {
+	Variant variant;
+	int r_len;
+	uint8_t buffer[] = {
+		0x02, 0x00, 0x01, 0x00, // Variant::INT & ENCODE_FLAG_64
+		0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0xf1 // value
+	};
+
+	CHECK(decode_variant(variant, buffer, 12, &r_len) == OK);
+	CHECK(r_len == 12);
+	CHECK(variant == Variant(uint64_t(0x0f123456789abcdef)));
+}
+
+TEST_CASE("[Marshalls] FLOAT single precision Variant decoding") {
+	Variant variant;
+	int r_len;
+	uint8_t buffer[] = {
+		0x03, 0x00, 0x00, 0x00, // Variant::FLOAT
+		0x00, 0x00, 0x20, 0x3e // value
+	};
+
+	CHECK(decode_variant(variant, buffer, 8, &r_len) == OK);
+	CHECK(r_len == 8);
+	CHECK(variant == Variant(0.15625f));
+}
+
+TEST_CASE("[Marshalls] FLOAT double precision Variant decoding") {
+	Variant variant;
+	int r_len;
+	uint8_t buffer[] = {
+		0x03, 0x00, 0x01, 0x00, // Variant::FLOAT & ENCODE_FLAG_64
+		0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0x3f // value
+	};
+
+	CHECK(decode_variant(variant, buffer, 12, &r_len) == OK);
+	CHECK(r_len == 12);
+	CHECK(variant == Variant(0.33333333333333333));
+}
 } // namespace TestMarshalls
 
 #endif // TEST_MARSHALLS_H