# This file tests the tclWinDde.c file. # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # RCS: @(#) $Id: winDde.test,v 1.16 2003/05/16 22:00:47 patthoyts Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest namespace import -force ::tcltest::* } if {$tcl_platform(platform) == "windows"} { if [catch { set lib [lindex [glob -directory [file join [pwd] [file dirname \ [info nameofexecutable]]] tcldde*.dll] 0] load $lib dde }] { puts "WARNING: Unable to find the dde package. Skipping dde tests." ::tcltest::cleanupTests return } } # ------------------------------------------------------------------------- # Setup a script for a test server # set scriptName [makeFile {} script1.tcl] proc createChildProcess { ddeServerName } { file delete -force $::scriptName set f [open $::scriptName w+] puts $f { # DDE child server - # if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest namespace import -force ::tcltest::* } # Load the dde package to test. if [catch { set lib [lindex [glob -directory \ [file join [pwd] [file dirname [info nameofexecutable]]] \ tcldde*.dll] 0] load $lib dde }] { puts "Unable to find the dde package. Skipping dde tests." ::tcltest::cleanupTests return } # If an error occurs during the tests, this process may end up not # being closed down. To deal with this we create a 30s timeout. proc DoTimeout {} { global done puts stderr "winDde.test child process $ddeServerName timed out." set done 1 } set timeout [after 30000 DoTimeout] } # set the dde server name to the supplied argument. puts $f [list dde servername $ddeServerName] puts $f { # run the server and handle final cleanup. after 200;# give dde a chance to get going. puts ready flush stdout vwait done update exit } close $f # run the child server script. set f [open |[list [interpreter] $::scriptName] r] fconfigure $f -buffering line gets $f line return $f } # ------------------------------------------------------------------------- test winDde-1.1 {Settings the server's topic name} {pcOnly} { list [dde servername foobar] [dde servername] [dde servername self] } {foobar foobar self} test winDde-2.1 {Checking for other services} {pcOnly} { expr [llength [dde services {} {}]] >= 0 } 1 test winDde-2.2 {Checking for existence, with service and topic specified} \ {pcOnly} { llength [dde services TclEval self] } 1 test winDde-2.3 {Checking for existence, with only the service specified} \ {pcOnly} { expr [llength [dde services TclEval {}]] >= 1 } 1 test winDde-2.4 {Checking for existence, with only the topic specified} \ {pcOnly} { expr [llength [dde services {} self]] >= 1 } 1 # ------------------------------------------------------------------------- test winDde-3.1 {DDE execute locally} {pcOnly} { set a "" dde execute TclEval self {set a "foo"} set a } foo test winDde-3.2 {DDE execute -async locally} {pcOnly} { set a "" dde execute -async TclEval self {set a "foo"} update set a } foo test winDde-3.3 {DDE request locally} {pcOnly} { set a "" dde execute TclEval self {set a "foo"} dde request TclEval self a } foo test winDde-3.4 {DDE eval locally} {pcOnly} { set a "" dde eval self set a "foo" } foo test winDde-3.5 {DDE request locally} {pcOnly} { set a "" dde execute TclEval self {set a "foo"} dde request -binary TclEval self a } "foo\x00" # ------------------------------------------------------------------------- test winDde-4.1 {DDE execute remotely} {stdio pcOnly} { set a "" set name child-4.1 set child [createChildProcess $name] dde execute TclEval $name {set a "foo"} dde execute TclEval $name {set done 1} update set a } "" test winDde-4.2 {DDE execute async remotely} {stdio pcOnly} { set a "" set name child-4.2 set child [createChildProcess $name] dde execute -async TclEval $name {set a "foo"} dde execute TclEval $name {set done 1} update set a } "" test winDde-4.3 {DDE request remotely} {stdio pcOnly} { set a "" set name chile-4.3 set child [createChildProcess $name] dde execute TclEval $name {set a "foo"} set a [dde request TclEval $name a] dde execute TclEval $name {set done 1} update set a } foo test winDde-4.4 {DDE eval remotely} {stdio pcOnly} { set a "" set name child-4.4 set child [createChildProcess $name] set a [dde eval $name set a "foo"] dde execute TclEval $name {set done 1} update set a } foo # ------------------------------------------------------------------------- test winDde-5.1 {check for bad arguments} {pcOnly} { catch {dde execute "" "" "" ""} result set result } {wrong # args: should be "dde execute ?-async? serviceName topicName value"} test winDde-5.2 {check for bad arguments} {pcOnly} { catch {dde execute "" "" ""} result set result } {cannot execute null data} test winDde-5.3 {check for bad arguments} {pcOnly} { catch {dde execute -foo "" "" ""} result set result } {wrong # args: should be "dde execute ?-async? serviceName topicName value"} test winDde-5.4 {DDE eval bad arguments} {pcOnly} { list [catch {dde eval "" "foo"} msg] $msg } {1 {invalid service name ""}} # ------------------------------------------------------------------------- test winDde-6.1 {DDE servername bad arguments} \ -constraints pcOnly \ -body {list [catch {dde servername -z -z -z} msg] $msg} \ -result {1 {wrong # args: should be "dde servername ?-exact? ?--? ?serverName?"}} test winDde-6.2 {DDE servername set name} \ -constraints pcOnly \ -body {dde servername -- winDde-6.2} \ -result {winDde-6.2} test winDde-6.3 {DDE servername set exact name} \ -constraints pcOnly \ -body {dde servername -exact winDde-6.3} \ -result {winDde-6.3} test winDde-6.4 {DDE servername set exact name} \ -constraints pcOnly \ -body {dde servername -exact -- winDde-6.4} \ -result {winDde-6.4} test winDde-6.5 {DDE remote servername collision} \ -constraints {stdio pcOnly} \ -setup { set name child-6.5 set child [createChildProcess $name] } \ -body { dde servername -- $name } \ -cleanup { dde execute TclEval $name {set done 1} update } \ -result "child-6.5 #2" test winDde-6.6 {DDE remote servername collision force} \ -constraints {stdio pcOnly} \ -setup { set name child-6.6 set child [createChildProcess $name] } \ -body { dde servername -exact -- $name } \ -cleanup { dde execute TclEval $name {set done 1} update } \ -result {child-6.6} # ------------------------------------------------------------------------- test winDde-7.1 {Load DDE in slave interpreter } \ -constraints pcOnly \ -setup { interp create slave } \ -body { slave eval [list load $lib dde] slave eval [list dde servername -- dde-interp-7.1] } \ -cleanup { interp delete slave } \ -result {dde-interp-7.1} test winDde-7.2 {DDE slave cleanup} \ -constraints pcOnly \ -setup { interp create slave slave eval [list load $lib dde] slave eval [list dde servername -- dde-interp-7.5] interp delete slave } \ -body { dde services TclEval {} set s [dde services TclEval {}] set m [list [list TclEval dde-interp-7.5]] if {[lsearch -exact $s $m] != -1} { set s } } \ -result {} test winDde-7.3 {DDE present in slave interp} \ -constraints pcOnly \ -setup { interp create slave slave eval [list load $lib dde] slave eval [list dde servername -- dde-interp-7.3] } \ -body { dde services TclEval dde-interp-7.3 } \ -cleanup { interp delete slave } \ -result {{TclEval dde-interp-7.3}} test winDde-7.4 {interp name collision with -exact} \ -constraints pcOnly \ -setup { interp create slave slave eval [list load $lib dde] slave eval [list dde servername -- dde-interp-7.4] } \ -body { dde servername -exact -- dde-interp-7.4 } \ -cleanup { interp delete slave } \ -result {dde-interp-7.4} test winDde-7.5 {interp name collision without -exact} \ -constraints pcOnly \ -setup { interp create slave slave eval [list load $lib dde] slave eval [list dde servername -- dde-interp-7.5] } \ -body { dde servername -- dde-interp-7.5 } \ -cleanup { interp delete slave } \ -result "dde-interp-7.5 #2" # ------------------------------------------------------------------------- #cleanup catch {interp delete $slave}; # ensure we clean up the slave. file delete -force $::scriptName ::tcltest::cleanupTests return # Local Variables: # mode: tcl # End: