| /* |
| * Copyright 2025 Rive |
| */ |
| |
| #include "catch.hpp" |
| |
| #include "rive/object_stream.hpp" |
| #include "rive/math/simd.hpp" |
| #include <array> |
| #include <numeric> |
| |
| using namespace rive; |
| |
| TEST_CASE("ObjectStream", "[ObjectStream]") |
| { |
| ObjectStream<std::string> s; |
| CHECK(s.empty()); |
| s << "hello"; |
| CHECK(!s.empty()); |
| s << "world" |
| << "hi"; |
| CHECK(!s.empty()); |
| s << "rive too"; |
| CHECK(!s.empty()); |
| |
| std::string str, str2, str3; |
| s >> str >> str2 >> str3; |
| CHECK(str == "hello"); |
| CHECK(str2 == "world"); |
| CHECK(str3 == "hi"); |
| CHECK(!s.empty()); |
| s >> str; |
| CHECK(str == "rive too"); |
| CHECK(s.empty()); |
| } |
| |
| TEST_CASE("ObjectStream -- force deque realloc", "[ObjectStream]") |
| { |
| ObjectStream<std::vector<int>> s; |
| for (int i = 0; i < 100; ++i) |
| { |
| std::vector<int> v(i); |
| std::iota(v.begin(), v.end(), i * 123 + 257); |
| s << v; |
| } |
| for (int i = 0; i < 100; ++i) |
| { |
| std::vector<int> v(i), v2; |
| std::iota(v.begin(), v.end(), i * 123 + 257); |
| s >> v2; |
| CHECK(v2.size() == i); |
| CHECK(v == v2); |
| } |
| CHECK(s.empty()); |
| } |
| |
| TEST_CASE("PODStream", "[ObjectStream]") |
| { |
| PODStream s; |
| CHECK(s.empty()); |
| |
| struct Pair |
| { |
| int x; |
| float y; |
| inline bool operator==(const Pair& rhs) const |
| { |
| return x == rhs.x && y == rhs.y; |
| } |
| }; |
| Pair pair = {1, 3.f}; |
| |
| bool boolean = true; |
| vec<3> f3d = {3, 2, 1}; |
| |
| s << pair; |
| CHECK(!s.empty()); |
| s << boolean << f3d; |
| CHECK(!s.empty()); |
| |
| Pair pair2 = {}; |
| bool boolean2 = {}; |
| vec<3> f3d2 = {}; |
| float4 f4d2 = {}; |
| std::array<int, 2> array2 = {}; |
| |
| CHECK(!s.empty()); |
| s >> pair2; |
| CHECK(pair == pair2); |
| |
| CHECK(!s.empty()); |
| s << float4{1, 2, 3, 4} << std::array<int, 2>{1, 2}; |
| |
| CHECK(!s.empty()); |
| s >> boolean2; |
| CHECK(boolean == boolean2); |
| |
| CHECK(!s.empty()); |
| s >> f3d2 >> f4d2; |
| CHECK(simd::all(f3d == f3d2)); |
| CHECK(simd::all(f4d2 == float4{1, 2, 3, 4})); |
| |
| CHECK(!s.empty()); |
| s >> array2; |
| CHECK(array2 == std::array<int, 2>{1, 2}); |
| |
| CHECK(s.empty()); |
| } |
| |
| TEST_CASE("PODStream -- force deque realloc", "[ObjectStream]") |
| { |
| PODStream s; |
| for (int16_t i16 = 0; i16 < 1 << 12; ++i16) |
| { |
| int8_t i8 = static_cast<int8_t>(i16 - 3); |
| int32_t i32 = i16 + 12; |
| int64_t i64 = i32 << 16; |
| int2 i32x2 = {15, i32}; |
| int4 i32x4 = {17, 18, i32, 20}; |
| s << true << false << i8 << i16 << i32 << i64 << i32x2 << i32x4; |
| s << i32x4 << false << i32 << i32x2 << true << i64 << i8 << i16; |
| } |
| for (int16_t i = 0; i < 1 << 12; ++i) |
| { |
| bool b1, b2; |
| int8_t i8; |
| int16_t i16; |
| int32_t i32; |
| int64_t i64; |
| int2 i32x2; |
| int4 i32x4; |
| s >> b1 >> b2 >> i8 >> i16 >> i32 >> i64 >> i32x2 >> i32x4; |
| CHECK(b1 == true); |
| CHECK(b2 == false); |
| CHECK(i8 == static_cast<int8_t>(i16 - 3)); |
| CHECK(i16 == i); |
| CHECK(i32 == i16 + 12); |
| CHECK(i64 == i32 << 16); |
| CHECK(simd::all(i32x2 == int2{15, i32})); |
| CHECK(simd::all(i32x4 == int4{17, 18, i32, 20})); |
| s >> i32x4 >> b1 >> i32 >> i32x2 >> b2 >> i64 >> i8 >> i16; |
| CHECK(b1 == false); |
| CHECK(b2 == true); |
| CHECK(i8 == static_cast<int8_t>(i16 - 3)); |
| CHECK(i16 == i); |
| CHECK(i32 == i16 + 12); |
| CHECK(i64 == i32 << 16); |
| CHECK(simd::all(i32x2 == int2{15, i32})); |
| CHECK(simd::all(i32x4 == int4{17, 18, i32, 20})); |
| } |
| CHECK(s.empty()); |
| } |