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')