// nextSize : calcul de la nouvelle taille d'un panneau (delta, inversion, clamp min/max). import { describe, it, expect } from 'vitest'; import { nextSize } from '../src/composables/useSplitter'; describe('useSplitter · nextSize', () => { it('ajoute le delta de position (sens direct)', () => { expect(nextSize(200, 100, 150, { min: 100, max: 400 })).toBe(250); }); it('soustrait le delta quand invert (poignée à droite/bas)', () => { expect(nextSize(200, 100, 150, { min: 100, max: 400, invert: true })).toBe(150); }); it('clampe au maximum', () => { expect(nextSize(380, 100, 200, { min: 100, max: 400 })).toBe(400); }); it('clampe au minimum', () => { expect(nextSize(120, 200, 100, { min: 100, max: 400 })).toBe(100); }); it('taille inchangée si la position ne bouge pas', () => { expect(nextSize(300, 150, 150, { min: 100, max: 400 })).toBe(300); }); // Régression : PanelSplitter passait ses bornes PAR VALEUR, capturées au premier rendu. Avec des // bornes dérivées du viewport ou d'une largeur mesurée, un drag clampait sur des valeurs périmées // (le clavier, lui, relisait les props : les deux voies ne s'accordaient plus). it('relit min/max à chaque appel (bornes réactives)', () => { const bounds = { min: 100, max: 200 }; const opts = { get min() { return bounds.min; }, get max() { return bounds.max; }, }; expect(nextSize(150, 0, 500, opts)).toBe(200); bounds.max = 900; expect(nextSize(150, 0, 500, opts)).toBe(650); }); });