< Summary

Information
Class: Minesweeper.MinefieldModule
Assembly: Minesweeper
File(s): /home/runner/work/poc-fsharp-tdd-kata-minesweeper2/poc-fsharp-tdd-kata-minesweeper2/src/Minesweeper/Minefield.fs
Tag: 29_2333059465
Line coverage
88%
Covered lines: 60
Uncovered lines: 8
Coverable lines: 68
Total lines: 102
Line coverage: 88.2%
Branch coverage
69%
Covered branches: 25
Total branches: 36
Branch coverage: 69.4%
Method coverage

Method coverage is only available for sponsors.

Upgrade to PRO version

Coverage History

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
Invoke(...)100%1100%
Invoke(...)100%2100%
string(...)16.66%628.57%
ifWin(...)100%4100%
getCells(...)50%250%
click(...)100%14100%
Invoke(...)100%1100%
start(...)33.33%695.65%
count(...)50%250%

File(s)

/home/runner/work/poc-fsharp-tdd-kata-minesweeper2/poc-fsharp-tdd-kata-minesweeper2/src/Minesweeper/Minefield.fs

#LineLine coverage
 1namespace Minesweeper
 2
 3open System
 4open System.Text
 5
 6type Minefield =
 7    | Setup of width:int * height:int
 8    | SetupWithBombPos of width:int * height:int * seq<int * int>
 9    | Playing of width:int * height:int * Map<int * int, Cell>
 10    | Win of width:int * height:int * Map<int * int, Cell>
 11    | Loose of width:int * height:int * Map<int * int, Cell>
 12
 13module Minefield =
 14    let rec string v =
 15        let print w z =
 316            let sb = (StringBuilder(), z) ||> Map.fold(fun s (y, x) z ->
 2717                let _1 = s.Append(z |> Cell.char)
 918                match x with
 1219                | _ when x = w - 1 -> _1.Append('\n')
 720                | _ -> _1.Append(' '))
 121            sb.ToString()
 122        match v with
 23        | Win (w, _, z) ->
 024            let r = (w, z) ||> print
 025            r + "\nWin"
 26        | Loose (w, _, z) ->
 027            let r = (w, z) ||> print
 028            r + "\nLoose"
 329        | Playing (w, _, z) -> (w, z) ||> print
 30
 031        | _ -> String.Empty
 32
 33    let ifWin v =
 1234        match v with
 35        | Playing (w, h, z) ->
 1636            let isNotWin = z |> Map.exists (fun x y ->
 3337                match y with
 738                | Covered(Number _) -> true
 3439                | _ -> false)
 840            match isNotWin with
 141            | false -> Win(w, h, z)
 742            | _ -> v
 443        | _ -> v
 44
 45    let getCells = function
 546        | Playing (w, h, z) -> z
 047        | _ -> Map.empty
 48
 49    let rec click p v =
 5150        match v with
 51        | Playing (w, h, z) ->
 52            let map = Option.map
 4253            let mapClick = map Cell.click
 4254            match Map.tryFind p z with
 55            | Some(Covered _) ->
 2656                let clicked = z |> Map.change p mapClick
 1357                match Map.tryFind p clicked with
 158                | Some(Bomb) -> Loose(w, h, clicked)
 59                | Some(Number 0) ->
 4860                    let (+) a b = (fst(a) + fst(b), snd(a) + snd(b))
 1261                    Playing(w, h, clicked) |> click (p + (-1, -1))
 662                                           |> click (p + (-1, 0))
 663                                           |> click (p + (-1, 1))
 664                                           |> click (p + (0, -1))
 665                                           |> click (p + (0, 1))
 666                                           |> click (p + (1, -1))
 667                                           |> click (p + (1, 0))
 668                                           |> click (p + (1, 1))
 669                                           |> ifWin
 1270                | _ -> Playing(w, h, clicked) |> ifWin
 2971            | _ -> v
 972        | _ -> v
 73
 74    let rec start v =
 975        match v with
 1076        | Setup (w, h) -> Playing (w, h, query {
 577            for y in 0..h - 1 do
 1578            for x in 0..w - 1 do
 22579            select ((y, x), 0 |> Number |> Covered)
 1080        } |> Map.ofSeq)
 81        | SetupWithBombPos (w, h, z) ->
 1282            let cells = Setup (w, h) |> start |> getCells
 1283            let cellsWithBombs = (cells, z) ||> Seq.fold (fun acc key ->
 484                let map = Option.map
 685                let mapAdd = map Cell.add
 4886                let (+) a b = (fst(a) + fst(b), snd(a) + snd(b))
 1887                acc |> Map.change key (map(fun i -> Covered Bomb))
 688                    |> Map.change (key + (-1, -1)) mapAdd
 689                    |> Map.change (key + (-1,  0)) mapAdd
 690                    |> Map.change (key + (-1,  1)) mapAdd
 691                    |> Map.change (key + ( 0, -1)) mapAdd
 692                    |> Map.change (key + ( 0,  1)) mapAdd
 693                    |> Map.change (key + ( 1, -1)) mapAdd
 694                    |> Map.change (key + ( 1,  0)) mapAdd
 695                    |> Map.change (key + ( 1,  1)) mapAdd
 496            )
 497            Playing(w, h, cellsWithBombs)
 098        | _ -> v
 99
 100    let count  = function
 2101        | Playing (w, h, z) -> z |> Map.count
 0102        | _ -> 0