geopro/tests/app/test_inversion_form_parse.cpp

88 lines
3.4 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 <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"));
}