にゃははー

はへらー

bjam AdC jp 2011 7日目

いつもどおり進みます。

参照:2006-02-05

testingモジュール

testingモジュールはテスト機能を提供するモジュールです。

一般に使用するruleは以下の6つだと思います。unit-test ruleは歴史的理由であるみたいな曖昧なことが書いてあるのでここでは解説しません。

rule compile ( sources + : requirements * : target-name ? )
rule compile-fail ( sources + : requirements * : target-name ? )
rule link ( sources + : requirements * : target-name ? )
rule link-fail ( sources + : requirements * : target-name ? )
rule run ( sources + : args * : input-files * : requirements * : target-name ? : default-build * )
rule run-fail ( sources + : args * : input-files * : requirements * : target-name ? : default-build * )

-failと付いているruleは失敗したら成功を意味するテストです。ill-formedなコードが正しくコンパイルエラーになるかの確認や、実行時に正しく落ちるかの確認などに使います。

これらruleに共通して現れるsourcesとrequirementsはexe ruleなどのそれと同じです。
前回のaliasモジュールに関連して、今回はtarget-nameが重要な意味を持ちます。読んで字の如くターゲット名です。bjamのコマンドライン引数に渡すあれです。省略できるけど省略するとexplicit ruleとかに投げれなくなるので何か設定しとくといいです。

compileとlinkは同じ引数を受け取りますが、rule名の通りコンパイルが通るかリンクが通るかをテストします。
runは実行するための引数や標準入力に渡すファイルなどを設定できます。

bjam checkを豪華に

豪華かどうかは知らないです。classとか使うともっとスマートになりますがめんどいのでガッと書きます。

import testing ;

project /somelib ;

rule named-compile ( name : sources + : requirements * )
{
	compile $(sources) : $(requirements) : $(name) ;
	explicit $(name) ;
}
rule named-compile-fail ( name : sources + : requirements * )
{
	compile-fail $(sources) : $(requirements) : $(name) ;
	explicit $(name) ;
}
rule named-link ( name : sources + : requirements * )
{
	link $(sources) : $(requirements) : $(name) ;
	explicit $(name) ;
}
rule named-link-fail ( name : sources + : requirements * )
{
	link-fail $(sources) : $(requirements) : $(name) ;
	explicit $(name) ;
}
rule named-run ( name : sources + : requirements * )
{
	run $(sources) : : : $(requirements) : $(name) ;
	explicit $(name) ;
}
rule named-run-fail ( name : sources + : requirements * )
{
	run-fail $(sources) : : : $(requirements) : $(name) ;
	explicit $(name) ;
}

rule test ( rule : successes * : fails * )
{
	for local s in $(successes) { named-$(rule)      $(s) : $(s).cpp ; }
	for local f in $(fails)     { named-$(rule)-fail $(s) : $(s).cpp ; }
}

local all-tests          = [ glob */*.cpp ] ;
local compile-tests      = [ MATCH (.*/compile[0-9]*).cpp : $(all-tests) ] ;
local compile-fail-tests = [ MATCH (.*/compile[0-9]*-fail).cpp : $(all-tests) ] ;
local link-tests         = [ MATCH (.*/link[0-9]*).cpp : $(all-tests) ] ;
local link-fail-tests    = [ MATCH (.*/link[0-9]*-fail).cpp : $(all-tests) ] ;
local run-tests          = [ MATCH (.*/run[0-9]*).cpp : $(all-tests) ] ;
local run-fail-tests     = [ MATCH (.*/run[0-9]*-fail).cpp : $(all-tests) ] ;

test compile : $(compile-tests) : $(compile-fail-tests) ;
test link : $(link-tests) : $(link-fail-tests) ;
test run : $(run-tests) : $(run-fail-tests) ;

explicit check ;
alias check
  : $(compile-tests) $(compiile-fail-tests )
    $(link-tests) $(link-fail-tests)
    $(run-tests) $(run-fail-tests)
  ;

まぁ読んだらわかりますね。わからなかったらコメントとか@とかください。以上。