3D 第一个控件成功显示

This commit is contained in:
2026-08-14 11:07:38 +08:00
parent 02c60679e4
commit 38231dbc1c
28 changed files with 2758 additions and 28 deletions
+43 -15
View File
@@ -34,7 +34,7 @@ Gallery_Request gallery_request(Gallery_Request_Kind kind, std::string message)
std::string open_message(std::string_view mode) {
return std::string(
R"({"category":"event","type":"gallery_open","case":"datoviz_3d","frame_mode":")") +
R"({"category":"event","type":"gallery_open","case":"point_3d","frame_mode":")") +
std::string(mode) + R"("})";
}
@@ -181,7 +181,7 @@ TEST(RenderiveWebDatovizGallery, CatalogUsesOnlyThreeDimensionalActions) {
const auto catalog = nlohmann::json::parse(Gallery_Protocol::catalog_json());
const auto item = std::find_if(
catalog.at("cases").begin(), catalog.at("cases").end(),
[](const nlohmann::json& value) { return value.at("id") == "datoviz_3d"; });
[](const nlohmann::json& value) { return value.at("id") == "point_3d"; });
ASSERT_NE(item, catalog.at("cases").end());
EXPECT_EQ(item->at("category"), "3D");
EXPECT_EQ(item->at("control_count"), 0);
@@ -193,11 +193,11 @@ TEST(RenderiveWebDatovizGallery, CatalogUsesOnlyThreeDimensionalActions) {
R"({"resources":[],"observers":[],"render_plan":null,"performance_capture":null})";
const auto state_for = [&](Gallery_Frame_Mode mode) {
return nlohmann::json::parse(Gallery_Protocol::case_json_from_controls(
"datoviz_3d", empty_controls, "{}", {}, mode, false));
"point_3d", empty_controls, "{}", {}, mode, false));
};
const std::set<std::string> common{
"add_sphere", "move_sphere", "remove_sphere", "reset_camera",
"sphere_churn", "toggle_projection"};
"add_point", "orbit_points", "remove_point", "point_churn",
"reset_points"};
auto expected = common;
expected.insert({"mode_prepare", "mode_refresh", "mode_render", "mode_discard"});
EXPECT_EQ(action_ids(state_for(Gallery_Frame_Mode::Manual)), expected);
@@ -239,12 +239,39 @@ TEST(RenderiveWebDatovizGallery, AutomaticLowLatencyFramesCarryAnimatedState) {
expect_actual_datoviz_pixels(later, 560, 320);
}
TEST(RenderiveWebDatovizGallery, WebPointerEventsReachTheDatovizController) {
Gallery_Plot_Session session;
ASSERT_EQ(open_scene(session, "low_latency").at("type"), "case_state");
const std::string before = request_pixels(session);
Pointer_Event press(Event_Type::Pointer_Press);
press.position = {210.0, 135.0};
press.button = Mouse_Button::Left;
EXPECT_FALSE(session.handle(Web_Event{press}).has_value());
Pointer_Event move(Event_Type::Pointer_Move);
move.position = {330.0, 190.0};
move.buttons = 1;
EXPECT_FALSE(session.handle(Web_Event{move}).has_value());
move.position = {390.0, 225.0};
EXPECT_FALSE(session.handle(Web_Event{move}).has_value());
Pointer_Event release(Event_Type::Pointer_Release);
release.position = move.position;
release.button = Mouse_Button::Left;
EXPECT_FALSE(session.handle(Web_Event{release}).has_value());
const std::string after = request_pixels(session);
expect_actual_datoviz_pixels(after, 560, 320);
EXPECT_NE(after, before);
}
TEST(RenderiveWebDatovizGallery, ManualRenderUsesThePreparedLogicalState) {
Gallery_Plot_Session session;
ASSERT_EQ(open_scene(session, "manual").at("type"), "case_state");
ASSERT_EQ(invoke_action(session, "move_sphere").at("type"), "case_state");
ASSERT_EQ(invoke_action(session, "orbit_points").at("type"), "case_state");
ASSERT_EQ(invoke_action(session, "mode_prepare").at("type"), "case_state");
ASSERT_EQ(invoke_action(session, "move_sphere").at("type"), "case_state");
ASSERT_EQ(invoke_action(session, "orbit_points").at("type"), "case_state");
ASSERT_EQ(invoke_action(session, "mode_refresh").at("type"), "case_state");
ASSERT_EQ(invoke_action(session, "mode_render").at("type"), "case_state");
const std::string prepared = request_pixels(session);
@@ -288,7 +315,7 @@ TEST(RenderiveWebDatovizGallery, AddedAndChurnedVisualsAreActuallyRemoved) {
ASSERT_EQ(open_scene(session, "manual").at("type"), "case_state");
const std::string baseline = request_pixels(session);
ASSERT_EQ(invoke_action(session, "add_sphere").at("type"), "case_state");
ASSERT_EQ(invoke_action(session, "add_point").at("type"), "case_state");
manual_render_cycle(session);
const std::string added = request_pixels(session);
EXPECT_NE(added, baseline);
@@ -314,23 +341,24 @@ TEST(RenderiveWebDatovizGallery, AddedAndChurnedVisualsAreActuallyRemoved) {
const auto green_y = centroid_y([](unsigned red, unsigned green, unsigned blue) {
return green > red + 20U && green > blue + 20U;
});
const auto yellow_y = centroid_y([](unsigned red, unsigned green, unsigned blue) {
return red > 100U && green > 100U && blue < 100U;
const auto cyan_y = centroid_y([](unsigned red, unsigned green, unsigned blue) {
return green > red + 50U && blue > red + 50U &&
std::abs(static_cast<int>(green) - static_cast<int>(blue)) < 30;
});
ASSERT_TRUE(green_y.has_value());
ASSERT_TRUE(yellow_y.has_value());
EXPECT_LT(*yellow_y, *green_y)
ASSERT_TRUE(cyan_y.has_value());
EXPECT_GT(*cyan_y, *green_y)
<< "Frame_3D_View must expose top-left-origin RGBA rows";
ASSERT_EQ(invoke_action(session, "remove_sphere").at("type"), "case_state");
ASSERT_EQ(invoke_action(session, "remove_point").at("type"), "case_state");
manual_render_cycle(session);
const std::string removed = request_pixels(session);
EXPECT_EQ(removed, baseline);
const auto churned = invoke_action(session, "sphere_churn");
const auto churned = invoke_action(session, "point_churn");
ASSERT_EQ(churned.at("type"), "case_state");
EXPECT_EQ(churned.at("telemetry").at("kernel_observer").at("last_event"),
"sphere_churned");
"point_churned");
const std::string after_churn = request_pixels(session);
expect_actual_datoviz_pixels(after_churn, 560, 320);
EXPECT_EQ(after_churn, baseline);
+2 -2
View File
@@ -228,10 +228,10 @@ TEST(RenderiveWebGallery, AdminiveCatalogCoversEveryControlCaseAndThreeModes) {
EXPECT_EQ(catalog.at("protocol"), "renderive.control-gallery");
EXPECT_EQ(catalog.at("protocol_version"), 4);
EXPECT_EQ(catalog.at("case_descriptor").at("protocol"), "adminive.resource");
EXPECT_EQ(catalog.at("cases").size(), 8U);
EXPECT_EQ(catalog.at("cases").size(), 9U);
EXPECT_EQ(catalog.at("frame_modes").size(), 3U);
EXPECT_EQ(catalog.at("coverage").at("page_count"), 3);
EXPECT_EQ(catalog.at("coverage").at("canvas_count"), 24);
EXPECT_EQ(catalog.at("coverage").at("canvas_count"), 27);
EXPECT_GT(catalog.at("coverage").at("manual_control_count").get<std::size_t>(), 180U);
EXPECT_GT(catalog.at("coverage").at("manual_action_count").get<std::size_t>(), 50U);
EXPECT_EQ(catalog.at("coverage").at("frequency_modes"),