geopro/tests/data/test_gr_dto.cpp

124 lines
6.6 KiB
C++
Raw 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 <QJsonArray>
#include <QJsonDocument>
#include "dto/GrMeasurementDto.hpp"
using namespace geopro::data::dto;
using geopro::core::TableColumnKind;
namespace {
// 取自真实夹具 tests/fixtures/dd/ert-gr-rows.json 的 data 数组(裁剪至 20 行,逐字一致)。
// 与 test_measurement_dto.cpp 同法:内联夹具,避免引入 fixture 路径编译定义。
const char* kGrRows = R"([
{ "electrodeId": 1, "testDate": "5/26/12", "testTime": "18:25:15", "p1Rg": 1385, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 2, "testDate": "5/26/12", "testTime": "18:25:16", "p1Rg": 3444, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 3, "testDate": "5/26/12", "testTime": "18:25:17", "p1Rg": 737, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 4, "testDate": "5/26/12", "testTime": "18:25:18", "p1Rg": 813, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 5, "testDate": "5/26/12", "testTime": "18:25:19", "p1Rg": 577, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 6, "testDate": "5/26/12", "testTime": "18:25:20", "p1Rg": 652, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 7, "testDate": "5/26/12", "testTime": "18:25:20", "p1Rg": 696, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 8, "testDate": "5/26/12", "testTime": "18:25:21", "p1Rg": 523, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 9, "testDate": "5/26/12", "testTime": "18:25:22", "p1Rg": 587, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 10, "testDate": "5/26/12", "testTime": "18:25:23", "p1Rg": 968, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 11, "testDate": "5/26/12", "testTime": "18:25:24", "p1Rg": 1701, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 12, "testDate": "5/26/12", "testTime": "18:25:25", "p1Rg": 1951, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 13, "testDate": "5/26/12", "testTime": "18:25:26", "p1Rg": 1405, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 14, "testDate": "5/26/12", "testTime": "18:25:27", "p1Rg": 1166, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 15, "testDate": "5/26/12", "testTime": "18:25:28", "p1Rg": 1222, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 16, "testDate": "5/26/12", "testTime": "18:25:29", "p1Rg": 1043, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 17, "testDate": "5/26/12", "testTime": "18:25:30", "p1Rg": 1272, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 18, "testDate": "5/26/12", "testTime": "18:25:30", "p1Rg": 2150, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 19, "testDate": "5/26/12", "testTime": "18:25:31", "p1Rg": 1806, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" },
{ "electrodeId": 20, "testDate": "5/26/12", "testTime": "18:25:32", "p1Rg": 971, "p1RgStatus": "正常", "p2Rg": null, "p2RgStatus": "" }
])";
QJsonArray grRows() { return QJsonDocument::fromJson(kGrRows).array(); }
} // namespace
TEST(GrDto, ParsesBarSingleP1Series) {
const QJsonArray rows = grRows();
ASSERT_EQ(rows.size(), 20);
auto bar = parseGrBar(rows);
// 类目 "#1".."#20"。
ASSERT_EQ(bar.categories.size(), 20u);
EXPECT_EQ(bar.categories.front().toStdString(), "#1");
EXPECT_EQ(bar.categories.back().toStdString(), "#20");
// 轴标题。
EXPECT_EQ(bar.xTitle.toStdString(), std::string("电极点"));
EXPECT_EQ(bar.yTitle.toStdString(), std::string("电阻(单位:欧姆)"));
// 单系列 P1p2Rg 全 null → 无 P2色 #5470c6。
ASSERT_EQ(bar.series.size(), 1u);
const auto& s = bar.series.front();
EXPECT_EQ(s.name.toStdString(), "P1");
EXPECT_EQ(s.color.toStdString(), "#5470c6");
ASSERT_EQ(s.values.size(), 20u);
EXPECT_DOUBLE_EQ(s.values.front(), 1385.0); // 首行 p1Rg
EXPECT_DOUBLE_EQ(s.values[1], 3444.0);
EXPECT_DOUBLE_EQ(s.values.back(), 971.0); // 第 20 行 p1Rg
}
TEST(GrDto, AddsP2SeriesWhenAnyNonNull) {
// 合成:含一行 p2Rg 非空 → 应建 P2 系列(分组柱)。
const char* json = R"([
{"electrodeId":1,"p1Rg":100,"p1RgStatus":"正常","p2Rg":null,"p2RgStatus":""},
{"electrodeId":2,"p1Rg":200,"p1RgStatus":"正常","p2Rg":55,"p2RgStatus":"正常"}
])";
const QJsonArray rows = QJsonDocument::fromJson(json).array();
auto bar = parseGrBar(rows);
ASSERT_EQ(bar.series.size(), 2u);
EXPECT_EQ(bar.series[0].name.toStdString(), "P1");
EXPECT_EQ(bar.series[1].name.toStdString(), "P2");
ASSERT_EQ(bar.series[1].values.size(), 2u);
EXPECT_DOUBLE_EQ(bar.series[1].values[1], 55.0);
}
TEST(GrDto, ParsesEmptyArrayToValidEmptyPayloads) {
// 空/畸形响应:空 QJsonArray → 有效但空的载荷,不崩。
const QJsonArray empty;
auto bar = parseGrBar(empty);
EXPECT_EQ(bar.categories.size(), 0u);
EXPECT_EQ(bar.series.size(), 1u); // P1 恒有(系列存在但无值)
EXPECT_EQ(bar.series.front().values.size(), 0u);
EXPECT_EQ(bar.xTitle.toStdString(), std::string("电极点"));
auto t = parseGrTable(empty);
EXPECT_EQ(t.columns.size(), 7u); // 7 列硬编码,恒有
EXPECT_EQ(t.rows.size(), 0u);
EXPECT_EQ(t.total, 0);
}
TEST(GrDto, ParsesTableSevenFixedColumns) {
const QJsonArray rows = grRows();
auto t = parseGrTable(rows);
// 7 固定列,无 Toggle 列gr 不复用 measurement 的开关列)。
ASSERT_EQ(t.columns.size(), 7u);
EXPECT_EQ(t.columns[0].title.toStdString(), "ID");
EXPECT_EQ(t.columns[1].title.toStdString(), std::string("日期"));
EXPECT_EQ(t.columns[2].title.toStdString(), std::string("时间"));
EXPECT_EQ(t.columns[3].title.toStdString(), "P1 Rg(Ω)");
EXPECT_EQ(t.columns[4].title.toStdString(), std::string("P1状态"));
EXPECT_EQ(t.columns[5].title.toStdString(), "P2 Rg(Ω)");
EXPECT_EQ(t.columns[6].title.toStdString(), std::string("P2状态"));
for (const auto& c : t.columns) EXPECT_EQ(c.kind, TableColumnKind::Text);
// 20 行;首行 ID=1, p1Rg=1385, P1状态=正常p2Rg null → 空串。
ASSERT_EQ(t.rows.size(), 20u);
ASSERT_EQ(t.rows[0].size(), 7u);
EXPECT_EQ(t.rows[0][0].toStdString(), "1");
EXPECT_EQ(t.rows[0][3].toStdString(), "1385");
EXPECT_EQ(t.rows[0][4].toStdString(), std::string("正常"));
EXPECT_TRUE(t.rows[0][5].isEmpty()); // p2Rg null
EXPECT_EQ(t.total, 20);
}