Added ability for tests to output messages

This commit is contained in:
locka%iol.ie 1999-03-21 19:51:19 +00:00
parent 8e8373e02b
commit 55635798e1
8 changed files with 276 additions and 68 deletions

View File

@ -35,6 +35,8 @@ TCHAR *aURLs[] =
_T("http://www.microsoft.com")
};
CBrowseDlg *CBrowseDlg::m_pBrowseDlg = NULL;
/////////////////////////////////////////////////////////////////////////////
// CBrowseDlg dialog
@ -51,7 +53,7 @@ CBrowseDlg::CBrowseDlg(CWnd* pParent /*=NULL*/)
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pBrowseDlg = this;
m_pControlSite = NULL;
m_clsid = CLSID_NULL;
}
@ -77,6 +79,7 @@ BEGIN_MESSAGE_MAP(CBrowseDlg, CDialog)
ON_BN_CLICKED(IDC_BACKWARD, OnBackward)
ON_BN_CLICKED(IDC_FORWARD, OnForward)
ON_NOTIFY(TVN_SELCHANGED, IDC_TESTLIST, OnSelchangedTestlist)
ON_NOTIFY(NM_DBLCLK, IDC_TESTLIST, OnDblclkTestlist)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
@ -251,47 +254,142 @@ void CBrowseDlg::OnForward()
}
}
void CBrowseDlg::RunTestSet(TestSet *pTestSet)
{
ASSERT(pTestSet);
if (pTestSet == NULL)
{
return;
}
for (int j = 0; j < pTestSet->nTests; j++)
{
Test *pTest = &pTestSet->aTests[j];
RunTest(pTest);
}
}
TestResult CBrowseDlg::RunTest(Test *pTest)
{
ASSERT(pTest);
TestResult nResult = trFailed;
CString szMsg;
szMsg.Format(_T("Running test \"%s\""), pTest->szName);
m_lbMessages.AddString(szMsg);
if (pTest && pTest->pfn)
{
BrowserInfo cInfo;
cInfo.clsid = m_clsid;
cInfo.pControlSite = m_pControlSite;
cInfo.pIUnknown = NULL;
cInfo.pfnOutputString = CBrowseDlg::OutputString;
if (cInfo.pControlSite)
{
cInfo.pControlSite->GetControlUnknown(&cInfo.pIUnknown);
}
nResult = pTest->pfn(&cInfo);
pTest->nLastResult = nResult;
if (cInfo.pIUnknown)
{
cInfo.pIUnknown->Release();
}
}
switch (nResult)
{
case trFailed:
m_lbMessages.AddString(_T("Test failed"));
break;
case trPassed:
m_lbMessages.AddString(_T("Test passed"));
break;
case trPartial:
m_lbMessages.AddString(_T("Test partial"));
break;
default:
break;
}
return nResult;
}
void __cdecl CBrowseDlg::OutputString(const TCHAR *szMessage, ...)
{
if (m_pBrowseDlg == NULL)
{
return;
}
TCHAR szBuffer[256];
va_list cArgs;
va_start(cArgs, szMessage);
_vstprintf(szBuffer, szMessage, cArgs);
va_end(cArgs);
CString szOutput;
szOutput.Format(_T(" Test: %s"), szBuffer);
m_pBrowseDlg->m_lbMessages.AddString(szOutput);
}
void CBrowseDlg::UpdateTest(HTREEITEM hItem, TestResult nResult)
{
if (nResult == trPassed)
{
m_tcTests.SetItemImage(hItem, IL_TESTPASSED, IL_TESTPASSED);
}
else if (nResult == trFailed)
{
m_tcTests.SetItemImage(hItem, IL_TESTFAILED, IL_TESTFAILED);
}
else if (nResult == trPartial)
{
// TODO
}
}
void CBrowseDlg::UpdateTestSet(HTREEITEM hItem)
{
// Examine the results
HTREEITEM hTest = m_tcTests.GetNextItem(hItem, TVGN_CHILD);
while (hTest)
{
Test *pTest = (Test *) m_tcTests.GetItemData(hTest);
UpdateTest(hTest, pTest->nLastResult);
hTest = m_tcTests.GetNextItem(hTest, TVGN_NEXT);
}
}
void CBrowseDlg::OnRuntest()
{
HTREEITEM hItem = m_tcTests.GetNextItem(NULL, TVGN_FIRSTVISIBLE);
while (hItem)
{
UINT nState;
nState = m_tcTests.GetItemState(hItem, TVIS_SELECTED);
if (!m_tcTests.ItemHasChildren(hItem) && nState & TVIS_SELECTED)
UINT nState = m_tcTests.GetItemState(hItem, TVIS_SELECTED);
if (!(nState & TVIS_SELECTED))
{
Test *pTest = (Test *) m_tcTests.GetItemData(hItem);
TestResult nResult = trFailed;
if (pTest && pTest->pfn)
{
BrowserInfo cInfo;
hItem = m_tcTests.GetNextItem(hItem, TVGN_NEXTVISIBLE);
continue;
}
cInfo.clsid = m_clsid;
cInfo.pControlSite = m_pControlSite;
cInfo.pIUnknown = NULL;
if (cInfo.pControlSite)
{
cInfo.pControlSite->GetControlUnknown(&cInfo.pIUnknown);
}
nResult = pTest->pfn(&cInfo);
if (cInfo.pIUnknown)
{
cInfo.pIUnknown->Release();
}
}
if (nResult == trPassed)
{
m_tcTests.SetItemImage(hItem, IL_TESTPASSED, IL_TESTPASSED);
}
else if (nResult == trFailed)
{
m_tcTests.SetItemImage(hItem, IL_TESTFAILED, IL_TESTFAILED);
}
else if (nResult == trPartial)
{
// TODO
}
if (m_tcTests.ItemHasChildren(hItem))
{
// Run complete set of tests
TestSet *pTestSet = (TestSet *) m_tcTests.GetItemData(hItem);
RunTestSet(pTestSet);
UpdateTestSet(hItem);
}
else
{
// Find the test
Test *pTest = (Test *) m_tcTests.GetItemData(hItem);
TestResult nResult = RunTest(pTest);
UpdateTest(hItem, nResult);
}
hItem = m_tcTests.GetNextItem(hItem, TVGN_NEXTVISIBLE);
@ -335,3 +433,9 @@ void CBrowseDlg::OnSelchangedTestlist(NMHDR* pNMHDR, LRESULT* pResult)
*pResult = 0;
}
void CBrowseDlg::OnDblclkTestlist(NMHDR* pNMHDR, LRESULT* pResult)
{
OnRuntest();
*pResult = 0;
}

View File

@ -20,7 +20,14 @@ public:
CBrowseDlg(CWnd* pParent = NULL); // standard constructor
static CBrowseDlg *m_pBrowseDlg;
static void __cdecl CBrowseDlg::OutputString(const TCHAR *szMessage, ...);
HRESULT GetWebBrowser(IWebBrowser **pWebBrowser);
void RunTestSet(TestSet *pTestSet);
TestResult RunTest(Test *pTest);
void UpdateTest(HTREEITEM hItem, TestResult nResult);
void UpdateTestSet(HTREEITEM hItem);
// Dialog Data
//{{AFX_DATA(CBrowseDlg)
@ -53,6 +60,7 @@ protected:
afx_msg void OnBackward();
afx_msg void OnForward();
afx_msg void OnSelchangedTestlist(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDblclkTestlist(NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

View File

@ -56,6 +56,7 @@ void CPickerDlg::DoDataExchange(CDataExchange* pDX)
BEGIN_MESSAGE_MAP(CPickerDlg, CDialog)
//{{AFX_MSG_MAP(CPickerDlg)
ON_BN_CLICKED(IDOK, OnOk)
ON_LBN_DBLCLK(IDC_LISTBROWSER, OnDblclkListbrowser)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
@ -90,3 +91,8 @@ void CPickerDlg::OnOk()
EndDialog(IDOK);
}
void CPickerDlg::OnDblclkListbrowser()
{
OnOk();
}

View File

@ -38,6 +38,7 @@ protected:
//{{AFX_MSG(CPickerDlg)
afx_msg void OnOk();
virtual BOOL OnInitDialog();
afx_msg void OnDblclkListbrowser();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

View File

@ -30,9 +30,97 @@ TestResult __cdecl tstDocument(BrowserInfo *pInfo)
return trPassed;
}
void tstDrillerLevel(BrowserInfo *pInfo, IHTMLElementCollection *pCollection, int nLevel)
{
if (pCollection == NULL)
{
return;
}
LONG celem = 0;;
HRESULT hr = pCollection->get_length( &celem );
for ( int i=0; i< celem; i++ )
{
VARIANT varIndex;
varIndex.vt = VT_UINT;
varIndex.lVal = i;
VARIANT var2;
VariantInit( &var2 );
CIPtr(IDispatch) cpDisp;
hr = pCollection->item( varIndex, var2, &cpDisp );
if ( hr != S_OK )
{
continue;
}
CIPtr(IHTMLElement) cpElem;
hr = cpDisp->QueryInterface( IID_IHTMLElement, (void **)&cpElem );
if ( hr == S_OK )
{
BSTR bstr;
hr = cpElem->get_tagName(&bstr);
USES_CONVERSION;
char szLevel[256];
memset(szLevel, 0, sizeof(szLevel));
memset(szLevel, ' ', nLevel);
CString strTag = bstr;
pInfo->pfnOutputString(_T("Parsing element: %s%s"), A2T(szLevel), strTag);
CIPtr(IHTMLImgElement) cpImgElem;
hr = cpDisp->QueryInterface( IID_IHTMLImgElement, (void **)&cpImgElem );
if ( hr == S_OK )
{
cpImgElem->get_href(&bstr);
}
else
{
CIPtr(IHTMLAnchorElement) cpAnchElem;
hr = cpDisp->QueryInterface( IID_IHTMLAnchorElement, (void **)&cpAnchElem );
if ( hr == S_OK )
{
cpAnchElem->get_href(&bstr);
}
}
CIPtr(IDispatch) cpDispColl;
cpElem->get_all(&cpDispColl);
if (hr == S_OK)
{
CIPtr(IHTMLElementCollection) cpColl = cpDispColl;
tstDrillerLevel(pInfo, cpColl, nLevel + 1);
}
}
}
}
TestResult __cdecl tstDriller(BrowserInfo *pInfo)
{
CIPtr(IHTMLDocument2) cpDocElement;
pInfo->GetDocument(&cpDocElement);
if (cpDocElement == NULL)
{
return trFailed;
}
CIPtr(IHTMLElementCollection) cpColl;
HRESULT hr = cpDocElement->get_all( &cpColl );
if (hr == S_OK)
{
tstDrillerLevel(pInfo, cpColl, 0);
}
return trPassed;
}
TestResult __cdecl tstTesters(BrowserInfo *pInfo)
{
AfxMessageBox("Test architecture is reasonably sane!");
pInfo->pfnOutputString("Test architecture is reasonably sane!");
return trPassed;
}
@ -62,6 +150,7 @@ TestResult __cdecl tstIWebBrowser(BrowserInfo *pInfo)
return trFailed;
}
TestResult __cdecl tstIWebBrowser2(BrowserInfo *pInfo)
{
if (pInfo->pIUnknown == NULL)
@ -99,23 +188,24 @@ TestResult __cdecl tstIWebBrowserApp(BrowserInfo *pInfo)
Test aBasic[] =
{
{ _T("Test Tester"), _T("Ensure that the testing architecture is working"), tstTesters },
{ _T("Control basics"), _T("Ensure that the browser control is active"), tstControlActive },
{ _T("IWebBrowser"), _T("Test if control has an IWebBrowser interface"), tstIWebBrowser },
{ _T("IWebBrowser2"), _T("Test if control has an IWebBrowser2 interface"), tstIWebBrowser2 },
{ _T("IWebBrowserApp"), _T("Test if control has an IWebBrowserApp interface"), tstIWebBrowserApp }
{ _T("Test Tester"), _T("Ensure that the testing architecture is working"), tstTesters, trNotRun },
{ _T("Control basics"), _T("Ensure that the browser control is active"), tstControlActive, trNotRun },
{ _T("IWebBrowser"), _T("Test if control has an IWebBrowser interface"), tstIWebBrowser, trNotRun },
{ _T("IWebBrowser2"), _T("Test if control has an IWebBrowser2 interface"), tstIWebBrowser2, trNotRun },
{ _T("IWebBrowserApp"), _T("Test if control has an IWebBrowserApp interface"), tstIWebBrowserApp, trNotRun }
};
Test aDHTML[] =
{
{ _T("get_Document"), _T("Test if browser has a top level element"), tstDocument }
{ _T("get_Document"), _T("Test if browser has a top level element"), tstDocument },
{ _T("parse DOM"), _T("Parse the document DOM"), tstDriller }
};
TestSet aTestSets[] =
{
{ _T("Basic"), _T("Basic sanity tests"), 5, aBasic },
{ _T("Browsing"), _T("Browsing and navigation tests"), 0, NULL },
{ _T("DHTML"), _T("Test the DOM"), 1, aDHTML }
{ _T("DHTML"), _T("Test the DOM"), 2, aDHTML }
};
int nTestSets = sizeof(aTestSets) / sizeof(aTestSets[0]);

View File

@ -23,17 +23,21 @@
enum TestResult
{
trNotRun,
trFailed,
trPassed,
trPartial
};
typedef void (__cdecl *OutputStringProc)(const TCHAR *szMessage, ...);
class BrowserInfo
{
public:
CControlSiteInstance *pControlSite;
IUnknown *pIUnknown;
CLSID clsid;
OutputStringProc pfnOutputString;
HRESULT GetWebBrowser(IWebBrowserApp **pWebBrowser)
{
@ -71,6 +75,7 @@ struct Test
TCHAR *szName;
TCHAR *szDesc;
TestProc pfn;
TestResult nLastResult;
};
struct TestSet

View File

@ -1,5 +1,5 @@
# Microsoft Developer Studio Project File - Name="cbrowse" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 5.00
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Application" 0x0101
@ -22,6 +22,7 @@ CFG=cbrowse - Win32 Debug
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
@ -42,8 +43,8 @@ RSC=rc.exe
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
# ADD BASE RSC /l 0x409 /d "NDEBUG" /d "_AFXDLL"
# ADD RSC /l 0x409 /d "NDEBUG" /d "_AFXDLL"
BSC32=bscmake.exe
@ -66,9 +67,9 @@ LINK32=link.exe
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /c
# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
# ADD BASE RSC /l 0x409 /d "_DEBUG" /d "_AFXDLL"
# ADD RSC /l 0x409 /d "_DEBUG" /d "_AFXDLL"
BSC32=bscmake.exe
@ -94,13 +95,6 @@ SOURCE=.\cbrowse.cpp
# Begin Source File
SOURCE=.\cbrowse.rc
!IF "$(CFG)" == "cbrowse - Win32 Release"
!ELSEIF "$(CFG)" == "cbrowse - Win32 Debug"
!ENDIF
# End Source File
# Begin Source File

View File

@ -45,6 +45,15 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME ICON DISCARDABLE "res\\cbrowse.ico"
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
@ -82,15 +91,6 @@ END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME ICON DISCARDABLE "res\\cbrowse.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
@ -107,12 +107,12 @@ BEGIN
CONTROL "",IDC_BROWSER_MARKER,"Static",SS_BLACKFRAME,7,24,310,
205
PUSHBUTTON "Run",IDC_RUNTEST,325,296,50,14,WS_DISABLED
LISTBOX IDC_LISTMESSAGES,7,247,310,63,LBS_SORT |
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
LISTBOX IDC_LISTMESSAGES,7,247,310,63,LBS_NOINTEGRALHEIGHT |
WS_VSCROLL | WS_TABSTOP
LTEXT "Messages:",IDC_STATIC,7,233,110,11
CONTROL "Tree1",IDC_TESTLIST,"SysTreeView32",TVS_HASBUTTONS |
TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,330,16,134,222
TVS_TRACKSELECT | WS_BORDER | WS_TABSTOP,330,16,134,222
GROUPBOX "Tests",IDC_STATIC,324,7,146,237
COMBOBOX IDC_URL,45,7,180,52,CBS_DROPDOWNLIST | WS_VSCROLL |
WS_TABSTOP