package model;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

public class GridTest {
  private Grid grid;

  @BeforeEach
  public void initializeGrid() {
    grid = new Grid(6, 6);
  }

  @Test
  public void testGetNeighbours() {
    assertThat(grid.getNeighbors(1, 1)).isNotNull();
    assertThat(grid.getNeighbors(1, 1)).hasSize(8);
    assertThat(grid.getNeighbors(1, 1))
            .containsExactlyInAnyOrder(grid.getCell(0, 0),
                    grid.getCell(0, 1),
                    grid.getCell(0, 2),
                    grid.getCell(1, 0),
                    grid.getCell(1, 2),
                    grid.getCell(2, 0),
                    grid.getCell(2, 1),
                    grid.getCell(2, 2));
  }

  @Test
  public void testCountAliveNeighbours() {
    assertThat(grid.countAliveNeighbors(1, 1)).isEqualTo(0);
    grid.getCell(2, 2).setState(CellState.ALIVE);
    grid.getCell(0, 0).setState(CellState.ALIVE);
    assertThat(grid.countAliveNeighbors(1, 1)).isEqualTo(2);
  }

  @Test
  public void testCalculateNextState() {
    grid.getCell(1, 0).setState(CellState.ALIVE);
    grid.getCell(1, 1).setState(CellState.ALIVE);
    grid.getCell(1, 2).setState(CellState.ALIVE);
    assertThat(grid.calculateNextState(0, 0).isAlive).isFalse();
    assertThat(grid.calculateNextState(1, 0).isAlive).isFalse();
    assertThat(grid.calculateNextState(1, 1).isAlive).isTrue();
    assertThat(grid.calculateNextState(2, 1).isAlive).isTrue();
  }

}