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
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
"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
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 NoneConsiderazioni
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.