import {describe, it, expect} from 'vitest' import {buildBoundedMask} from './maskTemplate' describe('buildBoundedMask', () => { it('dérive le masque structurel du gabarit (séparateurs conservés)', () => { expect(buildBoundedMask('JJ/MM/AAAA').mask).toBe('##/##/####') expect(buildBoundedMask('JJ/MM/AAAA HH:MM').mask).toBe('##/##/#### ##:##') }) }) describe('preProcess — bornage de la saisie (1er ET 2e chiffre)', () => { const pre = (template: string, value: string) => buildBoundedMask(template).preProcess!(value) it('jour : refuse > 31 et 00, accepte 01-31', () => { expect(pre('JJ/MM/AAAA', '32')).toBe('3') // 32 impossible → 2e chiffre refusé expect(pre('JJ/MM/AAAA', '33')).toBe('3') // exemple métier : 33 refusé expect(pre('JJ/MM/AAAA', '31')).toBe('31') expect(pre('JJ/MM/AAAA', '00')).toBe('0') // 00 impossible expect(pre('JJ/MM/AAAA', '09')).toBe('09') }) it('mois : refuse > 12 et 00 (après un jour valide) — cas 33/19', () => { expect(pre('JJ/MM/AAAA', '0119')).toBe('011') // 19 (mois) refusé expect(pre('JJ/MM/AAAA', '0113')).toBe('011') expect(pre('JJ/MM/AAAA', '0112')).toBe('0112') expect(pre('JJ/MM/AAAA', '0100')).toBe('010') }) it('laisse l’année libre', () => { expect(pre('JJ/MM/AAAA', '01012026')).toBe('01012026') }) it('heure 00-23 et minute 00-59 (datetime), sans confondre minute et mois', () => { const t = 'JJ/MM/AAAA HH:MM' expect(pre(t, '010120262300')).toBe('010120262300') // 23:00 ok expect(pre(t, '010120262460')).toBe('010120262') // heure 24 refusée expect(pre(t, '010120261259')).toBe('010120261259') // minute 59 ok (≠ mois) expect(pre(t, '010120261260')).toBe('0101202612') // minute 60 refusée }) it('stoppe à la première saisie invalide (99/99/9999 → rien)', () => { expect(pre('JJ/MM/AAAA', '99/99/9999')).toBe('') }) })