1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef ROSEN_TEST_TEXGINE_UNITTEST_PARAM_TEST_MACROS_H
17 #define ROSEN_TEST_TEXGINE_UNITTEST_PARAM_TEST_MACROS_H
18
19 #include <vector>
20
21 #include "texgine_exception.h"
22
23 namespace OHOS {
24 namespace Rosen {
25 namespace TextEngine {
26 #define PARAM_BINDING_ARGS0
27 #define PARAM_BINDING_ARGS1 arg1,
28 #define PARAM_BINDING_ARGS2 PARAM_BINDING_ARGS1 arg2,
29 #define PARAM_BINDING_ARGS3 PARAM_BINDING_ARGS2 arg3,
30 #define PARAM_BINDING_ARGS4 PARAM_BINDING_ARGS3 arg4,
31
32 #define PARAM_CALLING_ARGS0
33 #define PARAM_CALLING_ARGS1 arg1
34 #define PARAM_CALLING_ARGS2 PARAM_CALLING_ARGS1, arg2
35 #define PARAM_CALLING_ARGS3 PARAM_CALLING_ARGS2, arg3
36 #define PARAM_CALLING_ARGS4 PARAM_CALLING_ARGS3, arg4
37
38 #define PARAM_DEFINE_ARG0(...)
39 #define PARAM_DEFINE_ARG1(Arg1T, ...) \
40 [[maybe_unused]] Arg1T arg1;
41 #define PARAM_DEFINE_ARG2(Arg1T, Arg2T, ...) \
42 PARAM_DEFINE_ARG1(Arg1T) [[maybe_unused]] Arg2T arg2;
43 #define PARAM_DEFINE_ARG3(Arg1T, Arg2T, Arg3T, ...) \
44 PARAM_DEFINE_ARG2(Arg1T, Arg2T) [[maybe_unused]] Arg3T arg3;
45 #define PARAM_DEFINE_ARG4(Arg1T, Arg2T, Arg3T, Arg4T, ...) \
46 PARAM_DEFINE_ARG3(Arg1T, Arg2T, Arg3T) [[maybe_unused]] Arg4T arg4;
47
48 #define PARAM_REF_ARG0(...)
49 #define PARAM_REF_ARG1(T, ...) T&,
50 #define PARAM_REF_ARG2(T, ...) T&, PARAM_REF_ARG1(__VA_ARGS__)
51 #define PARAM_REF_ARG3(T, ...) T&, PARAM_REF_ARG2(__VA_ARGS__)
52 #define PARAM_REF_ARG4(T, ...) T&, PARAM_REF_ARG3(__VA_ARGS__)
53
54 #define PARAM_DATA_ARGS0(...) __VA_ARGS__
55 #define PARAM_DATA_ARGS1(arg1, ...) PARAM_DATA_ARGS0(__VA_ARGS__)
56 #define PARAM_DATA_ARGS2(arg2, ...) PARAM_DATA_ARGS1(__VA_ARGS__)
57 #define PARAM_DATA_ARGS3(arg3, ...) PARAM_DATA_ARGS2(__VA_ARGS__)
58 #define PARAM_DATA_ARGS4(arg4, ...) PARAM_DATA_ARGS3(__VA_ARGS__)
59
60 #define DEFINE_PARAM_TEST0(...) DEFINE_PARAM_TEST(RETVAL, 0, __VA_ARGS__)
61 #define DEFINE_PARAM_TEST1(...) DEFINE_PARAM_TEST(RETVAL, 1, __VA_ARGS__)
62 #define DEFINE_PARAM_TEST2(...) DEFINE_PARAM_TEST(RETVAL, 2, __VA_ARGS__)
63 #define DEFINE_PARAM_TEST3(...) DEFINE_PARAM_TEST(RETVAL, 3, __VA_ARGS__)
64 #define DEFINE_PARAM_TEST4(...) DEFINE_PARAM_TEST(RETVAL, 4, __VA_ARGS__)
65
66 #define DEFINE_VOID_PARAM_TEST0(...) DEFINE_PARAM_TEST(OBJECT, 0, __VA_ARGS__)
67 #define DEFINE_VOID_PARAM_TEST1(...) DEFINE_PARAM_TEST(OBJECT, 1, __VA_ARGS__)
68 #define DEFINE_VOID_PARAM_TEST2(...) DEFINE_PARAM_TEST(OBJECT, 2, __VA_ARGS__)
69 #define DEFINE_VOID_PARAM_TEST3(...) DEFINE_PARAM_TEST(OBJECT, 3, __VA_ARGS__)
70 #define DEFINE_VOID_PARAM_TEST4(...) DEFINE_PARAM_TEST(OBJECT, 4, __VA_ARGS__)
71
72 #define DEFINE_ALL_PARAM_TEST0(...) DEFINE_PARAM_TEST(ALL, 0, __VA_ARGS__)
73 #define DEFINE_ALL_PARAM_TEST1(...) DEFINE_PARAM_TEST(ALL, 1, __VA_ARGS__)
74 #define DEFINE_ALL_PARAM_TEST2(...) DEFINE_PARAM_TEST(ALL, 2, __VA_ARGS__)
75 #define DEFINE_ALL_PARAM_TEST3(...) DEFINE_PARAM_TEST(ALL, 3, __VA_ARGS__)
76 #define DEFINE_ALL_PARAM_TEST4(...) DEFINE_PARAM_TEST(ALL, 4, __VA_ARGS__)
77
78 #define DEFINE_CHECK_RETVAL_FN(N, CLASS, FUNC, ...) \
79 std::function<void(decltype(((CLASS *)nullptr)->FUNC(PARAM_CALLING_ARGS##N)) &&)>
80 #define DEFINE_CHECK_OBJECT_FN(N, CLASS, FUNC, ...) std::function<void(PARAM_REF_ARG##N(__VA_ARGS__) CLASS &)>
81 #define DEFINE_CHECK_ALL_FN(N, CLASS, FUNC, ...) std::function<void( \
82 decltype(((CLASS *)nullptr)->FUNC(PARAM_CALLING_ARGS##N)) &&, PARAM_REF_ARG##N(__VA_ARGS__) CLASS &)>
83
84 #define CHECK_RETVAL_CALL(N, FUNC) checkFunc(object.FUNC(PARAM_CALLING_ARGS##N))
85 #define CHECK_OBJECT_CALL(N, FUNC) object.FUNC(PARAM_CALLING_ARGS##N); checkFunc(PARAM_BINDING_ARGS##N object)
86 #define CHECK_ALL_CALL(N, FUNC) checkFunc(object.FUNC(PARAM_CALLING_ARGS##N), PARAM_BINDING_ARGS##N object)
87
88 #define ASSERT_EXCEPTION(ERRCODE, ...) \
89 try { \
90 __VA_ARGS__; \
91 FAIL() << "Do not trigger Exception: " << static_cast<int>(ERRCODE); \
92 } catch (const TexgineException &err) { \
93 ASSERT_EQ(ERRCODE, err.code); \
94 } \
95
96 #define DEFINE_PARAM_TEST(CHECKING, N, CLASS, FUNC, ...) \
97 HWTEST_F(CLASS##Test, FUNC, testing::ext::TestSize.Level1) \
98 { \
99 PARAM_DEFINE_ARG##N(__VA_ARGS__); \
100 struct TestInfo { \
101 std::function<void(void)> init = nullptr; \
102 CLASS object; \
103 PARAM_DEFINE_ARG##N(__VA_ARGS__) \
104 ExceptionType exception = ExceptionType::SUCCESS; \
105 DEFINE_CHECK_##CHECKING##_FN(N, CLASS, FUNC, __VA_ARGS__) checkFunc = nullptr; \
106 }; \
107 std::vector<struct TestInfo> data = PARAM_DATA_ARGS##N(__VA_ARGS__); \
108 for (auto &[init, object, PARAM_BINDING_ARGS##N exception, checkFunc] : data) { \
109 if (init != nullptr) { \
110 init(); \
111 } \
112 if (exception != ExceptionType::SUCCESS) { \
113 ASSERT_EXCEPTION(exception, object.FUNC(PARAM_CALLING_ARGS##N)); \
114 } else { \
115 ASSERT_NE(checkFunc, nullptr); \
116 CHECK_##CHECKING##_CALL(N, FUNC); \
117 } \
118 } \
119 } \
120
121 #define DEFINE_CHECK_RETVAL_FN2(N, CLASS, FUNC, ...) \
122 std::function<bool(decltype(((CLASS *)nullptr)->FUNC(PARAM_CALLING_ARGS##N)) &&)>
123 #define DEFINE_CHECK_OBJECT_FN2(N, CLASS, FUNC, ...) \
124 std::function<bool(PARAM_REF_ARG##N(__VA_ARGS__) CLASS &)>
125 #define DEFINE_CHECK_ALL_FN2(N, CLASS, FUNC, ...) \
126 std::function<bool( \
127 decltype(((CLASS *)nullptr)->FUNC(PARAM_CALLING_ARGS##N)) &&, PARAM_REF_ARG##N(__VA_ARGS__) CLASS &)>
128
129 #define CHECK_RETVAL_CALL2(N, FUNC, object) \
130 EXPECT_TRUE(checkFunc((object).FUNC(PARAM_CALLING_ARGS##N)))
131 #define CHECK_OBJECT_CALL2(N, FUNC, object) \
132 (object).FUNC(PARAM_CALLING_ARGS##N); \
133 EXPECT_TRUE(checkFunc(PARAM_BINDING_ARGS##N(object)))
134 #define CHECK_ALL_CALL2(N, FUNC, object) \
135 EXPECT_TRUE(checkFunc((object).FUNC(PARAM_CALLING_ARGS##N), PARAM_BINDING_ARGS##N object))
136
137 #define DEFINE_TESTINFO(CHECKING, N, ...) \
138 PARAM_DEFINE_ARG##N(__VA_ARGS__); \
139 struct TestInfo { \
140 std::function<void(void)> init = nullptr; \
141 PARAM_DEFINE_ARG##N(__VA_ARGS__) \
142 ExceptionType exception = ExceptionType::SUCCESS; \
143 DEFINE_CHECK_##CHECKING##_FN2(N, PARAMCLASS, PARAMFUNC, __VA_ARGS__) checkFunc = nullptr; \
144 }; \
145
146 #define RUN_TESTINFO(CHECKING, N, object, ...) \
147 { \
148 auto &&[init, PARAM_BINDING_ARGS##N exception, checkFunc] = TestInfo __VA_ARGS__; \
149 if (init != nullptr) { \
150 init(); \
151 } \
152 if (exception != ExceptionType::SUCCESS) { \
153 ASSERT_EXCEPTION(exception, (object).PARAMFUNC(PARAM_CALLING_ARGS##N)); \
154 } else { \
155 ASSERT_NE(checkFunc, nullptr); \
156 CHECK_##CHECKING##_CALL2(N, PARAMFUNC, object); \
157 } \
158 } \
159
160 #define DEFINE_TESTINFO0(...) DEFINE_TESTINFO(RETVAL, 0, __VA_ARGS__)
161 #define DEFINE_TESTINFO1(...) DEFINE_TESTINFO(RETVAL, 1, __VA_ARGS__)
162 #define DEFINE_TESTINFO2(...) DEFINE_TESTINFO(RETVAL, 2, __VA_ARGS__)
163 #define DEFINE_TESTINFO3(...) DEFINE_TESTINFO(RETVAL, 3, __VA_ARGS__)
164 #define DEFINE_TESTINFO4(...) DEFINE_TESTINFO(RETVAL, 4, __VA_ARGS__)
165
166 #define DEFINE_VOID_TESTINFO0(...) DEFINE_TESTINFO(OBJECT, 0, __VA_ARGS__)
167 #define DEFINE_VOID_TESTINFO1(...) DEFINE_TESTINFO(OBJECT, 1, __VA_ARGS__)
168 #define DEFINE_VOID_TESTINFO2(...) DEFINE_TESTINFO(OBJECT, 2, __VA_ARGS__)
169 #define DEFINE_VOID_TESTINFO3(...) DEFINE_TESTINFO(OBJECT, 3, __VA_ARGS__)
170 #define DEFINE_VOID_TESTINFO4(...) DEFINE_TESTINFO(OBJECT, 4, __VA_ARGS__)
171
172 #define DEFINE_ALL_TESTINFO0(...) DEFINE_TESTINFO(ALL, 0, __VA_ARGS__)
173 #define DEFINE_ALL_TESTINFO1(...) DEFINE_TESTINFO(ALL, 1, __VA_ARGS__)
174 #define DEFINE_ALL_TESTINFO2(...) DEFINE_TESTINFO(ALL, 2, __VA_ARGS__)
175 #define DEFINE_ALL_TESTINFO3(...) DEFINE_TESTINFO(ALL, 3, __VA_ARGS__)
176 #define DEFINE_ALL_TESTINFO4(...) DEFINE_TESTINFO(ALL, 4, __VA_ARGS__)
177
178 #define RUN_TESTINFO0(...) RUN_TESTINFO(RETVAL, 0, __VA_ARGS__)
179 #define RUN_TESTINFO1(...) RUN_TESTINFO(RETVAL, 1, __VA_ARGS__)
180 #define RUN_TESTINFO2(...) RUN_TESTINFO(RETVAL, 2, __VA_ARGS__)
181 #define RUN_TESTINFO3(...) RUN_TESTINFO(RETVAL, 3, __VA_ARGS__)
182 #define RUN_TESTINFO4(...) RUN_TESTINFO(RETVAL, 4, __VA_ARGS__)
183
184 #define RUN_VOID_TESTINFO0(...) RUN_TESTINFO(OBJECT, 0, __VA_ARGS__)
185 #define RUN_VOID_TESTINFO1(...) RUN_TESTINFO(OBJECT, 1, __VA_ARGS__)
186 #define RUN_VOID_TESTINFO2(...) RUN_TESTINFO(OBJECT, 2, __VA_ARGS__)
187 #define RUN_VOID_TESTINFO3(...) RUN_TESTINFO(OBJECT, 3, __VA_ARGS__)
188 #define RUN_VOID_TESTINFO4(...) RUN_TESTINFO(OBJECT, 4, __VA_ARGS__)
189
190 #define RUN_ALL_TESTINFO0(...) RUN_TESTINFO(ALL, 0, __VA_ARGS__)
191 #define RUN_ALL_TESTINFO1(...) RUN_TESTINFO(ALL, 1, __VA_ARGS__)
192 #define RUN_ALL_TESTINFO2(...) RUN_TESTINFO(ALL, 2, __VA_ARGS__)
193 #define RUN_ALL_TESTINFO3(...) RUN_TESTINFO(ALL, 3, __VA_ARGS__)
194 #define RUN_ALL_TESTINFO4(...) RUN_TESTINFO(ALL, 4, __VA_ARGS__)
195
196 template<class T>
GetResultChecker(T result)197 auto GetResultChecker(T result)
198 {
199 return [result](T &&actual) { ASSERT_EQ(result, actual); };
200 }
201
202 template<class T>
GetVecSizeChecker(std::size_t size)203 auto GetVecSizeChecker(std::size_t size)
204 {
205 return [size](std::vector<T> &&ret) {ASSERT_EQ(size, ret.size());};
206 }
207
208 template<class T>
CreateChecker(T result)209 auto CreateChecker(T result)
210 {
211 return [result](T &&actual) { return actual == result; };
212 }
213
214 template<class T>
CreateVecSizeChecker(std::size_t size)215 auto CreateVecSizeChecker(std::size_t size)
216 {
217 return [size](std::vector<T> &&ret) { return size == ret.size(); };
218 }
219 } // namespace TextEngine
220 } // namespace Rosen
221 } // namespace OHOS
222 #endif // ROSEN_TEST_TEXGINE_UNITTEST_PARAM_TEST_MACROS_H
223