feat: quick slots with 1-4 hotkeys (Phase 4.6)
4 quick slots bound to keys 1-4. Active slot determines what F key throws. Auto-assigns new items on collection. Clears slot when item depleted. 15 new tests (213 total). Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
131
tests/quickslots.test.ts
Normal file
131
tests/quickslots.test.ts
Normal file
@@ -0,0 +1,131 @@
|
||||
/**
|
||||
* 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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user