OCaml の Test::Simple を目コピしてみた

これ

普通に OCaml のコードがコンパイルできるのすごい。

モジュール名は Test.Builder にしておく。

module Test.Builder

type status =
  | NotOk
  | Ok

type directive =
  | Todo of string

type diagnostic =
  | Diag of string list

type node =
  | TestCaseNode     of status * int * string * diagnostic             option
  | TodoTestCaseNode of status * int * string * directive * diagnostic option
  | DiagnosticNode   of diagnostic
  | PlanNode         of int

type test_document =
  | Document of node list

テストケースをノードとして管理?する。
test_document が一番トップの型みたいだ。

let rec count_test_nodes nodes count =
  match nodes with
    | []                                   -> count
    | TestCaseNode(_, _, _, _)::xs
    | TodoTestCaseNode(_, _, _, _, _)::xs  -> count_test_nodes xs count + 1
    | DiagnosticNode(_)::xs
    | PlanNode(_)::xs                      -> count_test_nodes xs count

関数 count_test_nodes はノードの数を数える。
具体的には TestCaseNodeTodoTestCaseNode を数える。

let count_tests = function Document(nodes) ->
  count_test_nodes nodes 0

count_tests は引数が test_document だった時用の count_test_nodes だ。

function Document(nodes) -> は Warning を発生させる。
この Warning をどうやって回避すれば良いのかは不明である。

let count_test_failures = function Document(nodes) ->
  let rec loop nodes count =
    match nodes with
    | []
      -> count
    | TestCaseNode(Ok, _, _, _)::xs
    | TodoTestCaseNode(Ok, _, _, _, _)::xs
    | DiagnosticNode(_)::xs
    | PlanNode(_)::xs
      -> loop xs count
    | TestCaseNode(NotOk, _, _, _)::xs
    | TodoTestCaseNode(NotOk, _, _, _, _)::xs
      -> loop xs count + 1
  in loop nodes 0

関数 count_test_failures は指定されたノードリストの中から失敗したノードの数を数える。

書いたのは ここ に置いとく。