TestDrivenDevelopment

From SPA Wiki

Jump to: navigation, search

TDD is a very interactive session, and there's not a lot we can record in terms of useful session output.

You might be interested to look at the problem we based the session on at http://acm.uva.es/problemset/v1/101.html and our sample tests:

import junit.framework.TestCase;
public class BlocksTest extends TestCase {

public BlocksTest(String arg0) { super(arg0); }

public void testThatBlocksStartInCorrectInitialPositions(){ BlocksWorld blocksWorld = new BlocksWorld(2); assertEquals(0, blocksWorld.getPositionOfBlock(0)); assertEquals(1, blocksWorld.getPositionOfBlock(1)); }

public void testThatBlockMovedOverOtherChangesPosition(){ BlocksWorld blocksWorld = new BlocksWorld(2); blocksWorld.moveOver(0,1);

assertEquals(1, blocksWorld.getPositionOfBlock(0)); assertEquals(1, blocksWorld.getPositionOfBlock(1)); }

public void testThatBlockMovedOverOneThatIsNotInItsOriginalPositionOtherChangesPosition(){ BlocksWorld blocksWorld = new BlocksWorld(3); blocksWorld.moveOver(1,2); blocksWorld.moveOver(0,1);

assertEquals(2, blocksWorld.getPositionOfBlock(0)); assertEquals(2, blocksWorld.getPositionOfBlock(1)); assertEquals(2, blocksWorld.getPositionOfBlock(2)); }

public void testThatBlocksOnTopOfMovingBlockReturnToOriginalPosition() { BlocksWorld blocksWorld = new BlocksWorld(3); blocksWorld.moveOver(0,1); blocksWorld.moveOver(1,2);

assertEquals(0, blocksWorld.getPositionOfBlock(0)); }

public void testThatBlocksBelowMovingBlockStayWhereTheyAre() { BlocksWorld blocksWorld = new BlocksWorld(4); blocksWorld.moveOver(1,2); blocksWorld.moveOver(0,1); blocksWorld.moveOver(0,3);

assertEquals(3, blocksWorld.getPositionOfBlock(0)); assertEquals(2, blocksWorld.getPositionOfBlock(1)); assertEquals(2, blocksWorld.getPositionOfBlock(2)); assertEquals(3, blocksWorld.getPositionOfBlock(3)); }

public void testThatBlocksBelowMovingBlockStayWhereTheyAreForOtherCase() { BlocksWorld blocksWorld = new BlocksWorld(4); blocksWorld.moveOver(1,0); blocksWorld.moveOver(2,1); blocksWorld.moveOver(2,3);

assertEquals(0, blocksWorld.getPositionOfBlock(0)); assertEquals(0, blocksWorld.getPositionOfBlock(1)); assertEquals(3, blocksWorld.getPositionOfBlock(2)); assertEquals(3, blocksWorld.getPositionOfBlock(3)); }

}

and code:

import java.util.*;
public class BlocksWorld {

private List[] piles;

public BlocksWorld(int numberOfBlocks) { piles = new ArrayList[numberOfBlocks]; for (int pileNumber = 0; pileNumber < piles.length; pileNumber%2b%2b) { piles[pileNumber] = createPile(pileNumber); } }

private List createPile(int pileNumber) { List pile = new ArrayList(); int blockNumber = pileNumber; pile.add(block(blockNumber)); return pile; }

public int getPositionOfBlock(int blockNumber) { for (int pileNumber = 0; pileNumber < piles.length; pileNumber%2b%2b) { if(piles[pileNumber].contains(block(blockNumber))){ return pileNumber; } } return -1; }

private Integer block(int blockNumber) { return new Integer(blockNumber); }

private List getPileContaining(int blockNumber) { return piles[getPositionOfBlock(blockNumber)]; }

public void moveOver(int blockA, int blockB) { moveBlocksAboveToOriginalPosition(blockA); move(blockA, blockB); }

private void move(int blockA, int blockB) { getPileContaining(blockA).remove(block(blockA)); getPileContaining(blockB).add(block(blockA)); }

private void moveBlocksAboveToOriginalPosition(int blockA) { List pileToMoveBlocksFrom = getPileContaining(blockA); int indexOfBlockInPile = pileToMoveBlocksFrom.indexOf(block(blockA)); for (int numberInPile = indexOfBlockInPile%2b1; numberInPile < pileToMoveBlocksFrom.size(); numberInPile%2b%2b) { moveToOriginalPosition(pileToMoveBlocksFrom, numberInPile); } }

private void moveToOriginalPosition(List pileToMoveBlocksFrom, int positionInPile) { Integer blockToMove = (Integer) pileToMoveBlocksFrom.get(positionInPile); pileToMoveBlocksFrom.remove(positionInPile); piles[blockToMove.intValue()].add(blockToMove); }

}

We got as far as doing a tiny bit of refactoring (as by this stage the solution is starting to smell pretty bad), but that's about it. You might be interested in seeing if you can apply your refactoring skills to this one while keeping the unit tests passing.

Cheers, DuncanPierce and IvanMoore

Back to OtTwoThousandAndFourOutput.