| #include <catch.hpp> |
| #include <rive/core/binary_reader.hpp> |
| |
| template <typename T> void checkFits() { |
| int64_t min = std::numeric_limits<T>::min(); |
| int64_t max = std::numeric_limits<T>::max(); |
| REQUIRE( rive::fitsIn<T>(max+0)); |
| REQUIRE( rive::fitsIn<T>(min-0)); |
| REQUIRE(!rive::fitsIn<T>(max+1)); |
| REQUIRE(!rive::fitsIn<T>(min-1)); |
| } |
| |
| TEST_CASE("fitsIn checks", "[type_conversions]") { |
| checkFits<int8_t>(); |
| checkFits<uint8_t>(); |
| |
| checkFits<int16_t>(); |
| checkFits<uint16_t>(); |
| |
| checkFits<int32_t>(); |
| checkFits<uint32_t>(); |
| } |
| |
| static uint8_t* packvarint(uint8_t array[], uint64_t value) { |
| while (value > 127) { |
| *array++ = static_cast<uint8_t>(0x80 | (value & 0x7F)); |
| value >>= 7; |
| } |
| *array++ = static_cast<uint8_t>(value); |
| return array; |
| } |
| |
| template <typename T> bool checkAs(uint64_t value) { |
| uint8_t storage[16]; |
| uint8_t* p = storage; |
| |
| p = packvarint(storage, value); |
| rive::BinaryReader reader(rive::Span(storage, p - storage)); |
| |
| auto newValue = reader.readVarUintAs<T>(); |
| |
| if (reader.hasError()) { |
| REQUIRE(newValue == 0); |
| } |
| |
| return !reader.hasError() && value == newValue; |
| } |
| |
| TEST_CASE("range checks", "[binary_reader]") { |
| REQUIRE( checkAs<uint8_t>(100)); |
| REQUIRE( checkAs<uint16_t>(100)); |
| REQUIRE( checkAs<uint32_t>(100)); |
| |
| REQUIRE(!checkAs<uint8_t>(1000)); |
| REQUIRE( checkAs<uint16_t>(1000)); |
| REQUIRE( checkAs<uint32_t>(1000)); |
| |
| REQUIRE(!checkAs<uint8_t>(100000)); |
| REQUIRE(!checkAs<uint16_t>(100000)); |
| REQUIRE( checkAs<uint32_t>(100000)); |
| } |