gecko-dev/cmd/winfe/TestCaseManager.cpp

306 строки
5.8 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
// TestCaseManager.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
//#include "TestCaseManager.h"
#include "testcase.h"
#include "qa.h"
#include <stdlib.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// To be used by Par's code
CTestCase QA_TestCase;
IMPLEMENT_SERIAL(CTCData, CObject, 0)
IMPLEMENT_SERIAL(CTestCaseManager, CObject, 0)
CTCData::CTCData()
{
m_strName = "";
m_strDesc = "";
m_nID = 0;
}
void CTCData::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << m_strName;
ar << m_strDesc;
ar << (WORD)m_nID;
}
else
{
ar >> m_strName;
ar >> m_strDesc;
ar >> (WORD&)m_nID;
}
}
CTestCaseManager::CTestCaseManager()
{
m_iNumTestCases = 0;
m_iNumTestCasesToRun = 0;
m_sDataFile = CString("");
m_sDataPath = CString("");
m_sLogFile = CString("");
}
CTestCaseManager::~CTestCaseManager()
{
DeleteData();
}
void CTestCaseManager::Serialize(CArchive& ar)
{
CTCData* pTestCase;
int nI;
CObject::Serialize(ar);
if ( ar.IsStoring() )
{
ar << (WORD)m_TCData.GetSize();
for (nI = 0;nI < m_TCData.GetSize();nI++)
{
pTestCase = (CTCData*)m_TCData[nI];
ar << pTestCase;
}
}
else
{
WORD wSize;
ar >> wSize;
m_TCData.SetSize(wSize);
for (nI = 0;nI < m_TCData.GetSize();nI++)
{
ar >> pTestCase;
m_TCData.SetAt(nI,pTestCase);
}
}
}
void CTestCaseManager::AddTestCase(CTCData* pTestCase)
{
CTCData *pTCData;
int nI;
// put it in its place (acsending sorted order)
for (nI = 0;nI < m_TCData.GetSize();nI++)
{
pTCData = (CTCData*)m_TCData[nI];
if (pTCData->m_strName.Compare(pTestCase->m_strName) > 0)
break;
}
m_TCData.InsertAt(nI,pTestCase);
}
void CTestCaseManager::InitRun()
{
CFile fFile;
m_iNumPassed = 0;
m_iNumFailed = 0;
m_sLogFile = (CString)(m_sDataPath + "results.all");
// Delete the .all file
if (FileExists(m_sLogFile))
fFile.Remove(m_sLogFile);
fFile.Open(m_sLogFile,CFile::modeCreate | CFile::shareDenyNone);
fFile.Close();
}
// appends [str] to the Log File
void CTestCaseManager::PrintToFile(CString& str)
{
CStdioFile fFile;
if (fFile.Open(m_sLogFile,CFile::modeWrite | CFile::shareDenyNone))
{ // write to Testcase Log File
fFile.Seek(0, CFile::end);
fFile.WriteString(str + "\n");
fFile.Flush();
fFile.Close();
}
}
void CTestCaseManager::RemoveTestCases(LPINT m_TestCasesToRemove, int nNum)
{
CTCData* pTCData;
for (int nI = nNum-1 ; nI >= 0 ; nI--)
{
pTCData = (CTCData*)m_TCData[m_TestCasesToRemove[nI]];
delete pTCData;
m_TCData.RemoveAt(m_TestCasesToRemove[nI]);
}
}
void CTestCaseManager::DeleteData()
{
CTCData* pTCData;
int nI;
for (nI = 0;nI < m_TCData.GetSize();nI++)
{
pTCData = (CTCData*)m_TCData[nI];
delete pTCData;
}
m_TCData.RemoveAll();
}
void CTestCaseManager::SaveData()
{
CFile file;
if ( m_sDataFile == "" )
{
CFileDialog dlg(FALSE, NULL, NULL, NULL, "Testcase Data Files (*.dat)|*.dat|All Files (*.*)|*.*||");
if ( dlg.DoModal() == IDOK )
{
m_sDataFile = dlg.GetPathName();
if ( !FileExists(m_sDataFile) )
return;
}
}
if ( file.Open(m_sDataFile,CFile::modeCreate | CFile::modeWrite | CFile::shareDenyNone) )
{
CArchive saveArchive(&file, CArchive::store | CArchive::bNoFlushOnDelete);
Serialize(saveArchive);
saveArchive.Close();
file.Close();
}
}
void CTestCaseManager::LoadData()
{
CFileDialog dlg(TRUE, NULL, NULL, NULL, "Testcase Data Files (*.dat)|*.dat|All Files (*.*)|*.*||");
CString sFile;
CFile file;
if ( dlg.DoModal() == IDOK )
{
m_sDataFile = dlg.GetPathName();
if ( !FileExists(m_sDataFile) )
return;
// Save the path
int iSlantPos = m_sDataFile.ReverseFind('\\');
m_sDataPath = m_sDataFile.Left(iSlantPos+1); // get the slant too!
if ( file.Open(m_sDataFile,CFile::modeRead | CFile::shareDenyNone) )
{
DeleteData(); // delete data first
CArchive loadArchive(&file,CArchive::load | CArchive::bNoFlushOnDelete);
Serialize(loadArchive);
loadArchive.Close();
file.Close();
}
}
}
void CTestCaseManager::ExecuteTestCases(LPINT m_TestCasesToRun)
{
int index;
CTCData* pTCData;
CTestCaseManager *tc;
tc = this;
InitRun();
while (*m_TestCasesToRun != -1)
{
index = *m_TestCasesToRun;
pTCData = (CTCData*)m_TCData[index];
m_strName = pTCData->m_strName;
// Examine the following very closely - not a cast but a constructor
QA_TestCase = (CTestCase)(this); // formerly tc
switch (pTCData->m_nID)
{
case TEST1 : WhiteBox_DeleteMessage1(this); // formerly tc
break;
case TEST2 : TrialTestCase2(tc);
break;
}
while (QATestCaseDone == FALSE) {
FEU_StayingAlive();
}
Wrapup();
m_TestCasesToRun++;
}
DeleteData();
}
void CTestCaseManager::Wrapup()
{
CFile fFile;
// create the runflag file to talk to QAP
fFile.Open(m_sDataPath + "runflag.txt",CFile::modeCreate | CFile::shareDenyNone);
fFile.Close();
QA_TestCase.WrapUp();
}
BOOL CTestCaseManager::FileExists(CString& strPath)
{
CFileStatus status;
BOOL bFileExists = TRUE;
if ( !CFile::GetStatus(strPath,status) ) // static member
bFileExists = FALSE;
return bFileExists;
}