1
exercism fetch ocaml minesweeper

test.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
(* Test/exercise version: "1.0.0" *)

open Core
open OUnit2
open Minesweeper

let format_board strings =
  let width = match strings with
    | [] -> 0
    | (s::_) -> String.length s in
  let border_line = "+" ^ String.make width '-' ^ "+\n" in
  let line s = "|" ^ s ^ "|\n" in
  "\n" ^ border_line ^ String.concat (List.map strings ~f:line) ^ border_line

(* Assert Equals *)
let ae exp got =
  assert_equal exp got ~cmp:(List.equal ~equal:String.equal) ~printer:format_board

let tests = [
  "no rows" >:: (fun _ ->
    let b = [] in
    let expected = [] in
    ae expected (annotate b)
  );
  "no columns" >:: (fun _ ->
    let b = [""] in
    let expected = [""] in
    ae expected (annotate b)
  );
  "no mines" >:: (fun _ ->
    let b = ["   ";
             "   ";
             "   "] in
    let expected = ["   ";
                    "   ";
                    "   "] in
    ae expected (annotate b)
  );
  "board with only mines" >:: (fun _ ->
    let b = ["***";
             "***";
             "***"] in
    let expected = ["***";
                    "***";
                    "***"] in
    ae expected (annotate b)
  );
  "mine surrounded by spaces" >:: (fun _ ->
    let b = ["   ";
             " * ";
             "   "] in
    let expected = ["111";
                    "1*1";
                    "111"] in
    ae expected (annotate b)
  );
  "space surrounded by mines" >:: (fun _ ->
    let b = ["***";
             "* *";
             "***"] in
    let expected = ["***";
                    "*8*";
                    "***"] in
    ae expected (annotate b)
  );
  "horizontal line" >:: (fun _ ->
    let b = [" * * "] in
    let expected = ["1*2*1"] in
    ae expected (annotate b)
  );
  "horizontal line, mines at edges" >:: (fun _ ->
    let b = ["*   *"] in
    let expected = ["*1 1*"] in
    ae expected (annotate b)
  );
  "vertical line" >:: (fun _ ->
    let b = [" ";
             "*";
             " ";
             "*";
             " "] in
    let expected = ["1";
                    "*";
                    "2";
                    "*";
                    "1"] in
    ae expected (annotate b)
  );
  "vertical line, mines at edges" >:: (fun _ ->
    let b = ["*";
             " ";
             " ";
             " ";
             "*"] in
    let expected = ["*";
                    "1";
                    " ";
                    "1";
                    "*"] in
    ae expected (annotate b)
  );
  "cross" >:: (fun _ ->
    let b = ["  *  ";
             "  *  ";
             "*****";
             "  *  ";
             "  *  "] in
    let expected = [" 2*2 ";
                    "25*52";
                    "*****";
                    "25*52";
                    " 2*2 "] in
    ae expected (annotate b)
  );
  "large board" >:: (fun _ ->
    let b = [" *  * ";
             "  *   ";
             "    * ";
             "   * *";
             " *  * ";
             "      "] in
    let expected = ["1*22*1";
                    "12*322";
                    " 123*2";
                    "112*4*";
                    "1*22*2";
                    "111111"] in
    ae expected (annotate b)
  );
]

let () =
  run_test_tt_main ("minesweeper tests" >::: tests)