|
|
'******************************** TUTOR.MST ********************************** 'Demonstrates: This will test the OLE 2.0 sample app: OLine.EXE ' 'Required Files: MSTEST.INC, OUTLINE.EXE ' 'Uses: TESTSCRN, TESTCTRL, TESTEVENT. ' 'Notes: Assumes all exe's are in the PATH. ' '******************************************************************************
Declare Sub Init Declare Sub Windows Declare Sub AddLines Declare Sub NewDoc Declare Sub ClearAll Declare Sub TestNames Declare Sub TestClip Declare Sub EndTest
Declare SUB LogPrint(szString$) Declare SUB CheckAppExists(szAppName$, szErrMessage$) Declare SUB CheckAppNotExists(szAppName$, szErrMessage$) Declare FUNCTION CheckWndIsActive(szAppName$, szErrMessage$) AS INTEGER Declare SUB IsDllLoaded(szDllName$) Declare FUNCTION GetDllUsage(szDllName$) AS INTEGER Declare SUB CheckDllUsage(szDllName$, nExpectedUsage%)
'****************************************************************************** ' CONST '******************************************************************************
Const DefAppName$ = "outline" Const RootAppDir$ = "c:\ole2samp\outline\" Const SDemo1AppName$ = "sdemo1" Const SDemo1ClassName$ = "SDemo1" Const EllipseWTClassName$ = "EllipseWT" Const BELL = 7
Global WinHandle%, DbWinHandle%, logfile%, ErrCount, fSlaveMode%, fAutoMode%, AppName$, AppWndName$, AppDir$
Const nDll = 4 GLOBAL DllList$(nDll) GLOBAL DllExpectedUsage%(nDll)
DllList(0) = "OLE2.DLL" DllList(1) = "OLECLASS.DLL" DllList(2) = "OLEREM.DLL" DllList(3) = "OLEPROXY.DLL" DllList(4) = "DOCFILE.DLL"
'****************************************************************************** ' DEFINES '******************************************************************************
'$DEFINE TESTSCRN '$DEFINE TESTCTRL '$DEFINE TESTEVNT
'****************************************************************************** ' INCLUDES '******************************************************************************
'$INCLUDE 'mstest.inc' '$INCLUDE 'fasttest.inc' '$INCLUDE 'winkern.inc'
'****************************************************************************** ' Main program code '******************************************************************************
ON ERROR GOTO ErrorTrap
Init '*** Initialize logging, global constants. Windows '*** Test various windowing features of app. NewDoc '*** start a new document AddLines '*** Add some lines to document TestNames '*** Test naming functionality TestClip '*** Test clipboard functionality EndTest '*** Shut down.
END
'****************************************************************************** ' TRAPS '******************************************************************************
ErrorTrap:
ErrCount = ErrCount + 1 SELECT CASE Err CASE ERR_INVALID_PATH LogPrint "Path not found. Error number " + STR$(Err) LogPrint " on line " + STR$(ERL) LogPrint " in script " + ERF LogPrint ERROR$ ' The error message. END CASE ERR_CANT_OPEN_FILE LogPrint "Can't Open File. Error number " + STR$(Err) LogPrint " on line " + STR$(ERL) LogPrint " in script " + ERF LogPrint ERROR$ ' The error message. END CASE ERR_ILLEGAL_FUNCTION_CALL LogPrint "Illegal function call. Error number " + STR$(Err) LogPrint " on line " + STR$(ERL) LogPrint " in script " + ERF LogPrint ERROR$ ' The error message. LogPrint " (NOTE: Check if OLETEST.EXE & SDEMO1.EXE are on your PATH)" END CASE ELSE LogPrint "Unexpected error: Number " + STR$(Err) LogPrint " on line " + STR$(ERL) LogPrint " in script " +ERF LogPrint ERROR$ ' The error message. END END SELECT
'*** trap UAE from an application
'TRAP UAETrap FROM "TESTDRVR.EXE" ' LogPrint "!!!!!! UNRECOVERERABLE APPLICATION ERROR ENCOUNTERED!" ' LogPrint " ABORT TESTING!" ' ErrCount = ErrCount + 1 ' EndTest 'END TRAP
'****************************************************************************** ' SUBs and FUNCTIONs '******************************************************************************
'****************************************************************************** ' SUB Init sets up several variables that are used thoughout the test. '****************************************************************************** SUB Init STATIC
Viewport On Viewport Clear ErrCount = 0 fSlaveMode = 0 fAutoMode = 0 IF TESTMODE$ = "auto" OR TESTMODE$ = "AUTO" THEN fAutoMode = 1 ENDIF
'*** Determine name of app to run. this can be given with "/C appname" cmd line opt. IF COMMAND$ = "" THEN AppName$ = DefAppName$ ELSE AppName$ = COMMAND$ ENDIF AppWndName$ = AppName$ + " -"
logfile = FREEFILE OPEN "mstest.log" FOR OUTPUT AS # logfile 'Set log file and write header to file.
LogPrint "**********************************************" LogPrint "STARTING TEST OF " + AppName$ + " APPLICATION" LogPrint " " + DATETIME$ LogPrint "**********************************************"
'Record the initial usage counts for all OLE2 related DLLs FOR I = 0 TO nDll DllExpectedUsage(I) = GetDllUsage(DllLIst(I)) NEXT I
'Run the program and get its window handle.
WinHandle = WFndWnd(AppWndName$, FW_PART or FW_FOCUS or FW_ALL) IF WinHandle = 0 THEN LogPrint "Launching new instance of " + AppName$ + " app--running test in slave mode" LogPrint "NOTE: Running test in slave mode -- app will automatically shut down" RUN "dbwin", NOWAIT '*** start up debug messages window DbWinHandle = WGetActWnd(0) DoKeys "%(e)e" '*** Edit.Clear buffer RUN RootAppDir$ + AppName$ + "\" + AppName$, NOWAIT WinHandle = WGetActWnd(0) fSlaveMode = 1 '*** Test is run in slave mode, shut down afterwards ELSE LogPrint "Using existing instance of " + AppName$ ENDIF
IF CheckWndIsActive("Debug Messages", "") <> 0 THEN DoKeys "%(o)t" '*** Toggle off 'always on top' mode of debug window WSetActWnd WinHandle '*** activate app ENDIF
x = CheckWndIsActive(AppWndName$, AppName$ + " Test not launched successfully")
END SUB
'****************************************************************************** ' SUB Window will size app window and set it's position. '******************************************************************************
SUB Windows STATIC
DIM i%
'Position and size the form.
WSetWndPos WinHandle, 200, 200 WSetWndSiz WinHandle, 50, 60
'Adjust the window to several locations.
For i = 1 to 10 WAdjWndSiz WinHandle, 4*i, 4*i Next i
END SUB
'****************************************************************************** ' SUB NewDoc -- start a new doc. '******************************************************************************
SUB NewDoc STATIC
LogPrint "--- BEGIN NewDoc" WSetActWnd WinHandle '*** activate app DoKeys "%(l)axxxx" '*** add a line so doc is dirty WButtonClick "OK" '*** Close input dialog box DoKeys "%(f)n" '*** New command WButtonClick "No" '*** Do not save x = CheckWndIsActive(AppWndName$, "Unknown Error")
LogPrint "--- END"
END SUB
'****************************************************************************** ' SUB ClearAll -- clear all lines. '******************************************************************************
SUB ClearAll STATIC
LogPrint "--- BEGIN ClearALL" WSetActWnd WinHandle '*** activate app DoKeys "%(e)l" '*** select all DoKeys "%(e)e" '*** clear selection x = CheckWndIsActive(AppWndName$, "Unknown Error")
LogPrint "--- END"
END SUB
'****************************************************************************** ' SUB AddLines -- add text lines. '******************************************************************************
SUB AddLines STATIC
LogPrint "--- BEGIN AddLines" WSetActWnd WinHandle '*** activate app DoKeys "%(l)aLine 1: This is a test" '*** add a line WButtonClick "OK" '*** Close input dialog box DoKeys "%(l)aLine 2: This is a test" '*** add a line WButtonClick "OK" '*** Close input dialog box DoKeys "%(l)aLine 3: This is a test" '*** add a line WButtonClick "OK" '*** Close input dialog box DoKeys "%(l)aLine 3.1: This is a sub point" '*** add a line WButtonClick "OK" '*** Close input dialog box DoKeys "%(l)i" '*** indent line DoKeys "%(l)aLine 3.2: This is a sub point" '*** add a line WButtonClick "OK" '*** Close input dialog box DoKeys "%(l)aLine 3.3: This is a sub point" '*** add a line WButtonClick "OK" '*** Close input dialog box DoKeys "%(l)i" '*** indent line DoKeys "%(l)i" '*** indent line DoKeys "%(l)i" '*** indent line DoKeys "%(l)i" '*** indent line DoKeys "%(l)i" '*** indent line DoKeys "%(l)i" '*** indent line DoKeys "%(l)n" '*** un-indent line DoKeys "%(l)n" '*** un-indent line DoKeys "%(l)n" '*** un-indent line DoKeys "%(l)n" '*** un-indent line DoKeys "%(l)n" '*** un-indent line DoKeys "%(l)n" '*** un-indent line x = CheckWndIsActive(AppWndName$, "Unknown Error")
LogPrint "--- END"
END SUB
'****************************************************************************** ' SUB TestNames -- test the naming functionality. '******************************************************************************
SUB TestNames STATIC
LogPrint "--- BEGIN TestNames" WSetActWnd WinHandle '*** activate app DoKeys "{UP}" DoKeys "{Down}" DoKeys "+({UP})+({UP})+({UP})" '*** select some lines DoKeys "%(n)dx" '*** define a name WButtonClick "Ok" '*** Close define name dialog box DoKeys "%(l)aLine 4: This should be part of name x" '*** add a line WButtonClick "OK" '*** Close input dialog box DoKeys "%(l)aLine 5: This should be part of name x" '*** add a line WButtonClick "OK" '*** Close input dialog box DoKeys "%(n)gx" '*** goto name WButtonClick "OK" '*** Close define name dialog box DoKeys "{Down}" DoKeys "+{Down}" '*** select the 2 lines that were added DoKeys "%(e)e" '*** delete the selection DoKeys "%(n)gx" '*** goto name WButtonClick "OK" '*** Close define name dialog box x = CheckWndIsActive(AppWndName$, "Unknown Error")
LogPrint "--- END"
END SUB
'****************************************************************************** ' SUB TestClip -- test the clipboard functionality. '******************************************************************************
SUB TestClip STATIC
LogPrint "--- BEGIN TestClip" WSetActWnd WinHandle '*** activate app DoKeys "%(e)t" '*** cut the selection DoKeys "%(e)p" '*** paste DoKeys "%(e)p" '*** paste x = CheckWndIsActive(AppWndName$, "Unknown Error")
LogPrint "--- END"
END SUB
SUB EndTest STATIC
IF fSlaveMode <> 0 THEN LogPrint "*** EndTest" IF CheckWndIsActive(AppWndName$, AppName$ + " can NOT be closed properly") THEN DoKeys "%FX" '*** shut down OLETEST WButtonClick "No" '*** Do not save ENDIF WMinWnd(DbWinHandle) '*** minimize debug messages window CheckAppNotExists AppWndName$, AppName$ + " NOT shut down properly" ENDIF
'Check that all OLE2 related DLLs have the expected usage counts FOR I = 0 TO nDll CheckDllUsage DllList(I), DllExpectedUsage(I) NEXT I
LogPrint "**********************************************" LogPrint "SUCCESSFULLY COMPLETED " + AppName$ + "TEST" LogPrint " " + DATETIME$ LogPrint "Total of " + STR$(ErrCount) + " errors detected" LogPrint "**********************************************"
CLOSE # logfile
IF fAutoMode = 0 THEN PRINT, CHR$(BELL) '*** sound a BEEP, we are done! IF ErrCount = 0 THEN PAUSE "Test seems successful" ELSE PAUSE "*** TEST FAILED -- (" + STR$(ErrCount) + " Errors). See mstest.log" ENDIF ENDIF END SUB
'****************************************************************************** ' SUB LogPrint prints a string to the logfile and to the Viewport. '******************************************************************************
SUB LogPrint(szString$) STATIC
PRINT #logfile, szString$ PRINT, szString$
END SUB
SUB CheckAppExists(szAppName$, szErrMessage$) STATIC
hWnd = WFndWnd(szAppName, FW_PART or FW_ALL or FW_NOCASE) IF hWnd = 0 THEN LogPrint "!!!!!! Operation FAILED..." LogPrint " " + szErrMessage$ ErrCount = ErrCount + 1 ENDIF
END SUB
SUB CheckAppNotExists(szAppName$, szErrMessage$) STATIC
hWnd = WFndWnd(szAppName, FW_PART or FW_ALL or FW_NOCASE) IF hWnd <> 0 THEN LogPrint "!!!!!! Operation FAILED..." LogPrint " " + szErrMessage$ ErrCount = ErrCount + 1 ENDIF
END SUB
STATIC FUNCTION CheckWndIsActive(szAppName$, szErrMessage$) AS INTEGER hWnd = WFndWnd(szAppName, FW_PART or FW_ALL or FW_NOCASE) CheckWndIsActive = hWnd IF hWnd <> WGetActWnd(0) THEN CheckWndIsActive = 0
'*** if no message is given, then it is not considered an error IF szErrMessage <> "" THEN LogPrint "!!!!!! Operation FAILED..." LogPrint " " + szErrMessage$ LogPrint " <" + GetText(0) + "> Window is Active"
IF fAutoMode = 0 THEN PAUSE "<" + szAppName + "> Window expected.... " + "<" + GetText(0) + "> Window is Active" ENDIF
'*** if a dialog is active, then close it. it is probably an error message IF WButtonExists("Ignore") THEN WButtonClick "OK" '*** Close err message box ELSEIF WButtonExists("OK") THEN WButtonClick "OK" '*** Close err message box ELSEIF WButtonExists("Ok") THEN WButtonClick "Ok" '*** Close err message box ELSEIF WButtonExists("Cancel") THEN WButtonClick "Cancel" '*** Close err message box ELSEIF WButtonExists("CANCEL") THEN WButtonClick "CANCEL" '*** Close err message box ELSEIF WButtonExists("Close") THEN WButtonClick "Close" '*** Close err message box ENDIF ErrCount = ErrCount + 1 ENDIF ENDIF
END FUNCTION
'****************************************************************************** ' FUNCTION GetDllUsage gets the usage count of a DLL. '******************************************************************************
STATIC FUNCTION GetDllUsage(szDllName$) AS INTEGER
hDll% = GetModuleHandle(szDllName) GetDllUsage = GetModuleUsage(hDll)
END FUNCTION
'****************************************************************************** ' SUB CheckDllUsage checks if a DLL is loaded the expected number of times. '******************************************************************************
SUB CheckDllUsage(szDllName$, nExpectedUsage%) STATIC
usage% = GetDllUsage(szDllName) LogPrint "DLL: " + szDllName + " loadded" + STR$(usage) + " times (expected" + STR$(nExpectedUsage) + " times)"
'*** can only reliably report an error when expected usage is 0 IF usage <> nExpectedUsage AND nExpectedUsage = 0 THEN LogPrint "!!!!!! " + szDllName + " NOT UNLOADED PROPERLY!" ErrCount = ErrCount + 1 ENDIF
END SUB
|