#include "UnitTest++/Config.h"
#ifndef UNITTEST_NO_EXCEPTIONS
#include "UnitTest++/UnitTestPP.h"
#include "UnitTest++/CurrentTest.h"
#include "RecordingReporter.h"
#include "ScopedCurrentTest.h"
#include <stdexcept>
using namespace std;
namespace {
int ThrowingFunction()
{
throw "Doh";
}
int ThrowingStdExceptionFunction()
{
throw std::logic_error("Doh");
}
SUITE(CheckExceptionTests)
{
struct CheckFixture
{
CheckFixture()
: reporter()
, testResults(&reporter)
{}
void PerformCheckWithNonStdThrow()
{
ScopedCurrentTest scopedResults(testResults);
CHECK(ThrowingFunction() == 1);
}
void PerformCheckWithStdThrow()
{
ScopedCurrentTest scopedResults(testResults);
CHECK(ThrowingStdExceptionFunction() == 1);
}
RecordingReporter reporter;
UnitTest::TestResults testResults;
};
TEST_FIXTURE(CheckFixture, CheckFailsOnException)
{
PerformCheckWithNonStdThrow();
CHECK(testResults.GetFailureCount() > 0);
}
TEST_FIXTURE(CheckFixture, CheckFailsOnStdException)
{
PerformCheckWithStdThrow();
CHECK(testResults.GetFailureCount() > 0);
}
TEST_FIXTURE(CheckFixture, CheckFailureBecauseOfExceptionIncludesCheckContents)
{
PerformCheckWithNonStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "ThrowingFunction() == 1"));
}
TEST_FIXTURE(CheckFixture, CheckFailureBecauseOfStdExceptionIncludesCheckContents)
{
PerformCheckWithStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "ThrowingStdExceptionFunction() == 1"));
}
TEST_FIXTURE(CheckFixture, CheckFailureBecauseOfStandardExceptionIncludesWhat)
{
PerformCheckWithStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "exception (Doh)"));
}
}
SUITE(CheckEqualExceptionTests)
{
struct CheckEqualFixture
{
CheckEqualFixture()
: reporter()
, testResults(&reporter)
, line(-1)
{}
void PerformCheckWithNonStdThrow()
{
UnitTest::TestDetails const testDetails("testName", "suiteName", "filename", -1);
ScopedCurrentTest scopedResults(testResults, &testDetails);
CHECK_EQUAL(ThrowingFunction(), 123); line = __LINE__;
}
void PerformCheckWithStdThrow()
{
UnitTest::TestDetails const testDetails("testName", "suiteName", "filename", -1);
ScopedCurrentTest scopedResults(testResults, &testDetails);
CHECK_EQUAL(ThrowingStdExceptionFunction(), 123); line = __LINE__;
}
RecordingReporter reporter;
UnitTest::TestResults testResults;
int line;
};
TEST_FIXTURE(CheckEqualFixture, CheckEqualFailsOnException)
{
PerformCheckWithNonStdThrow();
CHECK(testResults.GetFailureCount() > 0);
}
TEST_FIXTURE(CheckEqualFixture, CheckEqualFailsOnStdException)
{
PerformCheckWithStdThrow();
CHECK(testResults.GetFailureCount() > 0);
}
TEST_FIXTURE(CheckEqualFixture, CheckEqualFailureBecauseOfExceptionContainsCorrectDetails)
{
PerformCheckWithNonStdThrow();
CHECK_EQUAL("testName", reporter.lastFailedTest);
CHECK_EQUAL("suiteName", reporter.lastFailedSuite);
CHECK_EQUAL("filename", reporter.lastFailedFile);
CHECK_EQUAL(line, reporter.lastFailedLine);
}
TEST_FIXTURE(CheckEqualFixture, CheckEqualFailureBecauseOfStdExceptionContainsCorrectDetails)
{
PerformCheckWithStdThrow();
CHECK_EQUAL("testName", reporter.lastFailedTest);
CHECK_EQUAL("suiteName", reporter.lastFailedSuite);
CHECK_EQUAL("filename", reporter.lastFailedFile);
CHECK_EQUAL(line, reporter.lastFailedLine);
}
TEST_FIXTURE(CheckEqualFixture, CheckEqualFailureBecauseOfExceptionIncludesCheckContents)
{
PerformCheckWithNonStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "ThrowingFunction()"));
CHECK(strstr(reporter.lastFailedMessage, "123"));
}
TEST_FIXTURE(CheckEqualFixture, CheckEqualFailureBecauseOfStdExceptionIncludesCheckContents)
{
PerformCheckWithStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "ThrowingStdExceptionFunction()"));
CHECK(strstr(reporter.lastFailedMessage, "123"));
}
TEST_FIXTURE(CheckEqualFixture, CheckEqualFailureBecauseOfStandardExceptionIncludesWhat)
{
PerformCheckWithStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "exception (Doh)"));
}
}
SUITE(CheckCloseExceptionTests)
{
struct CheckCloseFixture
{
CheckCloseFixture()
: reporter()
, testResults(&reporter)
, line(-1)
{}
void PerformCheckWithNonStdThrow()
{
UnitTest::TestDetails const testDetails("closeTest", "closeSuite", "filename", -1);
ScopedCurrentTest scopedResults(testResults, &testDetails);
CHECK_CLOSE(static_cast<float>(ThrowingFunction()), 1.0001f, 0.1f); line = __LINE__;
}
void PerformCheckWithStdThrow()
{
UnitTest::TestDetails const testDetails("closeTest", "closeSuite", "filename", -1);
ScopedCurrentTest scopedResults(testResults, &testDetails);
CHECK_CLOSE(static_cast<float>(ThrowingStdExceptionFunction()), 1.0001f, 0.1f); line = __LINE__;
}
RecordingReporter reporter;
UnitTest::TestResults testResults;
int line;
};
TEST_FIXTURE(CheckCloseFixture, CheckCloseFailsOnException)
{
PerformCheckWithNonStdThrow();
CHECK(testResults.GetFailureCount() > 0);
}
TEST_FIXTURE(CheckCloseFixture, CheckCloseFailsOnStdException)
{
PerformCheckWithStdThrow();
CHECK(testResults.GetFailureCount() > 0);
}
TEST_FIXTURE(CheckCloseFixture, CheckCloseFailureBecauseOfExceptionContainsCorrectDetails)
{
PerformCheckWithNonStdThrow();
CHECK_EQUAL("closeTest", reporter.lastFailedTest);
CHECK_EQUAL("closeSuite", reporter.lastFailedSuite);
CHECK_EQUAL("filename", reporter.lastFailedFile);
CHECK_EQUAL(line, reporter.lastFailedLine);
}
TEST_FIXTURE(CheckCloseFixture, CheckCloseFailureBecauseOfStdExceptionContainsCorrectDetails)
{
PerformCheckWithStdThrow();
CHECK_EQUAL("closeTest", reporter.lastFailedTest);
CHECK_EQUAL("closeSuite", reporter.lastFailedSuite);
CHECK_EQUAL("filename", reporter.lastFailedFile);
CHECK_EQUAL(line, reporter.lastFailedLine);
}
TEST_FIXTURE(CheckCloseFixture, CheckCloseFailureBecauseOfExceptionIncludesCheckContents)
{
PerformCheckWithNonStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "static_cast<float>(ThrowingFunction())"));
CHECK(strstr(reporter.lastFailedMessage, "1.0001f"));
}
TEST_FIXTURE(CheckCloseFixture, CheckCloseFailureBecauseOfStdExceptionIncludesCheckContents)
{
PerformCheckWithStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "static_cast<float>(ThrowingStdExceptionFunction())"));
CHECK(strstr(reporter.lastFailedMessage, "1.0001f"));
}
TEST_FIXTURE(CheckCloseFixture, CheckCloseFailureBecauseOfStandardExceptionIncludesWhat)
{
PerformCheckWithStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "exception (Doh)"));
}
}
class ThrowingObject
{
public:
float operator[](size_t) const
{
throw "Test throw";
}
};
class StdThrowingObject
{
public:
float operator[](size_t) const
{
throw std::runtime_error("Test throw");
}
};
SUITE(CheckArrayCloseExceptionTests)
{
struct CheckArrayCloseFixture
{
CheckArrayCloseFixture()
: reporter()
, testResults(&reporter)
, line(-1)
{}
void PerformCheckWithNonStdThrow()
{
UnitTest::TestDetails const testDetails("arrayCloseTest", "arrayCloseSuite", "filename", -1);
ScopedCurrentTest scopedResults(testResults, &testDetails);
int const data[4] = { 0, 1, 2, 3 };
CHECK_ARRAY_CLOSE(data, ThrowingObject(), 4, 0.01f); line = __LINE__;
}
void PerformCheckWithStdThrow()
{
UnitTest::TestDetails const testDetails("arrayCloseTest", "arrayCloseSuite", "filename", -1);
ScopedCurrentTest scopedResults(testResults, &testDetails);
int const data[4] = { 0, 1, 2, 3 };
CHECK_ARRAY_CLOSE(data, StdThrowingObject(), 4, 0.01f); line = __LINE__;
}
RecordingReporter reporter;
UnitTest::TestResults testResults;
int line;
};
TEST_FIXTURE(CheckArrayCloseFixture, CheckFailureBecauseOfExceptionContainsCorrectDetails)
{
PerformCheckWithNonStdThrow();
CHECK_EQUAL("arrayCloseTest", reporter.lastFailedTest);
CHECK_EQUAL("arrayCloseSuite", reporter.lastFailedSuite);
CHECK_EQUAL("filename", reporter.lastFailedFile);
CHECK_EQUAL(line, reporter.lastFailedLine);
}
TEST_FIXTURE(CheckArrayCloseFixture, CheckFailureBecauseOfStdExceptionContainsCorrectDetails)
{
PerformCheckWithStdThrow();
CHECK_EQUAL("arrayCloseTest", reporter.lastFailedTest);
CHECK_EQUAL("arrayCloseSuite", reporter.lastFailedSuite);
CHECK_EQUAL("filename", reporter.lastFailedFile);
CHECK_EQUAL(line, reporter.lastFailedLine);
}
TEST_FIXTURE(CheckArrayCloseFixture, CheckFailsOnException)
{
PerformCheckWithNonStdThrow();
CHECK(testResults.GetFailureCount() > 0);
}
TEST_FIXTURE(CheckArrayCloseFixture, CheckFailsOnStdException)
{
PerformCheckWithStdThrow();
CHECK(testResults.GetFailureCount() > 0);
}
TEST_FIXTURE(CheckArrayCloseFixture, CheckFailureOnExceptionIncludesCheckContents)
{
PerformCheckWithNonStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "data"));
CHECK(strstr(reporter.lastFailedMessage, "ThrowingObject()"));
}
TEST_FIXTURE(CheckArrayCloseFixture, CheckFailureOnStdExceptionIncludesCheckContents)
{
PerformCheckWithStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "data"));
CHECK(strstr(reporter.lastFailedMessage, "StdThrowingObject()"));
}
TEST_FIXTURE(CheckArrayCloseFixture, CheckFailureOnStdExceptionIncludesWhat)
{
PerformCheckWithStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "exception (Test throw)"));
}
}
SUITE(CheckArrayEqualExceptionTests)
{
struct CheckArrayEqualFixture
{
CheckArrayEqualFixture()
: reporter()
, testResults(&reporter)
, line(-1)
{}
void PerformCheckWithNonStdThrow()
{
UnitTest::TestDetails const testDetails("arrayEqualTest", "arrayEqualSuite", "filename", -1);
ScopedCurrentTest scopedResults(testResults, &testDetails);
int const data[4] = { 0, 1, 2, 3 };
CHECK_ARRAY_EQUAL(data, ThrowingObject(), 4); line = __LINE__;
}
void PerformCheckWithStdThrow()
{
UnitTest::TestDetails const testDetails("arrayEqualTest", "arrayEqualSuite", "filename", -1);
ScopedCurrentTest scopedResults(testResults, &testDetails);
int const data[4] = { 0, 1, 2, 3 };
CHECK_ARRAY_EQUAL(data, StdThrowingObject(), 4); line = __LINE__;
}
RecordingReporter reporter;
UnitTest::TestResults testResults;
int line;
};
TEST_FIXTURE(CheckArrayEqualFixture, CheckFailureBecauseOfExceptionContainsCorrectDetails)
{
PerformCheckWithNonStdThrow();
CHECK_EQUAL("arrayEqualTest", reporter.lastFailedTest);
CHECK_EQUAL("arrayEqualSuite", reporter.lastFailedSuite);
CHECK_EQUAL("filename", reporter.lastFailedFile);
CHECK_EQUAL(line, reporter.lastFailedLine);
}
TEST_FIXTURE(CheckArrayEqualFixture, CheckFailureBecauseOfStdExceptionContainsCorrectDetails)
{
PerformCheckWithStdThrow();
CHECK_EQUAL("arrayEqualTest", reporter.lastFailedTest);
CHECK_EQUAL("arrayEqualSuite", reporter.lastFailedSuite);
CHECK_EQUAL("filename", reporter.lastFailedFile);
CHECK_EQUAL(line, reporter.lastFailedLine);
}
TEST_FIXTURE(CheckArrayEqualFixture, CheckFailsOnException)
{
PerformCheckWithNonStdThrow();
CHECK(testResults.GetFailureCount() > 0);
}
TEST_FIXTURE(CheckArrayEqualFixture, CheckFailsOnStdException)
{
PerformCheckWithStdThrow();
CHECK(testResults.GetFailureCount() > 0);
}
TEST_FIXTURE(CheckArrayEqualFixture, CheckFailureOnExceptionIncludesCheckContents)
{
PerformCheckWithNonStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "data"));
CHECK(strstr(reporter.lastFailedMessage, "ThrowingObject()"));
}
TEST_FIXTURE(CheckArrayEqualFixture, CheckFailureOnStdExceptionIncludesCheckContents)
{
PerformCheckWithStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "data"));
CHECK(strstr(reporter.lastFailedMessage, "StdThrowingObject()"));
}
TEST_FIXTURE(CheckArrayEqualFixture, CheckFailureOnStdExceptionIncludesWhat)
{
PerformCheckWithStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "exception (Test throw)"));
}
}
SUITE(CheckArray2DExceptionTests)
{
class ThrowingObject2D
{
public:
float* operator[](size_t) const
{
throw "Test throw";
}
};
class StdThrowingObject2D
{
public:
float* operator[](size_t) const
{
throw std::runtime_error("Test throw");
}
};
struct CheckArray2DCloseFixture
{
CheckArray2DCloseFixture()
: reporter()
, testResults(&reporter)
, line(-1)
{}
void PerformCheckWithNonStdThrow()
{
UnitTest::TestDetails const testDetails("array2DCloseTest", "array2DCloseSuite", "filename", -1);
ScopedCurrentTest scopedResults(testResults, &testDetails);
const float data[2][2] = { {0, 1}, {2, 3} };
CHECK_ARRAY2D_CLOSE(data, ThrowingObject2D(), 2, 2, 0.01f); line = __LINE__;
}
void PerformCheckWithStdThrow()
{
UnitTest::TestDetails const testDetails("array2DCloseTest", "array2DCloseSuite", "filename", -1);
ScopedCurrentTest scopedResults(testResults, &testDetails);
const float data[2][2] = { {0, 1}, {2, 3} };
CHECK_ARRAY2D_CLOSE(data, StdThrowingObject2D(), 2, 2, 0.01f); line = __LINE__;
}
RecordingReporter reporter;
UnitTest::TestResults testResults;
int line;
};
TEST_FIXTURE(CheckArray2DCloseFixture, CheckFailureBecauseOfExceptionContainsCorrectDetails)
{
PerformCheckWithNonStdThrow();
CHECK_EQUAL("array2DCloseTest", reporter.lastFailedTest);
CHECK_EQUAL("array2DCloseSuite", reporter.lastFailedSuite);
CHECK_EQUAL("filename", reporter.lastFailedFile);
CHECK_EQUAL(line, reporter.lastFailedLine);
}
TEST_FIXTURE(CheckArray2DCloseFixture, CheckFailureBecauseOfStdExceptionContainsCorrectDetails)
{
PerformCheckWithStdThrow();
CHECK_EQUAL("array2DCloseTest", reporter.lastFailedTest);
CHECK_EQUAL("array2DCloseSuite", reporter.lastFailedSuite);
CHECK_EQUAL("filename", reporter.lastFailedFile);
CHECK_EQUAL(line, reporter.lastFailedLine);
}
TEST_FIXTURE(CheckArray2DCloseFixture, CheckFailsOnException)
{
PerformCheckWithNonStdThrow();
CHECK(testResults.GetFailureCount() > 0);
}
TEST_FIXTURE(CheckArray2DCloseFixture, CheckFailsOnStdException)
{
PerformCheckWithStdThrow();
CHECK(testResults.GetFailureCount() > 0);
}
TEST_FIXTURE(CheckArray2DCloseFixture, CheckFailureOnExceptionIncludesCheckContents)
{
PerformCheckWithNonStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "data"));
CHECK(strstr(reporter.lastFailedMessage, "ThrowingObject2D()"));
}
TEST_FIXTURE(CheckArray2DCloseFixture, CheckFailureOnStdExceptionIncludesCheckContents)
{
PerformCheckWithStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "data"));
CHECK(strstr(reporter.lastFailedMessage, "StdThrowingObject2D()"));
}
TEST_FIXTURE(CheckArray2DCloseFixture, CheckFailureOnStdExceptionIncludesWhat)
{
PerformCheckWithStdThrow();
CHECK(strstr(reporter.lastFailedMessage, "exception (Test throw)"));
}
}
}
#endif