88 lines
3.4 KiB
C++
88 lines
3.4 KiB
C++
#include <gtest/gtest.h>
|
||
|
||
#include <QJsonDocument>
|
||
#include <QJsonObject>
|
||
|
||
#include "panels/chart/InversionFormParse.hpp"
|
||
|
||
using namespace geopro::app;
|
||
|
||
namespace {
|
||
|
||
// 取自原版动态表单响应 data 结构(POST /business/project/getDynamicForm):
|
||
// formList → [{groupName, values:[{fieldCode, fieldName, optionsObject:[{label,value}]}]}]。
|
||
const char* kFormData = R"({
|
||
"formList": [
|
||
{
|
||
"groupName": "基础参数",
|
||
"values": [
|
||
{ "fieldCode": "elevation", "fieldName": "是否含高程",
|
||
"optionsObject": [ {"label": "是", "value": "1"}, {"label": "否", "value": "0"} ] },
|
||
{ "fieldCode": "method", "fieldName": "反演方法",
|
||
"optionsObject": [ {"label": "最小二乘", "value": "ls"} ] }
|
||
]
|
||
},
|
||
{
|
||
"groupName": "高级参数",
|
||
"values": [
|
||
{ "fieldCode": "noOptions", "fieldName": "无选项字段", "optionsObject": [] }
|
||
]
|
||
}
|
||
]
|
||
})";
|
||
|
||
QJsonObject formData() { return QJsonDocument::fromJson(kFormData).object(); }
|
||
|
||
} // namespace
|
||
|
||
TEST(InversionFormParse, ParsesGroupsFieldsAndOptions) {
|
||
const auto groups = parseDynamicForm(formData());
|
||
|
||
ASSERT_EQ(groups.size(), 2u);
|
||
EXPECT_EQ(groups[0].groupName.toStdString(), std::string("基础参数"));
|
||
ASSERT_EQ(groups[0].fields.size(), 2u);
|
||
|
||
const auto& f0 = groups[0].fields[0];
|
||
EXPECT_EQ(f0.fieldCode.toStdString(), std::string("elevation"));
|
||
EXPECT_EQ(f0.fieldName.toStdString(), std::string("是否含高程"));
|
||
ASSERT_EQ(f0.options.size(), 2u);
|
||
EXPECT_EQ(f0.options[0].label.toStdString(), std::string("是"));
|
||
EXPECT_EQ(f0.options[0].value.toStdString(), std::string("1"));
|
||
|
||
EXPECT_TRUE(groups[1].fields[0].options.empty());
|
||
}
|
||
|
||
TEST(InversionFormParse, EmptyDataYieldsNoGroups) {
|
||
EXPECT_TRUE(parseDynamicForm(QJsonObject{}).empty());
|
||
}
|
||
|
||
TEST(InversionFormParse, AssembleUsesSelectedValues) {
|
||
const auto groups = parseDynamicForm(formData());
|
||
QJsonObject selected{{"elevation", "0"}, {"method", "ls"}};
|
||
|
||
// fillDefaults=false(反演运算):仅含已选且非空的字段;无选值字段不进体。
|
||
const QJsonObject out = assembleFieldMap(groups, selected, /*fillDefaults*/ false);
|
||
EXPECT_EQ(out.value("elevation").toString().toStdString(), std::string("0"));
|
||
EXPECT_EQ(out.value("method").toString().toStdString(), std::string("ls"));
|
||
EXPECT_FALSE(out.contains("noOptions")); // 无选项 + 未选 → 不进体
|
||
}
|
||
|
||
TEST(InversionFormParse, AssembleFillsDefaultsWhenRequested) {
|
||
const auto groups = parseDynamicForm(formData());
|
||
|
||
// fillDefaults=true(生成视电阻率):空选值回退首个选项。
|
||
const QJsonObject out = assembleFieldMap(groups, QJsonObject{}, /*fillDefaults*/ true);
|
||
EXPECT_EQ(out.value("elevation").toString().toStdString(), std::string("1")); // 首项 value
|
||
EXPECT_EQ(out.value("method").toString().toStdString(), std::string("ls"));
|
||
EXPECT_FALSE(out.contains("noOptions")); // 无选项 → 即便 fillDefaults 也无值可填
|
||
}
|
||
|
||
TEST(InversionFormParse, AssembleOmitsEmptySelectedValues) {
|
||
const auto groups = parseDynamicForm(formData());
|
||
QJsonObject selected{{"elevation", ""}}; // 显式空字符串
|
||
|
||
// fillDefaults=false:空值不进体(复刻原版 handleConfirm 的 if(selectedValue))。
|
||
const QJsonObject out = assembleFieldMap(groups, selected, /*fillDefaults*/ false);
|
||
EXPECT_FALSE(out.contains("elevation"));
|
||
}
|