blob: e69453d57c9d8b26bfa8bbf9261958c4059c21b1 [file] [log] [blame]
#include <catch.hpp>
#include <rive/core/reader.h>
TEST_CASE("uint leb decoder", "[reader]")
{
uint64_t result;
uint8_t encoded1[] = {0x01};
decode_uint_leb(encoded1, encoded1 + 1, &result);
REQUIRE(result == 1);
uint8_t encoded15[] = {0x0F};
decode_uint_leb(encoded15, encoded15 + 1, &result);
REQUIRE(result == 15);
uint8_t encodedMultiByte[] = {0xE5, 0x8E, 0x26};
decode_uint_leb(encodedMultiByte, encodedMultiByte + 3, &result);
REQUIRE(result == 624485);
}
TEST_CASE("string decoder", "[reader]")
{
char* str = strdup("New Artboard");
uint8_t str_bytes[] = {0x4E, 0x65, 0x77, 0x20, 0x41, 0x72, 0x74, 0x62, 0x6F, 0x61, 0x72, 0x64};
// Length of string + 1 is needed to add the null terminator
char* decoded_str = (char*)malloc((13) * sizeof(char));
uint64_t bytes_read = decode_string(12, str_bytes, str_bytes + 12, decoded_str);
REQUIRE(strcmp(str, decoded_str) == 0);
REQUIRE(bytes_read == 12);
bytes_read = decode_string(12, str_bytes, str_bytes + 11, decoded_str);
REQUIRE(bytes_read == 0);
delete str;
delete decoded_str;
}
TEST_CASE("double decoder", "[reader]")
{
double decoded_num;
uint64_t bytes_read;
uint8_t num_bytes_100[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x40};
bytes_read = decode_double(num_bytes_100, num_bytes_100 + 8, &decoded_num);
REQUIRE(decoded_num == 100);
REQUIRE(bytes_read == 8);
uint8_t num_bytes_pi[] = {0x6E, 0x86, 0x1B, 0xF0, 0xF9, 0x21, 0x09, 0x40};
bytes_read = decode_double(num_bytes_pi, num_bytes_pi + 8, &decoded_num);
REQUIRE(decoded_num == 3.14159);
REQUIRE(bytes_read == 8);
uint8_t num_bytes_neg_euler[] = {0x96, 0xB4, 0xE2, 0x1B, 0x0A, 0xBF, 0x05, 0xC0};
bytes_read = decode_double(num_bytes_neg_euler, num_bytes_neg_euler + 8, &decoded_num);
REQUIRE(decoded_num == -2.718281);
REQUIRE(bytes_read == 8);
bytes_read = decode_double(num_bytes_neg_euler, num_bytes_neg_euler + 7, &decoded_num);
REQUIRE(bytes_read == 0);
}
TEST_CASE("float decoder", "[reader]")
{
float decoded_num;
uint64_t bytes_read;
uint8_t num_bytes_100[] = {0x00, 0x00, 0xC8, 0x42};
bytes_read = decode_float(num_bytes_100, num_bytes_100 + 4, &decoded_num);
REQUIRE(decoded_num == 100.0f);
REQUIRE(bytes_read == 4);
uint8_t num_bytes_pi[] = {0xD0, 0x0F, 0x49, 0x40};
bytes_read = decode_float(num_bytes_pi, num_bytes_pi + 4, &decoded_num);
REQUIRE(decoded_num == 3.14159f);
REQUIRE(bytes_read == 4);
uint8_t num_bytes_neg_euler[] = {0x51, 0xF8, 0x2D, 0xC0};
bytes_read = decode_float(num_bytes_neg_euler, num_bytes_neg_euler + 4, &decoded_num);
REQUIRE(decoded_num == -2.718281f);
REQUIRE(bytes_read == 4);
bytes_read = decode_float(num_bytes_neg_euler, num_bytes_neg_euler + 3, &decoded_num);
REQUIRE(bytes_read == 0);
}
TEST_CASE("byte decoder", "[reader")
{
uint8_t decoded_byte;
// luigi: commented this out as it was giving a warning (I added -Wall to
// the compiler flags). Warning was:
//
// ../../rive/test/reader_test.cpp:108:11: warning: unused variable 'bytes_read' [-Wunused-variable]
//
// uint64_t bytes_read;
uint8_t pos = 0;
uint8_t bytes[] = {0x00, 0x00, 0xC8, 0x42};
pos += decode_uint_8(bytes + pos, bytes + 4, &decoded_byte);
REQUIRE(decoded_byte == bytes[pos - 1]);
pos += decode_uint_8(bytes + pos, bytes + 4, &decoded_byte);
REQUIRE(decoded_byte == bytes[pos - 1]);
pos += decode_uint_8(bytes + pos, bytes + 4, &decoded_byte);
REQUIRE(decoded_byte == bytes[pos - 1]);
pos += decode_uint_8(bytes + pos, bytes + 4, &decoded_byte);
REQUIRE(decoded_byte == bytes[pos - 1]);
// overflow
REQUIRE(decode_uint_8(bytes + pos, bytes + 4, &decoded_byte) == 0);
}