Skip to content

Testing

Per quanto riguarda il testing si è cercato di adottare il più possibile il TDD, specialmente nelle prime fasi dello sviluppo. Le fasi finali di raffinazione del codice hanno visto un minor utilizzo di questo approccio.

Dove possibile inoltre si è cercato di sfruttare il DSL per la creazione delle griglie, in modo da rendere i test più leggibili e comprensibili.

L'adozione di ScalaTest nella scrittura dei test ha permesso di mantenere un approccio idiomatico.

Scoverage

Per ottenere risultati più accurati e rappresentativi sono state escluse dal calcolo della coverage i sorgenti presenti nel package view. Di seguito vengono mostrati i risultati di coverage ottenuti.

Esempi rilevanti

Controllo percentuale mappa inondata

scala
it should "verify that 0% of the map is flooded if there is no water" in:
    val grid: DistanceGrid[Cell] =
    --- | --- | --- ||
    --- | --- | --- ||
    --- | --- | ---

    damageCalculator.floodedMapPercentage(grid, floodThreshold = 1.0) shouldBe 0.0

it should "verify that 100% of the map is flooded if all cells are flooded" in:
    val grid: DistanceGrid[Cell] =
    "100" | "100" | "100" ||
     "60" |  "70" |  "80" ||
     "55" |  "90" | "100"

Applicazione effetti meteo

scala
"apply different weather effects to different cells based on weatherGrid" in:
  val cellGrid = createCellGrid(3, 3, 0.0, noAbsorption)

  val weatherMap = (for
    x <- 0 until 3
    y <- 0 until 3
  yield
    val weather = if x == y then Weather.HeavyRain else Weather.LightClouds
    Coordinate(x, y) -> weather
  ).toMap

  val weatherGrid = MapBasedGrid(3, 3, weatherMap)
  val updatedGrid = service.applyWeatherEffects(cellGrid, weatherGrid)

  updatedGrid.getElementAt(Coordinate(0, 0)) match
    case Some(cell) => cell.waterVolume shouldBe 1.0 +- 0.00001
    case None       => fail("Expected cell at (0,0)")

  updatedGrid.getElementAt(Coordinate(1, 1)) match
    case Some(cell) => cell.waterVolume shouldBe 1.0 +- 0.00001
    case None       => fail("Expected cell at (1,1)")

  updatedGrid.getElementAt(Coordinate(0, 1)) match
    case Some(cell) => cell.waterVolume shouldBe 0.0 +- 0.00001
    case None       => fail("Expected cell at (0,1)")

Test di aggiornamento dello stato della simulazione nello store

scala
it should "update from Some state to None" in:
    val store        = SimulationStore()
    val initialState = SimulationState(
      cellGrid(10, 10),
      weatherGrid(10, 10),
      50.0
    )
    
    store.updateSimulationState(_ => Some(initialState))
    store.updateSimulationState(_ => None)
    
    val extractedState = createStateExtractionStore(store)
    extractedState shouldBe None

Considerazioni

Mantenendo una copertura quasi totale sul package model, si è riusciti a garantire la correttezza delle funzionalità principali dell'applicazione in ogni fase di sviluppo, identificando subito eventuali comportamenti indesiderati. Il TDD, infine, ha aiutato nella progettazione permettendo di descrivere il comportamento atteso delle funzionalità prima ancora di implementarle.