// RunTests //------------------------------------------------------------------------------ bool UnitTestManager::RunTests( const char * testGroup ) { // check for compile time filter UnitTest * test = s_FirstTest; while ( test ) { if ( testGroup != nullptr ) { // is this test the one we want? if ( AString::StrNCmp( test->GetName(), testGroup, strlen( testGroup ) ) != 0 ) { // no -skip it test = test->m_NextTestGroup; continue; } } OUTPUT( "------------------------------\n" ); OUTPUT( "Test Group: %s\n", test->GetName() ); try { test->RunTests(); } catch (...) { OUTPUT( " - Test '%s' *** FAILED ***\n", s_TestInfos[ s_NumTests - 1 ].m_TestName ); } test = test->m_NextTestGroup; } OUTPUT( "------------------------------------------------------------\n" ); OUTPUT( "Summary For All Tests\n" ); uint32_t numPassed = 0; UnitTest * lastGroup = nullptr; for ( size_t i=0; i<s_NumTests; ++i ) { const TestInfo& info = s_TestInfos[ i ]; if ( info.m_TestGroup != lastGroup ) { OUTPUT( "------------------------------------------------------------\n" ); OUTPUT( " : : %s\n", info.m_TestGroup->GetName() ); lastGroup = info.m_TestGroup; } const char * status = "OK"; if ( info.m_Passed ) { ++numPassed; } else { status = ( info.m_MemoryLeaks ) ? "FAILED (LEAKS)" : "FAILED"; } OUTPUT( "%15s : %5.1fs : %30s\n", status, info.m_TimeTaken, info.m_TestName ); } OUTPUT( "------------------------------------------------------------\n" ); OUTPUT( " - Passed: %u / %u (%u failures)\n", numPassed, s_NumTests, ( s_NumTests - numPassed ) ); OUTPUT( "------------------------------------------------------------\n" ); return ( s_NumTests == numPassed ); }