gpt4 book ai didi

c++ - 单元测试高度模板化的库

转载 作者:行者123 更新时间:2023-11-30 03:36:29 25 4
gpt4 key购买 nike

我想知道单元测试模板是否是一件事。让我解释一下我的需求。

我有一个高度模板化的库。我有很多 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");
}

我正在考虑测试这些特征是否正常,以及是否为我的案例抛出了正确的静态断言。如果触发了错误的静态断言,那就是一个错误,我希望能够测试它。尝试涵盖所有编译器的所有情况并手动检查每条消息确实非常耗时且容易出错。

最佳答案

参数类型范围的单元测试模板代码的问题是googletest 很好地解决了及其TYPED TESTS featureType-Parameterized Tests功能。

这些功能的局限性在于它们仅立即适用于测试只有一个参数的模板。但解决这个限制并不难:请参阅this question以及接受的答案。

但是,这些都没有帮助解决测试 static_assert 的正确性的进一步问题模板代码。当然,这种测试的特殊障碍是static_assert 因编译失败而触发;所以如果它触发了,无论正确与否,您无法执行任何操作来证明它确实有效。

几年前这也困扰着我。我发了How to write runnable tests of static_assert?还写了迄今为止唯一的答案已收到(最近针对 C++14 和当前编译器进行了更新)。

结合这些资源和技术应该会产生您正在寻找的解决方案。

关于c++ - 单元测试高度模板化的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40681645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com