FormCollectDimensionTest.java 4.35 KB
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"));
    }
}