2
我正在使用mixin模板編寫模塊爲單元測試目的提供main
函數。用法如下:使用ParameterTypeTuple測試函數簽名
/* For modules without their own main, e.g. libraries.
* main is conditionally supplied using version(unittest).
*/
mixin Main;
/* For executable modules defining function "realMain".
* Generated main has the same signature and return type
* as realMain, and transfers control to it. Additionally,
* main exits without calling realMain for version (unittest).
*/
mixin Main!realMain;
的想法是,每模塊礦井中main
適當地混合,使:
- 庫不需要
--main
傳遞給rdmd
,因爲 - 似乎沒有好的方法來決定而不是通過
--main
爲自己定義的模塊,當自動運行單元測試的每個文件在di rectory層次結構 -rdmd
的退出代碼與失敗的編譯相同。
我使用std.traits
確定realMain
的有效性爲main
功能,並確保我產生main
具有相同的簽名。一切似乎都在起作用,但我認爲它可能更乾淨。目前,我的檢查有效main
參數模板看起來是這樣的:
template isMainArgTypes(alias main)
{
static if (is(ParameterTypeTuple!main == TypeTuple!()))
enum isMainArgTypes = true;
else static if (ParameterTypeTuple!main.length == 1
&& is(ParameterTypeTuple!main[0] T : const T[]))
{
enum isMainArgTypes = is(T : const char[]);
}
else
enum isMainArgTypes = false;
}
我覺得肯定必須有某種方式來壓縮中間狀態到一個單一的is
表達,沒有明確地測試元組的長度,並分別檢查了字符串類型,但到目前爲止,我的新生元編程-fu已經不足。
任何想法,D巫師?
感謝您的回答看起來更乾淨。不專門測試函數的優點是可以使用其他類型的可調用值,但我同意,這是更清晰的。它似乎也是最接近我們現在的例子的慣用D來自Phobos源:) – shambulator 2010-08-25 16:33:30