134 lines
6.0 KiB
C++
134 lines
6.0 KiB
C++
#include <gtest/gtest.h>
|
||
#include "DatasetDetailTab.hpp"
|
||
#include "IDatasetChartStrategy.hpp" // geopro::controller(控制器层)
|
||
#include "panels/chart/ErtInversionStrategy.hpp"
|
||
#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<TabSpec> 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<Fake>());
|
||
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<Fake>());
|
||
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);
|
||
}
|
||
|
||
// T4 双击详情联动 gate 契约(决策6):DatasetDetailController::supports() 直接委托本注册表的 supports()。
|
||
// 三维体(dd_voxel/dd_radar_3d)等无详情页策略 → supports()=false → 双击只适配、静默不开面板;
|
||
// 5 种已注册类型 supports()=true → 双击联动打开中下方详情页。此测锁定这条 gate 的真实注册集行为。
|
||
TEST(ChartStrategyRegistry, T4GateSilentForVolumeTypesSupportsRegistered) {
|
||
ChartStrategyRegistry reg;
|
||
reg.add(std::make_unique<geopro::app::ErtInversionStrategy>());
|
||
reg.add(std::make_unique<geopro::app::MeasurementStrategy>());
|
||
reg.add(std::make_unique<geopro::app::GrMeasurementStrategy>());
|
||
reg.add(std::make_unique<geopro::app::TrajectoryStrategy>());
|
||
reg.add(std::make_unique<geopro::app::GridStrategy>());
|
||
// 有详情页 → 双击联动打开中下方详情面板。
|
||
EXPECT_TRUE(reg.supports("dd_inversion_data"));
|
||
EXPECT_TRUE(reg.supports("dd_ert_measurement_data"));
|
||
EXPECT_TRUE(reg.supports("dd_ert_measurement_gr_data"));
|
||
EXPECT_TRUE(reg.supports("dd_trajectory_data"));
|
||
EXPECT_TRUE(reg.supports("dd_grid"));
|
||
// 无详情页(三维体/切片/异常)→ 静默:双击只适配、不开面板、不弹状态栏。
|
||
EXPECT_FALSE(reg.supports("dd_voxel"));
|
||
EXPECT_FALSE(reg.supports("dd_radar_3d"));
|
||
EXPECT_FALSE(reg.supports("dd_slice"));
|
||
EXPECT_FALSE(reg.supports("dd_anomaly"));
|
||
}
|
||
|
||
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");
|
||
}
|