uifw/AvKon/tsrc/bc/bctestutil/src/bctestsuite.cpp
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/tsrc/bc/bctestutil/src/bctestsuite.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,327 @@
+/*
+* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Test suite.
+*
+*/
+
+
+#include <eikenv.h>
+#include <coeaui.h>
+#include <eikappui.h>
+#include <eikapp.h>
+
+#include "bctestlogger.h"
+#include "bctestsuite.h"
+#include "bctestcase.h"
+#include "bctestendcase.h"
+
+_LIT( KLeaveLog, "\r\n\r\nTest case %s leaved. Leave reason is %d." );
+_LIT( KNoCommandsInCase, 
+                "No automatic test commands defined in test case %s!\r\n" );
+_LIT( KUnbalancedIf, 
+                "Unbalanced ifs/endifs in test case %s!\r\n\r\n" );
+_LIT( KCaseStartLog, ", case %d start " );
+_LIT( KCaseEndLog, ", case %d end " );
+_LIT( KUnnamedCase, "Unnamed case" );
+_LIT( KStartInfo, 
+    " Total %d cases will be tested in the application. \r\n\r\n\r\n" );
+_LIT( KCompletedTest, "%s completed testing work." );
+_LIT( KSummary, "\r\nSummary:\r\nTotal %d cases were tested.\r\nThere are \
+%d cases including failed tests.\r\nTotal %d asserted tests and %d \
+failed tests.\r\n" );
+_LIT( KSummaryFailLog, "Those cases including failed tests are " );
+_LIT( KSummaryComma, ", " );
+_LIT( KSummaryDot, ". " );
+_LIT( KSummaryFailFormat, "case %d");    
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// C++ default Constructor
+// ---------------------------------------------------------------------------
+//
+CBCTestSuite::CBCTestSuite( CBCTestLogger* aLogger )
+    : iLogger( aLogger )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CBCTestSuite::~CBCTestSuite()
+    {
+    for ( TInt i=0; i<iTestCases.Count(); i++ )
+        {
+        delete iTestCases[i];
+        }
+    iTestCases.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// CBCTestSuite::RunL
+// Pass an command to test case for executing some test work.
+// ---------------------------------------------------------------------------
+//
+void CBCTestSuite::RunL(int aCmd)
+    {
+    for ( TInt i=0; i<iTestCases.Count(); i++ )
+        {
+        TRAPD( errno, iTestCases[i]->RunL(aCmd) );
+        if ( errno != KErrNone )
+            {            
+            TDes& buf = iLogger->Buffer();
+            buf.AppendFormat( 
+                TPtrC( KLeaveLog ), iTestCases[i]->Name().Ptr(), errno );            
+            iLogger->CreateTimeStamp( buf );            
+            buf.Append( KLogLine );
+            iLogger->WriteLogL( buf );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CBCTestSuite::AddTestCaseL
+// Add a test case pointer and name of the test case.
+// ---------------------------------------------------------------------------
+//
+void CBCTestSuite::AddTestCaseL( CBCTestCase* aTestCase, const TDesC& aName )
+    {
+    aTestCase->SetLogger( iLogger );
+    aTestCase->SetName( aName );
+    iTestCases.AppendL( aTestCase );
+    }
+
+// ---------------------------------------------------------------------------
+// CBCTestSuite::AddTestCaseL
+// Build parameter of automatic test.
+// ---------------------------------------------------------------------------
+//
+void CBCTestSuite::BuildScriptsL( SAutoTest* aAutoTest )
+    {  
+    if ( !aAutoTest )
+        {
+        return;
+        }
+    TInt type = iTestCases[iTestCases.Count() - 1]->Type();    
+    if ( type != CBCTestCase::EEndCase )
+        {
+        CBCTestEndCase* endCase = CBCTestEndCase::NewL();        
+        CleanupStack::PushL( endCase );
+        endCase->SetType( CBCTestCase::EEndCase );
+        AddTestCaseL( endCase, KNullDesC );
+        CleanupStack::Pop( endCase );
+        }
+    delete [] aAutoTest->countArray;
+    aAutoTest->countArray = NULL;
+    delete [] aAutoTest->scripts;
+    aAutoTest->scripts = NULL;
+    
+    aAutoTest->scriptCount = iTestCases.Count();
+    aAutoTest->countArray = new( ELeave ) TInt[aAutoTest->scriptCount];    
+    aAutoTest->scripts = new( ELeave ) TInt*[aAutoTest->scriptCount];
+    
+    for ( TInt i=0; i< aAutoTest->scriptCount; i++ )
+        {        
+        aAutoTest->countArray[i] = iTestCases[i]->ScriptCount();
+        aAutoTest->scripts[i] = iTestCases[i]->TestScripts();
+        aAutoTest->nameArray.Append( iTestCases[i]->Name() );        
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CBCTestSuite::HandleTestEvent
+// -----------------------------------------------------------------------------
+//
+void CBCTestSuite::HandleTestEventL( TBCTestEvent aEvent, TInt aParam )
+    {
+    TInt scriptIndex = aParam;
+    if ( scriptIndex < 0 || scriptIndex >= iTestCases.Count() )
+        {
+        return;
+        }
+    switch ( aEvent )
+        {
+        case ETestCaseStart:
+            {
+            iTestCases[scriptIndex]->ClearTestSummary();
+            if ( scriptIndex == 0)
+                {
+                WriteStartLogL();
+                }
+            WriteTestCaseLogL( scriptIndex, ETrue );            
+            }
+            break;
+        case ETestCaseEnd:
+            {
+            WriteTestCaseLogL( scriptIndex, EFalse );
+            // The end case is not considered by user. So the test case 
+            // before end case is actually the fianl case.
+            TInt actualCaseCount = iTestCases.Count() - 1;            
+            // The last index is actualCaseCount - 1
+            if ( scriptIndex == actualCaseCount - 1 )
+                {                
+                WriteSummaryLogL();
+                }            
+            }
+            break;
+        case ETestCaseNoScript:
+            {            
+            TDes& buf = iLogger->Buffer();
+            buf.Zero();
+            buf.AppendFormat( TPtrC( KNoCommandsInCase ), 
+                iTestCases[scriptIndex]->Name().Ptr() );
+            iLogger->WriteLogL( buf );
+            }
+            break;
+        case ETestCaseUnbalancedIf:
+            {            
+            TDes& buf = iLogger->Buffer();
+            buf.Zero();            
+            buf.AppendFormat( TPtrC( KUnbalancedIf ),
+                iTestCases[scriptIndex]->Name().Ptr() );            
+            iLogger->WriteLogL( buf );
+            }
+            break;
+        default:
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CBCTestSuite::WriteTestCaseLogL
+// Creates test case log start (and end) separator.
+// -----------------------------------------------------------------------------
+//
+void CBCTestSuite::WriteTestCaseLogL( TInt aScriptIndex, TBool aStart )
+    {   
+    if ( !iLogger )
+        {
+        return;
+        }       
+    
+    TDes& buf = iLogger->Buffer();
+    buf.Zero(); // reset buffer    
+    TInt type = iTestCases[aScriptIndex]->Type();
+    if ( type == CBCTestCase::EEndCase )
+        {        
+        buf.Append( KLogTwoLine );
+        iLogger->WriteLogL( buf );
+        return;
+        }
+    TDesC& name = iTestCases[aScriptIndex]->Name();
+    buf.Append( KLogRow80 ); // first separator row
+    if ( name.Length() > 0 )
+        {
+        buf.Append( name );
+        }
+    else
+        {        
+        buf.Append( KUnnamedCase );
+        }
+        
+    if ( aStart )
+        {
+        buf.AppendFormat( TPtrC( KCaseStartLog ), aScriptIndex + 1 );
+        }
+    else
+        {
+        buf.AppendFormat( TPtrC( KCaseEndLog ), aScriptIndex + 1 );
+        }
+    iLogger->CreateTimeStamp( buf );
+    buf.Append( KLogRow80 );    
+    if ( !aStart ) // insert some empty lines
+        {
+        buf.Append( KLogTwoLine );
+        }
+    iLogger->WriteLogL( buf );
+    }
+
+// -----------------------------------------------------------------------------
+// CBCTestSuite::WriteStartLogL
+// -----------------------------------------------------------------------------
+//
+void CBCTestSuite::WriteStartLogL()
+    {
+    if ( !iLogger )
+        {
+        return;
+        }    
+    
+    TDes& buf = iLogger->Buffer();
+    buf.Zero();    
+    buf.AppendFormat( TPtrC( KStartInfo ), iTestCases.Count() - 1 );    
+    iLogger->WriteLogL( buf );
+    }
+    
+// -----------------------------------------------------------------------------
+// CBCTestSuite::WriteSummaryLogL
+// -----------------------------------------------------------------------------
+//
+void CBCTestSuite::WriteSummaryLogL()
+    {
+    TDes& buf = iLogger->Buffer();
+    
+    // write main log    
+    buf.Zero();
+    const TDesC& appCaption = iLogger->AppCaption();      
+    buf.AppendFormat( KCompletedTest, appCaption.Ptr() );        
+    iLogger->CreateTimeStamp( buf );
+    iLogger->WriteMainLogL( buf );
+    
+    // write summary log    
+    TInt testCount = 0;
+    TInt failCases = 0;
+    TInt failCount = 0;    
+    TInt* failedInfo = new( ELeave ) TInt[iTestCases.Count()];
+    CleanupStack::PushL( failedInfo );
+    for( TInt i=0; i<iTestCases.Count(); i++ )
+        {
+        TInt count = 0;
+        iTestCases[i]->GetTestSummary( count, failedInfo[i] );
+        testCount += count;
+        if ( failedInfo[i] > 0)
+            {
+            failCases++;
+            failCount += failedInfo[i];
+            }
+        }
+    
+    buf.Zero();      
+    buf.AppendFormat( TPtrC( KSummary ), iTestCases.Count() - 1, failCases, 
+        testCount, failCount );
+    
+    if ( failCases > 0 )
+        {        
+        buf.Append( KSummaryFailLog );
+        TInt failRecord = 0;    
+        for( TInt i=0; i<iTestCases.Count(); i++ )
+            {        
+            if ( failedInfo[i] > 0)
+                {
+                if ( failRecord > 0)
+                    {
+                    buf.Append( KSummaryComma );
+                    }
+                buf.AppendFormat( TPtrC( KSummaryFailFormat ), i + 1 );
+                failRecord++;            
+                }
+            }
+        buf.Append( KSummaryDot );
+        buf.Append( KLogTwoLine );
+        }
+    CleanupStack::PopAndDestroy( failedInfo );
+    iLogger->WriteLogL( buf );
+    iLogger->WriteMainLogL( buf );    
+    }