Question: Given the following three templates, in Java create 60 JUnit test cases for the 3 classes. Create GameTest.java, FrameTest.java, and BowlingTest.java. Hint: FrameTest.java should have
Given the following three templates, in Java create 60 JUnit test cases for the 3 classes.
Create GameTest.java, FrameTest.java, and BowlingTest.java.
Hint: FrameTest.java should have the following test cases:
testOneThrow()
testNeverKnockDownAllThePins()
testStrike()
testFrameScore()
Hint: GameTest.java should have the following test cases:
testEmptyGame()
testOneThrow1()
testThreeThrows()
testThreeThrows()
testThreeThrowsStrike()
testPerfectGame()
testAllOnesGame()
bowling class template:
--------------------------------------------------------------------------------------
import java.io.*;
public class Bowling {
static final int MAXFRAMES = 10;
static final int MAXROLLS = (MAXFRAMES * 2 + 1);
static int[] rolls = new int[MAXROLLS];
static Frame[] frames = new Frame[MAXFRAMES];
static final Bowling b = new Bowling();
class Frame
{
public int[] rollindex = new int[3];
public Frame()
{
for (int i = 0; i < 3; i++)
{
rollindex[i] = -1;
}
}
public int getTotal()
{
int tot = 0;
for (int i = 0; i < 3; i++)
{
if (rollindex[i] != -1)
{
tot += rolls[rollindex[i]];
}
}return tot;
}
public Frame newFrame() {
return new Frame();
}
public void main(String[] args)
throws IOException {
String inputline;
int nextroll = 0;
int i, pinsleft, hitpins;
boolean extrarolls = false;
for (i = 0; i < MAXROLLS; i++) {
rolls[i] = 0;
}
BufferedReader bufrd =
new BufferedReader(
new InputStreamReader(System.in));
nextframe:
for (int frame = 0; frame < MAXFRAMES; frame++) {
// frames[frame] = b.newFrame();
pinsleft = 10;
for (int roll = 0; roll < 3; roll++ ) {
// Get number of pins hit from user
while (true) {
System.out.println(
"Frame " + (frame+1) +
", roll " + (roll+1) +
", pins left " + pinsleft +
". How many hit?");
inputline = bufrd.readLine();
try {
hitpins =
Integer.parseInt(inputline);
} catch (NumberFormatException e) {
continue;
}
if ((hitpins >= 0) &&
(hitpins <= pinsleft)) {
break;
}
}
rolls[nextroll] = hitpins;
frames[frame].rollindex[roll] =
nextroll;
// If all pins down and this is not an
// extra roll, set it to add bonus rolls
int frametot = frames[frame].getTotal();
if ((frametot == 10) &&
(extrarolls == false)) {
for (int t = roll+1; t < 3; t++) {
frames[frame].rollindex[i] =
nextroll + (i - roll);
}
}
++nextroll;
pinsleft -= hitpins;
// two rolls, pins left, frame over
if ((roll == 1) &&
(frametot < 10)) {
continue nextframe;
}
// all pins knocked down...
if (frametot == 10) {
if (frame < (MAXFRAMES-1)) {
continue nextframe;
} else {
// ...and last frame
extrarolls = true;
}
}
if (extrarolls && (pinsleft == 0)) {
// new pins if needed
pinsleft = 10;
}
}
}
int total = 0;
for (i = 0; i < MAXFRAMES; i++) {
total += frames[i].getTotal();
}
System.out.println("Game total is " + total);
}
}
}
----------------------------------------------------------------------------------------------------------------
Game class template:
-----------------------------------------------------------------------------------------------------------------
import java.util.*;
public class Game { static final int ALL_PINS_DOWN = 10; static final int FRAMES_PER_GAME = 10; static final int THROWS_PER_FRAME = 2; static final int EXTRA_THROW_AT_END_OF_GAME = 1; static final int MAX_THROWS = FRAMES_PER_GAME * THROWS_PER_FRAME + EXTRA_THROW_AT_END_OF_GAME;
int[] theThrows = new int[MAX_THROWS]; int throwCount = 0;
public String getScore(int frame) { if (!frameIsComplete(frame)) return ""; int score = 0; for (int i = 1; i <= frame; i++) score += howMuchThisFrameIsWorth(i);
return Integer.toString(score); } private int sumOfLeftAndRightThrows(int frame) { return getLeftThrow(frame)+getRightThrow(frame); } private int howMuchThisFrameIsWorth(int frame) { if (isStrike(frame)) return sumOfThreeThrows(frame); if (isSpare(frame)) return sumOfLeftAndRightThrows(frame)+getLeftThrow(frame+1); return sumOfLeftAndRightThrows(frame); } private boolean isStrike(int frame) { return getLeftThrow(frame)==ALL_PINS_DOWN; } private boolean isSpare(int frame) { return sumOfLeftAndRightThrows(frame)==ALL_PINS_DOWN; } private int sumOfThreeThrows(int frame) { return sumOfThrows(frame,3); } private int sumOfThrows(int frame, int numberOfThrows) { int sum = 0; for (int i = 0; i < numberOfThrows; i++) sum += theThrows[getIndexOfFrame(frame)+i]; return sum; } private int getLeftThrow(int frame) { return theThrows[getIndexOfFrame(frame)]; } private int getRightThrow(int frame) { return theThrows[getRightThrowIndex(frame)]; } public void setPinsKnockedDown(int pins) { theThrows[throwCount++] = pins; } public String getLeftBox(int frame) { return convertScore(getLeftThrow(frame)); } private String convertScore(int score) { if (score == 0) return ""; return ""+score; } private int getIndexOfFrame(int frame) { int index = 0; for (int i = 1; i < frame; i++) index += ballsInFrame(index); return index; } private int getLastIndexOfFrame(int frame) { return getIndexOfFrame(frame)+ballsInFrame(frame)-1; } private int getRightThrowIndex(int frame) { return getIndexOfFrame(frame)+1; } private boolean frameIsComplete(int frame) { return numberOfCompleteFrames() >= frame; } private int numberOfCompleteFrames() { int count; for (count = 0; getLastIndexOfFrame(count+1) < throwCount; count++) ; return count; } private int ballsInFrame(int index) { if (theThrows[index]==ALL_PINS_DOWN) return 1; return 2; } }
--------------------------------------------------------------------------------------------------------
Frame Class template:
-------------------------------------------------------------------------------------------------------
public class Frame {
private int[] pins = new int[3]; private int throwCount; private Frame nextFrame;
public int getScore() { final int INDEX_OF_LAST_SCORABLE_FRAME = 9; return getScore(INDEX_OF_LAST_SCORABLE_FRAME); }
public int getScore(int frameIndex) { if (!isScoreAvailable()) return 0; return totalPins() + getScoreForNextFrame(frameIndex); }
private int getScoreForNextFrame(int frameIndex) { if (nextFrame == null || frameIndex == 0) return 0; return nextFrame.getScore(frameIndex - 1); }
public void addPins(int pins) { if (isFull()) giveThrowToNextFrame(pins); if (throwCount < throwsNeededForScore()) this.pins[throwCount++] = pins; }
private void giveThrowToNextFrame(int pins) { if (nextFrame == null) nextFrame = new Frame(); nextFrame.addPins(pins); }
private boolean isScoreAvailable() { return throwCount >= throwsNeededForScore(); }
private int throwsNeededForScore() { if (isStrike() || isSpare()) return 3; return 2; }
private boolean isStrike() { return pins[0] == 10; }
private boolean isSpare() { return pins[0] + pins[1] == 10; } private int totalPins() { int total = 0; for (int i = 0; i < throwsNeededForScore(); i++) total += pins [i]; return total; }
private boolean isFull() { return isStrike() || throwCount >= 2; }
}
-----------------------------------------------------------------------------------------------------------
Step by Step Solution
There are 3 Steps involved in it
Get step-by-step solutions from verified subject matter experts
