#include "UnitTest++/UnitTestPP.h" #include "UnitTest++/TestMacros.h" #include "UnitTest++/TestList.h" #include "UnitTest++/TestResults.h" #include "UnitTest++/TestReporter.h" #include "UnitTest++/ReportAssert.h" #include "RecordingReporter.h" #include "ScopedCurrentTest.h" using namespace UnitTest; using namespace std; /* test for c++11 support */ #ifndef _MSC_VER /* Test for clang >= 3.3 */ #ifdef __clang__ #if (__clang__ == 1) && (__clang_major__ > 3 || (__clang_major__ == 3 && (__clang_minor__ > 2 ))) #define _NOEXCEPT_OP(x) noexcept(x) #else #define _NOEXCEPT_OP(x) #endif #endif #ifndef __clang__ /* Test for GCC >= 4.8.0 */ #ifdef __GNUC__ #if (__GNUC__ > 4) || (__GNUC__ == 4 && (__GNUC_MINOR__ > 7 )) #define _NOEXCEPT_OP(x) noexcept(x) #else #define _NOEXCEPT_OP(x) #endif #endif #endif #elif _MSC_VER #if (_MSC_VER > 1800) #define _NOEXCEPT_OP(x) noexcept(x) #else #define _NOEXCEPT_OP(x) #endif #endif namespace { TestList list1; UNITTEST_IMPL_TEST(DummyTest, list1) {} TEST (TestsAreAddedToTheListThroughMacro) { CHECK(list1.GetHead() != 0); CHECK(list1.GetHead()->m_nextTest == 0); } #ifndef UNITTEST_NO_EXCEPTIONS struct ThrowingThingie { ThrowingThingie() : dummy(false) { if (!dummy) throw "Oops"; } bool dummy; }; TestList list2; UNITTEST_IMPL_TEST_FIXTURE(ThrowingThingie, DummyTestName, list2) {} TEST (ExceptionsInFixtureAreReportedAsHappeningInTheFixture) { RecordingReporter reporter; TestResults result(&reporter); { ScopedCurrentTest scopedResults(result); list2.GetHead()->Run(); } CHECK(strstr(reporter.lastFailedMessage, "xception")); CHECK(strstr(reporter.lastFailedMessage, "fixture")); CHECK(strstr(reporter.lastFailedMessage, "ThrowingThingie")); } #endif struct DummyFixture { int x; }; // We're really testing the macros so we just want them to compile and link SUITE(TestSuite1) { TEST(SimilarlyNamedTestsInDifferentSuitesWork) {} TEST_FIXTURE(DummyFixture, SimilarlyNamedFixtureTestsInDifferentSuitesWork) {} } SUITE(TestSuite2) { TEST(SimilarlyNamedTestsInDifferentSuitesWork) {} TEST_FIXTURE(DummyFixture,SimilarlyNamedFixtureTestsInDifferentSuitesWork) {} } TestList macroTestList1; UNITTEST_IMPL_TEST(MacroTestHelper1, macroTestList1) {} TEST(TestAddedWithTEST_EXMacroGetsDefaultSuite) { CHECK(macroTestList1.GetHead() != NULL); CHECK_EQUAL ("MacroTestHelper1", macroTestList1.GetHead()->m_details.testName); CHECK_EQUAL ("DefaultSuite", macroTestList1.GetHead()->m_details.suiteName); } TestList macroTestList2; UNITTEST_IMPL_TEST_FIXTURE(DummyFixture, MacroTestHelper2, macroTestList2) {} TEST(TestAddedWithTEST_FIXTURE_EXMacroGetsDefaultSuite) { CHECK(macroTestList2.GetHead() != NULL); CHECK_EQUAL ("MacroTestHelper2", macroTestList2.GetHead()->m_details.testName); CHECK_EQUAL ("DefaultSuite", macroTestList2.GetHead()->m_details.suiteName); } #ifndef UNITTEST_NO_EXCEPTIONS struct FixtureCtorThrows { FixtureCtorThrows() { throw "exception"; } }; TestList throwingFixtureTestList1; UNITTEST_IMPL_TEST_FIXTURE(FixtureCtorThrows, FixtureCtorThrowsTestName, throwingFixtureTestList1) {} TEST(FixturesWithThrowingCtorsAreFailures) { CHECK(throwingFixtureTestList1.GetHead() != NULL); RecordingReporter reporter; TestResults result(&reporter); { ScopedCurrentTest scopedResult(result); throwingFixtureTestList1.GetHead()->Run(); } int const failureCount = result.GetFailedTestCount(); CHECK_EQUAL(1, failureCount); CHECK(strstr(reporter.lastFailedMessage, "while constructing fixture")); } struct FixtureDtorThrows { ~FixtureDtorThrows() _NOEXCEPT_OP(false) { throw "exception"; } }; TestList throwingFixtureTestList2; UNITTEST_IMPL_TEST_FIXTURE(FixtureDtorThrows, FixtureDtorThrowsTestName, throwingFixtureTestList2) {} TEST(FixturesWithThrowingDtorsAreFailures) { CHECK(throwingFixtureTestList2.GetHead() != NULL); RecordingReporter reporter; TestResults result(&reporter); { ScopedCurrentTest scopedResult(result); throwingFixtureTestList2.GetHead()->Run(); } int const failureCount = result.GetFailedTestCount(); CHECK_EQUAL(1, failureCount); CHECK(strstr(reporter.lastFailedMessage, "while destroying fixture")); } const int FailingLine = 123; struct FixtureCtorAsserts { FixtureCtorAsserts() { UnitTest::ReportAssert("assert failure", "file", FailingLine); } }; TestList ctorAssertFixtureTestList; UNITTEST_IMPL_TEST_FIXTURE(FixtureCtorAsserts, CorrectlyReportsAssertFailureInCtor, ctorAssertFixtureTestList) {} TEST(CorrectlyReportsFixturesWithCtorsThatAssert) { RecordingReporter reporter; TestResults result(&reporter); { ScopedCurrentTest scopedResults(result); ctorAssertFixtureTestList.GetHead()->Run(); } const int failureCount = result.GetFailedTestCount(); CHECK_EQUAL(1, failureCount); CHECK_EQUAL(FailingLine, reporter.lastFailedLine); CHECK(strstr(reporter.lastFailedMessage, "assert failure")); } #endif } // We're really testing if it's possible to use the same suite in two files // to compile and link successfuly (TestTestSuite.cpp has suite with the same name) // Note: we are outside of the anonymous namespace SUITE(SameTestSuite) { TEST(DummyTest1) {} } #define CUR_TEST_NAME CurrentTestDetailsContainCurrentTestInfo #define INNER_STRINGIFY(X) #X #define STRINGIFY(X) INNER_STRINGIFY(X) TEST(CUR_TEST_NAME) { const UnitTest::TestDetails* details = CurrentTest::Details(); CHECK_EQUAL(STRINGIFY(CUR_TEST_NAME), details->testName); } #undef CUR_TEST_NAME #undef INNER_STRINGIFY #undef STRINGIFY