// The 176x0 label: a cleared number field emitted `NaNin`, the browser dropped // the declaration, and the code box fell back to auto height, which is zero for // an image sized at 100% of it. Every case below is a value a number input can // actually hold. import { describe, it, expect } from 'vitest' import { labelVars, LABEL_VAR_NAMES, VAR_FALLBACKS } from './labelVars' const EMPTY_INPUT = '' // what v-model.number leaves behind on a cleared field describe('labelVars', () => { it('emits every property the stylesheet reads', () => { const vars = labelVars({}) for (const name of LABEL_VAR_NAMES) expect(vars[name]).toBeTruthy() }) it('never emits NaN or an empty length, whatever it is handed', () => { for (const junk of [EMPTY_INPUT, NaN, null, undefined, 'abc', Infinity]) { const vars = labelVars({ labelwidth: junk, labelheight: junk, barheight: junk, codesize: junk, quiet: junk, gap: junk, padding: junk, labelfont: junk, picturesize: junk, contentx: junk, contenty: junk, nudgex: junk, nudgey: junk, pictureopacity: junk, }) for (const name of LABEL_VAR_NAMES) { expect(vars[name]).not.toMatch(/NaN|Infinity|undefined|null/) expect(vars[name]).not.toBe('in') } } }) it('falls back to a printable bar height rather than a zero-height box', () => { expect(labelVars({ barheight: EMPTY_INPUT })['--tool-barh']) .toBe(VAR_FALLBACKS.barheight + 'in') expect(labelVars({ barheight: 0 })['--tool-barh']) .toBe(VAR_FALLBACKS.barheight + 'in') expect(labelVars({ barheight: -2 })['--tool-barh']) .toBe(VAR_FALLBACKS.barheight + 'in') }) it('keeps a real measurement', () => { const vars = labelVars({ labelwidth: 2.13, labelheight: 3.38, barheight: 0.5 }) expect(vars['--tool-label-w']).toBe('2.13in') expect(vars['--tool-label-h']).toBe('3.38in') expect(vars['--tool-barh']).toBe('0.5in') }) it('lets padding, quiet zone and gap be zero, because zero is a real answer', () => { const vars = labelVars({ padding: 0, quiet: 0, gap: 0 }) expect(vars['--tool-pad']).toBe('0in') expect(vars['--tool-quiet']).toBe('0in') expect(vars['--tool-gap']).toBe('0in') }) it('keeps offsets signed - a negative nudge is the whole point of a nudge', () => { const vars = labelVars({ contentx: -0.05, nudgey: -0.1, contenty: 0.02 }) expect(vars['--tool-content-x']).toBe('-0.05in') expect(vars['--tool-nudge-y']).toBe('-0.1in') expect(vars['--tool-content-y']).toBe('0.02in') }) it('refuses an alignment it does not recognise', () => { expect(labelVars({ align: 'flex-end' })['--tool-align']).toBe('flex-end') expect(labelVars({ align: 'sideways' })['--tool-align']).toBe('center') expect(labelVars({ valign: EMPTY_INPUT })['--tool-valign']).toBe('center') }) it('clamps watermark opacity into a range that still prints', () => { expect(labelVars({ pictureopacity: 0.4 })['--tool-pic-opacity']).toBe('0.4') expect(labelVars({ pictureopacity: 0 })['--tool-pic-opacity']) .toBe(String(VAR_FALLBACKS.pictureopacity)) expect(labelVars({ pictureopacity: 5 })['--tool-pic-opacity']) .toBe(String(VAR_FALLBACKS.pictureopacity)) }) })