mourning-ember / src / test / java / dev / llan / model / pieces / enemies / ImpTest.java
ImpTest.java
Raw
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());
  }
}