Files
decision/web/tests/unit/diff.test.ts
T
YvvandClaude Opus 5.5 83f8ca0981 v3 : interface des objections, des coquilles validées et de la messagerie ; contrôles C28–C31
Une version retenue par une objection le dit sous l'article, à chacun
selon son rôle : la personne qui vote voit qu'elle ne se vote plus (les
votes faits restent) ; l'auteur, quoi faire (« Modifier l'article visé »
pour une redite, « Reformuler » pour une contradiction) ; la personne qui
objecte, lever ou réitérer avant l'échéance. Le panier la montre sans
choix et ne l'envoie jamais.

« Détails » : faire une objection (redit / contredit), les objections et
où elles en sont, les coquilles proposées par d'autres avec leur diff
resserré, valider / refuser / revenir, l'historique dit qui a validé.
Une coquille se propose sur toute version ouverte ou en vigueur.

Boîte « Messages » dans le menu, avec le nombre de non-lus (pastille sur
le bouton du menu en mobile) : objet, texte, gestes, échéance ; un message
traité n'a plus de geste. Répondre à une objection lit son message.

Trilingue (fr, en, es). C6 suit la règle : la coquille d'un administrateur
sur un texte du seed passe tout de suite ; C28–C31 couvrent le reste.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 04:21:20 +01:00

46 lines
2.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
});
});