#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("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);
}