'******************************** 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