geopro/tests/data/test_dataset_chart_dto.cpp

103 lines
5.0 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <gtest/gtest.h>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include "dto/DatasetChartDto.hpp"
using namespace geopro::data::dto;
static QJsonObject obj(const char* json) {
return QJsonDocument::fromJson(json).object();
}
TEST(DatasetChartDto, ParsesInversionGrid) {
auto d = obj(R"({"x":[0,1],"y":[0,1,2],"v":[[1,2],[3,4],[5,6]],"vmin":1,"vmax":6})");
auto g = parseInversionGrid(d);
EXPECT_EQ(g.nx(), 2); EXPECT_EQ(g.ny(), 3);
EXPECT_DOUBLE_EQ(g.valueAt(1, 2), 6.0);
EXPECT_DOUBLE_EQ(g.vmax, 6.0);
}
TEST(DatasetChartDto, ParsesColorBar) {
// Real API colorBar format: MIXED hex (#RRGGBB) and CSS rgba() with alpha in 01 scale
// (verified live: lvl/colorGradation/getDetail returns e.g. ["1.51","rgba(0, 0, 170, 1)"]).
// Every stop must render OPAQUE (alpha=255); the rgba a=1 must map to 255, not 1.
const char* colorBarJson =
"{\"properties\":{\"colorBar\":["
"[\"0.00\",\"#00008B\"],"
"[\"1.51\",\"rgba(0, 0, 170, 1)\"],"
"[\"60.77\",\"#FFFF00\"],"
"[\"138.20\",\"rgba(255, 128, 0, 1)\"]]}}";
auto d = obj(colorBarJson);
auto cs = parseColorBar(d);
auto stops = cs.stops();
ASSERT_EQ(stops.size(), 4u);
EXPECT_DOUBLE_EQ(stops[0].first, 0.0);
EXPECT_DOUBLE_EQ(stops[1].first, 1.51);
// hex stop → exact rgb, opaque
EXPECT_EQ(stops[0].second.r, 0); EXPECT_EQ(stops[0].second.g, 0);
EXPECT_EQ(stops[0].second.b, 0x8B); EXPECT_EQ(stops[0].second.a, 255);
// rgba(a=1) stop → exact rgb, OPAQUE (regression: was alpha=1 under Bit255 → near-transparent)
EXPECT_EQ(stops[1].second.r, 0); EXPECT_EQ(stops[1].second.g, 0);
EXPECT_EQ(stops[1].second.b, 170); EXPECT_EQ(stops[1].second.a, 255);
EXPECT_EQ(stops[3].second.r, 255); EXPECT_EQ(stops[3].second.g, 128);
EXPECT_EQ(stops[3].second.b, 0); EXPECT_EQ(stops[3].second.a, 255);
// every stop opaque
for (const auto& s : stops) EXPECT_EQ(s.second.a, 255) << "value=" << s.first;
}
TEST(DatasetChartDto, ParsesAnomalyPolyline) {
auto arr = QJsonDocument::fromJson(
R"([{"exceptionName":"A1","exceptionTypeName":"AnomalyZone","exceptionMarkType":2,
"legend":{"polylineColor":"#0D0101","polylineWidth":4,"polylineShape":"dash"},
"location":{"coordinate":[{"x":1,"y":2},{"x":3,"y":4}]}}])").array();
auto v = parseDatasetAnomalies(arr);
ASSERT_EQ(v.size(), 1u);
EXPECT_EQ(v[0].name, "A1");
EXPECT_EQ(static_cast<int>(v[0].markType), 2);
ASSERT_EQ(v[0].localPts.size(), 2u);
EXPECT_DOUBLE_EQ(v[0].localPts[1].x, 3.0);
EXPECT_TRUE(v[0].dashed);
}
TEST(DatasetChartDto, ParsesAnomalyLatLonAndEastNorth) {
// 对照原版 drawerExceptionInfo经纬度 latitudeLongitude.latLon[].{longitude,latitude}、
// 投影 geographicalCoordinates.coordinates[].{northCoord,eastCoord}x=northCoord y=eastCoord
auto arr = QJsonDocument::fromJson(
R"([{"id":"exc-2","exceptionName":"A2","exceptionMarkType":2,
"location":{"coordinate":[{"x":1,"y":2}]},
"latitudeLongitude":{"latLon":[{"longitude":120.5,"latitude":30.25}]},
"geographicalCoordinates":{"coordinates":[{"northCoord":3350000.0,"eastCoord":500000.0}]}}])")
.array();
auto v = parseDatasetAnomalies(arr);
ASSERT_EQ(v.size(), 1u);
ASSERT_EQ(v[0].lonLatPts.size(), 1u);
EXPECT_DOUBLE_EQ(v[0].lonLatPts[0].x, 120.5); // 经度
EXPECT_DOUBLE_EQ(v[0].lonLatPts[0].y, 30.25); // 纬度
ASSERT_EQ(v[0].eastNorthPts.size(), 1u);
EXPECT_DOUBLE_EQ(v[0].eastNorthPts[0].x, 3350000.0); // northCoord → X
EXPECT_DOUBLE_EQ(v[0].eastNorthPts[0].y, 500000.0); // eastCoord → Y
}
TEST(DatasetChartDto, AnomalyWithoutGeoCoordsLeavesVectorsEmpty) {
// 响应未携带经纬度/投影 → 两向量为空(详情坐标系下拉退化为仅「图形坐标」,与原版一致)。
auto arr = QJsonDocument::fromJson(
R"([{"id":"exc-3","exceptionName":"A3","exceptionMarkType":2,
"location":{"coordinate":[{"x":1,"y":2}]}}])")
.array();
auto v = parseDatasetAnomalies(arr);
ASSERT_EQ(v.size(), 1u);
EXPECT_TRUE(v[0].lonLatPts.empty());
EXPECT_TRUE(v[0].eastNorthPts.empty());
}
TEST(DatasetChartDto, ParsesAnomalyIdentityFields) {
// I10/I11/I12 需要 id删除/更新/定位)、备注、异常类型 id、创建时间。
auto arr = QJsonDocument::fromJson(
R"([{"id":"exc-1","exceptionName":"A1","exceptionTypeName":"Zone",
"exceptionTypeId":"type-9","exceptionMarkType":3,"remark":"备注X",
"createTime":"2026-06-22 10:00:00",
"location":{"coordinate":[{"x":1,"y":2},{"x":3,"y":4},{"x":5,"y":6}]}}])").array();
auto v = parseDatasetAnomalies(arr);
ASSERT_EQ(v.size(), 1u);
EXPECT_EQ(v[0].id, "exc-1");
EXPECT_EQ(v[0].exceptionTypeId, "type-9");
EXPECT_EQ(v[0].remark, "备注X");
EXPECT_EQ(v[0].createTime, "2026-06-22 10:00:00");
EXPECT_EQ(static_cast<int>(v[0].markType), 3);
}