ra_gen_test.rb
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"
と、どこかに書いておけば大丈夫な気がします。
※ファイル名と行番号を出力するように修正