Files
Renderive/render_3D/tests/Point_Render_Integration_Tests.cpp
T
2026-08-14 11:07:38 +08:00

106 lines
3.7 KiB
C++

#include "render_3D/Point_Demo.h"
#include <gtest/gtest.h>
#include <algorithm>
#include <array>
#include <cstddef>
#include <cstdint>
#include <exception>
#include <memory>
#include <string>
namespace renderive::render_3d {
namespace {
struct Event_Point {
float x{};
float y{};
};
std::size_t colored_pixel_count(const Pixel_Frame& frame) {
if (frame.rgba8.size() < 4)
return 0;
const auto* bytes = reinterpret_cast<const std::uint8_t*>(frame.rgba8.data());
const std::array<std::uint8_t, 4> background{
bytes[0], bytes[1], bytes[2], bytes[3]};
std::size_t result{};
for (std::size_t offset = 0; offset + 3 < frame.rgba8.size(); offset += 4) {
result += bytes[offset] != background[0] ||
bytes[offset + 1] != background[1] ||
bytes[offset + 2] != background[2] ||
bytes[offset + 3] != background[3];
}
return result;
}
TEST(PointRenderIntegration, RendersRealRgbaAndResizes) {
try {
auto demo = make_point_demo(Scene_Options{.viewport = {320, 200}});
ASSERT_TRUE(demo.scene->request_frame());
auto first = demo.scene->latest_frame();
ASSERT_NE(first, nullptr);
EXPECT_EQ(first->extent, (Extent{320, 200}));
EXPECT_EQ(first->rgba8.size(), 320U * 200U * 4U);
EXPECT_GT(colored_pixel_count(*first), 100U);
demo.scene->resize({480, 270});
ASSERT_TRUE(demo.scene->request_frame());
auto resized = demo.scene->latest_frame();
ASSERT_NE(resized, nullptr);
EXPECT_EQ(resized->extent, (Extent{480, 270}));
EXPECT_EQ(resized->rgba8.size(), 480U * 270U * 4U);
EXPECT_GT(colored_pixel_count(*resized), 100U);
} catch (const std::exception& error) {
GTEST_SKIP() << "Vulkan/Datoviz unavailable: " << error.what();
}
}
TEST(PointRenderIntegration, KernelEventsReachDatovizArcballOnItsDomain) {
try {
auto demo = make_point_demo(Scene_Options{.viewport = {320, 200}});
ASSERT_TRUE(demo.scene->request_frame());
const auto before = demo.scene->latest_frame()->rgba8;
::renderive::Basic_Pointer_Event<Event_Point> press(
::renderive::Event_Type::Pointer_Press);
press.position = {120.0F, 90.0F};
press.button = ::renderive::Mouse_Button::Left;
demo.scene->dispatch(press);
::renderive::Basic_Pointer_Event<Event_Point> move(
::renderive::Event_Type::Pointer_Move);
move.position = {210.0F, 125.0F};
move.buttons = 1;
demo.scene->dispatch(move);
move.position = {245.0F, 145.0F};
demo.scene->dispatch(move);
::renderive::Basic_Pointer_Event<Event_Point> release(
::renderive::Event_Type::Pointer_Release);
release.position = move.position;
release.button = ::renderive::Mouse_Button::Left;
demo.scene->dispatch(release);
ASSERT_TRUE(demo.scene->request_frame());
const auto after_drag = demo.scene->latest_frame();
ASSERT_NE(after_drag, nullptr);
EXPECT_NE(after_drag->rgba8, before);
::renderive::Basic_Wheel_Event<Event_Point> wheel;
wheel.position = {160.0F, 100.0F};
wheel.pixel_delta_y = 180.0;
wheel.angle_delta_y = -216.0;
demo.scene->dispatch(wheel);
ASSERT_TRUE(demo.scene->request_frame());
const auto after_wheel = demo.scene->latest_frame();
ASSERT_NE(after_wheel, nullptr);
EXPECT_GT(colored_pixel_count(*after_wheel), 100U);
EXPECT_NE(after_wheel->rgba8, after_drag->rgba8);
} catch (const std::exception& error) {
GTEST_SKIP() << "Vulkan/Datoviz unavailable: " << error.what();
}
}
} // namespace
} // namespace renderive::render_3d