package com.xly.tool; import org.junit.jupiter.api.Test; import java.util.LinkedHashMap; import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; /** * 尺寸拆分正则(自 SlotFillService 迁入):模型拆不对「长和宽50cm,高5cm」是实测结论, * 预填值里的尺寸表达必须由代码确定性拆成 长/宽/高。 */ class FormCollectDimensionTest { private static Map known(String... kv) { Map m = new LinkedHashMap<>(); for (int i = 0; i < kv.length; i += 2) { m.put(kv[i], kv[i + 1]); } return m; } @Test void positionalSpecSplitsIntoLwh() { Map m = known("规格", "60*40*30"); FormCollectTool.expandDimensions(m); assertEquals("60", m.get("长")); assertEquals("40", m.get("宽")); assertEquals("30", m.get("高")); assertEquals("60*40*30", m.get("规格"), "原值保留"); } @Test void labeledSpecWithSharedValueAndUnits() { Map m = known("尺寸", "长和宽50cm,高5cm"); FormCollectTool.expandDimensions(m); assertEquals("50", m.get("长")); assertEquals("50", m.get("宽")); assertEquals("5", m.get("高")); } @Test void multiplicationSignsAndDecimals() { Map m = known("规格", "50×30x5.5"); FormCollectTool.expandDimensions(m); assertEquals("50", m.get("长")); assertEquals("30", m.get("宽")); assertEquals("5.5", m.get("高")); } @Test void existingExplicitDimsAreNotOverwritten() { Map m = known("长", "99", "规格", "60*40*30"); FormCollectTool.expandDimensions(m); assertEquals("99", m.get("长"), "模型已明确给的 长 不被覆盖"); assertEquals("40", m.get("宽")); } @Test void plainValuesAreUntouched() { Map m = known("数量", "5000", "产品名称", "大16开画册", "联系电话", "0571-88881234"); FormCollectTool.expandDimensions(m); assertFalse(m.containsKey("长"), "普通数值/名称/电话不产生尺寸"); assertEquals("大16开画册", m.get("产品名称"), "值逐字保留"); } // ---- 预填键 ↔ 字段标签的宽松对齐(e2e 实测缺陷:模型给「客户」,字段叫「客户名称」,全等匹配丢预填)---- private static java.util.List> fields(String... labelTypePairs) { java.util.List> out = new java.util.ArrayList<>(); for (int i = 0; i < labelTypePairs.length; i += 2) { Map f = new LinkedHashMap<>(); f.put("label", labelTypePairs[i]); f.put("type", labelTypePairs[i + 1]); out.add(f); } return out; } @Test void fuzzyKeyPrefillsContainingLabel() { var fs = fields("客户名称", "fkselect", "产品名称", "fkselect", "数量", "number"); FormCollectTool.applyKnownDefaults(known("客户", "必胜客", "数量", "5000"), fs); assertEquals("必胜客", fs.get(0).get("default"), "「客户」对齐到「客户名称」"); assertEquals("5000", fs.get(2).get("default")); } @Test void ambiguousKeyPrefersFkOrNamedField() { var fs = fields("客户代码", "text", "客户名称", "fkselect"); FormCollectTool.applyKnownDefaults(known("客户", "必胜客"), fs); assertEquals("必胜客", fs.get(1).get("default"), "多候选时唯一外键下拉字段胜出"); assertFalse(fs.get(0).containsKey("default")); var fs2 = fields("客户代码", "text", "客户简称", "text"); FormCollectTool.applyKnownDefaults(known("客户", "必胜客"), fs2); assertFalse(fs2.get(0).containsKey("default"), "无法决胜的二义 → 宁缺勿错"); assertFalse(fs2.get(1).containsKey("default")); } @Test void exactMatchAndParenLabelStillWork() { var fs = fields("长(L)", "number", "宽(W)", "number"); FormCollectTool.applyKnownDefaults(known("长", "50", "宽", "30"), fs); assertEquals("50", fs.get(0).get("default"), "括号标签归一化后全等命中"); assertEquals("30", fs.get(1).get("default")); } }