#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