/*
* Copyright (c) 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: This file contains the header file of the CTestReport.
*
*/

#ifndef TEST_REPORT_H
#define TEST_REPORT_H

//  INCLUDES
#include <e32std.h>
#include <e32base.h>
#include "TestEngineClient.h"
#include "TestEngine.h"

// CONSTANTS
// Maximum length for date or time definitions 'Thursday 06th November 2003'
const TInt KMaxDateAndTimeStamp = 30;

// MACROS
// None

// DATA TYPES
// None

// FUNCTION PROTOTYPES
// None

// FORWARD DECLARATIONS
class CStifLogger;

// CLASS DECLARATION
// None

// DESCRIPTION
// CTestReport is a class that can generate different test reports.
class CTestReport
        : public CBase
    {
    public:     // Enumerations

        // TTestReportMode defines the mode of test report
        enum TTestReportMode
            {
            ETestReportBlank = 0x00000000,
            ETestReportSummary = 0x00000001,
            ETestReportEnvironment = 0x00000002,
            ETestReportCases = 0x00000004,
            ETestReportFull = ETestReportSummary | ETestReportEnvironment | ETestReportCases
            };

        // TTestReportOutput defines the type of test report output
        enum TTestReportOutput
            {
            ETestReportNone = 0x00000000,
            ETestReportDebug = 0x00000001,
            ETestReportPlainText = 0x00000002,
            ETestReportHtml = 0x00000004,
            ETestReportAll = ETestReportDebug | ETestReportPlainText | ETestReportHtml
            };

    public:     // Structured classes

        /**
        *  TTestReportHeader includes header information for test report.
        *
        */
        struct THwInfo
            {
            TInt iManufacturer;
            TInt iMachineUid;
            TInt iModel;
            TInt iHwRev;
            TInt iCpu;
            TInt iCpuSpeed;
            TInt iLanguage;
            };

        struct TSwInfo
            {
            TInt iSwRev;
            TInt iSwBuild;
            };

        struct TMemoryInfo
            {
            TInt iRAM;
            TInt iRAMFree;
            };

        class TTestHWInfo
            {
            public: // New functions
                TTestHWInfo();

            public: // Data
                // HW Info
                THwInfo         iHwInfo;
                // SW Info
                TSwInfo         iSwInfo;
                // Memory Info
                TMemoryInfo     iMemoryInfo;
            };

        /**
        *  TTestCaseSummary includes information for summary of test cases.
        */
        class TTestCaseSummary
            {
            public:     // New functions
                TTestCaseSummary();

            public:     // Data
                // Test Info
                TTestInfo           iTestInfo;
                // Test Result
                TFullTestResult     iFullTestResult;
            };

        /**
        *  TTestSummary includes information for test report summary.
        */
        class TTestSummary
            {
            public:     // New functions
                TTestSummary( const TName& aName );

            public:     // Data
                // Name (e.g. test module name )
                const TName     iName;
                // Count of passed test cases
                TInt            iPassedCases;
                // Count of failed test cases
                TInt            iFailedCases;
                // Count of crashed cases
                TInt            iCrashedCases;
                // Count of timed out cases
                TInt            iTimeoutCases;
            };

    private:    // Enumerations

    public:     // Constructors and destructor
        
        /**
        * Two-phased constructor.
        */
        static CTestReport* NewL( TTestReportSettings& aTestReportSettings,
                                  const TTestReportMode aReportMode );
        
        /**
        * Destructor.
        */
        ~CTestReport();
        
    public:     // New functions
        
        /**
        * Add test case result.
        */
        void AddTestCaseResultL( const TTestInfo& aTestInfo,
                                 const TFullTestResult& aTestResult,
                                 const TInt aError );

        /**
        * Generate result reports.
        */
        void GenerateReportL();
        
        /**
        * Update result reports.
        */
        void UpdateReportSummaryL();
        
        /**
         * Adds version of test module to RPointerArray
         */
        void AddTestModuleVersion(TTestModuleVersionInfo& aVersion);

    public:     // Functions from base classes
        
    protected:  // New functions

    protected:  // Functions from base classes

    private:

        /**
        * By default Symbian OS constructor is private.
        */
        void ConstructL(  TTestReportSettings& aTestReportSettings );

        /**
        * Default C++ constructor.
        */
        CTestReport( const TTestReportMode aReportMode );
        
        /**
        * Write result file header.
        */
        void WriteHeaderL();
        
        /**
        * Write result file trailer.
        */
        void WriteTrailerL();
        
        /**
        * Write data to file.
        */
        void WriteLineL( TRefByValue<const TDesC> aStr,... );
        
        /**
        * Write delimiter line.
        */
        void WriteDelimiterL( const TDesC& aDelimiter, TInt aCount );
        
        /**
        * Adds needed tags to get valid xml file.
        */
        void CloseXMLTagsInUnfinishedFileL(void);

    public:     // Data
    
    protected:  // Data

    private:    // Data

        // Report file handles
        RFs                             iFs;
        RFile                           iFile;
        CStifLogger::TLoggerType        iFormat;
        CStifLogger::TOutput            iOutput;
    
        // Report Mode
        TTestReportMode                 iReportMode;

        // Report HW info
        TTestHWInfo                     iReportHWInfo;

        // Total summary
        TTestSummary*                   iTotalSummary;

        // Test summary array
        RPointerArray<TTestSummary>     iTestSummaries;
        
        // Summary start position
        TInt                            iSummaryPos;
        
        // Versions of test modules position
        TInt							iModulesVersionsPos;
        
        // Test modules versions
        RPointerArray<TTestModuleVersionInfo> iTestModulesVersionsInfo;

        // Will report be written in xml format 
        TBool                           iXML;

    public:     // Friend classes

    protected:  // Friend classes

    private:    // Friend classes

    };

#endif // TEST_REPORT_H

// End of File
