import { describe, it, expect } from 'vitest'; import { flip, flipTo, roll, Part } from '@/core/part'; import { createRNG } from '@/utils/rng'; function createTestPart(overrides: Partial> & TMeta): Part { return { id: 'test-part', regionId: 'test-region', position: [0, 0], ...overrides, } as Part; } describe('flip', () => { it('should cycle to next side when sides is defined', () => { const part = createTestPart({ sides: 2, side: 0 }); flip(part); expect(part.side).toBe(1); flip(part); expect(part.side).toBe(0); }); it('should wrap around when side reaches sides count', () => { const part = createTestPart({ sides: 6, side: 5 }); flip(part); expect(part.side).toBe(0); }); it('should do nothing when sides is undefined', () => { const part = createTestPart({ side: 3 }); flip(part); expect(part.side).toBe(3); }); it('should initialize side to 0 when side is undefined', () => { const part = createTestPart({ sides: 4 }); flip(part); expect(part.side).toBe(1); }); }); describe('flipTo', () => { it('should set side to specified value', () => { const part = createTestPart({ sides: 6, side: 0 }); flipTo(part, 3); expect(part.side).toBe(3); }); it('should do nothing when sides is undefined', () => { const part = createTestPart({ side: 2 }); flipTo(part, 5); expect(part.side).toBe(2); }); it('should do nothing when side exceeds sides count', () => { const part = createTestPart({ sides: 6, side: 0 }); flipTo(part, 6); expect(part.side).toBe(0); }); it('should allow side equal to sides - 1', () => { const part = createTestPart({ sides: 6, side: 0 }); flipTo(part, 5); expect(part.side).toBe(5); }); }); describe('roll', () => { it('should randomize side when sides is defined', () => { const part = createTestPart({ sides: 6 }); const rng = createRNG(12345); roll(part, rng); expect(part.side).toBeGreaterThanOrEqual(0); expect(part.side).toBeLessThan(6); }); it('should do nothing when sides is undefined', () => { const part = createTestPart({ side: 3 }); const rng = createRNG(12345); roll(part, rng); expect(part.side).toBe(3); }); it('should produce deterministic results with same seed', () => { const part1 = createTestPart({ sides: 6 }); const part2 = createTestPart({ sides: 6 }); const rng1 = createRNG(42); const rng2 = createRNG(42); roll(part1, rng1); roll(part2, rng2); expect(part1.side).toBe(part2.side); }); });