読者です 読者をやめる 読者になる 読者になる

ra_gen_test.rb

OCaml

OUnitでテストを書いていると、

open OUnit

let test_abc() = ...
let test_xyz() = ...

let suite = "Test_ABC" >:::
  [ "test_abc" >:: test_abc;
    "test_xyz" >:: test_xyz; ]

なんてコードを山のように書くことになって、リフレクションをくれえと、ぶちきれそうになります。そこで、このスクリプト

# test
# title Example
(* ↑optional *)
# suite test_list
(* ↑optional *)
open OUnit

let test_abc() = ...
let test_xyz() = ...

だけでOKになります。これでもう「テストを書いたのにsuiteに登録し忘れて、なぜかテストが通ってしまって???」という事態とはさよならできます。



camlp4勉強せえや。

def format(tests)
  tests.map {|t|
    "    \"#{t}\" >:: #{t};"
  }.join("\n")
end

title = ARGV[0]
suite = "suite"
tests = Array.new()
enabled = false

puts "# 1 \"#{title}\""
while l = gets()
  skip = false

  l = l.chomp

  case l
  when /^let\s+(test_\w*)/
    if enabled 
      tests << $1
    end
  when /^#\s*test/
    enabled = true
    skip = true
  when /^#\s*title\s+(\w)+/
    if enabled
      title = $1
      skip = true
    end
  when /^#\s*suite\s+(\w)+/
    if enabled
      suite = $1
      skip = true
    end
  end

  if skip
    puts ""
  else
    puts l
  end
end

if enabled
  puts <<MSG
(* auto generated by ra_gen_test *)
let #{suite} = "#{title}" >::: [
#{format(tests)}
  ]
MSG
end

行頭からletが始まって、test_*という関数をテストとして考えます。# testという謎のディレクティブが書いてない場合は、何もしません。

OCamlMakefileを使う場合は、

OCAMLFLAGS = -pp "ruby ra_gen_test.rb"
OCAMLDEP = ocamldep -pp "ruby ra_gen_test.rb"

と、どこかに書いておけば大丈夫な気がします。

※ファイル名と行番号を出力するように修正