import { describe, it, expect } from 'vitest' import { ATTRS, ATTR_ICON, ATTR_COLOR, TEAM_CSS, PHASE_LABEL, gaugePercent } from '../../src/utils/hudUtils' describe('utils/hudUtils', () => { describe('constantes', () => { it('ATTRS contient les 4 attributs du jeu', () => { expect(ATTRS).toEqual(['food', 'war', 'health', 'diplo']) }) it('ATTR_ICON a une icône pour chaque attribut', () => { ATTRS.forEach(attr => expect(ATTR_ICON[attr]).toBeTruthy()) }) it('ATTR_COLOR a une couleur pour chaque attribut', () => { ATTRS.forEach(attr => expect(ATTR_COLOR[attr]).toMatch(/^#[0-9a-f]{6}$/i)) }) it('TEAM_CSS couvre les 4 emplacements d\'équipe possibles (0 à 3, max 4 joueurs)', () => { expect(Object.keys(TEAM_CSS)).toEqual(['0', '1', '2', '3']) }) it('PHASE_LABEL couvre toutes les phases de jeu émises par le serveur', () => { expect(Object.keys(PHASE_LABEL).sort()).toEqual( ['end', 'resolve', 'selecting', 'waiting'].sort() ) }) }) describe('gaugePercent', () => { it('retourne 0 pour une valeur de 0', () => { expect(gaugePercent(0)).toBe(0) }) it('retourne 100 pour la valeur maximale théorique (6 * 12 = 72)', () => { expect(gaugePercent(72)).toBe(100) }) it('calcule un pourcentage proportionnel pour une valeur intermédiaire', () => { expect(gaugePercent(36)).toBe(50) // 36/72 = 50% }) it('borne à 100 même si la valeur dépasse le maximum théorique', () => { expect(gaugePercent(200)).toBe(100) }) it('ne retourne jamais de pourcentage négatif pour une valeur négative', () => { expect(gaugePercent(-10)).toBe(0) }) it('accepte des paramètres maxAttrPerTurn/maxTurns personnalisés', () => { expect(gaugePercent(5, 5, 10)).toBe(10) // 5 / (5*10) = 10% }) it('ne divise pas par zéro si max=0', () => { expect(gaugePercent(5, 0, 12)).toBe(0) }) it('arrondit au pourcentage entier le plus proche', () => { // 10/72 = 13.888...% → arrondi à 14 expect(gaugePercent(10)).toBe(14) }) }) })