3 #ifndef INCLUDE_NN_NLIB_TESTING_NTEST_H_
4 #define INCLUDE_NN_NLIB_TESTING_NTEST_H_
16 #if defined(_MSC_VER) && defined(nx_testing_EXPORTS)
17 #undef NLIB_VIS_PUBLIC
18 #define NLIB_VIS_PUBLIC NLIB_WINEXPORT
41 bool HasFatalFaiulre()
const {
return is_fatal_error; }
42 bool HasNonfatalFailure()
const {
return is_non_fatal_error; }
47 bool is_non_fatal_error;
59 virtual ~TestFactoryBase() {}
60 virtual Test* Create() = 0;
69 template <
class TestClass>
70 class TestFactory :
public TestFactoryBase {
86 const char* test_case_name()
const {
return m_TestCaseName; }
87 const char* name()
const {
return m_TestName; }
88 const TestResult* result()
const {
return &m_Result; }
92 typedef void (*SetUpTestCaseFunc)();
93 typedef void (*TearDownTestCaseFunc)();
94 template <
class TestClass>
95 static TestInfo* AddTestInfo(
const char* test_case,
const char* test_name,
int index,
96 SetUpTestCaseFunc setup_func, TearDownTestCaseFunc teardown_func);
99 static const int kMaxTestList = 4096;
100 static TestInfo m_TestList[kMaxTestList];
101 static int m_TestListIdx;
105 bool TestCaseNameLess(
const TestInfo& rhs)
const {
106 int tmp = strcmp(m_TestCaseName, rhs.m_TestCaseName);
107 if (tmp < 0)
return true;
108 if (tmp > 0)
return false;
109 return m_Index < rhs.m_Index;
111 bool TestCaseNameEq(
const TestInfo& rhs)
const {
112 return m_Index == rhs.m_Index &&
113 strcmp(m_TestCaseName, rhs.m_TestCaseName) == 0;
115 bool IsTypedTest()
const {
return m_Index >= 0; }
116 int GetTypedTestVariant()
const {
return m_Index < 0 ? 0 : m_Index; }
117 struct TestSortPred {
118 bool operator()(TestInfo* lhs, TestInfo* rhs) {
119 return lhs->TestCaseNameLess(*rhs);
124 static TestInfo& AddTestInfo_(
const char* test_case,
const char* test_name,
int index,
125 SetUpTestCaseFunc setup_func,
126 TearDownTestCaseFunc teardown_func);
129 friend class FollowMessageTerminator;
130 const char* m_TestCaseName;
131 const char* m_TestName;
133 TestFactoryBase* m_Factory;
134 void (*m_SetUpTestCase)();
135 void (*m_TearDownTestCase)();
137 double m_TestFactorySpace[2];
141 template <
class TestClass>
142 TestInfo* TestInfo::AddTestInfo(
const char* test_case,
const char* test_name,
int index,
143 SetUpTestCaseFunc setup_func, TearDownTestCaseFunc teardown_func) {
148 TestInfo& info = AddTestInfo_(test_case, test_name, index, setup_func, teardown_func);
149 void* p = &info.m_TestFactorySpace[0];
150 new (p) TestFactory<TestClass>();
156 char* tmpptr =
reinterpret_cast<char*
>(&info.m_TestFactorySpace[0]);
157 info.m_Factory =
reinterpret_cast<TestFactoryBase*
>(tmpptr);
165 static UnitTest* GetInstance();
170 const TestInfo* current_test_info()
const {
return m_Current; }
193 friend class TestInfo;
194 friend class SimpleSingleton<UnitTest>;
195 friend class FollowMessageTerminator;
196 UnitTest() : m_Current(NULL) {}
197 virtual ~UnitTest() {}
204 static void SetUpTestCase() {}
205 static void TearDownTestCase() {}
210 void RecordProperty(
const char* key,
const char* value);
211 void RecordProperty(
const char* key,
int value);
214 virtual void SetUp() {}
215 virtual void TearDown() {}
216 virtual void TestBody() = 0;
229 mutable std::string m_Main;
230 mutable std::string m_Scratch;
231 static const std::string::size_type kScratchSize = 1024;
241 operator bool()
const {
return m_Success; }
242 AssertionResult operator!()
const {
return AssertionResult(!m_Success); }
246 AssertionResult& operator<<(
const T& rhs) {
247 if (!m_Builder) m_Builder.reset(
new StringBuilder);
248 m_Builder->append(PrintToString(rhs));
254 mutable ::nlib_ns::UniquePtr<StringBuilder> m_Builder;
255 AssertionResult& operator=(
const AssertionResult&);
261 ScopedTrace(AssertionResult& msg,
const char* file,
int line);
270 explicit FollowMessageTerminator(
bool flag);
276 void operator=(
const AssertionResult& msg)
const;
282 inline bool suppress_warning_(
bool b) {
return b; }
283 NLIB_VIS_PUBLIC AssertionResult BooleanFailMessage(
const char* file,
int line,
const char* expr,
284 const char* actual,
const char* expected);
285 #define NLIB_TESTING_BOOLEAN_IMPL_(expr, expected, actual, iffail) \
289 if (::nlib_ns::testing::suppress_warning_(expr)) \
293 ::nlib_ns::testing::BooleanFailMessage(__FILE__, __LINE__, #expr, #actual, #expected)
295 NLIB_VIS_PUBLIC AssertionResult CompFailMessage(
const char* file,
int line,
const char* expr1,
296 const char* expr2,
const std::string& val1,
297 const std::string& val2,
const char* op);
298 #define NLIB_TESTING_COMP_IMPL_(func_name, op) \
299 template<class T1, class T2> \
300 AssertionResult Comp##func_name(const char* expr1, const char* expr2, const T1& val1, \
301 const T2& val2, const char* file, int line) { \
302 if (val1 op val2) { \
303 return AssertionResult(true); \
305 return CompFailMessage(file, line, expr1, expr2, PrintToString(val1), \
306 PrintToString(val2), #op); \
309 NLIB_VIS_PUBLIC AssertionResult Comp##func_name(const char* expr1, const char* expr2, \
310 int64_t val1, int64_t val2, \
311 const char* file, int line)
313 NLIB_TESTING_COMP_IMPL_(EQ, ==);
314 NLIB_TESTING_COMP_IMPL_(NE, !=);
315 NLIB_TESTING_COMP_IMPL_(LE, <=);
316 NLIB_TESTING_COMP_IMPL_(LT, <);
317 NLIB_TESTING_COMP_IMPL_(GE, >=);
318 NLIB_TESTING_COMP_IMPL_(GT, >);
320 #undef NLIB_TESTING_COMP_IMPL_
322 NLIB_VIS_PUBLIC AssertionResult CompStrEq(
const char* expr1,
const char* expr2,
const char* val1,
323 const char* val2,
const char* file,
int line);
324 NLIB_VIS_PUBLIC AssertionResult CompStrNe(
const char* expr1,
const char* expr2,
const char* val1,
325 const char* val2,
const char* file,
int line);
327 NLIB_VIS_PUBLIC AssertionResult CompStrEq(
const char* expr1,
const char* expr2,
const wchar_t* val1,
328 const wchar_t* val2,
const char* file,
int line);
329 NLIB_VIS_PUBLIC AssertionResult CompStrNe(
const char* expr1,
const char* expr2,
const wchar_t* val1,
330 const wchar_t* val2,
const char* file,
int line);
332 NLIB_VIS_PUBLIC AssertionResult CompStrCaseEq(
const char* expr1,
const char* expr2,
333 const char* val1,
const char* val2,
334 const char* file,
int line);
335 NLIB_VIS_PUBLIC AssertionResult CompStrCaseNe(
const char* expr1,
const char* expr2,
336 const char* val1,
const char* val2,
337 const char* file,
int line);
339 NLIB_VIS_PUBLIC AssertionResult CompStrCaseEq(
const char* expr1,
const char* expr2,
340 const wchar_t* val1,
const wchar_t* val2,
341 const char* file,
int line);
342 NLIB_VIS_PUBLIC AssertionResult CompStrCaseNe(
const char* expr1,
const char* expr2,
343 const wchar_t* val1,
const wchar_t* val2,
344 const char* file,
int line);
346 NLIB_VIS_PUBLIC AssertionResult CompFloatEq(
const char* expr1,
const char* expr2,
float val1,
347 float val2,
const char* file,
int line);
348 NLIB_VIS_PUBLIC AssertionResult CompDoubleEq(
const char* expr1,
const char* expr2,
double val1,
349 double val2,
const char* file,
int line);
350 NLIB_VIS_PUBLIC AssertionResult NearDouble(
double val1,
double val2,
double abs_error);
354 #define NLIB_TESTING_CONCAT_TOKEN_(a, b) NLIB_TESTING_CONCAT_TOKEN_IMPL_(a, b)
355 #define NLIB_TESTING_CONCAT_TOKEN_IMPL_(a, b) a##b
357 #define NLIB_TESTING_FATAL_ return ::nlib_ns::testing::FollowMessageTerminator(true)
358 #define NLIB_TESTING_NONFATAL_ ::nlib_ns::testing::FollowMessageTerminator(false)
360 #define NLIB_TESTING_ASSERT_HELPER_(func, val1, val2) \
364 if (::nlib_ns::testing::AssertionResult ar = \
365 func(#val1, #val2, val1, val2, __FILE__, __LINE__)) \
368 NLIB_TESTING_FATAL_ = ar
370 #define NLIB_TESTING_EXPECT_HELPER_(func, val1, val2) \
374 if (::nlib_ns::testing::AssertionResult ar = \
375 func(#val1, #val2, val1, val2, __FILE__, __LINE__)) \
378 NLIB_TESTING_NONFATAL_ = ar
380 #define NLIB_TESTING_CLASS_NAME_(test_case, test_name) test_case##_##test_name##_Test
382 #define NLIB_TEST_(test_case, test_name, parent) \
383 class NLIB_TESTING_CLASS_NAME_(test_case, test_name) \
386 NLIB_TESTING_CLASS_NAME_(test_case, test_name)() {} \
388 virtual void TestBody(); \
389 static ::nlib_ns::testing::TestInfo* m_Info; \
390 NLIB_DISALLOW_COPY_AND_ASSIGN(NLIB_TESTING_CLASS_NAME_(test_case, test_name)); \
392 ::nlib_ns::testing::TestInfo* NLIB_TESTING_CLASS_NAME_(test_case, test_name)::m_Info = \
393 ::nlib_ns::testing::TestInfo::AddTestInfo< \
394 NLIB_TESTING_CLASS_NAME_(test_case, test_name)>( \
395 #test_case, #test_name, -1, parent::SetUpTestCase, parent::TearDownTestCase); \
396 void NLIB_TESTING_CLASS_NAME_(test_case, test_name)::TestBody()
398 NLIB_VIS_PUBLIC AssertionResult& NearFailMessage(AssertionResult* ar,
const char* file,
int line,
399 const char* expr1,
const char* expr2,
400 const char* abs_error_expr,
double val1,
401 double val2,
double abs_error);
404 FloatLE(
const char* expr1,
const char* expr2,
float val1,
float val2);
406 DoubleLE(
const char* expr1,
const char* expr2,
double val1,
double val2);
411 #define NLIB_TESTING_FLAG(flag_name) NLIB_FLAGS_##flag_name
428 #define TEST(test_case_name, specific_test_name) \
429 NLIB_TEST_(test_case_name, specific_test_name, ::nlib_ns::testing::Test)
430 #define TEST_F(test_fixture_name, specific_test_name) \
431 NLIB_TEST_(test_fixture_name, specific_test_name, test_fixture_name)
433 #define FRIEND_TEST(test_case, test_name) \
434 friend class NLIB_TESTING_CLASS_NAME_(test_case, test_name)
436 #define RUN_ALL_TESTS() ::nlib_ns::testing::TestInfo::Run()
439 return ::nlib_ns::testing::FollowMessageTerminator(true) = \
440 ::nlib_ns::testing::AssertionResult(false)
443 #define ASSERT_TRUE(expr) NLIB_TESTING_BOOLEAN_IMPL_(expr, true, false, NLIB_TESTING_FATAL_)
444 #define ASSERT_FALSE(expr) NLIB_TESTING_BOOLEAN_IMPL_(!(expr), false, true, NLIB_TESTING_FATAL_)
445 #define EXPECT_TRUE(expr) NLIB_TESTING_BOOLEAN_IMPL_(expr, true, false, NLIB_TESTING_NONFATAL_)
446 #define EXPECT_FALSE(expr) NLIB_TESTING_BOOLEAN_IMPL_(!(expr), false, true, NLIB_TESTING_NONFATAL_)
448 #define ASSERT_EQ(expected, actual) \
449 NLIB_TESTING_ASSERT_HELPER_(::nlib_ns::testing::CompEQ, expected, actual)
450 #define ASSERT_NE(expected, actual) \
451 NLIB_TESTING_ASSERT_HELPER_(::nlib_ns::testing::CompNE, expected, actual)
452 #define ASSERT_LE(val1, val2) NLIB_TESTING_ASSERT_HELPER_(::nlib_ns::testing::CompLE, val1, val2)
453 #define ASSERT_LT(val1, val2) NLIB_TESTING_ASSERT_HELPER_(::nlib_ns::testing::CompLT, val1, val2)
454 #define ASSERT_GE(val1, val2) NLIB_TESTING_ASSERT_HELPER_(::nlib_ns::testing::CompGE, val1, val2)
455 #define ASSERT_GT(val1, val2) NLIB_TESTING_ASSERT_HELPER_(::nlib_ns::testing::CompGT, val1, val2)
457 #define EXPECT_EQ(expected, actual) \
458 NLIB_TESTING_EXPECT_HELPER_(::nlib_ns::testing::CompEQ, expected, actual)
459 #define EXPECT_NE(expected, actual) \
460 NLIB_TESTING_EXPECT_HELPER_(::nlib_ns::testing::CompNE, expected, actual)
461 #define EXPECT_LE(val1, val2) NLIB_TESTING_EXPECT_HELPER_(::nlib_ns::testing::CompLE, val1, val2)
462 #define EXPECT_LT(val1, val2) NLIB_TESTING_EXPECT_HELPER_(::nlib_ns::testing::CompLT, val1, val2)
463 #define EXPECT_GE(val1, val2) NLIB_TESTING_EXPECT_HELPER_(::nlib_ns::testing::CompGE, val1, val2)
464 #define EXPECT_GT(val1, val2) NLIB_TESTING_EXPECT_HELPER_(::nlib_ns::testing::CompGT, val1, val2)
466 #define ASSERT_STREQ(expected, actual) \
467 NLIB_TESTING_ASSERT_HELPER_(::nlib_ns::testing::CompStrEq, expected, actual)
468 #define ASSERT_STRNE(expected, actual) \
469 NLIB_TESTING_ASSERT_HELPER_(::nlib_ns::testing::CompStrNe, expected, actual)
471 #define EXPECT_STREQ(expected, actual) \
472 NLIB_TESTING_EXPECT_HELPER_(::nlib_ns::testing::CompStrEq, expected, actual)
473 #define EXPECT_STRNE(expected, actual) \
474 NLIB_TESTING_EXPECT_HELPER_(::nlib_ns::testing::CompStrNe, expected, actual)
476 #define ASSERT_STRCASEEQ(expected, actual) \
477 NLIB_TESTING_ASSERT_HELPER_(::nlib_ns::testing::CompStrCaseEq, expected, actual)
478 #define ASSERT_STRCASENE(expected, actual) \
479 NLIB_TESTING_ASSERT_HELPER_(::nlib_ns::testing::CompStrCaseNe, expected, actual)
481 #define EXPECT_STRCASEEQ(expected, actual) \
482 NLIB_TESTING_EXPECT_HELPER_(::nlib_ns::testing::CompStrCaseEq, expected, actual)
483 #define EXPECT_STRCASENE(expected, actual) \
484 NLIB_TESTING_EXPECT_HELPER_(::nlib_ns::testing::CompStrCaseNe, expected, actual)
490 #define ASSERT_FLOAT_EQ(expected, actual) \
491 NLIB_TESTING_ASSERT_HELPER_(::nlib_ns::testing::CompFloatEq, expected, actual)
492 #define ASSERT_DOUBLE_EQ(expected, actual) \
493 NLIB_TESTING_ASSERT_HELPER_(::nlib_ns::testing::CompDoubleEq, expected, actual)
495 #define EXPECT_FLOAT_EQ(expected, actual) \
496 NLIB_TESTING_EXPECT_HELPER_(::nlib_ns::testing::CompFloatEq, expected, actual)
497 #define EXPECT_DOUBLE_EQ(expected, actual) \
498 NLIB_TESTING_EXPECT_HELPER_(::nlib_ns::testing::CompDoubleEq, expected, actual)
500 #define ASSERT_NEAR(val1, val2, abs_error) \
504 if (::nlib_ns::testing::AssertionResult ar = \
505 ::nlib_ns::testing::NearDouble(val1, val2, abs_error)) \
508 NLIB_TESTING_FATAL_ = ::nlib_ns::testing::NearFailMessage( \
509 &ar, __FILE__, __LINE__, #val1, #val2, #abs_error, val1, val2, abs_error)
511 #define EXPECT_NEAR(val1, val2, abs_error) \
515 if (::nlib_ns::testing::AssertionResult ar = \
516 ::nlib_ns::testing::NearDouble(val1, val2, abs_error)) \
519 NLIB_TESTING_NONFATAL_ = ::nlib_ns::testing::NearFailMessage( \
520 &ar, __FILE__, __LINE__, #val1, #val2, #abs_error, val1, val2, abs_error)
522 #define SCOPED_TRACE(msg) \
523 ::nlib_ns::testing::ScopedTrace NLIB_TESTING_CONCAT_TOKEN_(nlib_scopedtrace_, __LINE__)( \
524 ::nlib_ns::testing::AssertionResult(true) << (msg), __FILE__, __LINE__)
526 #define ASSERT_NO_FATAL_FAILURE(statement) \
534 if (!::nlib_ns::testing::UnitTest::GetInstance() \
535 ->current_test_info() \
537 ->HasFatalFaiulre()) \
540 NLIB_TESTING_FATAL_ = ::nlib_ns::testing::AssertionResult(false) \
541 << "Expected: " #statement \
542 " doesn't generate new fatal failures.\n" \
543 " Actual: it does.\n"
545 #define EXPECT_NO_FATAL_FAILURE(statement) \
553 if (!::nlib_ns::testing::UnitTest::GetInstance() \
554 ->current_test_info() \
556 ->HasFatalFaiulre()) \
559 NLIB_TESTING_NONFATAL_ = ::nlib_ns::testing::AssertionResult(false) \
560 << "Expected: " #statement \
561 " doesn't generate new fatal failures.\n" \
562 " Actual: it does.\n"
564 #define GTEST_FLAG(name) NLIB_FLAGS_gtest_##name
569 #if defined(_MSC_VER) && defined(nx_testing_EXPORTS)
570 #undef NLIB_VIS_PUBLIC
571 #define NLIB_VIS_PUBLIC NLIB_WINIMPORT
574 #endif // INCLUDE_NN_NLIB_TESTING_NTEST_H_
AssertionResult FloatLE(const char *expr1, const char *expr2, float val1, float val2)
val1 <= val2を検証します。[ASSERT|EXPECT]_PRED_FORMAT2に組み込んで利用します。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
virtual void SetUp()
全てのテストの前に1回だけ実行される処理を記述します。
#define NLIB_OVERRIDE
利用可能であればoverrideが定義されます。そうでない場合は空文字列です。
std::unique_ptrに相当するクラスが定義されています。
コマンドライン文字列を扱うためのクラスが定義されています。
#define NLIB_FLAGS_DECLARE_bool(opt_name)
別の場所で定義された、NLIB_FLAGS_オプション名、を利用できるようにします。
void InitNintendoTest(int *argc, wchar_t **argv)
テストプログラムのコマンドラインオプションを処理します。
Environment * AddGlobalTestEnvironment(Environment *env)
Environment へのポインタを渡して、全てのテストの前と後に実行されるコードを登録します。 ...
virtual void TearDown()
全てのテストの後に1回だけ実行される処理を記述します。
#define NLIB_STATIC_ASSERT(exp)
静的アサートが定義されます。利用可能であればstatic_assertを利用します。
#define NLIB_FLAGS_DECLARE_string(opt_name)
別の場所で定義された、NLIB_FLAGS_オプション名、を利用できるようにします。
このクラスを継承してグローバルに実行されるSetUp()とTearDown()を定義します。
AssertionResult DoubleLE(const char *expr1, const char *expr2, double val1, double val2)
val1 <= val2を検証します。[ASSERT|EXPECT]_PRED_FORMAT2に組み込んで利用します。
#define NLIB_FLAGS_DECLARE_int32(opt_name)
別の場所で定義された、NLIB_FLAGS_オプション名、を利用できるようにします。