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<Action> actions = imp.generateActions(game.getMap(), game.getPlayer(), CombatPhase.TURN);
assertEquals(1, actions.size());
assertInstanceOf(Wait.class, actions.get(0));
}
@Test
void generateWaitActions() {
List<Action> 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> 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> 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());
}
}