• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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