116 lines
4.3 KiB
C++
116 lines
4.3 KiB
C++
#include <gtest/gtest.h>
|
|
#include <QSignalSpy>
|
|
#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{}); }
|
|
void fireFailed() { emit failed(QStringLiteral("x")); }
|
|
};
|
|
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);
|
|
}
|
|
|
|
TEST(DatasetDetailController, EmitsGridReadyOnDone) {
|
|
StubAsyncRepo repo;
|
|
controller::DatasetDetailController c(repo);
|
|
QSignalSpy spy(&c, &controller::DatasetDetailController::gridReady);
|
|
c.loadGridData("ds1", "dd_inversion_data");
|
|
repo.lastGrid->fireDone();
|
|
EXPECT_EQ(spy.count(), 1);
|
|
}
|
|
|
|
TEST(DatasetDetailController, EmitsLoadFailedOnGridFailed) {
|
|
StubAsyncRepo repo;
|
|
controller::DatasetDetailController c(repo);
|
|
QSignalSpy spy(&c, &controller::DatasetDetailController::loadFailed);
|
|
c.loadGridData("ds1", "dd_inversion_data");
|
|
repo.lastGrid->fireFailed();
|
|
EXPECT_EQ(spy.count(), 1);
|
|
}
|
|
|
|
TEST(DatasetDetailController, DropsLateGridSignalFromAbortedLoad) {
|
|
StubAsyncRepo repo;
|
|
controller::DatasetDetailController c(repo);
|
|
QSignalSpy spy(&c, &controller::DatasetDetailController::gridReady);
|
|
c.loadGridData("dsA", "dd_inversion_data");
|
|
StubGridLoad* a = repo.lastGrid;
|
|
c.loadGridData("dsB", "dd_inversion_data"); // 替换 → 旧句柄被 abort
|
|
StubGridLoad* b = repo.lastGrid;
|
|
EXPECT_TRUE(a->aborted);
|
|
a->fireDone(); // 旧句柄迟到 → 身份比对丢弃
|
|
EXPECT_EQ(spy.count(), 0);
|
|
b->fireDone(); // 当前句柄 → 正常
|
|
EXPECT_EQ(spy.count(), 1);
|
|
}
|