libcopp 2.3.1
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
test_macros.h
Go to the documentation of this file.
1/*
2 * test_macros.h
3 *
4 * Created on: 2014年3月11日
5 * Author: owent
6 *
7 * Released under the MIT license
8 */
9
10#ifndef TEST_MACROS_H_
11#define TEST_MACROS_H_
12
13#pragma once
14
15#include <cstdio>
16#include <iostream>
17#include <sstream>
18
19#ifdef _MSC_VER
20# ifndef WIN32_LEAN_AND_MEAN
21# define WIN32_LEAN_AND_MEAN
22# endif
23# include <Windows.h>
24#endif
25
26#ifdef UTILS_TEST_MACRO_TEST_ENABLE_GTEST
27# include "gtest/gtest.h"
28
29# define CASE_TEST(test_name, case_name) TEST(test_name, case_name)
30
31# define CASE_EXPECT_ERROR(msg) GTEST_NONFATAL_FAILURE_(msg)
32# define CASE_EXPECT_TRUE(c) EXPECT_TRUE(c)
33# define CASE_EXPECT_FALSE(c) EXPECT_FALSE(c)
34# define CASE_EXPECT_EQ(l, r) EXPECT_EQ(l, r)
35# define CASE_EXPECT_NE(l, r) EXPECT_NE(l, r)
36# define CASE_EXPECT_LT(l, r) EXPECT_LT(l, r)
37# define CASE_EXPECT_LE(l, r) EXPECT_LE(l, r)
38# define CASE_EXPECT_GT(l, r) EXPECT_GT(l, r)
39# define CASE_EXPECT_GE(l, r) EXPECT_GE(l, r)
40
41#else
42# include "test_manager.h"
43
44# define test_case_func_name(test_name, case_name) test_func_test_##test_name##_case_##case_name##_
45# define test_case_obj_name(test_name, case_name) test_obj_test_##test_name##_case_##case_name##_
46
47# define CASE_TEST(test_name, case_name) \
48 static void test_case_func_name(test_name, case_name)(); \
49 static test_case_base test_case_obj_name(test_name, case_name)(#test_name, #case_name, \
50 test_case_func_name(test_name, case_name)); \
51 void test_case_func_name(test_name, case_name)()
52
53# define test_event_on_start_func_name(event_name) test_func_event_on_start_##event_name##_
54# define test_event_on_start_obj_name(event_name) test_obj_event_on_start_##event_name##_
55# define test_event_on_exit_func_name(event_name) test_func_event_on_exit_##event_name##_
56# define test_event_on_exit_obj_name(event_name) test_obj_event_on_exit_##event_name##_
57
58# ifdef _MSC_VER
59# define CASE_TEST_EVENT_ON_START(event_name, ...) \
60 static void test_event_on_start_func_name(event_name)(); \
61 static test_on_start_base test_event_on_start_obj_name(event_name)( \
62 #event_name, test_event_on_start_func_name(event_name), __VA_ARGS__); \
63 void test_event_on_start_func_name(event_name)()
64
65# define CASE_TEST_EVENT_ON_EXIT(event_name, ...) \
66 static void test_event_on_exit_func_name(event_name)(); \
67 static test_on_exit_base test_event_on_exit_obj_name(event_name)( \
68 #event_name, test_event_on_exit_func_name(event_name), __VA_ARGS__); \
69 void test_event_on_exit_func_name(event_name)()
70# else
71# define CASE_TEST_EVENT_ON_START(event_name, args...) \
72 static void test_event_on_start_func_name(event_name)(); \
73 static test_on_start_base test_event_on_start_obj_name(event_name)( \
74 #event_name, test_event_on_start_func_name(event_name), ##args); \
75 void test_event_on_start_func_name(event_name)()
76
77# define CASE_TEST_EVENT_ON_EXIT(event_name, args...) \
78 static void test_event_on_exit_func_name(event_name)(); \
79 static test_on_exit_base test_event_on_exit_obj_name(event_name)( \
80 #event_name, test_event_on_exit_func_name(event_name), ##args); \
81 void test_event_on_exit_func_name(event_name)()
82# endif
83
84# ifdef UTILS_TEST_MACRO_TEST_ENABLE_BOOST_TEST
85# define CASE_EXPECT_ERROR(msg) BOOST_ERROR(msg)
86# define CASE_EXPECT_TRUE(c) BOOST_CHECK(c)
87# define CASE_EXPECT_FALSE(c) BOOST_CHECK(!(c))
88# define CASE_EXPECT_EQ(l, r) BOOST_CHECK_EQUAL(l, r)
89# define CASE_EXPECT_NE(l, r) BOOST_CHECK_NE(l, r)
90# define CASE_EXPECT_LT(l, r) BOOST_CHECK_LT(l, r)
91# define CASE_EXPECT_LE(l, r) BOOST_CHECK_LE(l, r)
92# define CASE_EXPECT_GT(l, r) BOOST_CHECK_GT(l, r)
93# define CASE_EXPECT_GE(l, r) BOOST_CHECK_GE(l, r)
94
95# else
96# define CASE_EXPECT_ERROR(msg) test_manager::me().expect_false(true, msg, __FILE__, __LINE__)
97# define CASE_EXPECT_TRUE(c) test_manager::me().expect_true((c), #c, __FILE__, __LINE__)
98# define CASE_EXPECT_FALSE(c) test_manager::me().expect_false((c), #c, __FILE__, __LINE__)
99# define CASE_EXPECT_EQ(l, r) test_manager::me().expect_eq((l), (r), #l, #r, __FILE__, __LINE__)
100# define CASE_EXPECT_NE(l, r) test_manager::me().expect_ne((l), (r), #l, #r, __FILE__, __LINE__)
101# define CASE_EXPECT_LT(l, r) test_manager::me().expect_lt((l), (r), #l, #r, __FILE__, __LINE__)
102# define CASE_EXPECT_LE(l, r) test_manager::me().expect_le((l), (r), #l, #r, __FILE__, __LINE__)
103# define CASE_EXPECT_GT(l, r) test_manager::me().expect_gt((l), (r), #l, #r, __FILE__, __LINE__)
104# define CASE_EXPECT_GE(l, r) test_manager::me().expect_ge((l), (r), #l, #r, __FILE__, __LINE__)
105
106# endif
107
108#endif
109
110// 前景色: BLACK,RED,GREEN,YELLOW,BLUE,MAGENTA,CYAN,WHITE
111#define CASE_MSG_FCOLOR(x) util::cli::shell_font_style::SHELL_FONT_COLOR_##x
112// 背景色: BLACK,RED,GREEN,YELLOW,BLUE,MAGENTA,CYAN,WHITE
113#define CASE_MSG_BCOLOR(x) util::cli::shell_font_style::SHELL_FONT_BACKGROUND_COLOR_##x
114// 字体格式: BOLD,UNDERLINE,FLASH,DARK
115#define CASE_MSG_STYLE(x) util::cli::shell_font_style::SHELL_FONT_SPEC_##x
116
117#define CASE_MSG_INFO() util::cli::shell_stream(std::cout)() << "[ RUNNING ] "
118#define CASE_MSG_ERROR() util::cli::shell_stream(std::cerr)() << "[ RUNNING ] "
119
120// 测试中休眠
121#if (defined(__cplusplus) && __cplusplus >= 201103L) || (defined(_MSC_VER) && _MSC_VER >= 1800)
122# include <thread>
123# define CASE_THREAD_SLEEP_MS(x) std::this_thread::sleep_for(std::chrono::milliseconds(x))
124# define CASE_THREAD_YIELD() std::this_thread::yield()
125
126#elif defined(_MSC_VER)
127# ifndef WIN32_LEAN_AND_MEAN
128# define WIN32_LEAN_AND_MEAN
129# endif
130# include <Windows.h>
131# define CASE_THREAD_SLEEP_MS(x) Sleep(x)
132# define CASE_THREAD_YIELD() YieldProcessor()
133
134#else
135# include <unistd.h>
136
137# define CASE_THREAD_SLEEP_MS(x) \
138 ((x > 1000) ? sleep(x / 1000) : usleep(0)); \
139 usleep((x % 1000) * 1000)
140# if defined(__linux__) || defined(__unix__)
141# include <sched.h>
142# define CASE_THREAD_YIELD() sched_yield()
143# elif defined(__GNUC__) || defined(__clang__)
144# if defined(__i386__) || defined(__x86_64__)
150# define CASE_THREAD_YIELD() __asm__ __volatile__("pause")
151# elif defined(__ia64__) || defined(__ia64)
157# define CASE_THREAD_YIELD() __asm__ __volatile__("hint @pause")
158# elif defined(__arm__) && !defined(__ANDROID__)
163# define CASE_THREAD_YIELD() __asm__ __volatile__("yield")
164# else
165# define CASE_THREAD_YIELD()
166# endif
167# else
168# define CASE_THREAD_YIELD()
169# endif
170
171#endif
172
173#endif /* TEST_MACROS_H_ */