package dev.llan.model.pieces.enemies; import dev.llan.model.Game; import dev.llan.model.GameContainer; import dev.llan.model.board.Grid; import dev.llan.model.board.Point; import dev.llan.model.board.Tile.TileType; import dev.llan.model.board.pathfinding.Path; import dev.llan.model.state.combat.CombatManager.CombatPhase; import dev.llan.model.state.combat.actions.Action; import dev.llan.model.state.combat.actions.CardUse; import dev.llan.model.state.combat.actions.Move; import dev.llan.model.state.combat.actions.Wait; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.util.List; import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; class ImpTest { private Imp imp; private Game game; @BeforeEach void setUp() { GameContainer.getInstance().initGame(); game = GameContainer.getInstance().getCurrentGame(); game.getEnemies().stream() .filter(enemy -> (enemy instanceof Imp)) .findFirst() .ifPresent(enemy -> imp = (Imp) enemy); } @Test void generateTurnActions() { List actions = imp.generateActions(game.getMap(), game.getPlayer(), CombatPhase.TURN); assertEquals(1, actions.size()); assertInstanceOf(Wait.class, actions.get(0)); } @Test void generateWaitActions() { List actions = imp.generateActions(game.getMap(), game.getPlayer(), CombatPhase.WAIT); assertEquals(2, actions.size()); assertInstanceOf(Move.class, actions.get(0)); assertInstanceOf(CardUse.class, actions.get(1)); Move move = (Move) actions.get(0); assertNotNull(move.getPath()); CardUse cardUse = (CardUse) actions.get(1); assertSame(imp, cardUse.getActor()); } @Test void generateActivePath() { Optional path = imp.generateActivePath(game.getPlayer().getPosition()); assertTrue(path.isPresent()); Path generatedPath = path.get(); double distance = Point.getDistance(generatedPath.getEndpoint(), game.getPlayer().getPosition()); assertTrue(distance < 1.5); } @Test void generateActivePathWithTraffic() { game.getMap().getGrid().tileAt(new Point(1, 0)).setType(TileType.OCCUPIED); game.getMap().getGrid().tileAt(new Point(1, 1)).setType(TileType.OCCUPIED); game.getMap().getGrid().tileAt(new Point(0, 1)).setType(TileType.OCCUPIED); Optional path = imp.generateActivePath(game.getPlayer().getPosition()); assertTrue(path.isPresent()); Path generatedPath = path.get(); double distance = Point.getDistance(generatedPath.getEndpoint(), game.getPlayer().getPosition()); assertTrue(distance > 1.5); } @Test void testClone() { imp.generateActions(game.getMap(), game.getPlayer(), CombatPhase.WAIT); Grid clonedGrid = game.getMap().cloneGrid(); Imp clone = (Imp) imp.clone(clonedGrid); assertNotSame(imp, clone); assertNotSame(imp.getActivePath(), clone.getActivePath()); assertNotSame(imp.getStats(), clone.getStats()); assertNotSame(imp.getPosition(), clone.getPosition()); assertEquals( imp.getActivePath().get().getPath().size(), clone.getActivePath().get().getPath().size()); assertEquals(imp.getStats().getHealth(), clone.getStats().getHealth()); assertEquals(imp.getStats().getMovement(), clone.getStats().getMovement()); assertEquals(imp.getPosition().getRow(), clone.getPosition().getRow()); assertEquals(imp.getPosition().getCol(), clone.getPosition().getCol()); } }