Introduction
Realizzazione in Java del GAME OF LIFE DI CONWAY
Requirements
- R1: Realizzare una versione in Java del gioco Life di Conway, come gioco zero-player. Il gioco consiste nell'introdurre una Griglia di Celle il cui stato (cella 'viva' o cella 'morta') evolve come stabilito dalle regole di ConwayLife
- R2: L'utente umano deve poter:
- R2.1: Specificare la configurazione iniziale della griglia del gioco
- R2.2: Vedere l'evoluzione del gioco in forma opportuna (si veda Problema della vista del gioco)
- R2.3: Fermare e far ripartire l'evoluzione del gioco
- R2.4: Pulire (a gioco fermo) la configurazione della griglia del gioco
Problem analysis
Requirement analysis
- Cosa intende il committente per "Cella"?
- interface ICell - Entità con stato vivo/morto.
- void setStatus(boolean alive) - Imposta esplicitamente lo stato della cella.
- boolean isAlive() - Restituisce true se la cella è viva, false altrimenti.
- void switchCellState() - Inverte lo stato corrente della cella (viva ↔ morta).
- Cosa intende il committente per "Griglia"?
- interface IGrid - Entità che rappresenta un insieme ordinato e bidimensionale di celle e gestisce le operazioni a loro correlate.
- int getRows() - Restituisce il numero di righe della griglia.
- int getCols() - Restituisce il numero di colonne della griglia.
- boolean isAlive(int row, int col) - Verifica se la cella in posizione (row, col) è viva.
- void setStatus(int row, int col, boolean status) - Aggiorna lo stato della cella in posizione (row, col).
- ICell getCell(int row, int col) - Restituisce il riferimento alla cella in posizione (row, col).
- void reset() - Modifica lo stato di tutte le celle della griglia portandole a morta.
- Cosa intende il committente per "Gioco Life di Conway"?
- interface ILife - Entità che coordina l'evoluzione del gioco applicando le regole di Conway.
- void nextGeneration() - Calcola e applica lo stato della generazione successiva.
- boolean isAlive(int row, int col) - Verifica lo stato della cella in posizione (row, col).
- void setCell(int row, int col, boolean alive) - Imposta lo stato di una cella identificata da (row, col).
- ICell getCell(int row, int col) - Restituisce il riferimento alla cella in posizione (row, col).
- int getRows() - Restituisce il numero di righe della griglia gestita.
- int getCols() - Restituisce il numero di colonne della griglia gestita.
- IGrid getGrid() - Restituisce il riferimento alla griglia gestita.
- int countNeighborsLive(int row, int col) - Conta le celle vive adiacenti alla cella in posizione (row, col).
Test plans
Test di unità per la classe Cellpublic class CellTest {
private ICell c;
@Before
public void setup() {
System.out.println("ConwayLifeTest | setup");
c = new Cell();
}
@After
public void down() {
System.out.println("ConwayLifeTest | down");
}
@Test
public void testCellAlive() {
System.out.println("ConwayLifeTest | doing alive");
c.setStatus(true);
boolean r = c.isAlive();
assertTrue(r);
c.setStatus(false);
}
@Test
public void testCellDead() {
System.out.println("ConwayLifeTest | doing alive");
c.setStatus(false);
boolean r = c.isAlive();
assertFalse(r);
}
@Test
public void testCellAlive() {
System.out.println("ConwayLifeTest | doing alive");
c.setStatus(true);
boolean r = c.isAlive();
assertTrue(r);
c.setStatus(false);
}
}
Test di unità per la classe Grid
public class GridTest {
private IGrid g;
public static final int rowsSize = 5;
public static final int colsSize = 5;
@Before
public void setup() {
System.out.println("GriTest | setup");
g = new Grid(rowsSize,colsSize);
}
@After
public void down() {
System.out.println("GridTest | down");
}
@Test
public void testSetGetCellCorretto() {
System.out.println("GridTest | testSetGetCellCorretto");
g.setStatus(0, 0, true);
assertTrue(g.isAlive(0, 0));
}
@Test(expected = IndexOutOfBoundsException.class)
public void testGetCellErrato1() {
System.out.println("GridTest | testGetCellErrato1");
g.isAlive(-1, -1);
}
@Test(expected = IndexOutOfBoundsException.class)
public void testGetCellErrato2() {
System.out.println("GridTest | testGetCellErrato2");
g.isAlive(rowsSize, colsSize);
}
@Test(expected = IndexOutOfBoundsException.class)
public void testSetCellErrato1() {
System.out.println("GridTest | testSetCellErrato1");
g.setStatus(-1, -1, true);
}
@Test(expected = IndexOutOfBoundsException.class)
public void testSetCellErrato2() {
System.out.println("GridTest | testSetCellErrato2");
g.setStatus(rowsSize, colsSize, true);
}
@Test
public void testGetRows() {
assertTrue(g.getRows()==rowsSize);
}
@Test
public void testGetCols() {
assertTrue(g.getCols()==colsSize);
}
}
Test di unità per la classe Life
public class LifeTest {
private ILife l;
public static final int rowsSize = 5;
public static final int colsSize = 5;
@Before
public void setup() {
System.out.println("LifeTest | setup");
l = null;
}
@After
public void down() {
System.out.println("LifeTest | down");
}
@Test
public void testNextGeneration() {
System.out.println("LifeTest | testNextGeneration");
l.setStatus(1, 1, true);
l.nextGeneration();
assertFalse(l.isAlive(1, 1));
}
@Test
public void testIsAlive1() {
System.out.println("LifeTest | testIsAlive1");
assertFalse(l.isAlive(0, 0));
}
@Test
public void testIsAlive2() {
System.out.println("LifeTest | testIsAlive2");
l.setStatus(0, 0, true);
assertTrue(l.isAlive(0, 0));
l.setStatus(0, 0, false);
}
@Test
public void testSetGetCellCorretto() {
System.out.println("LifeTest | testSetGetCellCorretto");
l.setStatus(0, 0, true);
assertTrue(g.isAlive(0, 0));
l.setStatus(0, 0, false);
}
@Test(expected = IndexOutOfBoundsException.class)
public void testGetCellErrato1() {
System.out.println("LifeTest | testGetCellErrato1");
g.isAlive(-1, -1);
}
@Test(expected = IndexOutOfBoundsException.class)
public void testGetCellErrato2() {
System.out.println("LifeTest | testGetCellErrato2");
g.isAlive(rowsSize, colsSize);
}
@Test(expected = IndexOutOfBoundsException.class)
public void testSetCellErrato1() {
System.out.println("LifeTest | testSetCellErrato1");
g.setStatus(-1, -1, true);
}
@Test(expected = IndexOutOfBoundsException.class)
public void testSetCellErrato2() {
System.out.println("LifeTest | testSetCellErrato2");
g.setStatus(rowsSize, colsSize, true);
}
@Test
public void testGetRows() {
System.out.println("LifeTest | testGetRows");
assertTrue(g.getRows()==rowsSize);
}
@Test
public void testGetCols() {
System.out.println("LifeTest | testGetCols");
assertTrue(g.getCols()==colsSize);
}
@Test
public void testGetGrid() {
System.out.println("LifeTest | testGetGrid");
IGrid grid = g.getGrid();
assertTrue(grid.getRows()==rowsSize);
assertTrue(grid.getCols()==colsSize);
}
@Test
public void testCountNeighborsLive() {
System.out.println("LifeTest | testCountNeighborsLive");
l.setStatus(1, 1, true);
l.setStatus(1, 2, true);
l.setStatus(1, 3, true);
int count = l.countNeighborsLive(2, 2);
assertTrue(count == 3);
l.getGrid().reset();
}
}