#include "UnitTest++/Config.h"
#include "UnitTest++/UnitTestPP.h"
#include "UnitTest++/ReportAssert.h"
#include "UnitTest++/ReportAssertImpl.h"
#include "UnitTest++/AssertException.h"
#include "RecordingReporter.h"
#include <csetjmp>
using namespace UnitTest;
namespace {
TEST(CanSetAssertExpected)
{
Detail::ExpectAssert(true);
CHECK(Detail::AssertExpected());
Detail::ExpectAssert(false);
CHECK(!Detail::AssertExpected());
}
#ifndef UNITTEST_NO_EXCEPTIONS
TEST(ReportAssertThrowsAssertException)
{
bool caught = false;
try
{
TestResults testResults;
TestDetails testDetails("", "", "", 0);
Detail::ReportAssertEx(&testResults, &testDetails, "", "", 0);
}
catch(AssertException const&)
{
caught = true;
}
CHECK(true == caught);
}
TEST(ReportAssertClearsExpectAssertFlag)
{
RecordingReporter reporter;
TestResults testResults(&reporter);
TestDetails testDetails("", "", "", 0);
try
{
Detail::ExpectAssert(true);
Detail::ReportAssertEx(&testResults, &testDetails, "", "", 0);
}
catch(AssertException const&)
{}
CHECK(Detail::AssertExpected() == false);
CHECK_EQUAL(0, reporter.testFailedCount);
}
TEST(ReportAssertWritesFailureToResultsAndDetailsWhenAssertIsNotExpected)
{
const int lineNumber = 12345;
const char* description = "description";
const char* filename = "filename";
RecordingReporter reporter;
TestResults testResults(&reporter);
TestDetails testDetails("", "", "", 0);
try
{
Detail::ReportAssertEx(&testResults, &testDetails, description, filename, lineNumber);
}
catch(AssertException const&)
{}
CHECK_EQUAL(description, reporter.lastFailedMessage);
CHECK_EQUAL(filename, reporter.lastFailedFile);
CHECK_EQUAL(lineNumber, reporter.lastFailedLine);
}
TEST(ReportAssertReportsNoErrorsWhenAssertIsExpected)
{
Detail::ExpectAssert(true);
RecordingReporter reporter;
TestResults testResults(&reporter);
TestDetails testDetails("", "", "", 0);
try
{
Detail::ReportAssertEx(&testResults, &testDetails, "", "", 0);
}
catch(AssertException const&)
{}
CHECK_EQUAL(0, reporter.testFailedCount);
}
TEST(CheckAssertMacroSetsAssertExpectationToFalseAfterRunning)
{
Detail::ExpectAssert(true);
CHECK_ASSERT(ReportAssert("", "", 0));
CHECK(!Detail::AssertExpected());
Detail::ExpectAssert(false);
}
#else
TEST(SetAssertJumpTargetReturnsFalseWhenSettingJumpTarget)
{
CHECK(UNITTEST_SET_ASSERT_JUMP_TARGET() == false);
}
TEST(JumpToAssertJumpTarget_JumpsToSetPoint_ReturnsTrue)
{
const volatile bool taken = !!UNITTEST_SET_ASSERT_JUMP_TARGET();
volatile bool set = false;
if (taken == false)
{
UNITTEST_JUMP_TO_ASSERT_JUMP_TARGET();
set = true;
}
CHECK(set == false);
}
#endif
}