470 lines
17 KiB
Plaintext
470 lines
17 KiB
Plaintext
|
'******************************** 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
|
||
|
|