Thomas Papendieck
4 years ago
commit
b853df175a
3 changed files with 129 additions and 0 deletions
-
24pom.xml
-
43src/main/java/de/edu/hsfulda/ccip/tdd/purefunction/BowlingCalculator.java
-
62src/test/java/de/edu/hsfulda/ccip/tdd/purefunction/BowlingCalculatorTest.java
@ -0,0 +1,24 @@ |
|||||
|
<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</groupId> |
||||
|
<artifactId>tdd-pure-function</artifactId> |
||||
|
<version>0.1.0-SNAPSHOT</version> |
||||
|
<properties> |
||||
|
<maven.compiler.target>11</maven.compiler.target> |
||||
|
<maven.compiler.source>11</maven.compiler.source> |
||||
|
</properties> |
||||
|
<dependencies> |
||||
|
<dependency> |
||||
|
<groupId>org.junit.jupiter</groupId> |
||||
|
<artifactId>junit-jupiter-engine</artifactId> |
||||
|
<version>5.5.2</version> |
||||
|
<scope>test</scope> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>org.junit.platform</groupId> |
||||
|
<artifactId>junit-platform-runner</artifactId> |
||||
|
<version>1.5.2</version> |
||||
|
<scope>test</scope> |
||||
|
</dependency> |
||||
|
</dependencies> |
||||
|
</project> |
@ -0,0 +1,43 @@ |
|||||
|
package de.edu.hsfulda.ccip.tdd.purefunction; |
||||
|
|
||||
|
import java.util.regex.Matcher; |
||||
|
import java.util.regex.Pattern; |
||||
|
|
||||
|
public class BowlingCalculator { |
||||
|
@FunctionalInterface |
||||
|
interface FrameScorer { |
||||
|
int score(Matcher frameMatcher); |
||||
|
} |
||||
|
|
||||
|
private static final int INITIAL_SCORE = 0; |
||||
|
private static final Pattern SINGLE_ROLL_PATTERN = Pattern.compile("\\d"); |
||||
|
private static final Pattern SPARE_PATTERN = Pattern.compile("(\\d)/ ([-\\d])"); |
||||
|
|
||||
|
public int score(String rolls) { |
||||
|
int score = INITIAL_SCORE; |
||||
|
Matcher singleRollMatcher = SINGLE_ROLL_PATTERN.matcher(rolls); |
||||
|
score = scoreFrameType(score, singleRollMatcher, matcher -> Integer.parseInt(singleRollMatcher.group())); |
||||
|
|
||||
|
Matcher spareMatcher = SPARE_PATTERN.matcher(rolls); |
||||
|
score = scoreFrameType(score, spareMatcher, matcher -> scoreSpareFrame(spareMatcher)); |
||||
|
|
||||
|
return score; |
||||
|
} |
||||
|
|
||||
|
private int scoreSpareFrame(Matcher spareMatcher) { |
||||
|
int frameScore = 10 - Integer.parseInt(spareMatcher.group(1)); |
||||
|
String nextRoll = spareMatcher.group(2); |
||||
|
if(!"-".equalsIgnoreCase(nextRoll)) { |
||||
|
frameScore += Integer.parseInt(spareMatcher.group(1)); |
||||
|
} |
||||
|
return frameScore; |
||||
|
} |
||||
|
|
||||
|
private int scoreFrameType(int score, Matcher scoreMatcher, FrameScorer frameScorer) { |
||||
|
while (scoreMatcher.find()) { |
||||
|
score += frameScorer.score(scoreMatcher); |
||||
|
} |
||||
|
return score; |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,62 @@ |
|||||
|
package de.edu.hsfulda.ccip.tdd.purefunction; |
||||
|
|
||||
|
import static org.junit.Assert.assertThat; |
||||
|
import static org.junit.jupiter.api.Assertions.*; |
||||
|
|
||||
|
import org.hamcrest.CoreMatchers; |
||||
|
import org.junit.Assert; |
||||
|
import org.junit.jupiter.api.BeforeEach; |
||||
|
import org.junit.jupiter.api.Test; |
||||
|
|
||||
|
class BowlingCalculatorTest { |
||||
|
|
||||
|
private BowlingCalculator bowlingCalculator; |
||||
|
|
||||
|
@BeforeEach |
||||
|
void setUp() throws Exception { |
||||
|
bowlingCalculator = new BowlingCalculator(); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void resultOfWorstGameIsZero() { |
||||
|
// arrange |
||||
|
String rolls = "-- -- -- -- -- -- -- -- -- --"; |
||||
|
int expectedScore = 0; |
||||
|
// act |
||||
|
int score = bowlingCalculator.score(rolls); |
||||
|
// assert |
||||
|
assertThat("score", score, CoreMatchers.equalTo(expectedScore)); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void addUpSingleRollInIncompleteFrames() { |
||||
|
// arrange |
||||
|
String rolls = "-1 23 -4 5- -6 -7 8- 9- -- --"; |
||||
|
int expectedScore = 45; |
||||
|
// act |
||||
|
int score = bowlingCalculator.score(rolls); |
||||
|
// assert |
||||
|
assertThat("score", score, CoreMatchers.equalTo(expectedScore)); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void frameWithSpareCounts10() { |
||||
|
// arrange |
||||
|
String rolls = "-- -- 3/ -- 7/ -- -- -- -- --"; |
||||
|
int expectedScore = 20; |
||||
|
// act |
||||
|
int score = bowlingCalculator.score(rolls); |
||||
|
// assert |
||||
|
assertThat("score", score, CoreMatchers.equalTo(expectedScore)); |
||||
|
} |
||||
|
@Test |
||||
|
void frameWithSpareAddsNextRollTwice() { |
||||
|
// arrange |
||||
|
String rolls = "-- -- 3/ 2- 7/ 8- -- -- -- --"; |
||||
|
int expectedScore = 40; |
||||
|
// act |
||||
|
int score = bowlingCalculator.score(rolls); |
||||
|
// assert |
||||
|
assertThat("score", score, CoreMatchers.equalTo(expectedScore)); |
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue