#ifndef UNITTEST_EXECUTE_TEST_H
#define UNITTEST_EXECUTE_TEST_H

#include "TestDetails.h"
#include "MemoryOutStream.h"
#include "AssertException.h"
#include "CurrentTest.h"

#ifdef UNITTEST_POSIX
    #include "Posix/SignalTranslator.h"
#endif

namespace UnitTest {

template< typename T >
void ExecuteTest(T& testObject, TestDetails const& details)
{
    CurrentTest::Details() = &details;

    try
    {
#ifdef UNITTEST_POSIX
        UNITTEST_THROW_SIGNALS
#endif
        testObject.RunImpl();
    }
    catch (AssertException const& e)
    {
        CurrentTest::Results()->OnTestFailure(
            TestDetails(details.testName, details.suiteName, e.Filename(), e.LineNumber()), e.what());
    }
    catch (std::exception const& e)
    {
        MemoryOutStream stream;
        stream << "Unhandled exception: " << e.what();
        CurrentTest::Results()->OnTestFailure(details, stream.GetText());
    }
    catch (...)
    {
        CurrentTest::Results()->OnTestFailure(details, "Unhandled exception: Crash!");
    }
}

}

#endif

