const { test, describe } = require('node:test') const assert = require('node:assert/strict') const { ITEMS, getItemById } = require('../../src/game/items') describe('items.js', () => { test('expose exactement 4 objets', () => { assert.equal(ITEMS.length, 4) }) test('chaque objet a un id unique', () => { const ids = ITEMS.map(i => i.id) assert.equal(new Set(ids).size, ids.length) }) test('chaque objet est lié à un attribut valide et a un coût positif', () => { const validAttrs = ['food', 'war', 'health', 'diplo'] for (const item of ITEMS) { assert.ok(validAttrs.includes(item.attr), `${item.id}.attr doit être un attribut valide`) assert.ok(item.cost > 0, `${item.id}.cost doit être positif`) } }) test('chaque objet a un effect reconnu par Room._applyItemEffects', () => { const knownEffects = ['double_gain', 'guaranteed_gain', 'copy_best_in_game'] for (const item of ITEMS) { assert.ok(knownEffects.includes(item.effect), `${item.id}.effect '${item.effect}' inconnu`) } }) test('guaranteed_gain (Trousse du Médecin) définit bien effectValue', () => { const medkit = getItemById('medkit') assert.ok(medkit) assert.equal(medkit.effect, 'guaranteed_gain') assert.equal(typeof medkit.effectValue, 'number') }) test('aucun attribut n\'est couvert par 2 objets différents (pas de conflit de cumul)', () => { const attrs = ITEMS.map(i => i.attr) assert.equal(new Set(attrs).size, attrs.length) }) describe('getItemById', () => { test('retourne l\'objet correspondant à un id existant', () => { const trebuchet = getItemById('trebuchet') assert.ok(trebuchet) assert.equal(trebuchet.name, 'Trébuchet') assert.equal(trebuchet.attr, 'war') }) test('retourne null pour un id inconnu', () => { assert.equal(getItemById('does-not-exist'), null) }) test('retourne null pour undefined/null', () => { assert.equal(getItemById(undefined), null) assert.equal(getItemById(null), null) }) }) })