import { describe, expect, it } from 'vitest'; import { condense } from '../../src/lib/diff'; import type { DiffPart } from '../../src/lib/types'; const text = (parts: DiffPart[]) => parts.map((p) => (p.op === 'same' ? p.text : `[${p.op === 'added' ? '+' : '-'}${p.text}]`)).join(''); describe('a typo fix, told around its change', () => { it('keeps a few words on each side of a change, cut between words', () => { const parts: DiffPart[] = [ { op: 'same', text: "Raison d'être\nDerrière une clé il n'y a qu'un seul être humain vivant. C" }, { op: 'removed', text: "'" }, { op: 'added', text: '’' }, { op: 'same', text: "est le seul et unique propos de la certification, qui donne à notre toile fiduciaire sa valeur." }, ]; expect(text(condense(parts, 24))).toBe("… être humain vivant. C[-'][+’]est le seul et unique …"); }); it('two changes far apart: the middle is cut; close ones stay together', () => { const far: DiffPart[] = [ { op: 'same', text: 'Je m' }, { op: 'removed', text: "'" }, { op: 'added', text: '’' }, { op: 'same', text: 'engage à vérifier la clé publique avec la personne, en sa présence, avant toute certification de son compte, et à n' }, { op: 'removed', text: "'" }, { op: 'added', text: '’' }, { op: 'same', text: 'en rien faire sinon.' }, ]; expect(text(condense(far, 20))).toBe("Je m[-'][+’]engage à vérifier la … son compte, et à n[-'][+’]en rien faire sinon."); const near: DiffPart[] = [ { op: 'same', text: 'Je m' }, { op: 'removed', text: "'" }, { op: 'added', text: '’' }, { op: 'same', text: 'engage à n' }, { op: 'removed', text: "'" }, { op: 'added', text: '’' }, { op: 'same', text: 'utiliser qu' }, ]; expect(condense(near, 20)).toEqual(near); }); it('nothing changed: the text as it is', () => { const same: DiffPart[] = [{ op: 'same', text: 'Un texte.' }]; expect(condense(same)).toEqual(same); }); });