#include #include #include #include #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 0–1 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(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(v[0].markType), 3); }