geopro/tests/app/test_inversion_process_ops.cpp

131 lines
5.7 KiB
C++

#include <gtest/gtest.h>
#include <QJsonArray>
#include <QJsonObject>
#include "panels/chart/InversionProcessOps.hpp"
using namespace geopro::app;
// ── I1/O1 网格化 toGrid 体 ────────────────────────────────────────────────
TEST(InversionProcessOps, GridToBodyFieldsLinear) {
GridToParams p;
p.dsObjectId = QStringLiteral("ds1");
p.actionCode = QStringLiteral("alg_kriging");
p.xMin = -1.0; p.xMax = 99.0; p.yMin = -2.0; p.yMax = 50.0;
p.vMin = 5.0; p.vMax = 500.0;
p.xSize = 100; p.ySize = 60;
p.xSpacing = 1.0; p.ySpacing = 0.86;
p.logFormat = false;
auto b = buildGridToBody(p);
EXPECT_EQ(b.value("dsObjectId").toString().toStdString(), "ds1");
EXPECT_EQ(b.value("actionCode").toString().toStdString(), "alg_kriging");
EXPECT_DOUBLE_EQ(b.value("xminValue").toDouble(), -1.0);
EXPECT_DOUBLE_EQ(b.value("xmaxValue").toDouble(), 99.0);
EXPECT_DOUBLE_EQ(b.value("yminValue").toDouble(), -2.0);
EXPECT_DOUBLE_EQ(b.value("ymaxValue").toDouble(), 50.0);
EXPECT_EQ(b.value("xsize").toInt(), 100); // 小写
EXPECT_EQ(b.value("ysize").toInt(), 60); // 小写
EXPECT_DOUBLE_EQ(b.value("xSpacing").toDouble(), 1.0); // 驼峰
EXPECT_DOUBLE_EQ(b.value("ySpacing").toDouble(), 0.86); // 驼峰
EXPECT_DOUBLE_EQ(b.value("vminValue").toDouble(), 5.0);
EXPECT_DOUBLE_EQ(b.value("vmaxValue").toDouble(), 500.0);
EXPECT_EQ(b.value("saveDataValueType").toInt(), 1); // 线性=1
}
TEST(InversionProcessOps, GridToBodyLogFormat) {
GridToParams p;
p.logFormat = true;
EXPECT_EQ(buildGridToBody(p).value("saveDataValueType").toInt(), 2); // 对数=2
}
// ── I3 白化 whitenData 体 ──────────────────────────────────────────────────
TEST(InversionProcessOps, WhitenMethod1ExternalSendsBoolWay) {
WhitenParams p;
p.dsObjectId = QStringLiteral("ds1");
p.whiteningMethod = 1;
p.boundaryExtension = 3.5;
p.whiteningType = 0; // 外部 → whitenedWay=true
auto b = buildWhitenBody(p);
EXPECT_EQ(b.value("whiteningMethod").toInt(), 1);
EXPECT_DOUBLE_EQ(b.value("boundaryExtension").toDouble(), 3.5);
EXPECT_TRUE(b.value("whitenedWay").toBool());
EXPECT_FALSE(b.contains("whitenedDataId"));
}
TEST(InversionProcessOps, WhitenMethod1InternalWayFalse) {
WhitenParams p;
p.whiteningMethod = 1;
p.whiteningType = 1; // 内部 → whitenedWay=false
EXPECT_FALSE(buildWhitenBody(p).value("whitenedWay").toBool());
}
TEST(InversionProcessOps, WhitenMethod2SendsFileId) {
WhitenParams p;
p.whiteningMethod = 2;
p.whitenedDataId = QStringLiteral("file-9");
auto b = buildWhitenBody(p);
EXPECT_EQ(b.value("whitenedDataId").toString().toStdString(), "file-9");
EXPECT_FALSE(b.contains("boundaryExtension"));
}
TEST(InversionProcessOps, WhitenMethod3SendsSubType) {
WhitenParams p;
p.whiteningMethod = 3;
p.modelWhiteningSubType = 1; // 矩形
auto b = buildWhitenBody(p);
EXPECT_EQ(b.value("modelWhiteningSubType").toInt(), 1);
}
// ── I4 滤波 applyFilter 体 + code 映射 ──────────────────────────────────────
TEST(InversionProcessOps, BoundaryAndNoDataCodes) {
EXPECT_EQ(filterBoundaryCode(QStringLiteral("whitening")), 1);
EXPECT_EQ(filterBoundaryCode(QStringLiteral("skip")), 2);
EXPECT_EQ(filterBoundaryCode(QStringLiteral("edgePoint")), 3);
EXPECT_EQ(filterBoundaryCode(QStringLiteral("filling")), 4);
EXPECT_EQ(filterNoDataCode(QStringLiteral("expansion")), 1);
EXPECT_EQ(filterNoDataCode(QStringLiteral("retain")), 2);
EXPECT_EQ(filterNoDataCode(QStringLiteral("skip")), 3);
EXPECT_EQ(filterNoDataCode(QStringLiteral("filling")), 4);
}
TEST(InversionProcessOps, FilterApplyBodyFields) {
FilterApplyParams p;
p.dsObjectId = QStringLiteral("ds1");
p.dataEdge = QStringLiteral("filling");
p.dataEdgeValue = 12.0;
p.noDataPoints = QStringLiteral("skip");
p.noDataValue = 0.0;
p.number = 3;
p.row = 3; p.column = 3;
p.matrix = {{0, 1, 0}, {1, 1, 1}, {0, 1, 0}};
p.filteringMethod = QStringLiteral("中值滤波");
auto b = buildFilterApplyBody(p);
EXPECT_EQ(b.value("boundary").toInt(), 4); // filling
EXPECT_DOUBLE_EQ(b.value("boundaryValue").toDouble(), 12.0);
EXPECT_EQ(b.value("noDataPoints").toInt(), 3); // skip
EXPECT_DOUBLE_EQ(b.value("noDataPointsValue").toDouble(), 0.0);
EXPECT_EQ(b.value("number").toInt(), 3);
EXPECT_EQ(b.value("row").toInt(), 3);
EXPECT_EQ(b.value("column").toInt(), 3);
EXPECT_EQ(b.value("filteringMethod").toString().toStdString(), std::string("中值滤波"));
const auto form = b.value("rowColumValue").toObject().value("form").toArray();
ASSERT_EQ(form.size(), 3);
EXPECT_DOUBLE_EQ(form.at(1).toArray().at(1).toDouble(), 1.0); // 中心
EXPECT_DOUBLE_EQ(form.at(0).toArray().at(0).toDouble(), 0.0); // 角
}
TEST(InversionProcessOps, NewFilterBodyFields) {
auto b = buildNewFilterBody(QStringLiteral("自定义滤波器1"), QStringLiteral("pj1"),
QStringLiteral("grp-7"), {{1, 1}, {1, 1}});
EXPECT_EQ(b.value("type").toInt(), 1);
EXPECT_EQ(b.value("name").toString().toStdString(), std::string("自定义滤波器1"));
EXPECT_EQ(b.value("projectId").toString().toStdString(), "pj1");
EXPECT_EQ(b.value("parentId").toString().toStdString(), "grp-7");
const auto form = b.value("rowColumValue").toObject().value("form").toArray();
ASSERT_EQ(form.size(), 2);
EXPECT_EQ(form.at(0).toArray().size(), 2);
}