ConwayLife Sprint1

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 Cell
public 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();
	}
}

Project

Qua riporto le implementazioni delle interfacce ICell, IGrid e ILife, rispettivamente Cell, Grid e Life. Codice di Cell Codice di Grid Codice di Life

Testing

Qua riporto le implementazioni dei test di unità per le classi Cell, Grid e Life, rispettivamente CellTest, GridTest e LifeTest. Codice di CellTest Codice di GridTest Codice di LifeTest

Deployment

Il deployment è stato fatto con una libreria JAR (slim) chiamata conway26Java-1.0.jar

Maintenance