Content of file GameHistoryImplTest.java
package de.fhdw.gaming.ipspiel21.dilemmaOriginal.domain;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.fail;
import java.util.Optional;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import de.fhdw.gaming.core.domain.GameException;
import de.fhdw.gaming.ipspiel21.dilemmaOriginal.domain.DilemmaGame;
import de.fhdw.gaming.ipspiel21.dilemmaOriginal.domain.DilemmaGameBuilder;
  | No need to import a type that lives in the same package.  |  | 
import de.fhdw.gaming.ipspiel21.dilemmaOriginal.domain.impl.DilemmaGameBuilderImpl;
import de.fhdw.gaming.ipspiel21.dilemmaOriginal.moves.impl.DilemmaBeSilentMove;
import de.fhdw.gaming.ipspiel21.dilemmaOriginal.moves.impl.DilemmaConfessMove;
import de.fhdw.gaming.ipspiel21.dilemmaOriginal.moves.impl.DilemmaDefaultMoveFactory;
import de.fhdw.gaming.ipspiel21.dilemmaOriginal.strategy.DilemmaAlwaysConfessStrategy;
import de.fhdw.gaming.ipspiel21.dilemmaOriginal.strategy.DilemmaStaySilentStrategyFactory;
import de.fhdw.gaming.ipspiel21.evolution.EvolutionPlayer;
import de.fhdw.gaming.ipspiel21.evolution.MemoryObserver;
/**
 * Tests Game History with DilemmaGame.
 */
class GameHistoryImplTest {
    /**
     * Game Builder.
     */
    private DilemmaGameBuilder gameBuilder;
    /**
     * Silent Move.
     */
    private DilemmaBeSilentMove silentMove;
    /**
     * Confess Move.
     */
    private DilemmaConfessMove confessMove;
    /**
     * Creates a new builder for each test. Side effect from other project. Without no testing possible.
     */
    @BeforeEach
    public void initTest() {
        this.gameBuilder = new DilemmaGameBuilderImpl();
        this.silentMove = new DilemmaBeSilentMove();
        this.confessMove = new DilemmaConfessMove();
    }
    /**
     * Tests a Game History.
     */
    @Test
    public void gameHistoryMoves() {
        try {
            final int gameId = 1;
            final String player1 = "Torben";
            final String player2 = "Flo";
            final DilemmaStaySilentStrategyFactory silentFactory = new DilemmaStaySilentStrategyFactory();
            this.gameBuilder.addPlayerBuilder(
                    this.gameBuilder.createPlayerBuilder().defaultPlayerBuilder().changeName(player1),
                    new DilemmaAlwaysConfessStrategy(new DilemmaDefaultMoveFactory()));
            this.gameBuilder.addPlayerBuilder(
                    this.gameBuilder.createPlayerBuilder().defaultPlayerBuilder().changeName(player2),
                    silentFactory.create(new DilemmaDefaultMoveFactory()));
            try (DilemmaGame game = this.gameBuilder.build(gameId)) {
                game.addObserver(new MemoryObserver());
                game.start();
                while (!game.isFinished()) {
                    game.makeMove();
                }
                final EvolutionPlayer evplayer1 = game.getPlayers().get(player1);
                assertThat(evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).getGameId(),
                        is(equalTo(gameId)));
                assertThat(evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).getMove(0),
                        is(equalTo(confessMove)));
                assertThat(evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).getOpponentMove(0),
                        is(equalTo(silentMove)));
                assertThat(evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).getOutcome(),
                        is(equalTo(Optional.of(0.0))));
                assertThat(evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).getOpponentOutcome(),
                        is(equalTo(Optional.of(-10.0))));
                assertThat(evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).numberOfPlayedMoves(),
                        is(equalTo(1)));
                final EvolutionPlayer evplayer2 = game.getPlayers().get(player2);
                assertThat(evplayer2.getGameHistoryCollection().getSpecificGameHistory(0).getGameId(),
                        is(equalTo(gameId)));
                assertThat(evplayer2.getGameHistoryCollection().getSpecificGameHistory(0).getOpponentMove(0),
                        is(equalTo(confessMove)));
                assertThat(evplayer2.getGameHistoryCollection().getSpecificGameHistory(0).getMove(0),
                        is(equalTo(silentMove)));
                assertThat(evplayer2.getGameHistoryCollection().getSpecificGameHistory(0).getOutcome(),
                        is(equalTo(Optional.of(-10.0))));
                assertThat(evplayer2.getGameHistoryCollection().getSpecificGameHistory(0).getOpponentOutcome(),
                        is(equalTo(Optional.of(0.0))));
                assertThat(evplayer2.getGameHistoryCollection().getSpecificGameHistory(0).numberOfPlayedMoves(),
                        is(equalTo(1)));
                evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).setOutcome(false,
                        Optional.of(1000.0));
                assertThat(evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).getOutcome(),
                        is(equalTo(Optional.of(1000.0))));
                evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).setOutcome(true,
                        Optional.of(-555.0));
                assertThat(evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).getOpponentOutcome(),
                        is(equalTo(Optional.of(-555.0))));
                evplayer2.getGameHistoryCollection().getSpecificGameHistory(0).setOutcome(false,
                        Optional.of(99.0));
                assertThat(evplayer2.getGameHistoryCollection().getSpecificGameHistory(0).getOutcome(),
                        is(equalTo(Optional.of(99.0))));
                evplayer2.getGameHistoryCollection().getSpecificGameHistory(0).setOutcome(true, Optional.of(22.0));
                assertThat(evplayer2.getGameHistoryCollection().getSpecificGameHistory(0).getOpponentOutcome(),
                        is(equalTo(Optional.of(22.0))));
                evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).addMove(false, silentMove);
                assertThat(evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).getMove(0),
                        is(equalTo(silentMove)));
                assertThat(evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).getMove(1),
                        is(equalTo(confessMove)));
                evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).addMove(true, confessMove);
                evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).addMove(true, silentMove);
                evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).addMove(true, confessMove);
                assertThat(evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).getOpponentMove(0),
                        is(equalTo(confessMove)));
                assertThat(evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).getOpponentMove(1),
                        is(equalTo(silentMove)));
                assertThat(evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).getOpponentMove(2),
                        is(equalTo(confessMove)));
                assertThat(evplayer1.getGameHistoryCollection().getSpecificGameHistory(0).getOpponentMove(3),
                        is(equalTo(silentMove)));
                assertThrows(IndexOutOfBoundsException.class, () -> evplayer1.getGameHistoryCollection()
                        .getSpecificGameHistory(0).getOpponentMove(9999));
            }
        } catch (GameException | InterruptedException e) {
            fail(e.getMessage());
        }
    }
}