#include "UnitTest++/UnitTestPP.h"
 
#include "UnitTest++/TestReporter.h"
 
#include "UnitTest++/TimeHelpers.h"
 
#include "ScopedCurrentTest.h"
 
 
 
using namespace UnitTest;
 
 
 
namespace {
 
 
 
   TEST(PassingTestHasNoFailures)
 
   {
 
      class PassingTest : public Test
 
      {
 
      public:
 
         PassingTest() : Test("passing") {}
 
         virtual void RunImpl() const
 
         {
 
            CHECK(true);
 
         }
 
      };
 
 
 
      TestResults results;
 
      {
 
         ScopedCurrentTest scopedResults(results);
 
         PassingTest().Run();
 
      }
 
 
 
      CHECK_EQUAL(0, results.GetFailureCount());
 
   }
 
 
 
 
 
   TEST(FailingTestHasFailures)
 
   {
 
      class FailingTest : public Test
 
      {
 
      public:
 
         FailingTest() : Test("failing") {}
 
         virtual void RunImpl() const
 
         {
 
            CHECK(false);
 
         }
 
      };
 
 
 
      TestResults results;
 
      {
 
         ScopedCurrentTest scopedResults(results);
 
         FailingTest().Run();
 
      }
 
 
 
      CHECK_EQUAL(1, results.GetFailureCount());
 
   }
 
 
 
#ifndef UNITTEST_NO_EXCEPTIONS
 
   TEST(ThrowingTestsAreReportedAsFailures)
 
   {
 
      class CrashingTest : public Test
 
      {
 
      public:
 
         CrashingTest() : Test("throwing") {}
 
         virtual void RunImpl() const
 
         {
 
            throw "Blah";
 
         }
 
      };
 
 
 
      TestResults results;
 
      {
 
         ScopedCurrentTest scopedResult(results);
 
         CrashingTest().Run();
 
      }
 
 
 
      CHECK_EQUAL(1, results.GetFailureCount());
 
   }
 
 
 
#if !defined(UNITTEST_MINGW) && !defined(UNITTEST_WIN32) && !defined(__clang__)
 
// Skip this test in debug because some debuggers don't like it.
 
#if defined(NDEBUG)
 
   TEST(CrashingTestsAreReportedAsFailures)
 
   {
 
      class CrashingTest : public Test
 
      {
 
      public:
 
         CrashingTest() : Test("crashing") {}
 
         virtual void RunImpl() const
 
         {
 
 
 
            reinterpret_cast< void (*)() >(0)();
 
         }
 
      };
 
 
 
      TestResults results;
 
      {
 
         ScopedCurrentTest scopedResult(results);
 
         CrashingTest().Run();
 
      }
 
 
 
      CHECK_EQUAL(1, results.GetFailureCount());
 
   }
 
#endif
 
#endif
 
#endif
 
 
 
   TEST(TestWithUnspecifiedSuiteGetsDefaultSuite)
 
   {
 
      Test test("test");
 
      CHECK(test.m_details.suiteName != NULL);
 
      CHECK_EQUAL("DefaultSuite", test.m_details.suiteName);
 
   }
 
 
 
   TEST(TestReflectsSpecifiedSuiteName)
 
   {
 
      Test test("test", "testSuite");
 
      CHECK(test.m_details.suiteName != NULL);
 
      CHECK_EQUAL("testSuite", test.m_details.suiteName);
 
   }
 
 
 
   void Fail()
 
   {
 
      CHECK(false);
 
   }
 
 
 
   TEST(OutOfCoreCHECKMacrosCanFailTests)
 
   {
 
      TestResults results;
 
      {
 
         ScopedCurrentTest scopedResult(results);
 
         Fail();
 
      }
 
 
 
      CHECK_EQUAL(1, results.GetFailureCount());
 
   }
 
 
 
}