FormCollectDimensionTest.java
4.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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<String, String> known(String... kv) {
Map<String, String> 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<String, String> 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<String, String> m = known("尺寸", "长和宽50cm,高5cm");
FormCollectTool.expandDimensions(m);
assertEquals("50", m.get("长"));
assertEquals("50", m.get("宽"));
assertEquals("5", m.get("高"));
}
@Test
void multiplicationSignsAndDecimals() {
Map<String, String> 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<String, String> m = known("长", "99", "规格", "60*40*30");
FormCollectTool.expandDimensions(m);
assertEquals("99", m.get("长"), "模型已明确给的 长 不被覆盖");
assertEquals("40", m.get("宽"));
}
@Test
void plainValuesAreUntouched() {
Map<String, String> m = known("数量", "5000", "产品名称", "大16开画册", "联系电话", "0571-88881234");
FormCollectTool.expandDimensions(m);
assertFalse(m.containsKey("长"), "普通数值/名称/电话不产生尺寸");
assertEquals("大16开画册", m.get("产品名称"), "值逐字保留");
}
// ---- 预填键 ↔ 字段标签的宽松对齐(e2e 实测缺陷:模型给「客户」,字段叫「客户名称」,全等匹配丢预填)----
private static java.util.List<Map<String, Object>> fields(String... labelTypePairs) {
java.util.List<Map<String, Object>> out = new java.util.ArrayList<>();
for (int i = 0; i < labelTypePairs.length; i += 2) {
Map<String, Object> 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"));
}
}