forked from yvv/decision
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>
46 lines
2.0 KiB
TypeScript
46 lines
2.0 KiB
TypeScript
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);
|
||
});
|
||
});
|