• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2017-2020 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.
make_printable(int8_t value)40 inline int make_printable(int8_t value)
41 {
42     return value;
43 }
44 
make_printable(uint8_t value)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>
make_printable(T && value)52 inline T make_printable(T &&value)
53 {
54     return value;
55 }
56 
ARM_COMPUTE_PRINT_INFO()57 inline void ARM_COMPUTE_PRINT_INFO()
58 {
59     std::stringstream msg;
60     arm_compute::test::framework::Framework::get().print_test_info(msg);
61     arm_compute::test::framework::Framework::get().log_info(msg.str());
62     arm_compute::test::framework::Framework::get().clear_test_info();
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 
92 ARM_COMPUTE_TEST_COMP_FACTORY(EXPECT, Expectation, ==, EQUAL, arm_compute::test::framework::Framework::get().log_failed_expectation(arm_compute::test::framework::TestError(msg.str(), level));)
93 ARM_COMPUTE_TEST_COMP_FACTORY(EXPECT, Expectation, !=, NOT_EQUAL, arm_compute::test::framework::Framework::get().log_failed_expectation(arm_compute::test::framework::TestError(msg.str(), level));)
94 ARM_COMPUTE_TEST_COMP_FACTORY(ASSERT, Assertion, ==, EQUAL, throw arm_compute::test::framework::TestError(msg.str(), level);)
95 ARM_COMPUTE_TEST_COMP_FACTORY(ASSERT, Assertion, !=, NOT_EQUAL, throw arm_compute::test::framework::TestError(msg.str(), level);)
96 } // namespace detail
97 
98 #define ARM_COMPUTE_ASSERT_NOT_EQUAL(X, Y) \
99     arm_compute::test::framework::detail::ARM_COMPUTE_ASSERT_NOT_EQUAL_IMPL(X, Y, #X, #Y, LogLevel::ERRORS)
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 #define ARM_COMPUTE_EXPECT_THROW(X, LEVEL)                                                                                                    \
157     do                                                                                                                                        \
158     {                                                                                                                                         \
159         bool exception_caught = false;                                                                                                        \
160         try                                                                                                                                   \
161         {                                                                                                                                     \
162             const auto &x = X;                                                                                                                \
163             (void)x;                                                                                                                          \
164         }                                                                                                                                     \
165         catch(...)                                                                                                                            \
166         {                                                                                                                                     \
167             exception_caught = true;                                                                                                          \
168         }                                                                                                                                     \
169         if(!exception_caught)                                                                                                                 \
170         {                                                                                                                                     \
171             std::stringstream msg;                                                                                                            \
172             msg << "Expectation '" #X "' to throw failed.\n";                                                                                 \
173             arm_compute::test::framework::Framework::get().print_test_info(msg);                                                              \
174             arm_compute::test::framework::Framework::get().log_failed_expectation(arm_compute::test::framework::TestError(msg.str(), LEVEL)); \
175         }                                                                                                                                     \
176         arm_compute::test::framework::Framework::get().clear_test_info();                                                                     \
177     } while(false)
178 
179 #define ARM_COMPUTE_ASSERT_FAIL(MSG)                                                                              \
180     do                                                                                                            \
181     {                                                                                                             \
182         std::stringstream msg;                                                                                    \
183         msg << "Assertion '" << MSG << "' failed.\n";                                                             \
184         arm_compute::test::framework::Framework::get().print_test_info(msg);                                      \
185         throw arm_compute::test::framework::TestError(msg.str(), arm_compute::test::framework::LogLevel::ERRORS); \
186         arm_compute::test::framework::Framework::get().clear_test_info();                                         \
187     } while(false)
188 
189 #define ARM_COMPUTE_EXPECT_FAIL(MSG, LEVEL)                                                                                               \
190     do                                                                                                                                    \
191     {                                                                                                                                     \
192         std::stringstream msg;                                                                                                            \
193         msg << "Expectation '" << MSG << "' failed.\n";                                                                                   \
194         arm_compute::test::framework::Framework::get().print_test_info(msg);                                                              \
195         arm_compute::test::framework::Framework::get().log_failed_expectation(arm_compute::test::framework::TestError(msg.str(), LEVEL)); \
196         arm_compute::test::framework::Framework::get().clear_test_info();                                                                 \
197     } while(false)
198 } // namespace framework
199 } // namespace test
200 } // namespace arm_compute
201 #endif /* ARM_COMPUTE_TEST_FRAMEWORK_ASSERTS */
202