#include #include #include #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")); }