| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- /**
- * T01 纯逻辑检查:模式→面板映射、展开收放、全局筛选选项。
- *
- * 仓库没有配置测试运行器(node_modules 里没有 vitest/jest),
- * 且项目约定不为此引入新框架,所以这里用零依赖的 Node 断言脚本。
- *
- * 运行:node .scratch/cockpit-shell-panel-layout/verify/t01-panel-catalog.mjs
- */
- import assert from 'node:assert/strict'
- import {
- MODES,
- PANEL_LABELS,
- columnsForMode,
- defaultExpandedPanelIds,
- isKnownMode,
- isKnownPanel,
- labelForPanel,
- panelsForMode,
- toggleExpanded,
- } from '../../../src/modules/cockpit/domain/panelCatalog.js'
- import { DEFAULT_INDUSTRY, DEFAULT_SCOPE, INDUSTRIES, SCOPES, isKnownIndustry, isKnownScope } from '../../../src/modules/cockpit/domain/filterOptions.js'
- const EXPECTED_MODES = ['overview', 'infrastructure', 'monitoring', 'warningResponse']
- // 模式键是稳定的 camelCase 四值,且顺序固定。
- assert.deepEqual(MODES, EXPECTED_MODES, '一级模式键或顺序不符')
- EXPECTED_MODES.forEach((mode) => assert.equal(isKnownMode(mode), true, `${mode} 应被识别`))
- assert.equal(isKnownMode('总体概览'), false, '中文不得作为模式键')
- // 每个模式恰好左右各两块,共四块。
- EXPECTED_MODES.forEach((mode) => {
- const { left, right } = columnsForMode(mode)
- assert.equal(left.length, 2, `${mode} 左栏应为 2 块`)
- assert.equal(right.length, 2, `${mode} 右栏应为 2 块`)
- assert.equal(panelsForMode(mode).length, 4, `${mode} 应为 4 块面板`)
- })
- // 未知模式报错,不静默渲染空壳。
- assert.throws(() => columnsForMode('unknownMode'), /未知一级模式/, '未知模式应报错')
- // panelId 扁平、全局唯一、共 16 个,且每个都有中文展示名。
- const allPanelIds = EXPECTED_MODES.flatMap((mode) => panelsForMode(mode))
- assert.equal(allPanelIds.length, 16, '面板总数应为 16')
- assert.equal(new Set(allPanelIds).size, 16, 'panelId 必须全局唯一')
- allPanelIds.forEach((panelId) => {
- assert.equal(panelId.includes('.'), false, `panelId 不应带模式前缀: ${panelId}`)
- assert.equal(isKnownPanel(panelId), true, `${panelId} 应有中文展示名`)
- assert.notEqual(labelForPanel(panelId), panelId, `${panelId} 的中文名未解析`)
- })
- assert.equal(labelForPanel('noSuchPanel'), 'noSuchPanel', '未知面板应回退为原键')
- // 进入模式时默认全部展开。
- EXPECTED_MODES.forEach((mode) => {
- assert.deepEqual(defaultExpandedPanelIds(mode), panelsForMode(mode), `${mode} 默认应全部展开`)
- })
- // 展开集合的收放是纯函数:可来回切换,且不改动入参。
- const initial = ['archive', 'operation']
- const collapsed = toggleExpanded(initial, 'archive')
- assert.deepEqual(collapsed, ['operation'], '已展开的面板应收起')
- assert.deepEqual(initial, ['archive', 'operation'], 'toggleExpanded 不得改写入参')
- const reExpanded = toggleExpanded(collapsed, 'archive')
- // 展开集合语义上是无序集合(面板渲染顺序由目录决定),所以只断言成员与数量,不断言顺序。
- assert.equal(reExpanded.includes('archive'), true, '收起后面板应能重新展开')
- assert.equal(reExpanded.includes('operation'), true, '重展不得丢失其他已展开项')
- assert.equal(reExpanded.length, collapsed.length + 1, '重展后集合应恰好多一项')
- // ---- 全局筛选选项(范围 / 行业)----
- assert.equal(SCOPES.length >= 2, true, '范围至少要有全域与其他区域')
- assert.equal(INDUSTRIES.map((i) => i.key).join(','), 'all,gas,water,drainage,manhole', '行业键与顺序应按 ADR 0002')
- assert.equal(DEFAULT_SCOPE, 'all', '默认范围为全域')
- assert.equal(DEFAULT_INDUSTRY, 'all', '默认行业为全部')
- assert.equal(SCOPES.some((s) => s.key === DEFAULT_SCOPE), true, '默认范围必须是合法选项')
- assert.equal(INDUSTRIES.some((i) => i.key === DEFAULT_INDUSTRY), true, '默认行业必须是合法选项')
- assert.equal(isKnownScope(DEFAULT_SCOPE), true, '默认范围应被识别')
- assert.equal(isKnownIndustry('gas'), true, '燃气应被识别')
- assert.equal(isKnownIndustry('电力'), false, '不在行业清单内的键应被拒绝')
- assert.equal(isKnownScope('火星'), false, '不在范围清单内的键应被拒绝')
- console.log(
- `T01 检查通过:${EXPECTED_MODES.length} 个模式 / ${allPanelIds.length} 个面板 / 展开收放与默认展开一致 / 筛选选项(${SCOPES.length} 范围 · ${INDUSTRIES.length} 行业)正确。`,
- )
|