mirror of
https://github.com/unittest-cpp/unittest-cpp
synced 2026-09-26 16:19:30 +03:00
TEST, SUITE, and REQUIRE macros now have UNITTEST_ and UNITTEST_IMPL_ prefixes like the others, completing the set.
246 lines
6.1 KiB
C++
246 lines
6.1 KiB
C++
#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
|