|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
[CICLO3] Test Driven Development Task 3.2.3 (71104 vs fek THE ARMAGEDDON)
fek, quando vuoi sono pronto
direi che cominciare a prendere il codice dei test che avevo fatto, eventualmente anche il codice della classe, e semplificarlo; oppure se vuoi ricominciamo dall'inizio, come vuoi. intanto questo era il codice dei test: Codice:
public class TestPlayerGrid extends TestCase
{
private Config config;
private Bounds bounds;
private int rows;
private int cols;
private PlayerGrid pg;
public void setUp()
{
config = Config.createForTesting();
bounds = new Bounds(40, 40, 256, 448, config);
pg = new PlayerGrid(config, bounds);
rows = pg.getRows();
cols = pg.getColumns();
}
public void testDimensions()
{
assertEquals(pg.getRows(), rows);
assertEquals(pg.getColumns(), cols);
assertEquals(rows, config.getIntProperty("rows"));
assertEquals(cols, config.getIntProperty("columns"));
try
{
pg.getAt(0, 0);
pg.getAt(rows - 1, 0);
pg.getAt(0, cols - 1);
pg.getAt(rows - 1, cols - 1);
}
catch(IllegalArgumentException e)
{
fail("legal arguments rejected");
}
}
private void retrievalTest(boolean empty)
{
for (int y = 0; y < rows; y++)
{
for (int x = 0; x < cols; x++)
{
if (empty)
{
assertNull(pg.getAt(y, x));
}
else
{
assertNotNull(pg.getAt(y, x));
}
}
}
}
private void insertionTest()
{
for (int y = 0; y < rows; y++)
{
for (int x = 0; x < cols; x++)
{
assertTrue(pg.addGem(y, x, "diamond"));
assertFalse(pg.addGem(y, x, "diamond"));
}
}
}
private void removalTest()
{
for (int y = 0; y < rows; y++)
{
for (int x = 0; x < cols; x++)
{
assertTrue(pg.removeGem(y, x));
assertFalse(pg.removeGem(y, x));
}
}
}
public void testCells()
{
retrievalTest(true);
insertionTest();
retrievalTest(false);
removalTest();
}
public void testAssignBounds()
{
pg.addGem(0, 0, "diamond");
assertSame(pg.getAt(0, 0).getBounds(), bounds);
pg.removeGem(0, 0);
}
public void testDraw()
{
MockEngine engine = new MockEngine();
for (int y = 0; y < rows; y++)
{
for (int x = 0; x < cols; x++)
{
pg.addGem(y, x, "diamond");
}
}
pg.draw(engine);
assertEquals(engine.getNumberOfQuadsDrawn(), rows * cols);
for (int y = 0; y < rows; y++)
{
for (int x = 0; x < cols; x++)
{
pg.removeGem(y, x);
}
}
}
}
Ultima modifica di 71104 : 25-10-2005 alle 20:14. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Come sempre non fate commit sul Server perche' la build sara' precaria mentre scriviamo il task. Spengo la build machine.
Questo e' il task: 3.2.3 Creare una matrice di sprite MxN allineate al background e disegnare i diamanti contenuti Inziamo da zero. Il primo test te lo do' io, ma prima la cena Torno fra mezz'ora.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Primo test. Dobbiamo creare una matrice NxM. Appena creata una matrice e'... vuota.
Ecco il test: Codice:
public void testIsEmpty()
{
Grid grid = new Grid(14, 8);
assertTrue(grid.isEmpty());
}
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
pronti; è il minimo indispensabile imho:
Codice:
public class Grid
{
private int rows;
private int columns;
private Gem grid[][];
public Grid(int rows, int columns)
{
this.rows = rows;
this.columns = columns;
grid = new Gem[rows][columns];
}
public boolean isEmpty()
{
boolean result = true;
for (int y = 0; result && (y < rows); y++)
{
for (int x = 0; result && (x < columns); x++)
{
if (null != grid[y][x])
{
result = false;
}
}
}
return result;
}
}
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Non e' neppure vicino a essere il minimo indispensabile!!
Ho chiesto il minimo indispensabile per far passare il test e non una riga di codice in piu'. In quel codice ne vedo almeno venti di troppo. Codice:
public class Grid
{
public Grid(int rows, int columns)
{
}
public boolean isEmpty()
{
return true;
}
}
Ora vediamo se inserendo un diamante la griglia e' ancora vuota: Codice:
public void testIsNotEmpty()
{
Grid grid = new Grid(14, 8);
grid.insertDiamond(0, 0);
assertFalse("Grid is still empty after an insert", grid.isEmpty());
}
Si', ancora piu' semplice di quello che stai pensando ora. Molto piu' semplice. Ricorda i passi: - fai compilare prima il test - guarda che fallisce con l'implementazione corrente - fai la minima aggiunta che fa passare il test - guarda il test che passa - refactoring ed elimina il codice duplicato (ad esempio nei test)
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
#6 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
LOL, ok,
Codice:
public class Grid
{
private boolean empty = true;
public Grid(int rows, int columns)
{
}
public void insertDiamond(int row, int column)
{
empty = false;
}
public boolean isEmpty()
{
return empty;
}
}
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Perfetto!
Ora andiamo avanti e testiamo l'inserimento. Scrivi tu il test questa volta, inserisci un diamante e testi che ci sia un diamante nella posizione inserita.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
#8 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Codice:
public void testInsertion()
{
Grid grid = new Grid(14, 8);
grid.insertDiamond(0, 0);
assertNotNull("insertion failed", grid.getAt(0, 0));
}
piccola nota: penso sia giunto il momento di rendere grid un campo private della classe e gi aggiungere il metodo setUp |
|
|
|
|
|
|
#9 | ||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Ottimo test!
Volendo fare i pignolissimi, avrei preferito un metodo del chiamato isDiamondAt() che ritorni un boolean, per il principio di passare sempre le informazioni strettamente necessarie. A questo livello ci serve solo l'informazione se un diamante e' presente o meno ad una data posizione, non ci serve sapere quale diamante. Quote:
Quote:
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
||
|
|
|
|
|
#10 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
oplà! direi che bisogna fare così:
Codice:
public class TestGrid extends TestCase
{
private Grid grid;
public void setUp()
{
grid = new Grid(14, 8);
}
public void testIsEmpty()
{
assertTrue("Grid is not empty", grid.isEmpty());
}
public void testIsNotEmpty()
{
grid.insertDiamond(0, 0);
assertFalse("Grid is still empty after an insert", grid.isEmpty());
}
public void testInsertion()
{
grid.insertDiamond(0, 0);
assertTrue("insertion failed", grid.isDiamondAt(0, 0));
}
}
Codice:
public class Grid
{
private boolean empty = true;
private boolean grid[][];
public Grid(int rows, int columns)
{
grid = new boolean[rows][columns];
}
public void insertDiamond(int row, int column)
{
empty = false;
grid[row][column] = true;
}
public boolean isEmpty()
{
return empty;
}
public boolean isDiamondAt(int row, int column)
{
return grid[row][column];
}
}
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Infatti si e' offeso, quella non e' il codice minimale che fa passare il test
Ma e' questo: Codice:
public class Grid
{
private boolean empty = true;
public Grid(int rows, int columns)
{
}
public void insertDiamond(int row, int column)
{
empty = false;
}
public boolean isEmpty()
{
return empty;
}
public boolean isDiamondAt(int row, int column)
{
return true;
}
}
Codice:
public void testInsertion()
{
assertFalse("no diamond at (0,0)", grid.isDiamondAt(0, 0));
grid.insertDiamond(0, 0);
assertTrue("insertion failed", grid.isDiamondAt(0, 0));
}
Scrivi il test che lo fa passare. La versione piu' semplice possibile!
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA Ultima modifica di fek : 25-10-2005 alle 21:46. |
|
|
|
|
|
#12 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
vabbè, ragazzi sarò onesto, questa modifica me l'ha suggerita fek
comunque eccola: Codice:
public boolean isDiamondAt(int row, int column)
{
return !empty;
}
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Bene. Siamo un passettino piu' vicini alla fine.
Ora andiamo avanti per triangolazione. Ti scrivo io il prossimo test: Codice:
public void testTwoInsertions()
{
grid.insertDiamond(0, 0);
assertFalse("there's a diamond at (0,1) before insertion", grid.isDiamondAt(0, 1));
grid.insertDiamond(0, 1);
assertTrue("insertion failed at (0,1) ", grid.isDiamondAt(0, 1));
}
Ma non scrivere una riga di codice in piu'.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA Ultima modifica di fek : 25-10-2005 alle 22:11. |
|
|
|
|
|
#14 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
ok ci sono; guarda non ho neanche messo i campi privati rows e columns
Codice:
public class Grid
{
private boolean empty = true;
private boolean grid[][];
public Grid(int rows, int columns)
{
grid = new boolean[rows][columns];
}
public void insertDiamond(int row, int column)
{
empty = false;
grid[row][column] = true;
}
public boolean isEmpty()
{
return empty;
}
public boolean isDiamondAt(int row, int column)
{
return grid[row][column];
}
}
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Bene! Ora c'e' sempre una piccola duplicazione fra empty e la griglia, ma per ora possiamo sopravvivere. Magari la togliamo piu' in la'.
Una piccola cosa mi turba: che succede se inserisco un diamante in una posizione in cui c'e' gia'? Vorrei che si scatenasse una bella eccezione, scrivi il test relativo.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
#16 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Codice:
public void testRedundantInsertion()
{
try {
grid.insertDiamond(0, 0);
grid.insertDiamond(0, 0);
}
catch (IllegalArgumentException e)
{
return;
}
fail("Double insertion at same position should not be allowed");
}
Ultima modifica di 71104 : 25-10-2005 alle 22:24. |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Buon test che fallisce. Implementazione ora.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
#18 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
ok questo era semplice
Codice:
public void insertDiamond(int row, int column)
{
if (grid[row][column])
{
throw new IllegalArgumentException();
}
empty = false;
grid[row][column] = true;
}
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
edit: ho scritto una scemenza.
Ora mi serve un test che mi dica che nella posizione in cui inserisco un diamante ci sia effettivamente un oggetto di tipo Gem che poi disegneremo. Scrivi il test relativo.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA Ultima modifica di fek : 25-10-2005 alle 22:35. |
|
|
|
|
|
#20 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
direi di procedere così:
Codice:
public void testRetrieval()
{
grid.insertDiamond(0, 0);
Gem gem = grid.getGemAt(0, 0);
assertNotNull("Gem retrieval failed", gem);
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:24.


















