#include #include "DatasetDetailTab.hpp" #include "IDatasetChartStrategy.hpp" // geopro::controller(控制器层) #include "panels/chart/MeasurementStrategy.hpp" #include "panels/chart/GrMeasurementStrategy.hpp" #include "panels/chart/TrajectoryStrategy.hpp" #include "panels/chart/GridStrategy.hpp" using namespace geopro::controller; namespace { struct Fake : IDatasetChartStrategy { std::string ddCode() const override { return "dd_inversion_data"; } std::vector tabs() const override { return { {QStringLiteral("原数据"), ViewKind::Scatter, QStringLiteral("inversion.scatter"), /*lazy*/ false, /*paginated*/ false}, {QStringLiteral("网格数据"), ViewKind::FilledContour, QStringLiteral("inversion.grid"), /*lazy*/ true, /*paginated*/ false}, }; } }; } TEST(ChartStrategyRegistry, FindsRegisteredAndDegradesUnknown) { ChartStrategyRegistry reg; reg.add(std::make_unique()); EXPECT_TRUE(reg.supports("dd_inversion_data")); EXPECT_NE(reg.find("dd_inversion_data"), nullptr); EXPECT_FALSE(reg.supports("dd_unknown")); EXPECT_EQ(reg.find("dd_unknown"), nullptr); } TEST(ChartStrategyRegistry, ExposesTabSpecsFromStrategy) { ChartStrategyRegistry reg; reg.add(std::make_unique()); auto* s = reg.find("dd_inversion_data"); ASSERT_NE(s, nullptr); const auto tabs = s->tabs(); ASSERT_EQ(tabs.size(), 2u); EXPECT_FALSE(tabs[0].lazy); // 原数据非 lazy EXPECT_TRUE(tabs[1].lazy); // 网格数据 lazy EXPECT_EQ(tabs[1].kind, ViewKind::FilledContour); } TEST(MeasurementStrategy, DrivesTwoTabsScatterAndTable) { geopro::app::MeasurementStrategy s; EXPECT_EQ(s.ddCode(), "dd_ert_measurement_data"); const auto tabs = s.tabs(); ASSERT_EQ(tabs.size(), 2u); // 散点图:Scatter,非 lazy。 EXPECT_EQ(tabs[0].title.toStdString(), std::string("散点图")); EXPECT_EQ(tabs[0].kind, ViewKind::Scatter); EXPECT_FALSE(tabs[0].lazy); EXPECT_EQ(tabs[0].loaderKey.toStdString(), "ert_measurement.scatter"); // 数据列表:Table,lazy。 EXPECT_EQ(tabs[1].title.toStdString(), std::string("数据列表")); EXPECT_EQ(tabs[1].kind, ViewKind::Table); EXPECT_TRUE(tabs[1].lazy); EXPECT_EQ(tabs[1].loaderKey.toStdString(), "ert_measurement.rows"); } TEST(GrMeasurementStrategy, DrivesBarAndTableTabs) { geopro::app::GrMeasurementStrategy s; EXPECT_EQ(s.ddCode(), "dd_ert_measurement_gr_data"); const auto tabs = s.tabs(); ASSERT_EQ(tabs.size(), 2u); // 柱状图:Bar,非 lazy。 EXPECT_EQ(tabs[0].title.toStdString(), std::string("柱状图")); EXPECT_EQ(tabs[0].kind, ViewKind::Bar); EXPECT_FALSE(tabs[0].lazy); EXPECT_EQ(tabs[0].loaderKey.toStdString(), "gr.bar"); // 列表:Table,lazy。 EXPECT_EQ(tabs[1].title.toStdString(), std::string("列表")); EXPECT_EQ(tabs[1].kind, ViewKind::Table); EXPECT_TRUE(tabs[1].lazy); EXPECT_EQ(tabs[1].loaderKey.toStdString(), "gr.rows"); } TEST(TrajectoryStrategy, DrivesMapTableElevationTabs) { geopro::app::TrajectoryStrategy s; EXPECT_EQ(s.ddCode(), "dd_trajectory_data"); const auto tabs = s.tabs(); ASSERT_EQ(tabs.size(), 3u); // 地图:WebMap,首位/非 lazy(默认页,loaderKey traj.map → MapPayload;端点 trajectory/line)。 EXPECT_EQ(tabs[0].title.toStdString(), std::string("地图")); EXPECT_EQ(tabs[0].kind, ViewKind::WebMap); EXPECT_FALSE(tabs[0].lazy); EXPECT_EQ(tabs[0].loaderKey.toStdString(), "traj.map"); // 列表:Table,lazy。 EXPECT_EQ(tabs[1].title.toStdString(), std::string("列表")); EXPECT_EQ(tabs[1].kind, ViewKind::Table); EXPECT_TRUE(tabs[1].lazy); EXPECT_EQ(tabs[1].loaderKey.toStdString(), "traj.rows"); // 高程:LineProfile,非 lazy。 EXPECT_EQ(tabs[2].title.toStdString(), std::string("高程")); EXPECT_EQ(tabs[2].kind, ViewKind::LineProfile); EXPECT_FALSE(tabs[2].lazy); EXPECT_EQ(tabs[2].loaderKey.toStdString(), "traj.elev"); } TEST(GridStrategy, DrivesSinglePaginatedListTab) { geopro::app::GridStrategy s; EXPECT_EQ(s.ddCode(), "dd_grid"); const auto tabs = s.tabs(); ASSERT_EQ(tabs.size(), 1u); // 列表:Table,非 lazy,分页(paginated)。loaderKey grid.rows → TablePayload。 EXPECT_EQ(tabs[0].title.toStdString(), std::string("列表")); EXPECT_EQ(tabs[0].kind, ViewKind::Table); EXPECT_FALSE(tabs[0].lazy); EXPECT_TRUE(tabs[0].paginated); EXPECT_EQ(tabs[0].loaderKey.toStdString(), "grid.rows"); }