Je me demandais si quelque chose en tant que modèle de test unitaire était une chose. Laissez-moi expliquer mes besoins.Unité testant la bibliothèque hautement modélisée
J'ai une bibliothèque très basée sur un modèle. J'ai beaucoup de traits de type sfinae, et static_assert. Ce que je veux tester est la validité des traits de type sfinae, et tester si mes static_assert lancent la bonne chose. Savoir quelle est ma couverture serait génial.
Voici un exemple de ce que mon regard de code comme:
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");
}
Je pensais à tester si les traits étaient ok, et si l'assertion statique droit est jeté pour mes affaires. Si l'assertion statique incorrecte est déclenchée, c'est un bug, et j'aimerais pouvoir le tester. Essayer de couvrir tous les cas pour tous les compilateurs et vérifier chaque message à la main est vraiment long et sujet aux erreurs.