Files
Aethera/web_server/tests/Frame_Sampler_Tests.cpp
T
2026-08-29 12:03:22 +08:00

62 lines
2.6 KiB
C++

#include <gtest/gtest.h>
#include <web_server/src/frame_sampling/Frame_Sampler.hpp>
#include <web_server/src/frame_sampling/websocket_pixel/WebSocket_Pixel_Frame.hpp>
#include <cstddef>
#include <cstdint>
#include <memory>
#include <vector>
namespace aethera::web::frame_sampling {
namespace {
std::shared_ptr<const Plot_Pixel_Frame> native_bgra_frame() {
auto pixels = std::make_shared<std::vector<std::byte>>(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<const Plot_Pixel_Frame>(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<std::uint8_t>(packet.bytes[8]), 1U);
EXPECT_EQ(static_cast<std::uint8_t>(packet.bytes[48]), 11U);
EXPECT_EQ(static_cast<std::uint8_t>(packet.bytes[49]), 22U);
EXPECT_EQ(static_cast<std::uint8_t>(packet.bytes[50]), 33U);
EXPECT_EQ(static_cast<std::uint8_t>(packet.bytes[51]), 44U);
}
}