Files
Mana-Loop/src/lib/game/__tests__/room-utils-floor-state.test.ts
T
n8n-gitea 23a83a04cf
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m17s
fix: resolve all TypeScript compilation errors
- Fixed DisciplinesAttunementType enum usage in discipline data files
- Fixed EquipmentSlot import in equipment/types.ts
- Fixed enchantment-effects.ts export/import chain
- Fixed safe-persist.ts StateStorage type compatibility
- Fixed store persist partial return types for all stores
- Fixed gameStore.ts ElementState type and error handling
- Fixed useGameDerived.ts missing properties on GameCoordinatorStore
- Added SkillUpgradeChoice type to types.ts
- Fixed ActionButtons.tsx optional currentStudyTarget prop
- Fixed GameToast.tsx Toast type compatibility
- Fixed EnchantmentDesigner sub-component type mismatches
- Fixed SpireCombatPage equippedInstances/equipmentInstances types
- Fixed page.tsx computeClickMana argument
- Added baseCastTime to SpellDef type
- Fixed golem/types.ts and loot-drops.ts import paths
- Fixed craftingStore.ts missing lastError in initial state and actions
- Fixed store-actions-combat-prestige.test.ts Memory type usage
- Fixed floor-utils.upgraded.test.ts array type annotation
- Fixed computed-stats.test.ts state type assertions
- Fixed activity-log.test.ts state type annotation
- Fixed discipline-math.test.ts enum value usage
- Fixed game-loop.test.ts vitest mock import
- Various other test file type fixes
2026-05-24 14:34:49 +02:00

112 lines
4.3 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { generateFloorState } from '../utils/room-utils';
import { PUZZLE_ROOMS, SWARM_CONFIG, SPEED_ROOM_CONFIG } from '../constants';
import { getGuardianForFloor } from '../data/guardian-encounters';
import { getFloorMaxHP } from '../utils/floor-utils';
import { getDodgeChance } from '../utils/room-utils';
// ─── generateFloorState ───────────────────────────────────────────────────────
describe('generateFloorState', () => {
it('should return a FloorState object', () => {
const state = generateFloorState(1);
expect(typeof state).toBe('object');
expect(state).toHaveProperty('roomType');
expect(state).toHaveProperty('enemies');
});
it('should generate guardian state for guardian floor', () => {
const state = generateFloorState(10);
expect(state.roomType).toBe('guardian');
expect(state.enemies.length).toBe(1);
const g10 = getGuardianForFloor(10)!;
expect(state.enemies[0].name).toBe(g10.name);
expect(state.enemies[0].hp).toBe(g10.hp);
expect(state.enemies[0].element).toBe(g10.element);
});
it('should generate combat state for non-guardian floor with combat', () => {
const originalRandom = Math.random;
Math.random = () => 0.5; // Won't trigger special rooms
const state = generateFloorState(5);
expect(state.roomType).toBe('combat');
expect(state.enemies.length).toBe(1);
expect(state.enemies[0].hp).toBe(getFloorMaxHP(5));
Math.random = originalRandom;
});
it('should generate swarm state for swarm room', () => {
const originalRandom = Math.random;
Math.random = () => 0.14; // < SWARM_ROOM_CHANCE (0.15)
const state = generateFloorState(5);
expect(state.roomType).toBe('swarm');
expect(Array.isArray(state.enemies)).toBe(true);
expect(state.enemies.length).toBeGreaterThanOrEqual(SWARM_CONFIG.minEnemies);
Math.random = originalRandom;
});
it('should generate speed state for speed room', () => {
const originalRandom = Math.random;
Math.random = () => 0.09; // < SPEED_ROOM_CHANCE (0.10)
const state = generateFloorState(5);
expect(state.roomType).toBe('speed');
expect(state.enemies.length).toBe(1);
Math.random = originalRandom;
});
it('should generate puzzle state for puzzle room', () => {
const originalRandom = Math.random;
Math.random = () => 0.19; // < PUZZLE_ROOM_CHANCE (0.20)
const state = generateFloorState(7);
expect(state.roomType).toBe('puzzle');
expect(Array.isArray(state.enemies)).toBe(true);
expect(state.enemies).toEqual([]);
expect(state.puzzleProgress).toBe(0);
expect(typeof state.puzzleRequired).toBe('number');
expect(typeof state.puzzleId).toBe('string');
expect(typeof state.puzzleAttunements).toBe('object');
Math.random = originalRandom;
});
it('should fill puzzle attunements from PUZZLE_ROOMS', () => {
const originalRandom = Math.random;
Math.random = () => 0.19;
const state = generateFloorState(7);
expect(state.roomType).toBe('puzzle');
expect(state.puzzleAttunements!.length).toBeGreaterThan(0);
expect(typeof state.puzzleAttunements![0]).toBe('string');
Math.random = originalRandom;
});
it('should use correct element for floor', () => {
const state = generateFloorState(1);
expect(state.enemies[0].element).toBe('fire');
const state2 = generateFloorState(2);
expect(state2.enemies[0].element).toBe('water');
});
it('combat enemy HP should match floor max HP', () => {
const state = generateFloorState(50);
expect(state.enemies[0].hp).toBe(getFloorMaxHP(50));
});
it('speed room should have correct dodge chance', () => {
const originalRandom = Math.random;
Math.random = () => 0.09; // Speed room
const speedState = generateFloorState(50);
expect(speedState.roomType).toBe('speed');
expect(speedState.enemies[0].dodgeChance).toBe(getDodgeChance(50));
Math.random = originalRandom;
});
it('should handle very high floor number', () => {
const state = generateFloorState(1000);
expect(state.roomType).toBe('guardian');
});
it('should handle floor 0', () => {
const state = generateFloorState(0);
expect(state.roomType).toBe('combat');
});
});