computeWidgetAlignment(spirit) 简化版 (水平+垂直居中): _alignFlags = 16 | 8 _horizontalCenter = x + w/2 - 640 _verticalCenter = 360 - (y + h/2) emitPrefabJson 仅在 Spirit 父节点是 group (非 Layer 根) 时调用; root / group-X envelope 沿用默认 _alignFlags=45 全屏铺满. PoC 验证: Layer00010.xml Protol_Layer (group 37, 4 spirits) 生成 Protol_Layer.prefab — 6 Widget 节点 (1 root + 1 group-37 + 4 spirit), 4 spirit widget 全部 _alignFlags=24.
69 lines
3.3 KiB
JavaScript
69 lines
3.3 KiB
JavaScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { execSync } from 'node:child_process';
|
|
import { existsSync, readFileSync } from 'node:fs';
|
|
|
|
// PoC 阶段 2 端到端: Layer00010.xml Protol_Layer (group 37, 4 spirits, type 0/5)
|
|
// 走 CLI → 生成 prefab JSON → 校验含 cc.Widget 节点 (与 computeWidgetAlignment 锚定).
|
|
//
|
|
// 路径从 cocoscreator_projects/ 运行 (与 poc-iconbutton.test.mjs 风格一致).
|
|
// Layer00010.xml 4 个 spirit 全属 group 37 (无 Layer 根直挂), 生成的 prefab 应有:
|
|
// - 1 root Widget (default _alignFlags=45, 全屏铺满)
|
|
// - 1 group-37 Widget (default _alignFlags=45)
|
|
// - 4 Spirit Widget (apply computeWidgetAlignment: _alignFlags=24=16|8 水平+垂直居中)
|
|
const CLI = 'node scripts/legacy-layer-to-cocos-prefab-cli.mjs';
|
|
const INPUT = '../projects/Game_Surface_3/save/Layer00010.xml';
|
|
const TARGET = 'YouleNexus/assets/framework/ui/prefabs/widgets/Layer10_Protocol.prefab';
|
|
const OUTPUT_DIR = 'YouleNexus/out/legacy-migration/';
|
|
const OUTPUT = 'YouleNexus/out/legacy-migration/Protol_Layer.prefab';
|
|
|
|
test('Layer10_Protocol 生成 + 含 cc.Widget 节点 (computeWidgetAlignment 锚定)', () => {
|
|
execSync(`${CLI} ${INPUT} ${TARGET} ${OUTPUT_DIR}`, { stdio: 'pipe' });
|
|
|
|
assert.ok(existsSync(OUTPUT), `${OUTPUT} 应生成`);
|
|
|
|
const json = JSON.parse(readFileSync(OUTPUT, 'utf8'));
|
|
assert.ok(Array.isArray(json));
|
|
|
|
// 1) 至少应有 6 个 cc.Widget 节点 (1 root + 1 group-37 + 4 spirits).
|
|
const widgetNodes = json.filter(o => o.__type__ === 'cc.Widget');
|
|
assert.ok(
|
|
widgetNodes.length >= 6,
|
|
`应有 ≥6 个 cc.Widget 节点 (1 root + 1 group + 4 spirit), 实得 ${widgetNodes.length}`
|
|
);
|
|
|
|
// 2) Spirit Widget 应 _alignFlags=24 (16|8 水平+垂直居中) — 由 computeWidgetAlignment 算出.
|
|
// 这是 PoC 阶段 2 的关键验证: 证明 computeWidgetAlignment 真实生效 (而非全部用默认 45).
|
|
// Spirit Widget 与 root/group Widget 的区别: Widget.node.__id__ 指向的 cc.Node
|
|
// _name 不为 'Protol_Layer' (root) 也不以 'group-' 开头 (group 父节点).
|
|
const spiritWidgetCount = widgetNodes.filter(w => {
|
|
const nid = w.node && w.node.__id__;
|
|
if (nid === undefined) return false;
|
|
const targetNode = json[nid];
|
|
if (!targetNode || targetNode.__type__ !== 'cc.Node' || !targetNode._name) return false;
|
|
return targetNode._name !== 'Protol_Layer' && !targetNode._name.startsWith('group-');
|
|
}).length;
|
|
assert.equal(
|
|
spiritWidgetCount, 4,
|
|
`应有 4 个 Spirit Widget, 实得 ${spiritWidgetCount}`
|
|
);
|
|
|
|
// 3) Spirit Widget _alignFlags 必须等于 24 (= 16 | 8, 水平居中 + 垂直居中).
|
|
// 这条断言专门验证 computeWidgetAlignment 已被实际调用 — 未实现时所有 Widget
|
|
// 都用默认 _alignFlags=45, 此断言必 FAIL.
|
|
const spiritWidgets = widgetNodes.filter(w => {
|
|
const nid = w.node && w.node.__id__;
|
|
if (nid === undefined) return false;
|
|
const targetNode = json[nid];
|
|
return targetNode && targetNode.__type__ === 'cc.Node' && targetNode._name
|
|
&& targetNode._name !== 'Protol_Layer'
|
|
&& !targetNode._name.startsWith('group-');
|
|
});
|
|
for (const w of spiritWidgets) {
|
|
assert.equal(
|
|
w._alignFlags, 24,
|
|
`Spirit Widget 应 _alignFlags=24 (16|8), 实得 ${w._alignFlags}`
|
|
);
|
|
}
|
|
});
|