124 lines
6.6 KiB
C++
124 lines
6.6 KiB
C++
#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("电阻(单位:欧姆)"));
|
||
|
||
// 单系列 P1(p2Rg 全 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);
|
||
}
|