#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; namespace { TestList list1; TEST_EX(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; TEST_FIXTURE_EX(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; TEST_EX(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; TEST_FIXTURE_EX(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; TEST_FIXTURE_EX(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() { throw "exception"; } }; TestList throwingFixtureTestList2; TEST_FIXTURE_EX(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; TEST_FIXTURE_EX(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