private int _pinsKnocked = 0;
private int[] _rolls = new int[21];
public void Roll(int pinsKnocked) { _rolls[_index++] = pinsKnocked;}
for (var i = 0; i < 10; i++)
score += 10 + _rolls[ci + 1] + _rolls[ci + 2];
else if (_rolls[ci] + _rolls[ci + 1] == 10)
score += 10 + _rolls[ci + 2];
score += _rolls[ci] + _rolls[ci + 1];
public class BowlingGameTest
public void Roll_WhenCalledOnParamOf_0_ReturnScoreOf_0()
var game = new BowlingGame();
var actual = game.GameScore();
Assert.That(actual, Is.EqualTo(0));
public void Roll_WhenCalledOnParamOf_1_ReturnScoreOf_1()
var game = new BowlingGame();
var actual = game.GameScore();
Assert.That(actual, Is.EqualTo(1));
public void GameScore_WhenCalledOnAfterGutterGame_0_ReturnScoreOf_0()
var game = new BowlingGame();
SimulateRolls(game, 20, 0);
var actual = game.GameScore();
Assert.That(actual, Is.EqualTo(0));
public void GameScore_WhenCalledOnAfter20_1sHaveBeenRolled_ReturnScoreOf_0()
var game = new BowlingGame();
SimulateRolls(game, 20, 1);
var actual = game.GameScore();
Assert.That(actual, Is.EqualTo(20));
public void GameScore_WhenCalledOnAfter5_5_3_SpareGame_ReturnScoreOf_16()
var game = new BowlingGame();
SimulateRolls(game, 17, 0);
var actual = game.GameScore();
Assert.That(actual, Is.EqualTo(16));
public void GameScore_WhenCalledOnAfterX_5_3_SpareGame_ReturnScoreOf_42()
var game = new BowlingGame();
SimulateRolls(game, 16, 1);
var actual = game.GameScore();
Assert.That(actual, Is.EqualTo(18 + 8 + 16));
public void GameScore_WhenCalledOnAfterPerfectGame_ReturnScoreOf_300()
var game = new BowlingGame();
SimulateRolls(game, 12, 10);
var actual = game.GameScore();
Assert.That(actual, Is.EqualTo(300));
private static void SimulateRolls(BowlingGame game, int rolls, int pinsKnocked)
for ( var i = 0; i < rolls; i++ ) game.Roll(pinsKnocked);
public static void Main()
var test = new BowlingGameTest();
test.Roll_WhenCalledOnParamOf_0_ReturnScoreOf_0();
test.Roll_WhenCalledOnParamOf_1_ReturnScoreOf_1();
test.GameScore_WhenCalledOnAfterGutterGame_0_ReturnScoreOf_0();
test.GameScore_WhenCalledOnAfter20_1sHaveBeenRolled_ReturnScoreOf_0();
test.GameScore_WhenCalledOnAfter5_5_3_SpareGame_ReturnScoreOf_16();
test.GameScore_WhenCalledOnAfterX_5_3_SpareGame_ReturnScoreOf_42();
test.GameScore_WhenCalledOnAfterPerfectGame_ReturnScoreOf_300();
Console.WriteLine("Passed");
Console.WriteLine(ex.ToString());