--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/testexecfw/tef/tefunit/src/crunner.cpp Mon Mar 08 15:03:44 2010 +0800
@@ -0,0 +1,240 @@
+/*
+* Copyright (c) 2005-2009 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:
+*
+*/
+
+
+
+/**
+ @file CRunner.cpp
+*/
+
+
+#include "CTEFLogger.h"
+#include "CRunner.h"
+
+_LIT( KWildCard, "*");
+
+CRunner::CRunner( const CTestConfig& aConfig, const CTestExecuteLogger& aLogger)
+/**
+ * Constructor
+ *
+ * @param aConfig - Instance of the test config
+ * @param aLogger - Instance of the logger
+ */
+ : iConfig(aConfig), iLogger(aLogger)
+ {
+ }
+
+CRunner::~CRunner()
+/**
+ * Destructor
+ */
+ {
+ }
+
+void CRunner::ConstructL( const TTestPath& aPath )
+/**
+ * ConstructL
+ *
+ * @param aPath - The path of the test case to be executed
+ */
+ {
+ iPath.ConstructL( aPath );
+ }
+
+/*
+ * NewL
+ * Return an instance of CRunner
+ */
+CRunner* CRunner::NewL( const TTestPath &aPath, const CTestConfig& aConfig, const CTestExecuteLogger& aLogger )
+/**
+ * NewL
+ *
+ * @param aPath - The path of the test case to be executed
+ * @param aConfig - Instance of the test config
+ * @param aLogger - Instance of the logger
+ * @return - Instance of CRunner
+ */
+ {
+ CRunner* lRunner = new (ELeave) CRunner(aConfig, aLogger);
+ CleanupStack::PushL(lRunner);
+ lRunner->ConstructL(aPath);
+ CleanupStack::Pop();
+ return lRunner;
+ }
+
+void CRunner::VisitL(CTestCase* aTestCase)
+/**
+ * VisitL
+ *
+ * @param aTestCase - The test case to visit
+ */
+ {
+ aTestCase->RunL(iConfig, iLogger);
+ }
+
+void CRunner::VisitL(CTestSuite* aTestSuite)
+/**
+ * VisitL
+ *
+ * @param aTestSuite - The test suite to visit
+ */
+ {
+ // Get the next field from the path and search for it
+ if( iPath.Remaining() )
+ {
+ TTestName testSuite = iPath.NextL();
+ if( testSuite == KWildCard )
+ {
+ // Run all the tests in the suite and sub suites
+ aTestSuite->RunL( iConfig, iLogger );
+ }
+ else
+ {
+ TInt lIndex = 0;
+ while( (lIndex < aTestSuite->Count()) &&
+ (aTestSuite->NameL(lIndex)!=iPath.Current()) )
+ {
+ lIndex++;
+ }
+ if( (lIndex < aTestSuite->Count()) &&
+ (aTestSuite->NameL(lIndex)==iPath.Current()) )
+ {
+ // Log that the runner is currently in this suite
+ CTEFLogger::LogTraverse( aTestSuite->Name(), iLogger );
+ aTestSuite->TestL( lIndex )->AcceptL( *this );
+ }
+ else
+ {
+ User::Leave(KErrTEFUnitTestSuiteError);
+ }
+ }
+ }
+ else
+ {
+ // Run all the tests in the suite and sub suites
+ aTestSuite->RunL( iConfig, iLogger );
+ }
+ }
+
+CPath::CPath()
+/**
+ * Constructor
+ */
+ : iCurrent(0)
+ {
+ }
+
+void CPath::ConstructL( const TDes& aPath )
+/**
+ * ConstructL
+ *
+ * @param aPath - The path to be parsed
+ */
+ {
+ // Prepend a NULL field for the top level suite
+ User::LeaveIfError( iFields.Append(_L("NULL")) );
+ HBufC* ptrPath = HBufC::NewLC(KMaxPathSize);
+ TPtr ptr(ptrPath->Des());
+ ptr.Copy(aPath);
+ // Populate the path fields array
+ TInt offset = ptr.Locate( '.' );
+ while( offset != KErrNotFound )
+ {
+ TTestName field;
+ field.Append( ptr.Ptr(), offset );
+ User::LeaveIfError( iFields.Append(field) );
+ ptr.Delete( 0, offset+1 );
+ offset = ptr.Locate( '.' );
+ }
+ // There will be one more field
+ TTestName field;
+ field.Append( ptrPath->Ptr(), ptrPath->Size()/2 );
+ CleanupStack::PopAndDestroy(ptrPath);
+ User::LeaveIfError( iFields.Append(field) );
+ }
+
+/*
+ * NewL
+ * Return an instance of CPath
+ */
+CPath* CPath::NewL( TDes& aPath )
+/**
+ * NewL
+ *
+ * @param aPath - The path to be parsed
+ * @return - Instance of CPath
+ */
+ {
+ CPath* lPath = new (ELeave) CPath();
+ CleanupStack::PushL(lPath);
+ lPath->ConstructL(aPath);
+ CleanupStack::Pop();
+ return lPath;
+ }
+
+CPath::~CPath()
+/**
+ * Destructor
+ */
+ {
+ iFields.Close();
+ }
+
+TTestName CPath::Current() const
+/**
+ * Current
+ *
+ * @return - The current field within the path
+ */
+ {
+ return iFields[iCurrent];
+ }
+
+TTestName CPath::NextL()
+/**
+ * NextL
+ *
+ * @return - The next field in the path
+ */
+ {
+ if( iCurrent>(iFields.Count()-2) )
+ {
+ User::Leave(KErrTEFUnitFail);
+ }
+
+ return iFields[++iCurrent];
+ }
+
+TInt CPath::Count() const
+/**
+ * Count
+ *
+ * @return - The number of fields in the path
+ */
+ {
+ return iFields.Count();
+ }
+
+TInt CPath::Remaining() const
+/**
+ * Remaining
+ *
+ * @return - The number of remaining fields from the current location in the path
+ */
+ {
+ return (iFields.Count()-1)-iCurrent;
+ }