#include #include #include #include #include #include #include namespace aethera::web::frame_sampling { namespace { std::shared_ptr native_bgra_frame() { auto pixels = std::make_shared>(16U); (*pixels)[0] = std::byte{11}; (*pixels)[1] = std::byte{22}; (*pixels)[2] = std::byte{33}; (*pixels)[3] = std::byte{44}; return std::make_shared(Plot_Pixel_Frame{ std::move(pixels), Plot_Pixel_Layout::bgra8, std::chrono::microseconds{12'345}, 1, 9, 1, 9, 2, 2}); } } TEST(Frame_Sampler, First_Deadline_Samples_Latest_Without_Format_Conversion) { Frame_Sampler sampler(30.0, 2, 2, 1, {"plot"}, 0); ASSERT_EQ(sampler.accept_frame(0, native_bgra_frame()), Frame_Sampler::Accept_Frame_Result::accepted); EXPECT_TRUE(sampler.has_pending_frame()); const auto sample = sampler.sample(); ASSERT_TRUE(sample); EXPECT_FALSE(sampler.has_pending_frame()); EXPECT_EQ(sample->composition.layout, Plot_Pixel_Layout::bgra8); EXPECT_EQ(sample->composition.pixels[0], std::byte{11}); EXPECT_EQ(sample->composition.pixels[1], std::byte{22}); EXPECT_EQ(sample->composition.pixels[2], std::byte{33}); EXPECT_EQ(sample->composition.pixels[3], std::byte{44}); EXPECT_EQ(sample->tick.sequence, 9U); EXPECT_DOUBLE_EQ(sample->tick.time_milliseconds, 12.345); EXPECT_FALSE(sampler.sample()); const auto state = sampler.state(); EXPECT_DOUBLE_EQ(state.target_frame_rate_fps, 30.0); EXPECT_EQ(state.sampled_frames, 1U); EXPECT_EQ(state.early_ticks, 0U); } TEST(WebSocket_Pixel_Frame, Header_Describes_Unchanged_Native_Payload) { Frame_Sampler sampler(30.0, 2, 2, 1, {"plot"}, 0); ASSERT_EQ(sampler.accept_frame(0, native_bgra_frame()), Frame_Sampler::Accept_Frame_Result::accepted); const auto sample = sampler.sample(); ASSERT_TRUE(sample); const auto packet = websocket_pixel::pack_websocket_pixel_frame(*sample); ASSERT_EQ(packet.bytes.size(), 48U + 16U); EXPECT_EQ(packet.bytes.substr(0, 4), "AERP"); EXPECT_EQ(static_cast(packet.bytes[8]), 1U); EXPECT_EQ(static_cast(packet.bytes[48]), 11U); EXPECT_EQ(static_cast(packet.bytes[49]), 22U); EXPECT_EQ(static_cast(packet.bytes[50]), 33U); EXPECT_EQ(static_cast(packet.bytes[51]), 44U); } }