// Historique Precedent / Suivant des entrees ouvertes (js/app.js). const test = require('node:test'); const assert = require('node:assert/strict'); const { loadApp } = require('./harness.js'); const T = loadApp().__test; const fresh = () => ({ ids: [], pos: -1 }); const all = () => true; test('ouvrir A puis B : Precedent vise A, Suivant rien', () => { const h = fresh(); T.entryHistoryPush(h, 1); T.entryHistoryPush(h, 2); assert.deepEqual(h.ids, [1, 2]); assert.equal(h.ids[T.entryHistoryTarget(h, -1, all)], 1); assert.equal(T.entryHistoryTarget(h, +1, all), -1); }); test('meme entree deux fois : pas de doublon', () => { const h = fresh(); T.entryHistoryPush(h, 1); T.entryHistoryPush(h, 1); assert.deepEqual(h.ids, [1]); }); test('revenir puis ouvrir ailleurs oublie les suivants', () => { const h = fresh(); [1, 2, 3].forEach(id => T.entryHistoryPush(h, id)); h.pos = 0; // revenu sur 1 T.entryHistoryPush(h, 4); assert.deepEqual(h.ids, [1, 4]); assert.equal(h.pos, 1); }); test('une entree supprimee est sautee', () => { const h = fresh(); [1, 2, 3].forEach(id => T.entryHistoryPush(h, id)); const exists = id => id !== 2; assert.equal(h.ids[T.entryHistoryTarget(h, -1, exists)], 1); assert.equal(T.entryHistoryTarget(h, -1, id => id === 3), -1); }); test('historique borne', () => { const h = fresh(); for (let i = 0; i < T.ENTRY_HISTORY_MAX + 10; i++) T.entryHistoryPush(h, i); assert.equal(h.ids.length, T.ENTRY_HISTORY_MAX); assert.equal(h.pos, T.ENTRY_HISTORY_MAX - 1); });