16#ifndef HWY_TESTS_HWY_GTEST_H_
17#define HWY_TESTS_HWY_GTEST_H_
24#ifndef HWY_TEST_STANDALONE
27#define HWY_TEST_STANDALONE 1
29#define HWY_TEST_STANDALONE 0
38#if !HWY_TEST_STANDALONE
39#include "gtest/gtest.h"
45#if !HWY_TEST_STANDALONE
49#ifdef INSTANTIATE_TEST_SUITE_P
50#define HWY_GTEST_INSTANTIATE_TEST_SUITE_P INSTANTIATE_TEST_SUITE_P
52#define HWY_GTEST_INSTANTIATE_TEST_SUITE_P INSTANTIATE_TEST_CASE_P
70#if (HWY_TARGETS & (HWY_TARGETS - 1)) != 0
72 <<
"This hwy target parametric test doesn't use dynamic-dispatch and "
73 "doesn't need to be parametric.";
82 const testing::TestParamInfo<int64_t>& info) {
86#define HWY_TARGET_INSTANTIATE_TEST_SUITE_P(suite) \
87 HWY_GTEST_INSTANTIATE_TEST_SUITE_P( \
88 suite##Group, suite, \
89 testing::ValuesIn(::hwy::SupportedAndGeneratedTargets()), \
90 ::hwy::TestParamTargetName)
103 :
public ::testing::TestWithParam<std::tuple<int64_t, T>> {
112 ::testing::TestWithParam<std::tuple<int64_t, T>>
::GetParam()));
119#if (HWY_TARGETS & (HWY_TARGETS - 1)) != 0
121 <<
"This hwy target parametric test doesn't use dynamic-dispatch and "
122 "doesn't need to be parametric.";
129 ::testing::TestWithParam<std::tuple<int64_t, T>>
::GetParam());
135 const testing::TestParamInfo<std::tuple<int64_t, T>>& info) {
136 return std::string(
TargetName(std::get<0>(info.param))) +
"_" +
137 ::testing::PrintToString(std::get<1>(info.param));
140#define HWY_TARGET_INSTANTIATE_TEST_SUITE_P_T(suite, generator) \
141 HWY_GTEST_INSTANTIATE_TEST_SUITE_P( \
142 suite##Group, suite, \
143 ::testing::Combine( \
144 testing::ValuesIn(::hwy::SupportedAndGeneratedTargets()), \
146 ::hwy::TestParamTargetNameAndT<suite::HwyParamType>)
155#define HWY_EXPORT_AND_TEST_P(suite, func_name) \
156 HWY_EXPORT(func_name); \
157 TEST_P(suite, func_name) { HWY_DYNAMIC_DISPATCH(func_name)(); } \
158 static_assert(true, "For requiring trailing semicolon")
160#define HWY_EXPORT_AND_TEST_P_T(suite, func_name) \
161 HWY_EXPORT(func_name); \
162 TEST_P(suite, func_name) { HWY_DYNAMIC_DISPATCH(func_name)(GetParam()); } \
163 static_assert(true, "For requiring trailing semicolon")
165#define HWY_BEFORE_TEST(suite) \
166 class suite : public hwy::TestWithParamTarget {}; \
167 HWY_TARGET_INSTANTIATE_TEST_SUITE_P(suite); \
168 static_assert(true, "For requiring trailing semicolon")
170#define HWY_AFTER_TEST() static_assert(true, "For requiring trailing semicolon")
172#define HWY_TEST_MAIN() static_assert(true, "For requiring trailing semicolon")
178#define HWY_EXPORT_AND_TEST_P(suite, func_name) \
179 HWY_EXPORT(func_name); \
180 hwy::SetSupportedTargetsForTest(0); \
181 for (int64_t target : hwy::SupportedAndGeneratedTargets()) { \
182 hwy::SetSupportedTargetsForTest(target); \
183 fprintf(stderr, "=== %s for %s:\n", #func_name, hwy::TargetName(target)); \
184 HWY_DYNAMIC_DISPATCH(func_name)(); \
187 hwy::SetSupportedTargetsForTest(0); \
188 static_assert(true, "For requiring trailing semicolon")
193using VoidFunc = void (*)(void);
195VoidFunc& GetRunAll() {
196 static VoidFunc func;
200struct RegisterRunAll {
201 RegisterRunAll(VoidFunc func) { hwy::GetRunAll() = func; }
204#define HWY_BEFORE_TEST(suite) \
206 static hwy::RegisterRunAll HWY_CONCAT(reg_, suite)(&RunAll); \
208 static_assert(true, "For requiring trailing semicolon")
211#define HWY_AFTER_TEST() \
214 int main(int , char** ) { \
215 hwy::GetRunAll()(); \
216 fprintf(stderr, "Success.\n"); \
227std::vector<FuncAndName>& GetFuncAndNames() {
228 static std::vector<FuncAndName> vec;
234 RegisterTest(VoidFunc func,
const char* name) {
235 hwy::GetFuncAndNames().push_back({func, name});
240#define TEST(suite, func) \
242 static hwy::RegisterTest HWY_CONCAT(reg_, func)({&func, #func}); \
246#define HWY_TEST_MAIN() \
248 for (const auto& func_and_name : hwy::GetFuncAndNames()) { \
249 fprintf(stderr, "=== %s:\n", func_and_name.name); \
250 func_and_name.func(); \
252 fprintf(stderr, "Success.\n"); \
255 static_assert(true, "For requiring trailing semicolon")
Definition hwy_gtest.h:103
void TearDown() override
Definition hwy_gtest.h:115
T GetParam()
Definition hwy_gtest.h:127
T HwyParamType
Definition hwy_gtest.h:107
void SetUp() override
Definition hwy_gtest.h:110
Definition hwy_gtest.h:62
void TearDown() override
Definition hwy_gtest.h:66
void SetUp() override
Definition hwy_gtest.h:64
static std::string TestParamTargetName(const testing::TestParamInfo< int64_t > &info)
Definition hwy_gtest.h:81
static HWY_MAYBE_UNUSED const char * TargetName(int64_t target)
Definition targets.h:85
std::string TestParamTargetNameAndT(const testing::TestParamInfo< std::tuple< int64_t, T > > &info)
Definition hwy_gtest.h:134
HWY_DLLEXPORT ChosenTarget & GetChosenTarget()
HWY_DLLEXPORT void SetSupportedTargetsForTest(int64_t targets)