88 lines
3.5 KiB
C++
88 lines
3.5 KiB
C++
#include <gtest/gtest.h>
|
||
|
||
#include <cmath>
|
||
|
||
#include <QJsonObject>
|
||
|
||
#include "panels/chart/ScatterDataOps.hpp"
|
||
|
||
using namespace geopro::app;
|
||
using geopro::core::ScatterField;
|
||
|
||
TEST(ScatterDataOps, ValueTypeFromCode) {
|
||
EXPECT_EQ(scatterValueTypeFromCode(QStringLiteral("linearity")), ScatterValueType::Linearity);
|
||
EXPECT_EQ(scatterValueTypeFromCode(QStringLiteral("inverse")), ScatterValueType::Inverse);
|
||
EXPECT_EQ(scatterValueTypeFromCode(QStringLiteral("logarithm")), ScatterValueType::Logarithm);
|
||
// 未知回退线性。
|
||
EXPECT_EQ(scatterValueTypeFromCode(QStringLiteral("xyz")), ScatterValueType::Linearity);
|
||
}
|
||
|
||
TEST(ScatterDataOps, ApplyValueTypeLinearIsIdentity) {
|
||
std::vector<double> v{1.0, 10.0, 100.0};
|
||
auto out = applyScatterValueType(v, ScatterValueType::Linearity);
|
||
ASSERT_EQ(out.size(), 3u);
|
||
EXPECT_DOUBLE_EQ(out[0], 1.0);
|
||
EXPECT_DOUBLE_EQ(out[2], 100.0);
|
||
}
|
||
|
||
TEST(ScatterDataOps, ApplyValueTypeInverse) {
|
||
std::vector<double> v{2.0, 0.0, -4.0};
|
||
auto out = applyScatterValueType(v, ScatterValueType::Inverse);
|
||
EXPECT_DOUBLE_EQ(out[0], 0.5);
|
||
EXPECT_DOUBLE_EQ(out[1], 0.0); // v==0 → 保持 0(避免 inf)
|
||
EXPECT_DOUBLE_EQ(out[2], -0.25);
|
||
}
|
||
|
||
TEST(ScatterDataOps, ApplyValueTypeLog) {
|
||
std::vector<double> v{100.0, 0.0, -5.0};
|
||
auto out = applyScatterValueType(v, ScatterValueType::Logarithm);
|
||
EXPECT_DOUBLE_EQ(out[0], 2.0); // log10(100)
|
||
EXPECT_DOUBLE_EQ(out[1], 0.0); // v<=0 → 保持原值
|
||
EXPECT_DOUBLE_EQ(out[2], -5.0); // v<=0 → 保持原值
|
||
}
|
||
|
||
TEST(ScatterDataOps, CollectIdsForHideTakesVisible) {
|
||
ScatterField f;
|
||
f.id = {"a", "b", "c", ""};
|
||
f.displayStatus = {0, 1, 0, 0}; // a,c 可见;b 隐藏;空 id 跳过
|
||
// 隐藏:取可见点(a, c)。
|
||
auto hideIds = collectScatterIds(f, /*hide*/ true);
|
||
ASSERT_EQ(hideIds.size(), 2);
|
||
EXPECT_EQ(hideIds.at(0).toString().toStdString(), "a");
|
||
EXPECT_EQ(hideIds.at(1).toString().toStdString(), "c");
|
||
}
|
||
|
||
TEST(ScatterDataOps, CollectIdsForShowTakesHidden) {
|
||
ScatterField f;
|
||
f.id = {"a", "b", "c"};
|
||
f.displayStatus = {0, 1, 1}; // b,c 隐藏
|
||
auto showIds = collectScatterIds(f, /*hide*/ false);
|
||
ASSERT_EQ(showIds.size(), 2);
|
||
EXPECT_EQ(showIds.at(0).toString().toStdString(), "b");
|
||
EXPECT_EQ(showIds.at(1).toString().toStdString(), "c");
|
||
}
|
||
|
||
TEST(ScatterDataOps, FilterBodyFields) {
|
||
auto body = buildScatterFilterBody(QStringLiteral("ds1"), QStringLiteral("R0"), -10.5, 200.0);
|
||
EXPECT_EQ(body.value("sourceDsObjectId").toString().toStdString(), "ds1");
|
||
EXPECT_EQ(body.value("sourceVFieldCode").toString().toStdString(), "R0");
|
||
EXPECT_DOUBLE_EQ(body.value("min").toDouble(), -10.5);
|
||
EXPECT_DOUBLE_EQ(body.value("max").toDouble(), 200.0);
|
||
}
|
||
|
||
TEST(ScatterDataOps, SaveRawDataBodyNewHasName) {
|
||
auto body = buildSaveRawDataBody(QStringLiteral("ds1"), /*operationType*/ 1,
|
||
QStringLiteral("新数据"));
|
||
EXPECT_EQ(body.value("dsId").toString().toStdString(), "ds1");
|
||
EXPECT_EQ(body.value("operationType").toInt(), 1);
|
||
EXPECT_TRUE(body.contains("name"));
|
||
EXPECT_EQ(body.value("name").toString().toStdString(), std::string("新数据"));
|
||
}
|
||
|
||
TEST(ScatterDataOps, SaveRawDataBodyOverwriteOmitsName) {
|
||
auto body = buildSaveRawDataBody(QStringLiteral("ds1"), /*operationType*/ 0,
|
||
QStringLiteral("ignored"));
|
||
EXPECT_EQ(body.value("operationType").toInt(), 0);
|
||
EXPECT_FALSE(body.contains("name")); // 覆盖不带 name
|
||
}
|