#include #include #include "DatasetDetailController.hpp" #include "repo/IAsyncDatasetRepository.hpp" #include "api/DatasetLoadHandles.hpp" using namespace geopro; namespace { // 桩句柄:不声明 Q_OBJECT —— 发射继承自 data::ChartLoad/GridLoad 的信号、override abort。 struct StubChartLoad : data::ChartLoad { bool aborted = false; void abort() override { aborted = true; } void fireDone() { emit done(data::ChartParts{}); } void fireFailed() { emit failed(QStringLiteral("x")); } }; struct StubGridLoad : data::GridLoad { bool aborted = false; void abort() override { aborted = true; } void fireDone() { emit done(data::GridParts{}); } }; struct StubAsyncRepo : data::IAsyncDatasetRepository { StubChartLoad* lastChart = nullptr; StubGridLoad* lastGrid = nullptr; data::ChartLoad* loadChartAsync(const std::string&) override { lastChart = new StubChartLoad; return lastChart; } data::GridLoad* loadGridAsync(const std::string&) override { lastGrid = new StubGridLoad; return lastGrid; } }; } TEST(DatasetDetailController, EmitsChartReadyOnDone) { StubAsyncRepo repo; controller::DatasetDetailController c(repo); QSignalSpy spy(&c, &controller::DatasetDetailController::chartReady); c.openDataset("ds1", "dd_inversion_data"); repo.lastChart->fireDone(); EXPECT_EQ(spy.count(), 1); } TEST(DatasetDetailController, EmitsLoadFailedOnFailed) { StubAsyncRepo repo; controller::DatasetDetailController c(repo); QSignalSpy spy(&c, &controller::DatasetDetailController::loadFailed); c.openDataset("ds1", "dd_inversion_data"); repo.lastChart->fireFailed(); EXPECT_EQ(spy.count(), 1); } TEST(DatasetDetailController, UnsupportedTypeFailsImmediately) { StubAsyncRepo repo; controller::DatasetDetailController c(repo); QSignalSpy spy(&c, &controller::DatasetDetailController::loadFailed); c.openDataset("ds1", "dd_other"); EXPECT_EQ(spy.count(), 1); EXPECT_EQ(repo.lastChart, nullptr); // 未发起加载 } TEST(DatasetDetailController, AbortsPreviousOnReopen) { StubAsyncRepo repo; controller::DatasetDetailController c(repo); c.openDataset("dsA", "dd_inversion_data"); StubChartLoad* a = repo.lastChart; c.openDataset("dsB", "dd_inversion_data"); // 替换 EXPECT_TRUE(a->aborted); // 旧句柄被 abort } TEST(DatasetDetailController, DropsLateSignalFromAbortedLoad) { StubAsyncRepo repo; controller::DatasetDetailController c(repo); QSignalSpy spy(&c, &controller::DatasetDetailController::chartReady); c.openDataset("dsA", "dd_inversion_data"); StubChartLoad* a = repo.lastChart; c.openDataset("dsB", "dd_inversion_data"); StubChartLoad* b = repo.lastChart; a->fireDone(); // 旧句柄迟到 → 身份比对丢弃 EXPECT_EQ(spy.count(), 0); b->fireDone(); // 当前句柄 → 正常 EXPECT_EQ(spy.count(), 1); }