ユニットテストテンプレートとして何かがあるかどうか疑問に思っていました。私のニーズを説明しましょう。高度にテンプレート化されたライブラリのユニットテスト
私は非常にテンプレートライブラリを持っています。私はsfinae型の形質をたくさん持ち、static_assertをいくつか持っています。
私がテストしたいのは、sfinae型の特性の妥当性と、static_assertが正しいものを投げているかどうかをテストすることです。私のカバレッジが何であるかを知ることはすばらしいことです。
template<typename T>
using false_v = !std::is_same<T, T>::value;
// Here are my types traits
template<typename T, typename... Args>
struct SomeCondition1 { /* ... */ };
template<typename T, typename... Args>
struct SomeCondition2 { /* ... */ };
// This is a master type trait, that test every others
template<typename T, typename... Args>
using Conditions = std::integral_constant<bool,
SomeCondition1<T, Args...>::value && SomeCondition2<T, Args...>::value
>;
// This is the function that is call when everything is okay.
template<typename T, typename... Args,
std::enable_if_t<Conditions<T, Args...>::value, int> = 0>
void doThing(Args...) {}
// These function are called only to trigger
// static asserts to give the user a diagnostic to explain what's wrong.
template<typename T, typename... Args,
std::enable_if_t<SomeCondition1<T, Args...>::value && !SomeCondition2<T, Args...>::value, int> = 0>
void doThing(Args...) {
static_assert(false_v<T>, "Error, SomeCondition2 not met");
}
template<typename T, typename... Args,
std::enable_if_t<!SomeCondition1<T, Args...>::value && SomeCondition2<T, Args...>::value, int> = 0>
void doThing(Args...) {
static_assert(false_v<T>, "Error, SomeCondition1 not met");
}
template<typename T, typename... Args,
std::enable_if_t<!SomeCondition1<T, Args...>::value && !SomeCondition2<T, Args...>::value, int> = 0>
void doThing(Args...) {
static_assert(false_v<T>, "Error, both conditions not met");
}
私は形質はOKだったらテストについて考えていた、と右の静的アサートは、私の場合のためにスローされた場合:ここでは
は私のコードがどのように見えるかの例です。間違った静的なアサーションがトリガされた場合、それはバグです。私はそれをテストできるようにしたいと思います。すべてのコンパイラのすべてのケースをカバーし、手作業ですべてのメッセージをチェックしようとすると、実際には時間がかかりエラーが発生しやすくなります。