Indholdsfortegnelse

Kryds & Bolle – the TDD way

System

Engine-klasse der håndterer:

Software skal som udgangspunkt ikke have en GUI.

Use-cases

Jeg har identificeres følgende use-cases for kryds og bolle.


Hvilke use cases kan vi implementere først, så andre bliver lettere?

Hvis en use case kræver en anden for at give mening, så implementér den anden først.

UC1 – Initialisere spil

Trigger: Opret engine eller kald reset()

System:

  1. board fyldes med 0
  2. currentPlayer = 1
  3. gameState = RUNNING

Tests:

  1. shouldInitializeBoardWithZeros()
  2. shouldSetCurrentPlayerToOne()

UC2 – Placere brik

Trigger: placeMark(row, col)

Forudsætninger:

  1. gameState == RUNNING
  2. Felt er tomt
  3. Position er gyldig (0-2)

System:

  1. board[row][col] = currentPlayer
  2. Tjek for sejr/uafgjort
  3. Skift spiller hvis spil fortsætter
  4. Return true

Tests:

  1. shouldPlaceMarkOnEmptyField()
  2. shouldSwitchPlayerAfterMove()

UC3 – Afvise ugyldigt træk

Situationer:

  1. Felt optaget
  2. Spil afsluttet
  3. Ugyldig position

System:

  1. Ingen ændring i board
  2. currentPlayer ændres ikke
  3. Return false

Tests:

  1. shouldNotPlaceOnOccupiedField()
  2. shouldNotAllowMoveWhenGameIsOver()

UC4 – Registrere sejr

Trigger: Efter gyldigt træk

System:

  1. 3 ens i række, kolonne eller diagonal
  2. gameState = WON
  3. Spillet stopper

Tests:

  1. shouldDetectHorizontalWin()
  2. shouldDetectVerticalWin()
  3. shouldDetectDiagonalWin()

UC5 – Registrere uafgjort

Trigger: Efter gyldigt træk

Forudsætning:

  1. Board fuldt
  2. Ingen vinder

System:

  1. gameState = DRAW

Test:

  1. shouldDetectDraw()

TDD Arbejdsgang

For hver use case:

  1. Skriv én test
  2. Se den fejle
  3. Implementér minimal kode
  4. Refaktorér
  5. Gentag