forked from yvv/decision
Chaque section du lecteur finit par l'ordre de ses articles (inertie 2) : ses articles numérotés, son vote déplié, « Proposer un autre ordre » — une liste où l'on clique un article puis sa place, ses flèches, ou le clavier. Le titre du document (inertie 4) se vote et se propose sous le titre, « traduction à revoir » quand il a changé. Les deux sont dans la liste des propositions, le panier et la chaîne Ğ1 ; un nouvel article se propose dans une section, à sa fin. La liste du groupe compte les propositions ouvertes des modules. Restes mineurs : la participation ramenée se dit en deux temps (la mesure, puis ce que le groupe demande), les lignes « habituelle » des réglages resserrées, le sélecteur d'inertie se parcourt aux flèches (le cran actuel atteignable, jamais choisi), la marque « seed a minima » porte le vrai nombre de votes. Contrôles : C25 (ordre, dont la chaîne et le téléphone), C26 (titre), C27 (participation ramenée) ; C3, C17 (41 modules), C20 mis à jour. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
39 lines
1.8 KiB
TypeScript
39 lines
1.8 KiB
TypeScript
// The order of a section, proposed with a list one clicks (Yvv, 2026-10-30:
|
|
// « une simple liste clipable »): an article, then its new place; or its arrows.
|
|
import { describe, expect, it } from 'vitest';
|
|
import { moved, place, sameOrder, step } from '../../src/lib/order';
|
|
|
|
const section = ['T1', 'E1', 'E2', 'E3'];
|
|
|
|
describe('the order of a section, by clicks', () => {
|
|
it('an article chosen takes the place clicked, the others close up', () => {
|
|
expect(place(section, 'E2', 'T1')).toEqual(['E2', 'T1', 'E1', 'E3']);
|
|
expect(place(section, 'T1', 'E3')).toEqual(['E1', 'E2', 'E3', 'T1']);
|
|
expect(place(section, 'E1', 'E2')).toEqual(['T1', 'E2', 'E1', 'E3']);
|
|
// Its own place, or an article not in the list: nothing moves.
|
|
expect(place(section, 'E1', 'E1')).toEqual(section);
|
|
expect(place(section, 'X9', 'E1')).toEqual(section);
|
|
expect(place(section, 'E1', 'X9')).toEqual(section);
|
|
});
|
|
|
|
it('the arrows move one place, never beyond the ends', () => {
|
|
expect(step(section, 'E2', -1)).toEqual(['T1', 'E2', 'E1', 'E3']);
|
|
expect(step(section, 'E2', 1)).toEqual(['T1', 'E1', 'E3', 'E2']);
|
|
expect(step(section, 'T1', -1)).toEqual(section);
|
|
expect(step(section, 'E3', 1)).toEqual(section);
|
|
});
|
|
|
|
it('a list never loses nor doubles an article', () => {
|
|
const once = place(step(place(section, 'E3', 'T1'), 'T1', 1), 'E1', 'E3');
|
|
expect([...once].sort()).toEqual([...section].sort());
|
|
});
|
|
|
|
it('tells the order in force from another, and what moved', () => {
|
|
expect(sameOrder(section, [...section])).toBe(true);
|
|
expect(sameOrder(section, step(section, 'E1', 1))).toBe(false);
|
|
expect(sameOrder(section, section.slice(1))).toBe(false);
|
|
expect([...moved(section, ['E1', 'T1', 'E2', 'E3'])].sort()).toEqual(['E1', 'T1']);
|
|
expect(moved(section, section).size).toBe(0);
|
|
});
|
|
});
|