From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master

---
 jnpf-biz-common/jnpf-biz-common-audit/src/test/java/jnpf/bizcommon/audit/service/title/AuditTitleSpecProbe.java |  127 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 127 insertions(+), 0 deletions(-)

diff --git a/jnpf-biz-common/jnpf-biz-common-audit/src/test/java/jnpf/bizcommon/audit/service/title/AuditTitleSpecProbe.java b/jnpf-biz-common/jnpf-biz-common-audit/src/test/java/jnpf/bizcommon/audit/service/title/AuditTitleSpecProbe.java
new file mode 100644
index 0000000..175a020
--- /dev/null
+++ b/jnpf-biz-common/jnpf-biz-common-audit/src/test/java/jnpf/bizcommon/audit/service/title/AuditTitleSpecProbe.java
@@ -0,0 +1,127 @@
+package jnpf.bizcommon.audit.service.title;
+
+import java.util.List;
+
+/**
+ * 琛ㄥ崟鍕鹃�夛紙{@code __config__.biz_log_enabled}锛夎В鏋愮殑绾� JVM 鍥炲綊缃戙��
+ *
+ * <p><b>涓轰粈涔堜笉澶嶇敤 {@code AuditFormRegistry.collectFields}</b>锛氬畠閫掑綊鏃舵妸瀛愯〃 children
+ * 鎷嶅钩杩涘悓涓�涓� map锛屽ぉ鐢熷垎涓嶅嚭涓昏〃/瀛愯〃锛涜�屽畠琚� {@code resolveFieldMetadata} 涓�
+ * {@code resolveBaselineFields} 涓ゆ潯宸查獙璇佽矾寰勪緷璧栥�佸帇鐫� {@code AuditL0PartialSnapshotProbe}
+ * 鐨� 46 鏉℃柇瑷�銆傛爣棰樻槸鏂拌涔夛紝鍙﹁捣绾嚱鏁帮紝椋庨櫓闅旂銆�
+ *
+ * <p><b>鏈粍绠$殑閿欐硶</b>锛氶『搴忚鎵撲贡锛堜笟鍔″嬀 a/c 鏄剧ず鎴� c/a锛夈�佸瓙琛ㄥ瓧娈垫贩杩涗富琛ㄦ爣棰樸��
+ * 甯冨眬瀹瑰櫒锛堟爡鏍�/鏍囩椤碉級閲岀殑瀛楁琚紡鎺夈�傝繖涓夌绔埌绔兘鍙〃鐜颁负"鏍囬鐪嬬潃涓嶅お瀵�"锛�
+ * 娌℃湁鎶ラ敊銆佹病鏈夋棩蹇楋紝鍙兘闈犳柇瑷�閽夋銆�
+ *
+ * <p>runner锛歿@code tasks/audit-title-spec-checks.sh}
+ */
+public final class AuditTitleSpecProbe {
+
+    private static int pass;
+    private static int fail;
+
+    public static void main(String[] args) {
+        noneEnabled();
+        mainFieldsKeepFormOrder();
+        layoutContainersAreTraversed();
+        subTableIsSeparated();
+        subTableFieldsNeverLeakIntoMain();
+        malformedInputDegradesToEmpty();
+        System.out.println("=== 琛ㄥ崟鍕鹃�夎В鏋愭柇瑷�锛�" + pass + " 閫氳繃 / " + fail + " 澶辫触 ===");
+        if (fail > 0) {
+            System.exit(1);
+        }
+    }
+
+    /** T1 涓�涓兘娌″嬀 鈫� EMPTY銆傝繖鏄綋鍓嶅簱閲� 148 浠借〃鍗曠殑鐪熷疄鐘舵�侊紝蹇呴』鏄畨鍏ㄩ粯璁ゃ�� */
+    private static void noneEnabled() {
+        String json = "{\"fields\":["
+                + field("a", "input", false)
+                + "," + field("b", "input", false)
+                + "]}";
+        AuditTitleSpec spec = AuditTitleSpecParser.parse(json);
+        check("T1 涓�涓兘娌″嬀 鈫� isEmpty", spec.isEmpty(), "鍕鹃�変负绌烘椂涓嶅簲浜у嚭浠讳綍鏍囬瀛楁");
+    }
+
+    /** T2 椤哄簭蹇呴』鏄〃鍗曞嚭鐜伴『搴忥紝涓嶆槸瀛楁瘝搴忊�斺�斾笟鍔″嬀 a/c 灏卞緱鏄� a/c銆� */
+    private static void mainFieldsKeepFormOrder() {
+        String json = "{\"fields\":["
+                + field("zebra", "input", true)
+                + "," + field("apple", "input", true)
+                + "," + field("mango", "input", false)
+                + "]}";
+        List<String> main = AuditTitleSpecParser.parse(json).mainFields();
+        check("T2 鍙敹鍕鹃�夊瓧娈�", main.size() == 2, "瀹為檯 " + main);
+        check("T2 淇濇寔琛ㄥ崟椤哄簭锛堥潪瀛楁瘝搴忥級",
+                "zebra".equals(main.get(0)) && "apple".equals(main.get(1)),
+                "瀹為檯 " + main);
+    }
+
+    /** T3 鏍呮牸/鏍囩椤佃繖绫诲竷灞�瀹瑰櫒鐨� children 鏄富琛ㄥ瓧娈碉紝蹇呴』缁х画閫掑綊銆� */
+    private static void layoutContainersAreTraversed() {
+        String json = "{\"fields\":[{\"__config__\":{\"jnpfKey\":\"row\",\"children\":["
+                + field("inside", "input", true)
+                + "]}}]}";
+        List<String> main = AuditTitleSpecParser.parse(json).mainFields();
+        check("T3 甯冨眬瀹瑰櫒鍐呯殑鍕鹃�夊瓧娈佃鏀惰繘涓昏〃",
+                main.size() == 1 && "inside".equals(main.get(0)), "瀹為檯 " + main);
+    }
+
+    /** T4 瀛愯〃鎺т欢鐙珛鎴愮粍锛屽甫涓婅〃鍚嶃�� */
+    private static void subTableIsSeparated() {
+        String json = "{\"fields\":["
+                + field("main1", "input", true)
+                + ",{\"__vModel__\":\"tableField6da682\",\"__config__\":{\"jnpfKey\":\"table\","
+                + "\"tableName\":\"lims_jianyan_xiang\",\"children\":["
+                + field("sub1", "input", true)
+                + "," + field("sub2", "input", false)
+                + "," + field("sub3", "input", true)
+                + "]}}]}";
+        AuditTitleSpec spec = AuditTitleSpecParser.parse(json);
+        check("T4 涓昏〃鍙湁 main1",
+                spec.mainFields().size() == 1 && "main1".equals(spec.mainFields().get(0)),
+                "瀹為檯 " + spec.mainFields());
+        check("T4 璇嗗埆鍑� 1 涓瓙琛�", spec.subTables().size() == 1,
+                "瀹為檯 " + spec.subTables().size());
+        AuditTitleSpec.SubTableSpec sub = spec.subTables().get(0);
+        check("T4 瀛愯〃 vModel", "tableField6da682".equals(sub.vModel()), "瀹為檯 " + sub.vModel());
+        check("T4 瀛愯〃琛ㄥ悕", "lims_jianyan_xiang".equals(sub.tableName()), "瀹為檯 " + sub.tableName());
+        check("T4 瀛愯〃鍕鹃�夊瓧娈垫寜椤哄簭",
+                sub.fields().size() == 2 && "sub1".equals(sub.fields().get(0))
+                        && "sub3".equals(sub.fields().get(1)),
+                "瀹為檯 " + sub.fields());
+    }
+
+    /** T5 瀛愯〃瀛楁缁濅笉鑳藉嚭鐜板湪涓昏〃鏍囬閲屸�斺�斿惁鍒欎富琛ㄩ偅涓�琛屼細娣疯繘瀛愯〃鐨勫�笺�� */
+    private static void subTableFieldsNeverLeakIntoMain() {
+        String json = "{\"fields\":[{\"__vModel__\":\"tf1\",\"__config__\":{\"jnpfKey\":\"table\","
+                + "\"tableName\":\"t_sub\",\"children\":[" + field("leaky", "input", true) + "]}}]}";
+        AuditTitleSpec spec = AuditTitleSpecParser.parse(json);
+        check("T5 瀛愯〃瀛楁涓嶈繘涓昏〃", spec.mainFields().isEmpty(),
+                "涓昏〃娣峰叆浜嗗瓙琛ㄥ瓧娈碉細" + spec.mainFields());
+    }
+
+    /** T6 闈炴硶/绌鸿緭鍏ヤ竴寰嬮��鍖栨垚 EMPTY锛岀粷涓嶆姏寮傚父鈥斺�斿眰 0 鐨� handler 澶栧眰铏芥湁鍏滃簳锛屼絾閭d細涓㈡暣鏉′簨浠躲�� */
+    private static void malformedInputDegradesToEmpty() {
+        check("T6 null 杈撳叆", AuditTitleSpecParser.parse(null).isEmpty(), "搴斾负 EMPTY");
+        check("T6 绌轰覆杈撳叆", AuditTitleSpecParser.parse("   ").isEmpty(), "搴斾负 EMPTY");
+        check("T6 闈炴硶 JSON", AuditTitleSpecParser.parse("{not json").isEmpty(), "搴斾负 EMPTY");
+        check("T6 娌℃湁 fields 閿�", AuditTitleSpecParser.parse("{\"x\":1}").isEmpty(), "搴斾负 EMPTY");
+    }
+
+    private static String field(String vModel, String jnpfKey, boolean enabled) {
+        return "{\"__vModel__\":\"" + vModel + "\",\"__config__\":{\"jnpfKey\":\"" + jnpfKey
+                + "\",\"biz_log_enabled\":" + enabled + "}}";
+    }
+
+    private static void check(String name, boolean ok, String detail) {
+        if (ok) {
+            pass++;
+            System.out.println("  鉁� " + name);
+        } else {
+            fail++;
+            System.out.println("  鉂� " + name + " 鈥斺�� " + detail);
+        }
+    }
+}

--
Gitblit v1.8.0