import { expect } from "@esm-bundle/chai"; import * as THREE from "three"; import { GameLoop } from "../../../src/core/GameLoop.js"; import { createGameLoopSetup, cleanupGameLoop, createRunData, createMockGameStateManagerForCombat, setupCombatUnits, cleanupTurnSystem, } from "./helpers.js"; describe("Core: GameLoop - Combat Highlights", function () { this.timeout(30000); let gameLoop; let container; let mockGameStateManager; let playerUnit; let enemyUnit; beforeEach(async () => { const setup = createGameLoopSetup(); gameLoop = setup.gameLoop; container = setup.container; // Clean up any existing state first if (gameLoop.turnSystemAbortController) { gameLoop.turnSystemAbortController.abort(); } gameLoop.stop(); if ( gameLoop.turnSystem && typeof gameLoop.turnSystem.reset === "function" ) { gameLoop.turnSystem.reset(); } gameLoop.init(container); mockGameStateManager = createMockGameStateManagerForCombat(); gameLoop.gameStateManager = mockGameStateManager; const runData = createRunData({ squad: [{ id: "u1", classId: "CLASS_VANGUARD" }], }); await gameLoop.startLevel(runData, { startAnimation: false }); const units = setupCombatUnits(gameLoop); playerUnit = units.playerUnit; enemyUnit = units.enemyUnit; }); afterEach(async () => { // Clear highlights first to free Three.js resources gameLoop.clearMovementHighlights(); gameLoop.clearSpawnZoneHighlights(); cleanupTurnSystem(gameLoop); cleanupGameLoop(gameLoop, container); // Small delay to allow cleanup to complete await new Promise((resolve) => setTimeout(resolve, 10)); }); it("CoA 6: should not show movement highlights for enemy units", () => { mockGameStateManager.getCombatState.returns({ activeUnit: { id: enemyUnit.id, name: enemyUnit.name, }, turnQueue: [], }); gameLoop.updateMovementHighlights(enemyUnit); expect(gameLoop.movementHighlights.size).to.equal(0); }); it("CoA 7: should clear movement highlights when not in combat", () => { mockGameStateManager.getCombatState.returns({ activeUnit: { id: playerUnit.id, name: playerUnit.name, }, turnQueue: [], }); gameLoop.updateMovementHighlights(playerUnit); expect(gameLoop.movementHighlights.size).to.be.greaterThan(0); mockGameStateManager.currentState = "STATE_DEPLOYMENT"; gameLoop.updateMovementHighlights(playerUnit); expect(gameLoop.movementHighlights.size).to.equal(0); }); });