Compute Library
 22.02
Asserts.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017-2021 Arm Limited.
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to
8  * deal in the Software without restriction, including without limitation the
9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10  * sell copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 #ifndef ARM_COMPUTE_TEST_FRAMEWORK_ASSERTS
25 #define ARM_COMPUTE_TEST_FRAMEWORK_ASSERTS
26 
27 #include "Exceptions.h"
28 #include "Framework.h"
29 
30 #include <sstream>
31 #include <type_traits>
32 
33 namespace arm_compute
34 {
35 namespace test
36 {
37 namespace framework
38 {
39 // Cast char values to int so that their numeric value are printed.
40 inline int make_printable(int8_t value)
41 {
42  return value;
43 }
44 
45 inline unsigned int make_printable(uint8_t value)
46 {
47  return value;
48 }
49 
50 // Everything else can be printed as its own type.
51 template <typename T>
52 inline T make_printable(T &&value)
53 {
54  return value;
55 }
56 
58 {
59  std::stringstream msg;
63 }
64 
65 #define ARM_COMPUTE_TEST_INFO(INFO) \
66  { \
67  std::stringstream info; \
68  info << INFO; \
69  arm_compute::test::framework::Framework::get().add_test_info(info.str()); \
70  }
71 
72 namespace detail
73 {
74 #define ARM_COMPUTE_TEST_COMP_FACTORY(SEVERITY, SEVERITY_NAME, COMP, COMP_NAME, ERROR_CALL) \
75  template <typename T, typename U> \
76  void ARM_COMPUTE_##SEVERITY##_##COMP_NAME##_IMPL(T &&x, U &&y, const std::string &x_str, const std::string &y_str, LogLevel level) \
77  { \
78  if(!(x COMP y)) \
79  { \
80  std::stringstream msg; \
81  msg << #SEVERITY_NAME " '" << x_str << " " #COMP " " << y_str << "' failed. [" \
82  << std::boolalpha << arm_compute::test::framework::make_printable(x) \
83  << " " #COMP " " \
84  << std::boolalpha << arm_compute::test::framework::make_printable(y) \
85  << "]\n"; \
86  arm_compute::test::framework::Framework::get().print_test_info(msg); \
87  ERROR_CALL \
88  } \
89  arm_compute::test::framework::Framework::get().clear_test_info(); \
90  }
91 
95 ARM_COMPUTE_TEST_COMP_FACTORY(ASSERT, Assertion, !=, NOT_EQUAL, throw arm_compute::test::framework::TestError(msg.str(), level);)
96 } // namespace detail
97 
100 
101 #define ARM_COMPUTE_ASSERT_EQUAL(X, Y) \
102  arm_compute::test::framework::detail::ARM_COMPUTE_ASSERT_EQUAL_IMPL(X, Y, #X, #Y, LogLevel::ERRORS)
103 
104 #define ARM_COMPUTE_EXPECT_EQUAL(X, Y, LEVEL) \
105  arm_compute::test::framework::detail::ARM_COMPUTE_EXPECT_EQUAL_IMPL(X, Y, #X, #Y, LEVEL)
106 
107 #define ARM_COMPUTE_EXPECT_NOT_EQUAL(X, Y, LEVEL) \
108  arm_compute::test::framework::detail::ARM_COMPUTE_EXPECT_NOT_EQUAL_IMPL(X, Y, #X, #Y, LEVEL)
109 
110 #define ARM_COMPUTE_ASSERT(X) \
111  do \
112  { \
113  const auto &x = X; \
114  if(!x) \
115  { \
116  std::stringstream msg; \
117  msg << "Assertion '" #X "' failed.\n"; \
118  arm_compute::test::framework::Framework::get().print_test_info(msg); \
119  throw arm_compute::test::framework::TestError(msg.str(), arm_compute::test::framework::LogLevel::ERRORS); \
120  } \
121  arm_compute::test::framework::Framework::get().clear_test_info(); \
122  } while(false)
123 
124 #define ARM_COMPUTE_EXPECT(X, LEVEL) \
125  do \
126  { \
127  const auto &x = X; \
128  if(!x) \
129  { \
130  std::stringstream msg; \
131  msg << "Expectation '" #X "' failed.\n"; \
132  arm_compute::test::framework::Framework::get().print_test_info(msg); \
133  arm_compute::test::framework::Framework::get().log_failed_expectation(arm_compute::test::framework::TestError(msg.str(), LEVEL)); \
134  } \
135  arm_compute::test::framework::Framework::get().clear_test_info(); \
136  } while(false)
137 
138 #define ARM_COMPUTE_EXPECT_NO_THROW(X, LEVEL) \
139  do \
140  { \
141  try \
142  { \
143  const auto &x = X; \
144  (void)x; \
145  } \
146  catch(...) \
147  { \
148  std::stringstream msg; \
149  msg << "Expectation '" #X "' to not throw failed.\n"; \
150  arm_compute::test::framework::Framework::get().print_test_info(msg); \
151  arm_compute::test::framework::Framework::get().log_failed_expectation(arm_compute::test::framework::TestError(msg.str(), LEVEL)); \
152  } \
153  arm_compute::test::framework::Framework::get().clear_test_info(); \
154  } while(false)
155 
156 #if defined(ARM_COMPUTE_ASSERTS_ENABLED)
157 #define ARM_COMPUTE_EXPECT_THROW(X, LEVEL) \
158  do \
159  { \
160  bool exception_caught = false; \
161  try \
162  { \
163  const auto &x = X; \
164  (void)x; \
165  } \
166  catch(...) \
167  { \
168  exception_caught = true; \
169  } \
170  if(!exception_caught) \
171  { \
172  std::stringstream msg; \
173  msg << "Expectation '" #X "' to throw failed.\n"; \
174  arm_compute::test::framework::Framework::get().print_test_info(msg); \
175  arm_compute::test::framework::Framework::get().log_failed_expectation(arm_compute::test::framework::TestError(msg.str(), LEVEL)); \
176  } \
177  arm_compute::test::framework::Framework::get().clear_test_info(); \
178  } while(false)
179 #else // defined(ARM_COMPUTE_ASSERTS_ENABLED)
180 #define ARM_COMPUTE_EXPECT_THROW(X, LEVEL) \
181  do \
182  { \
183  std::stringstream msg; \
184  msg << "'" #X "' Skipped: asserts disabled, cannot throw\n"; \
185  arm_compute::test::framework::Framework::get().print_test_info(msg); \
186  arm_compute::test::framework::Framework::get().log_info(msg.str()); \
187  arm_compute::test::framework::Framework::get().clear_test_info(); \
188  } while(false)
189 #endif // defined(ARM_COMPUTE_ASSERTS_ENABLED)
190 
191 #define ARM_COMPUTE_ASSERT_FAIL(MSG) \
192  do \
193  { \
194  std::stringstream msg; \
195  msg << "Assertion '" << MSG << "' failed.\n"; \
196  arm_compute::test::framework::Framework::get().print_test_info(msg); \
197  throw arm_compute::test::framework::TestError(msg.str(), arm_compute::test::framework::LogLevel::ERRORS); \
198  arm_compute::test::framework::Framework::get().clear_test_info(); \
199  } while(false)
200 
201 #define ARM_COMPUTE_EXPECT_FAIL(MSG, LEVEL) \
202  do \
203  { \
204  std::stringstream msg; \
205  msg << "Expectation '" << MSG << "' failed.\n"; \
206  arm_compute::test::framework::Framework::get().print_test_info(msg); \
207  arm_compute::test::framework::Framework::get().log_failed_expectation(arm_compute::test::framework::TestError(msg.str(), LEVEL)); \
208  arm_compute::test::framework::Framework::get().clear_test_info(); \
209  } while(false)
210 } // namespace framework
211 } // namespace test
212 } // namespace arm_compute
213 #endif /* ARM_COMPUTE_TEST_FRAMEWORK_ASSERTS */
#define EQUAL(x, y)
Definition: comparisons.cl:26
#define ARM_COMPUTE_TEST_COMP_FACTORY(SEVERITY, SEVERITY_NAME, COMP, COMP_NAME, ERROR_CALL)
Definition: Asserts.h:74
#define ARM_COMPUTE_ASSERT_NOT_EQUAL(X, Y)
Definition: Asserts.h:98
void print_test_info(std::ostream &os) const
Print test info.
Definition: Framework.cpp:171
int make_printable(int8_t value)
Definition: Asserts.h:40
void log_failed_expectation(const TestError &error)
Tell the framework that the currently running test case failed a non-fatal expectation.
Definition: Framework.cpp:226
void log_info(const std::string &info)
Print the debug information that has already been logged.
Definition: Framework.cpp:244
Copyright (c) 2017-2021 Arm Limited.
static Framework & get()
Access to the singleton.
Definition: Framework.cpp:124
void ARM_COMPUTE_ASSERT_NOT_EQUAL_IMPL(T &&x, U &&y, const std::string &x_str, const std::string &y_str, LogLevel level)
Definition: Asserts.h:95
Error class for failures during test execution.
Definition: Exceptions.h:78
void clear_test_info()
Clear the collected test info.
Definition: Framework.cpp:161