GuDingZiChan/frontend/scripts/test-barcode-layout.ts
WuYongJie c7a9324635 feat(打印): 新增远程标签打印与 .NET 打印助手
- 新增打印终端、配对码、打印任务相关表结构与接口\n- 增加后台打印终端/任务管理页和资产标签远程打印入口\n- 引入 .NET 8 Windows 打印助手源码及下载清单配置
2026-03-25 21:05:30 +08:00

97 lines
3.3 KiB
TypeScript

import assert from 'node:assert/strict'
import {
buildIndustrialCardDisplay,
fitMultilineText,
fitSingleLineText,
splitCodeForDisplay
} from '../src/components/barcodeLayout.ts'
const measureText = (text: string, fontSize: number) => Array.from(text).length * fontSize
const assertLineFits = (text: string, fontSize: number, maxWidth: number, label: string) => {
assert.ok(
measureText(text, fontSize) <= maxWidth,
`${label} 超出宽度预算: "${text}" @ ${fontSize}px > ${maxWidth}`
)
}
const titleFit = fitMultilineText(
{
text: '设计中心高配图形工作站 DESIGN CENTER GRAPHICS WORKSTATION ULTRA',
maxWidth: 180,
maxLines: 2,
maxFontSize: 28,
minFontSize: 16
},
measureText
)
assert.ok(titleFit.lines.length <= 2, '资产名称最多只能占 2 行')
assert.ok(titleFit.lines.length >= 1, '资产名称至少应渲染 1 行')
assert.ok(titleFit.fontSize >= 16, '资产名称字号不能低于最小值')
for (const line of titleFit.lines) {
assertLineFits(line, titleFit.fontSize, 180, '资产名称')
}
const modelFit = fitSingleLineText(
{
text: '型号: SUPER-LONG-INDUSTRIAL-WORKSTATION-MODEL-4090D-EXTREME',
maxWidth: 160,
maxFontSize: 18,
minFontSize: 12,
allowTruncate: true
},
measureText
)
assert.ok(modelFit.text.endsWith('...'), '超长型号应以省略号截断')
assert.ok(modelFit.fontSize >= 12, '型号字号不能低于最小值')
assertLineFits(modelFit.text, modelFit.fontSize, 160, '型号')
const codeFit = fitSingleLineText(
{
text: 'JS-DESIGN-2026-ULTRA-09',
maxWidth: 300,
maxFontSize: 24,
minFontSize: 12,
allowTruncate: false
},
measureText
)
assert.equal(codeFit.text, 'JS-DESIGN-2026-ULTRA-09', '资产编码应优先完整显示')
assert.ok(codeFit.fontSize < 24, '编码过长时应先缩小字号')
assertLineFits(codeFit.text, codeFit.fontSize, 300, '资产编码')
const splitCode = splitCodeForDisplay('JS-DESIGN-2026-ULTRA-09')
assert.equal(splitCode.length, 2, '长编码应允许拆成 2 行显示')
assert.ok(splitCode[0].endsWith('-'), '第一行编码应尽量在分隔符处断开')
assert.equal(splitCode.join(''), 'JS-DESIGN-2026-ULTRA-09', '拆分后编码内容必须完整保留')
const industrialCard = buildIndustrialCardDisplay({
companyName: '常州简尚家具有限公司',
equipmentCode: 'JS-PC-2040',
equipmentType: '显示器',
purchaseDate: '2026-03-24T12:38:58.000Z',
organizationName: '设计中心'
})
assert.equal(industrialCard.companyName, '常州简尚家具有限公司', '工业卡片版必须保留公司名')
assert.equal(industrialCard.typeText, '显示器', '工业卡片版必须显示资产类别')
assert.equal(industrialCard.purchaseDateText, '2026-03-24', '工业卡片版必须显示格式化后的采购日期')
assert.equal(industrialCard.organizationText, '设计中心', '工业卡片版必须显示所属组织')
assert.deepEqual(industrialCard.codeLines, ['JS-PC-2040'], '较短编码应保持单行显示')
const blankDateCard = buildIndustrialCardDisplay({
companyName: '常州简尚家具有限公司',
equipmentCode: 'JS-PC-2041',
equipmentType: '显示器',
purchaseDate: '',
organizationName: '设计中心'
})
assert.equal(blankDateCard.purchaseDateText, '', '采购日期为空时必须保持留空')
console.log('barcode layout tests: ok')