/** * Quick Slots Tests — Phase 4.6 * * Tests: slot assignment, active selection, key switching. */ import { describe, it, expect } from 'vitest'; import { QuickSlots, SLOT_COUNT } from '../src/player/quickslots'; describe('QuickSlots — creation', () => { it('starts with all slots empty', () => { const qs = new QuickSlots(); for (let i = 0; i < SLOT_COUNT; i++) { expect(qs.getSlot(i)).toBeNull(); } }); it('starts with slot 0 active', () => { const qs = new QuickSlots(); expect(qs.activeIndex).toBe(0); }); it('has 4 slots', () => { expect(SLOT_COUNT).toBe(4); const qs = new QuickSlots(); expect(qs.getAll()).toHaveLength(4); }); }); describe('QuickSlots — assignment', () => { it('assigns item to slot', () => { const qs = new QuickSlots(); qs.assign(0, 'Na'); expect(qs.getSlot(0)).toBe('Na'); }); it('replaces existing item in slot', () => { const qs = new QuickSlots(); qs.assign(0, 'Na'); qs.assign(0, 'Fe'); expect(qs.getSlot(0)).toBe('Fe'); }); it('clears slot with null', () => { const qs = new QuickSlots(); qs.assign(0, 'Na'); qs.assign(0, null); expect(qs.getSlot(0)).toBeNull(); }); it('ignores invalid index', () => { const qs = new QuickSlots(); qs.assign(-1, 'Na'); qs.assign(4, 'Na'); // No crash, no change expect(qs.getAll()).toEqual([null, null, null, null]); }); }); describe('QuickSlots — active slot', () => { it('returns active slot item', () => { const qs = new QuickSlots(); qs.assign(0, 'Na'); expect(qs.getActive()).toBe('Na'); }); it('returns null for empty active slot', () => { const qs = new QuickSlots(); expect(qs.getActive()).toBeNull(); }); it('switches active slot', () => { const qs = new QuickSlots(); qs.assign(0, 'Na'); qs.assign(1, 'Fe'); qs.assign(2, 'Cu'); qs.setActive(1); expect(qs.activeIndex).toBe(1); expect(qs.getActive()).toBe('Fe'); qs.setActive(2); expect(qs.getActive()).toBe('Cu'); }); it('clamps active index to valid range', () => { const qs = new QuickSlots(); qs.setActive(-1); expect(qs.activeIndex).toBe(0); qs.setActive(10); expect(qs.activeIndex).toBe(3); }); }); describe('QuickSlots — getAll', () => { it('returns snapshot of all slots', () => { const qs = new QuickSlots(); qs.assign(0, 'Na'); qs.assign(2, 'Fe'); expect(qs.getAll()).toEqual(['Na', null, 'Fe', null]); }); }); describe('QuickSlots — auto-assign', () => { it('assigns to first empty slot', () => { const qs = new QuickSlots(); qs.assign(0, 'Na'); const index = qs.autoAssign('Fe'); expect(index).toBe(1); expect(qs.getSlot(1)).toBe('Fe'); }); it('returns -1 when all slots full', () => { const qs = new QuickSlots(); qs.assign(0, 'Na'); qs.assign(1, 'Fe'); qs.assign(2, 'Cu'); qs.assign(3, 'S'); const index = qs.autoAssign('H'); expect(index).toBe(-1); }); it('does not duplicate item already in a slot', () => { const qs = new QuickSlots(); qs.assign(0, 'Na'); const index = qs.autoAssign('Na'); expect(index).toBe(-1); // already assigned expect(qs.getAll().filter(s => s === 'Na')).toHaveLength(1); }); });