Thomas Papendieck
6 years ago
8 changed files with 317 additions and 0 deletions
-
33TDD-Mocking/pom.xml
-
37TDD-Mocking/src/main/java/de/edu/hsfulda/ciip/tdd/GameCell.java
-
9TDD-Mocking/src/main/java/de/edu/hsfulda/ciip/tdd/State.java
-
21TDD-Mocking/src/main/java/de/edu/hsfulda/ciip/tdd/StateAlive.java
-
26TDD-Mocking/src/main/java/de/edu/hsfulda/ciip/tdd/StateDead.java
-
77TDD-Mocking/src/test/java/de/edu/hsfulda/ciip/tdd/GameCellTest.java
-
53TDD-Mocking/src/test/java/de/edu/hsfulda/ciip/tdd/StatusAliveTest.java
-
61TDD-Mocking/src/test/java/de/edu/hsfulda/ciip/tdd/StatusDeadTest.java
@ -0,0 +1,33 @@ |
|||||
|
|
||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
|
<modelVersion>4.0.0</modelVersion> |
||||
|
|
||||
|
<groupId>de.edu.hsfulda.ciip.tdd</groupId> |
||||
|
<artifactId>ConwaysGameOfLife</artifactId> |
||||
|
<version>1.0-SNAPSHOT</version> |
||||
|
<packaging>jar</packaging> |
||||
|
|
||||
|
<properties> |
||||
|
<maven.compiler.source>1.8</maven.compiler.source> |
||||
|
<maven.compiler.target>1.8</maven.compiler.target> |
||||
|
</properties> |
||||
|
<build> |
||||
|
<sourceDirectory>src/main/java</sourceDirectory> |
||||
|
</build> |
||||
|
<dependencies> |
||||
|
<dependency> |
||||
|
<groupId>junit</groupId> |
||||
|
<artifactId>junit</artifactId> |
||||
|
<version>4.12</version> |
||||
|
<scope>test</scope> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>org.mockito</groupId> |
||||
|
<artifactId>mockito-all</artifactId> |
||||
|
<version>1.10.19</version> |
||||
|
<scope>test</scope> |
||||
|
</dependency> |
||||
|
</dependencies> |
||||
|
</project> |
@ -0,0 +1,37 @@ |
|||||
|
package de.edu.hsfulda.ciip.tdd; |
||||
|
|
||||
|
import java.util.ArrayList; |
||||
|
import java.util.Collection; |
||||
|
import java.util.Collections; |
||||
|
import java.util.List; |
||||
|
import java.util.stream.Collector; |
||||
|
import java.util.stream.Collectors; |
||||
|
|
||||
|
public class GameCell { |
||||
|
|
||||
|
private State state; |
||||
|
private State nextState; |
||||
|
private final List<GameCell> neighbors = new ArrayList<>(); |
||||
|
|
||||
|
public GameCell(State state) { |
||||
|
this.state = state; |
||||
|
} |
||||
|
|
||||
|
public State getState() { |
||||
|
return state; |
||||
|
} |
||||
|
|
||||
|
public void calculateNextGen() { |
||||
|
List<State> neigborStates = neighbors.stream().map(GameCell::getState).collect(Collectors.toList()); |
||||
|
nextState = state.nextBy(neigborStates); |
||||
|
} |
||||
|
|
||||
|
public void activateNextGeneration() { |
||||
|
state = nextState; |
||||
|
} |
||||
|
|
||||
|
public void addNeigbour(GameCell gameCell) { |
||||
|
neighbors.add(gameCell); |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,9 @@ |
|||||
|
package de.edu.hsfulda.ciip.tdd; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
public interface State { |
||||
|
|
||||
|
State nextBy(List<State> neigborStates); |
||||
|
|
||||
|
} |
@ -0,0 +1,21 @@ |
|||||
|
package de.edu.hsfulda.ciip.tdd; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
public class StateAlive implements State { |
||||
|
|
||||
|
@Override |
||||
|
public State nextBy(List<State> neigborStates) { |
||||
|
long alifeNeigbors = countAliveNeighbors(neigborStates); |
||||
|
if(alifeNeigbors >1) { |
||||
|
return this; |
||||
|
} else { |
||||
|
return new StateDead(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private long countAliveNeighbors(List<State> neigborStates) { |
||||
|
return neigborStates.stream().filter(state -> this == state).count(); |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,26 @@ |
|||||
|
package de.edu.hsfulda.ciip.tdd; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
public class StateDead implements State { |
||||
|
|
||||
|
private static final int REQUIRED_FOR_CHANGE = 3; |
||||
|
|
||||
|
@Override |
||||
|
public State nextBy(List<State> neigborStates) { |
||||
|
long alifeNeigbors = countAliveNeighbors(neigborStates); |
||||
|
return findNextStateBy(alifeNeigbors); |
||||
|
} |
||||
|
|
||||
|
private State findNextStateBy(long alifeNeigbors) { |
||||
|
if (REQUIRED_FOR_CHANGE == alifeNeigbors) |
||||
|
return this; |
||||
|
else |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
private long countAliveNeighbors(List<State> neigborStates) { |
||||
|
return neigborStates.stream().filter(state -> this != state).count(); |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,77 @@ |
|||||
|
package de.edu.hsfulda.ciip.tdd; |
||||
|
|
||||
|
import static org.mockito.Mockito.any; |
||||
|
import static org.hamcrest.CoreMatchers.equalTo; |
||||
|
import static org.junit.Assert.*; |
||||
|
import static org.mockito.Mockito.doReturn; |
||||
|
import static org.mockito.Mockito.mock; |
||||
|
import static org.mockito.Mockito.verify; |
||||
|
import static org.mockito.Mockito.when; |
||||
|
|
||||
|
import java.util.Arrays; |
||||
|
import java.util.Collection; |
||||
|
import java.util.List; |
||||
|
|
||||
|
import org.hamcrest.CoreMatchers; |
||||
|
import org.junit.Rule; |
||||
|
import org.junit.Test; |
||||
|
import org.mockito.ArgumentCaptor; |
||||
|
import org.mockito.Mock; |
||||
|
import org.mockito.junit.MockitoJUnit; |
||||
|
import org.mockito.junit.MockitoRule; |
||||
|
|
||||
|
public class GameCellTest { |
||||
|
|
||||
|
@Rule |
||||
|
public MockitoRule mockitoRule = MockitoJUnit.rule(); |
||||
|
|
||||
|
@Mock |
||||
|
State initialState; |
||||
|
|
||||
|
@Mock |
||||
|
State changedState; |
||||
|
|
||||
|
@Test |
||||
|
public void reportsInitiallyProvidesState() { |
||||
|
GameCell cell = new GameCell(initialState); |
||||
|
|
||||
|
State result = cell.getState(); |
||||
|
|
||||
|
assertThat("initial state returned", result, equalTo(initialState)); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void changesStateWhenRequested() { |
||||
|
GameCell cell = new GameCell(initialState); |
||||
|
when(initialState.nextBy(any(List.class))).thenReturn(changedState); |
||||
|
|
||||
|
cell.calculateNextGen(); |
||||
|
verify(initialState).nextBy(any(List.class)); |
||||
|
|
||||
|
cell.activateNextGeneration(); |
||||
|
State result = cell.getState(); |
||||
|
assertThat("initial state returned", result, equalTo(changedState)); |
||||
|
} |
||||
|
|
||||
|
@SuppressWarnings("unchecked") |
||||
|
@Test |
||||
|
|
||||
|
public void passesNeigbourStatesForStateChangeCalculation() { |
||||
|
GameCell cell = new GameCell(initialState); |
||||
|
List<State> neighborStates = Arrays.asList(mock(State.class), mock(State.class), mock(State.class), |
||||
|
mock(State.class)); |
||||
|
for (State state : neighborStates) { |
||||
|
cell.addNeigbour(new GameCell(state)); |
||||
|
} |
||||
|
|
||||
|
cell.calculateNextGen(); |
||||
|
ArgumentCaptor<List> passedStates = ArgumentCaptor.forClass(List.class); |
||||
|
verify(initialState).nextBy(passedStates.capture()); |
||||
|
|
||||
|
List<State> statesPassed = passedStates.getValue(); |
||||
|
for (State state : neighborStates) { |
||||
|
assertThat(statesPassed, CoreMatchers.hasItem(state)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,53 @@ |
|||||
|
package de.edu.hsfulda.ciip.tdd; |
||||
|
|
||||
|
import static org.hamcrest.CoreMatchers.equalTo; |
||||
|
import static org.hamcrest.CoreMatchers.not; |
||||
|
import static org.junit.Assert.*; |
||||
|
|
||||
|
import java.util.Arrays; |
||||
|
import java.util.List; |
||||
|
|
||||
|
import org.junit.Rule; |
||||
|
import org.junit.Test; |
||||
|
import org.mockito.Mock; |
||||
|
import org.mockito.junit.MockitoJUnit; |
||||
|
import org.mockito.junit.MockitoRule; |
||||
|
|
||||
|
public class StatusAliveTest { |
||||
|
|
||||
|
@Rule |
||||
|
public MockitoRule mockitoRule = MockitoJUnit.rule(); |
||||
|
|
||||
|
@Mock |
||||
|
State dead; |
||||
|
|
||||
|
@Test |
||||
|
public void changeToDeadIfOneAliveNeighbor() { |
||||
|
// arrange |
||||
|
State stateAlive = new StateAlive(); |
||||
|
List<State> neigborStates = Arrays.asList(stateAlive,dead,dead,dead,dead,dead,dead,dead); |
||||
|
|
||||
|
// act |
||||
|
State result = stateAlive.nextBy(neigborStates); |
||||
|
|
||||
|
// assert |
||||
|
assertNotNull("",result); |
||||
|
assertThat("changed to dead", result.getClass(), not(equalTo(stateAlive.getClass()))); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void KeepSateAliveWithTwoLivingNeighbors() { |
||||
|
// arrange |
||||
|
State stateAlive = new StateAlive(); |
||||
|
List<State> neigborStates = Arrays.asList(stateAlive,stateAlive,dead,dead,dead,dead,dead,dead); |
||||
|
|
||||
|
// act |
||||
|
State result = stateAlive.nextBy(neigborStates); |
||||
|
|
||||
|
// assert |
||||
|
assertNotNull("",result); |
||||
|
assertThat("Still alive", result.getClass(), (equalTo(stateAlive.getClass()))); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
@ -0,0 +1,61 @@ |
|||||
|
package de.edu.hsfulda.ciip.tdd; |
||||
|
|
||||
|
import static org.hamcrest.CoreMatchers.equalTo; |
||||
|
import static org.junit.Assert.assertThat; |
||||
|
import static org.mockito.Mockito.mock; |
||||
|
|
||||
|
import java.util.ArrayList; |
||||
|
import java.util.Arrays; |
||||
|
import java.util.Collection; |
||||
|
import java.util.Collections; |
||||
|
import java.util.List; |
||||
|
|
||||
|
import org.junit.Test; |
||||
|
import org.junit.runner.RunWith; |
||||
|
import org.junit.runners.Parameterized; |
||||
|
import org.junit.runners.Parameterized.Parameter; |
||||
|
import org.junit.runners.Parameterized.Parameters; |
||||
|
|
||||
|
@RunWith(Parameterized.class) |
||||
|
public class StatusDeadTest { |
||||
|
private static State[] states = { mock(State.class, "alife"), new StateDead() }; |
||||
|
private static final int alife = 0; |
||||
|
private static final int dead = 1; |
||||
|
|
||||
|
@Parameters(name = "{index}: condition: {0} expected: {2}") |
||||
|
public static Collection<Object[]> data() { |
||||
|
|
||||
|
return Arrays |
||||
|
.asList(new Object[][] { { "all dead", 0, dead }, { "one alife", 1, dead }, { "two alife", 2, dead }, |
||||
|
{ "four alife", 4, dead }, { "five alife", 5, dead }, { "three alife", 3, alife } }); |
||||
|
} |
||||
|
|
||||
|
@Parameter // first data value (0) is default |
||||
|
public /* NOT private */ String assertMessage; |
||||
|
|
||||
|
@Parameter(1) |
||||
|
public /* NOT private */ int aliveneigborCount; |
||||
|
|
||||
|
@Parameter(2) |
||||
|
public /* NOT private */ int expected; |
||||
|
|
||||
|
@Test |
||||
|
public void calculateNextState() { |
||||
|
// arrange |
||||
|
List<State> neigborStates = new ArrayList<>(); |
||||
|
for (int i = 0; i < aliveneigborCount; i++) |
||||
|
neigborStates.add(states[alife]); |
||||
|
while (neigborStates.size() < 8) { |
||||
|
neigborStates.add(states[dead]); |
||||
|
} |
||||
|
Collections.shuffle(neigborStates); |
||||
|
|
||||
|
// act |
||||
|
State stateDead = states[dead]; |
||||
|
State result = stateDead.nextBy(neigborStates); |
||||
|
|
||||
|
// assert |
||||
|
assertThat(assertMessage, result, equalTo(states[expected])); |
||||
|
} |
||||
|
|
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue