tcltest.test
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:49k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # This file contains a collection of tests for one or more of the Tcl
  2. # built-in commands.  Sourcing this file into Tcl runs the tests and
  3. # generates output for errors.  No output means no errors were found.
  4. #
  5. # Copyright (c) 1998-1999 by Scriptics Corporation. 
  6. # Copyright (c) 2000 by Ajuba Solutions
  7. # All rights reserved.
  8. #
  9. # RCS: @(#) $Id: tcltest.test,v 1.37.2.11 2006/03/19 22:47:30 vincentdarley Exp $
  10. # Note that there are several places where the value of 
  11. # tcltest::currentFailure is stored/reset in the -setup/-cleanup
  12. # of a test that has a body that runs [test] that will fail.
  13. # This is a workaround of using the same tcltest code that we are
  14. # testing to run the test itself.  Ditto on things like [verbose].
  15. #
  16. # It would be better to have the -body of the tests run the tcltest
  17. # commands in a slave interp so the [test] being tested would not
  18. # interfere with the [test] doing the testing.  
  19. #
  20. if {[catch {package require tcltest 2.1}]} {
  21.     puts stderr "Skipping tests in [info script].  tcltest 2.1 required."
  22.     return
  23. }
  24. namespace eval ::tcltest::test {
  25. namespace import ::tcltest::*
  26. makeFile {
  27.     package require tcltest
  28.     namespace import ::tcltest::test
  29.     test a-1.0 {test a} {
  30. list 0
  31.     } {0}
  32.     test b-1.0 {test b} {
  33. list 1
  34.     } {0}
  35.     test c-1.0 {test c} {knownBug} {
  36.     } {}
  37.     test d-1.0 {test d} {
  38. error "foo" foo 9
  39.     } {}
  40.     tcltest::cleanupTests
  41.     exit
  42. } test.tcl
  43. cd [temporaryDirectory]
  44. testConstraint exec [llength [info commands exec]]
  45. # test -help
  46. # Child processes because -help [exit]s.
  47. test tcltest-1.1 {tcltest -help} {exec} {
  48.     set result [catch {exec [interpreter] test.tcl -help} msg]
  49.     list $result [regexp Usage $msg]
  50. } {1 1} 
  51. test tcltest-1.2 {tcltest -help -something} {exec} {
  52.     set result [catch {exec [interpreter] test.tcl -help -something} msg]
  53.     list $result [regexp Usage $msg]
  54. } {1 1}
  55. test tcltest-1.3 {tcltest -h} {exec} {
  56.     set result [catch {exec [interpreter] test.tcl -h} msg]
  57.     list $result [regexp Usage $msg]
  58. } {1 0} 
  59. # -verbose, implicit & explicit testing of [verbose]
  60. proc slave {msgVar args} {
  61.     upvar 1 $msgVar msg
  62.     interp create [namespace current]::i
  63.     # Fake the slave interp into dumping output to a file
  64.     i eval {namespace eval ::tcltest {}}
  65.     i eval "set tcltest::outputChannel
  66.     [[list open [set of [makeFile {} output]] w]]"
  67.     i eval "set tcltest::errorChannel
  68.     [[list open [set ef [makeFile {} error]] w]]"
  69.     i eval [list set argv0 [lindex $args 0]]
  70.     i eval [list set argv [lrange $args 1 end]]
  71.     i eval [list package ifneeded tcltest [package provide tcltest] 
  72.     [package ifneeded tcltest [package provide tcltest]]]
  73.     i eval {proc exit args {}}
  74.     # Need to capture output in msg
  75.     set code [catch {i eval {source $argv0}} foo]
  76. if $code {
  77. #puts "$code: $foon$::errorInfo"
  78. }
  79.     i eval {close $tcltest::outputChannel}
  80.     interp delete [namespace current]::i
  81.     set f [open $of]
  82.     set msg [read -nonewline $f]
  83.     close $f
  84.     set f [open $ef]
  85.     set err [read -nonewline $f]
  86.     close $f
  87.     removeFile output
  88.     removeFile error
  89.     if {[string length $err]} {
  90. set code 1
  91. append msg n$err
  92.     }
  93.     return $code
  94. #    return [catch {uplevel 1 [linsert $args 0  exec [interpreter]]} msg]
  95. }
  96. test tcltest-2.0 {tcltest (verbose default - 'b')} {unixOrPc} {
  97.     set result [slave msg test.tcl]
  98.     list $result [regexp "Contents of test case" $msg] [regexp a-1.0 $msg] 
  99.     [regexp c-1.0 $msg] 
  100.     [regexp "Total.+4.+Passed.+1.+Skipped.+1.+Failed.+2" $msg]
  101. } {0 1 0 0 1}
  102. test tcltest-2.1 {tcltest -verbose 'b'} {unixOrPc} {
  103.     set result [slave msg test.tcl -verbose 'b']
  104.     list $result [regexp "Contents of test case" $msg] [regexp a-1.0 $msg] 
  105.     [regexp c-1.0 $msg] 
  106.     [regexp "Total.+4.+Passed.+1.+Skipped.+1.+Failed.+2" $msg]
  107. } {0 1 0 0 1}
  108. test tcltest-2.2 {tcltest -verbose 'p'} {unixOrPc} {
  109.     set result [slave msg test.tcl -verbose 'p']
  110.     list $result [regexp "Contents of test case" $msg] [regexp a-1.0 $msg] 
  111.     [regexp c-1.0 $msg] 
  112.     [regexp "Total.+4.+Passed.+1.+Skipped.+1.+Failed.+2" $msg]
  113. } {0 0 1 0 1}
  114. test tcltest-2.3 {tcltest -verbose 's'} {unixOrPc} {
  115.     set result [slave msg test.tcl -verbose 's']
  116.     list $result [regexp "Contents of test case" $msg] [regexp a-1.0 $msg] 
  117.     [regexp c-1.0 $msg] 
  118.     [regexp "Total.+4.+Passed.+1.+Skipped.+1.+Failed.+2" $msg]
  119. } {0 0 0 1 1}
  120. test tcltest-2.4 {tcltest -verbose 'ps'} {unixOrPc} {
  121.     set result [slave msg test.tcl -verbose 'ps']
  122.     list $result [regexp "Contents of test case" $msg] [regexp a-1.0 $msg] 
  123.     [regexp c-1.0 $msg] 
  124.     [regexp "Total.+4.+Passed.+1.+Skipped.+1.+Failed.+2" $msg]
  125. } {0 0 1 1 1}
  126. test tcltest-2.5 {tcltest -verbose 'psb'} {unixOrPc} {
  127.     set result [slave msg test.tcl -verbose 'psb']
  128.     list $result [regexp "Contents of test case" $msg] [regexp a-1.0 $msg] 
  129.     [regexp c-1.0 $msg] 
  130.     [regexp "Total.+4.+Passed.+1.+Skipped.+1.+Failed.+2" $msg]
  131. } {0 1 1 1 1}
  132. test tcltest-2.5a {tcltest -verbose 'pass skip body'} {unixOrPc} {
  133.     set result [slave msg test.tcl -verbose "pass skip body"]
  134.     list $result [regexp "Contents of test case" $msg] [regexp a-1.0 $msg] 
  135.     [regexp c-1.0 $msg] 
  136.     [regexp "Total.+4.+Passed.+1.+Skipped.+1.+Failed.+2" $msg]
  137. } {0 1 1 1 1}
  138. test tcltest-2.6 {tcltest -verbose 't'}  {
  139.     -constraints {unixOrPc} 
  140.     -body {
  141. set result [slave msg test.tcl -verbose 't']
  142. list $result $msg
  143.     }
  144.     -result {^0 .*a-1.0 start.*b-1.0 start}
  145.     -match regexp
  146. }
  147. test tcltest-2.6a {tcltest -verbose 'start'}  {
  148.     -constraints {unixOrPc} 
  149.     -body {
  150. set result [slave msg test.tcl -verbose start]
  151. list $result $msg
  152.     }
  153.     -result {^0 .*a-1.0 start.*b-1.0 start}
  154.     -match regexp
  155. }
  156. test tcltest-2.7 {tcltest::verbose}  {
  157.     -body {
  158. set oldVerbosity [verbose]
  159. verbose bar
  160. set currentVerbosity [verbose]
  161. verbose foo
  162. set newVerbosity [verbose]
  163. verbose $oldVerbosity
  164. list $currentVerbosity $newVerbosity 
  165.     }
  166.     -result {body {}}
  167. }
  168. test tcltest-2.8 {tcltest -verbose 'error'} {
  169.     -constraints {unixOrPc}
  170.     -body {
  171. set result [slave msg test.tcl -verbose error]
  172. list $result $msg
  173.     }
  174.     -result {errorInfo: foo.*errorCode: 9}
  175.     -match regexp
  176. }
  177. # -match, [match]
  178. test tcltest-3.1 {tcltest -match 'a*'} {unixOrPc} {
  179.     set result [slave msg test.tcl -match a* -verbose 'ps']
  180.     list $result [regexp a-1.0 $msg] [regexp b-1.0 $msg] [regexp c-1.0 $msg] 
  181.     [regexp "Total.+4.+Passed.+1.+Skipped.+3.+Failed.+0" $msg]
  182. } {0 1 0 0 1}
  183. test tcltest-3.2 {tcltest -match 'b*'} {unixOrPc} {
  184.     set result [slave msg test.tcl -match b* -verbose 'ps']
  185.     list $result [regexp a-1.0 $msg] [regexp b-1.0 $msg] [regexp c-1.0 $msg] 
  186.     [regexp "Total.+4.+Passed.+0.+Skipped.+3.+Failed.+1" $msg]
  187. } {0 0 1 0 1}
  188. test tcltest-3.3 {tcltest -match 'c*'} {unixOrPc} {
  189.     set result [slave msg test.tcl -match c* -verbose 'ps']
  190.     list $result [regexp a-1.0 $msg] [regexp b-1.0 $msg] [regexp c-1.0 $msg] 
  191.     [regexp "Total.+4.+Passed.+0.+Skipped.+4.+Failed.+0" $msg]
  192. } {0 0 0 1 1}
  193. test tcltest-3.4 {tcltest -match 'a* b*'} {unixOrPc} {
  194.     set result [slave msg test.tcl -match {a* b*} -verbose 'ps']
  195.     list $result [regexp a-1.0 $msg] [regexp b-1.0 $msg] [regexp c-1.0 $msg] 
  196.     [regexp "Total.+4.+Passed.+1.+Skipped.+2.+Failed.+1" $msg]
  197. } {0 1 1 0 1}
  198. test tcltest-3.5 {tcltest::match}  {
  199.     -body {
  200. set oldMatch [match]
  201. match foo
  202. set currentMatch [match]
  203. match bar
  204. set newMatch [match]
  205. match $oldMatch
  206. list $currentMatch $newMatch
  207.     }
  208.     -result {foo bar}
  209. }
  210. # -skip, [skip]
  211. test tcltest-4.1 {tcltest -skip 'a*'} {unixOrPc} {
  212.     set result [slave msg test.tcl -skip a* -verbose 'ps']
  213.     list $result [regexp a-1.0 $msg] [regexp b-1.0 $msg] [regexp c-1.0 $msg] 
  214.     [regexp "Total.+4.+Passed.+0.+Skipped.+2.+Failed.+1" $msg]
  215. } {0 0 1 1 1}
  216. test tcltest-4.2 {tcltest -skip 'b*'} {unixOrPc} {
  217.     set result [slave msg test.tcl -skip b* -verbose 'ps']
  218.     list $result [regexp a-1.0 $msg] [regexp b-1.0 $msg] [regexp c-1.0 $msg] 
  219.     [regexp "Total.+4.+Passed.+1.+Skipped.+2.+Failed.+1" $msg]
  220. } {0 1 0 1 1}
  221. test tcltest-4.3 {tcltest -skip 'c*'} {unixOrPc} {
  222.     set result [slave msg test.tcl -skip c* -verbose 'ps']
  223.     list $result [regexp a-1.0 $msg] [regexp b-1.0 $msg] [regexp c-1.0 $msg] 
  224.     [regexp "Total.+4.+Passed.+1.+Skipped.+1.+Failed.+2" $msg]
  225. } {0 1 1 0 1}
  226. test tcltest-4.4 {tcltest -skip 'a* b*'} {unixOrPc} {
  227.     set result [slave msg test.tcl -skip {a* b*} -verbose 'ps']
  228.     list $result [regexp a-1.0 $msg] [regexp b-1.0 $msg] [regexp c-1.0 $msg] 
  229.     [regexp "Total.+4.+Passed.+0.+Skipped.+3.+Failed.+1" $msg]
  230. } {0 0 0 1 1}
  231. test tcltest-4.5 {tcltest -match 'a* b*' -skip 'b*'} {unixOrPc} {
  232.     set result [slave msg test.tcl -match {a* b*} -skip b* -verbose 'ps']
  233.     list $result [regexp a-1.0 $msg] [regexp b-1.0 $msg] [regexp c-1.0 $msg] 
  234.     [regexp "Total.+4.+Passed.+1.+Skipped.+3.+Failed.+0" $msg]
  235. } {0 1 0 0 1}
  236. test tcltest-4.6 {tcltest::skip} {
  237.     -body {
  238. set oldSkip [skip]
  239. skip foo
  240. set currentSkip [skip]
  241. skip bar
  242. set newSkip [skip]
  243. skip $oldSkip
  244. list $currentSkip $newSkip
  245.     }
  246.     -result {foo bar}
  247. }
  248. # -constraints, -limitconstraints, [testConstraint],
  249. # $constraintsSpecified, [limitConstraints]
  250. test tcltest-5.1 {tcltest -constraints 'knownBug'} {unixOrPc} {
  251.     set result [slave msg test.tcl -constraints knownBug -verbose 'ps']
  252.     list $result [regexp a-1.0 $msg] [regexp b-1.0 $msg] [regexp c-1.0 $msg] 
  253.     [regexp "Total.+4.+Passed.+2.+Skipped.+0.+Failed.+2" $msg]
  254. } {0 1 1 1 1}
  255. test tcltest-5.2 {tcltest -constraints 'knownBug' -limitconstraints 1} {unixOrPc} {
  256.     set result [slave msg test.tcl -constraints knownBug -verbose 'p' -limitconstraints 1]
  257.     list $result [regexp a-1.0 $msg] [regexp b-1.0 $msg] [regexp c-1.0 $msg] 
  258.     [regexp "Total.+4.+Passed.+1.+Skipped.+3.+Failed.+0" $msg]
  259. } {0 0 0 1 1}
  260. test tcltest-5.3 {testConstraint - constraint empty (tcltest::safeFetch)}  {
  261.     -body {
  262. set r1 [testConstraint tcltestFakeConstraint]
  263. set r2 [testConstraint tcltestFakeConstraint 4]
  264. set r3 [testConstraint tcltestFakeConstraint]
  265. list $r1 $r2 $r3
  266.     }
  267.     -result {0 4 4}
  268.     -cleanup {unset ::tcltest::testConstraints(tcltestFakeConstraint)}
  269. }
  270. # Removed this test of internals of tcltest.  Those internals have changed.
  271. #test tcltest-5.4 {tcltest::constraintsSpecified} {
  272. #    -setup {
  273. # set constraintlist $::tcltest::constraintsSpecified
  274. # set ::tcltest::constraintsSpecified {}
  275. #    }
  276. #    -body {
  277. # set r1 $::tcltest::constraintsSpecified
  278. # testConstraint tcltestFakeConstraint1 1
  279. # set r2 $::tcltest::constraintsSpecified
  280. # testConstraint tcltestFakeConstraint2 1
  281. # set r3 $::tcltest::constraintsSpecified
  282. # list $r1 $r2 $r3
  283. #    }
  284. #    -result {{} tcltestFakeConstraint1 {tcltestFakeConstraint1 tcltestFakeConstraint2}}
  285. #    -cleanup {
  286. # set ::tcltest::constraintsSpecified $constraintlist
  287. # unset ::tcltest::testConstraints(tcltestFakeConstraint1) 
  288. # unset ::tcltest::testConstraints(tcltestFakeConstraint2) 
  289. #    }
  290. #}
  291. test tcltest-5.5 {InitConstraints: list of built-in constraints} 
  292. -constraints {!singleTestInterp} 
  293. -setup {tcltest::InitConstraints} 
  294. -body { lsort [array names ::tcltest::testConstraints] } 
  295. -result [lsort {
  296.     95 98 asyncPipeClose eformat emptyTest exec hasIsoLocale interactive
  297.     knownBug mac macCrash macOnly macOrPc macOrUnix macOrWin nonBlockFiles
  298.     nonPortable notRoot nt pc pcCrash pcOnly root singleTestInterp socket
  299.     stdio tempNotMac tempNotPc tempNotUnix tempNotWin unix unixCrash unixExecs
  300.     unixOnly unixOrPc unixOrWin userInteraction win winCrash winOnly
  301. }]
  302. # Removed this broken test.  Its usage of [limitConstraints] was not
  303. # in agreement with the documentation.  [limitConstraints] is supposed
  304. # to take an optional boolean argument, and "knownBug" ain't no boolean!
  305. #test tcltest-5.6 {tcltest::limitConstraints} {
  306. #    -setup {
  307. #        set keeplc $::tcltest::limitConstraints
  308. #        set keepkb [testConstraint knownBug]
  309. #    }
  310. #    -body {
  311. #        set r1 [limitConstraints]
  312. #        set r2 [limitConstraints knownBug]
  313. #        set r3 [limitConstraints]
  314. #        list $r1 $r2 $r3
  315. #    }
  316. #    -cleanup {
  317. #        limitConstraints $keeplc
  318. #        testConstraint knownBug $keepkb
  319. #    }
  320. #    -result {false knownBug knownBug}
  321. #}
  322. # -outfile, -errfile, [outputChannel], [outputFile], [errorChannel], [errorFile]
  323. set printerror [makeFile {
  324.     package require tcltest
  325.     namespace import ::tcltest::*
  326.     puts [outputChannel] "a test"
  327.     ::tcltest::PrintError "a really short string"
  328.     ::tcltest::PrintError "a really really really really really really long 
  329.     string containing "quotes" and other bad bad stuff"
  330.     ::tcltest::PrintError "a really really long string containing a 
  331.     "Path/that/is/really/long/and/contains/no/spaces""
  332.     ::tcltest::PrintError "a really really long string containing a 
  333.     "Really/Long/Path/that/contains/no/spaces/and/is/longer/than/eighty/characters/to/see/what/happens"" 
  334.     ::tcltest::PrintError "Problem renaming file: error renaming "Z:/ws/tcl8.2/win32-ix86/tests/core" to "Z:/ws/tcl8.2/win32-ix86/tests/movecore-core""
  335.     exit
  336. } printerror.tcl]
  337. test tcltest-6.1 {tcltest -outfile, -errfile defaults} {
  338.     -constraints unixOrPc
  339.     -body {
  340. slave msg $printerror
  341. return $msg
  342.     }
  343.     -result {a test.*a really}
  344.     -match regexp
  345. }
  346. test tcltest-6.2 {tcltest -outfile a.tmp} {unixOrPc unixExecs} {
  347.     slave msg $printerror -outfile a.tmp
  348.     set result1 [catch {exec grep "a test" a.tmp}]
  349.     set result2 [catch {exec grep "a really" a.tmp}]
  350.     list [regexp "a test" $msg] [regexp "a really" $msg] 
  351.     $result1 $result2 [file exists a.tmp] [file delete a.tmp] 
  352. } {0 1 0 1 1 {}}
  353. test tcltest-6.3 {tcltest -errfile a.tmp} {unixOrPc unixExecs} {
  354.     slave msg $printerror -errfile a.tmp
  355.     set result1 [catch {exec grep "a test" a.tmp}]
  356.     set result2 [catch {exec grep "a really" a.tmp}]
  357.     list [regexp "a test" $msg] [regexp "a really" $msg] 
  358.     $result1 $result2 [file exists a.tmp] [file delete a.tmp]
  359. } {1 0 1 0 1 {}}
  360. test tcltest-6.4 {tcltest -outfile a.tmp -errfile b.tmp} {unixOrPc unixExecs} {
  361.     slave msg $printerror -outfile a.tmp -errfile b.tmp
  362.     set result1 [catch {exec grep "a test" a.tmp}]
  363.     set result2 [catch {exec grep "a really" b.tmp}]
  364.     list [regexp "a test" $msg] [regexp "a really" $msg] 
  365.     $result1 $result2 
  366.     [file exists a.tmp] [file delete a.tmp] 
  367.     [file exists b.tmp] [file delete b.tmp]
  368. } {0 0 0 0 1 {} 1 {}}
  369. test tcltest-6.5 {tcltest::errorChannel - retrieval} {
  370.     -setup {
  371. set of [errorChannel]
  372. set ::tcltest::errorChannel stderr
  373.     }
  374.     -body {
  375. errorChannel
  376.     }
  377.     -result {stderr}
  378.     -cleanup {
  379. set ::tcltest::errorChannel $of
  380.     }
  381. }
  382. test tcltest-6.6 {tcltest::errorFile (implicit errorChannel)} {
  383.     -setup {
  384. set ef [makeFile {} efile]
  385. set of [errorFile]
  386. set ::tcltest::errorChannel stderr
  387. set ::tcltest::errorFile stderr
  388.     }
  389.     -body {
  390. set f0 [errorChannel]
  391. set f1 [errorFile]
  392. set f2 [errorFile $ef]
  393. set f3 [errorChannel]
  394. set f4 [errorFile]
  395. subst {$f0;$f1;$f2;$f3;$f4} 
  396.     }
  397.     -result {stderr;stderr;.*efile;file[0-9a-f]+;.*efile}
  398.     -match regexp
  399.     -cleanup {
  400. errorFile $of
  401. removeFile efile
  402.     }
  403. }
  404. test tcltest-6.7 {tcltest::outputChannel - retrieval} {
  405.     -setup {
  406. set of [outputChannel]
  407. set ::tcltest::outputChannel stdout
  408.     }
  409.     -body {
  410. outputChannel
  411.     }
  412.     -result {stdout}
  413.     -cleanup {
  414. set tcltest::outputChannel $of
  415.     }
  416. }
  417. test tcltest-6.8 {tcltest::outputFile (implicit outputFile)} {
  418.     -setup {
  419. set ef [makeFile {} efile]
  420. set of [outputFile]
  421. set ::tcltest::outputChannel stdout
  422. set ::tcltest::outputFile stdout
  423.     }
  424.     -body {
  425. set f0 [outputChannel]
  426. set f1 [outputFile]
  427. set f2 [outputFile $ef]
  428. set f3 [outputChannel]
  429. set f4 [outputFile]
  430. subst {$f0;$f1;$f2;$f3;$f4} 
  431.     }
  432.     -result {stdout;stdout;.*efile;file[0-9a-f]+;.*efile}
  433.     -match regexp
  434.     -cleanup {
  435. outputFile $of
  436. removeFile efile
  437.     }
  438. }
  439. # -debug, [debug]
  440. # Must use child processes to test -debug because it always writes
  441. # messages to stdout, and we have no way to capture stdout of a
  442. # slave interp
  443. test tcltest-7.1 {tcltest test.tcl -debug 0} {unixOrPc} {
  444.     catch {exec [interpreter] test.tcl -debug 0} msg
  445.     regexp "Flags passed into tcltest" $msg
  446. } {0}
  447. test tcltest-7.2 {tcltest test.tcl -debug 1} {unixOrPc} {
  448.     catch {exec [interpreter] test.tcl -debug 1 -skip b*} msg
  449.     list [regexp userSpecifiedSkip $msg] 
  450.     [regexp "Flags passed into tcltest" $msg]
  451. } {1 0}
  452. test tcltest-7.3 {tcltest test.tcl -debug 1} {unixOrPc} {
  453.     catch {exec [interpreter] test.tcl -debug 1 -match b*} msg
  454.     list [regexp userSpecifiedNonMatch $msg] 
  455.     [regexp "Flags passed into tcltest" $msg]
  456. } {1 0}
  457. test tcltest-7.4 {tcltest test.tcl -debug 2} {unixOrPc} {
  458.     catch {exec [interpreter] test.tcl -debug 2} msg
  459.     list [regexp "Flags passed into tcltest" $msg] [regexp "Running" $msg]
  460. } {1 0}
  461. test tcltest-7.5 {tcltest test.tcl -debug 3} {unixOrPc} {
  462.     catch {exec [interpreter] test.tcl -debug 3} msg
  463.     list [regexp "Flags passed into tcltest" $msg] [regexp "Running" $msg]
  464. } {1 1}
  465. test tcltest-7.6 {tcltest::debug} {
  466.     -setup {
  467. set old $::tcltest::debug
  468. set ::tcltest::debug 0
  469.     }
  470.     -body {
  471. set f1 [debug]
  472. set f2 [debug 1]
  473. set f3 [debug]
  474. set f4 [debug 2]
  475. set f5 [debug]
  476. list $f1 $f2 $f3 $f4 $f5
  477.     }
  478.     -result {0 1 1 2 2}
  479.     -cleanup {
  480. set ::tcltest::debug $old
  481.     }
  482. }
  483. removeFile test.tcl
  484. # directory tests
  485. set a [makeFile {
  486.     package require tcltest
  487.     tcltest::makeFile {} a.tmp
  488.     puts [tcltest::outputChannel] "testdir: [tcltest::testsDirectory]"
  489.     exit
  490. } a.tcl]
  491. set tdiaf [makeFile {} thisdirectoryisafile]
  492. set normaldirectory [makeDirectory normaldirectory]
  493. normalizePath normaldirectory
  494. # -tmpdir, [temporaryDirectory]
  495. test tcltest-8.1 {tcltest a.tcl -tmpdir a} {unixOrPc} {
  496.     file delete -force thisdirectorydoesnotexist
  497.     slave msg $a -tmpdir thisdirectorydoesnotexist
  498.     list [file exists [file join thisdirectorydoesnotexist a.tmp]] 
  499.     [file delete -force thisdirectorydoesnotexist] 
  500. } {1 {}}
  501. test tcltest-8.2 {tcltest a.tcl -tmpdir thisdirectoryisafile} {
  502.     -constraints unixOrPc
  503.     -body {
  504. slave msg $a -tmpdir $tdiaf
  505. set msg
  506.     }
  507.     -result {*not a directory*}
  508.     -match glob
  509. }
  510. # Test non-writeable directories, non-readable directories with directory flags
  511. set notReadableDir [file join [temporaryDirectory] notreadable]
  512. set notWriteableDir [file join [temporaryDirectory] notwriteable]
  513. makeDirectory notreadable
  514. makeDirectory notwriteable
  515. switch $tcl_platform(platform) {
  516.     "unix" {
  517. file attributes $notReadableDir -permissions 00333
  518. file attributes $notWriteableDir -permissions 00555
  519.     }
  520.     default {
  521. catch {file attributes $notWriteableDir -readonly 1}
  522. catch {testchmod 000 $notWriteableDir}
  523.     }
  524. }
  525. test tcltest-8.3 {tcltest a.tcl -tmpdir notReadableDir} {unix notRoot} {
  526.     slave msg $a -tmpdir $notReadableDir 
  527.     string match {*not readable*} $msg
  528. } {1}
  529. test tcltest-8.4 {tcltest a.tcl -tmpdir notWriteableDir} {unixOrPc notRoot} {
  530.     slave msg $a -tmpdir $notWriteableDir
  531.     string match {*not writeable*} $msg
  532. } {1}
  533. test tcltest-8.5 {tcltest a.tcl -tmpdir normaldirectory} {unixOrPc} {
  534.     slave msg $a -tmpdir $normaldirectory
  535.     # The join is necessary because the message can be split on multiple lines
  536.     list [file exists [file join $normaldirectory a.tmp]] 
  537.     [file delete [file join $normaldirectory a.tmp]] 
  538. } {1 {}}   
  539. cd [workingDirectory]
  540. test tcltest-8.6 {temporaryDirectory}  {
  541.     -setup {
  542. set old $::tcltest::temporaryDirectory
  543. set ::tcltest::temporaryDirectory $normaldirectory
  544.     }
  545.     -body {
  546. set f1 [temporaryDirectory]
  547. set f2 [temporaryDirectory [workingDirectory]]
  548. set f3 [temporaryDirectory]
  549. list $f1 $f2 $f3
  550.     }
  551.     -result "[list $normaldirectory [workingDirectory] [workingDirectory]]"
  552.     -cleanup {
  553. set ::tcltest::temporaryDirectory $old
  554.     }
  555. }
  556. test tcltest-8.6a {temporaryDirectory - test format 2} -setup {
  557.     set old $::tcltest::temporaryDirectory
  558.     set ::tcltest::temporaryDirectory $normaldirectory
  559. } -body {
  560.     set f1 [temporaryDirectory]
  561.     set f2 [temporaryDirectory [workingDirectory]]
  562.     set f3 [temporaryDirectory]
  563.     list $f1 $f2 $f3
  564. } -cleanup {
  565.     set ::tcltest::temporaryDirectory $old
  566. } -result [list $normaldirectory [workingDirectory] [workingDirectory]]
  567. cd [temporaryDirectory]
  568. # -testdir, [testsDirectory]
  569. test tcltest-8.10 {tcltest a.tcl -testdir thisdirectorydoesnotexist} {unixOrPc} {
  570.     file delete -force thisdirectorydoesnotexist
  571.     slave msg $a -testdir thisdirectorydoesnotexist
  572.     string match "*does not exist*" $msg
  573. } {1}
  574. test tcltest-8.11 {tcltest a.tcl -testdir thisdirectoryisafile} {unixOrPc} {
  575.     slave msg $a -testdir $tdiaf
  576.     string match "*not a directory*" $msg 
  577. } {1}
  578. test tcltest-8.12 {tcltest a.tcl -testdir notReadableDir} {unix notRoot} {
  579.     slave msg $a -testdir $notReadableDir 
  580.     string match {*not readable*} $msg
  581. } {1}
  582. test tcltest-8.13 {tcltest a.tcl -testdir normaldirectory} {unixOrPc} {
  583.     slave msg $a -testdir $normaldirectory
  584.     # The join is necessary because the message can be split on multiple lines
  585.     list [string first "testdir: $normaldirectory" [join $msg]] 
  586.     [file exists [file join [temporaryDirectory] a.tmp]] 
  587.     [file delete [file join [temporaryDirectory] a.tmp]] 
  588. } {0 1 {}} 
  589. cd [workingDirectory]
  590. set current [pwd]
  591. test tcltest-8.14 {testsDirectory} {
  592.     -setup {
  593. set old $::tcltest::testsDirectory
  594. set ::tcltest::testsDirectory $normaldirectory
  595.     }
  596.     -body {
  597. set f1 [testsDirectory]
  598. set f2 [testsDirectory $current]
  599. set f3 [testsDirectory]
  600. list $f1 $f2 $f3
  601.     }
  602.     -result "[list $normaldirectory $current $current]"
  603.     -cleanup {
  604. set ::tcltest::testsDirectory $old
  605.     }
  606. }
  607. # [workingDirectory]
  608. test tcltest-8.60 {::workingDirectory}  {
  609.     -setup {
  610. set old $::tcltest::workingDirectory
  611. set current [pwd]
  612. set ::tcltest::workingDirectory $normaldirectory
  613. cd $normaldirectory
  614.     }
  615.     -body {
  616. set f1 [workingDirectory]
  617. set f2 [pwd]
  618. set f3 [workingDirectory $current]
  619. set f4 [pwd] 
  620. set f5 [workingDirectory]
  621. list $f1 $f2 $f3 $f4 $f5
  622.     }
  623.     -result "[list $normaldirectory 
  624.                    $normaldirectory 
  625.                    $current 
  626.                    $current 
  627.                    $current]"
  628.     -cleanup {
  629. set ::tcltest::workingDirectory $old
  630. cd $current
  631.     }
  632. }
  633. # clean up from directory testing
  634. switch $tcl_platform(platform) {
  635.     "unix" {
  636. file attributes $notReadableDir -permissions 777
  637. file attributes $notWriteableDir -permissions 777
  638.     }
  639.     default {
  640. catch {file attributes $notWriteableDir -readonly 0}
  641.     }
  642. }
  643. file delete -force $notReadableDir $notWriteableDir
  644. removeFile a.tcl
  645. removeFile thisdirectoryisafile
  646. removeDirectory normaldirectory
  647. # -file, -notfile, [matchFiles], [skipFiles]
  648. test tcltest-9.1 {-file d*.tcl} -constraints {unixOrPc} -setup {
  649.     set old [testsDirectory]
  650.     testsDirectory [file dirname [info script]]
  651. } -body {
  652.     slave msg [file join [testsDirectory] all.tcl] -file d*.test
  653.     set msg
  654. } -cleanup {
  655.     testsDirectory $old
  656. } -match regexp -result {dstring.test}
  657. test tcltest-9.2 {-file d*.tcl} -constraints {unixOrPc} -setup {
  658.     set old [testsDirectory]
  659.     testsDirectory [file dirname [info script]]
  660. } -body {
  661.     slave msg [file join [testsDirectory] all.tcl] 
  662.     -file d*.test -notfile dstring*
  663.     regexp {dstring.test} $msg
  664. } -cleanup {
  665.     testsDirectory $old
  666. } -result 0
  667. test tcltest-9.3 {matchFiles}  {
  668.     -body {
  669. set old [matchFiles]
  670. matchFiles foo
  671. set current [matchFiles]
  672. matchFiles bar
  673. set new [matchFiles]
  674. matchFiles $old
  675. list $current $new
  676.     } 
  677.     -result {foo bar}
  678. }
  679. test tcltest-9.4 {skipFiles} {
  680.     -body {
  681. set old [skipFiles]
  682. skipFiles foo
  683. set current [skipFiles]
  684. skipFiles bar
  685. set new [skipFiles]
  686. skipFiles $old
  687. list $current $new
  688.     } 
  689.     -result {foo bar}
  690. }
  691. test tcltest-9.5 {GetMatchingFiles: Bug 1119798} -setup {
  692.     set d [makeDirectory tmp]
  693.     makeDirectory foo $d
  694.     makeFile {} fee $d
  695.     file copy [file join [file dirname [info script]] all.tcl] $d
  696. } -body {
  697.     slave msg [file join [temporaryDirectory] all.tcl] -file f*
  698.     regexp {exiting with errors:} $msg
  699. } -cleanup {
  700.     file delete [file join $d all.tcl]
  701.     removeFile fee $d
  702.     removeDirectory foo $d
  703.     removeDirectory tmp
  704. } -result 0
  705. # -preservecore, [preserveCore]
  706. set mc [makeFile {
  707.     package require tcltest
  708.     namespace import ::tcltest::test
  709.     test makecore {make a core file} {
  710. set f [open core w]
  711. close $f
  712.     } {}
  713.     ::tcltest::cleanupTests
  714.     return
  715. } makecore.tcl]
  716. cd [temporaryDirectory]
  717. test tcltest-10.1 {-preservecore 0} {unixOrPc} {
  718.     slave msg $mc -preservecore 0
  719.     file delete core
  720.     regexp "Core file produced" $msg
  721. } {0}
  722. test tcltest-10.2 {-preservecore 1} {unixOrPc} {
  723.     slave msg $mc -preservecore 1
  724.     file delete core
  725.     regexp "Core file produced" $msg
  726. } {1}
  727. test tcltest-10.3 {-preservecore 2} {unixOrPc} {
  728.     slave msg $mc -preservecore 2
  729.     file delete core
  730.     list [regexp "Core file produced" $msg] [regexp "Moving file to" $msg] 
  731.     [regexp "core-" $msg] [file delete core-makecore]
  732. } {1 1 1 {}}
  733. test tcltest-10.4 {-preservecore 3} {unixOrPc} {
  734.     slave msg $mc -preservecore 3
  735.     file delete core
  736.     list [regexp "Core file produced" $msg] [regexp "Moving file to" $msg] 
  737.     [regexp "core-" $msg] [file delete core-makecore]
  738. } {1 1 1 {}}
  739. # Removing this test.  It makes no sense to test the ability of
  740. # [preserveCore] to accept an invalid value that will cause errors
  741. # in other parts of tcltest's operation.
  742. #test tcltest-10.5 {preserveCore} {
  743. #    -body {
  744. # set old [preserveCore]
  745. # set result [preserveCore foo]
  746. # set result2 [preserveCore]
  747. # preserveCore $old
  748. # list $result $result2
  749. #    }
  750. #    -result {foo foo}
  751. #}
  752. removeFile makecore.tcl
  753. # -load, -loadfile, [loadScript], [loadFile]
  754. set contents { 
  755.     package require tcltest
  756.     namespace import tcltest::*
  757.     puts [outputChannel] $::tcltest::loadScript
  758.     exit
  759. set loadfile [makeFile $contents load.tcl]
  760. test tcltest-12.1 {-load xxx} {unixOrPc} {
  761.     slave msg $loadfile -load xxx
  762.     set msg
  763. } {xxx}
  764. # Using child process because of -debug usage.
  765. test tcltest-12.2 {-loadfile load.tcl} {unixOrPc} {
  766.     catch {exec [interpreter] $loadfile -debug 2 -loadfile $loadfile} msg
  767.     list 
  768.     [regexp {tcltest} [join [list $msg] [split $msg n]]] 
  769.     [regexp {loadScript} [join [list $msg] [split $msg n]]]
  770. } {1 1}
  771. test tcltest-12.3 {loadScript} {
  772.     -setup {
  773. set old $::tcltest::loadScript
  774. set ::tcltest::loadScript {}
  775.     }
  776.     -body {
  777. set f1 [loadScript]
  778. set f2 [loadScript xxx]
  779. set f3 [loadScript]
  780. list $f1 $f2 $f3
  781.     }
  782.     -result {{} xxx xxx}
  783.     -cleanup {
  784. set ::tcltest::loadScript $old
  785.     }
  786. }
  787. test tcltest-12.4 {loadFile} {
  788.     -setup {
  789. set olds $::tcltest::loadScript
  790. set ::tcltest::loadScript {}
  791. set oldf $::tcltest::loadFile
  792. set ::tcltest::loadFile {}
  793.     }
  794.     -body {
  795. set f1 [loadScript]
  796. set f2 [loadFile]
  797. set f3 [loadFile $loadfile]
  798. set f4 [loadScript]
  799. set f5 [loadFile]
  800. list $f1 $f2 $f3 $f4 $f5
  801.     }
  802.     -result "[list {} {} $loadfile $contents $loadfile]n"
  803.     -cleanup {
  804. set ::tcltest::loadScript $olds
  805. set ::tcltest::loadFile $oldf
  806.     }
  807. }
  808. removeFile load.tcl
  809. # [interpreter]
  810. test tcltest-13.1 {interpreter} {
  811.     -setup {
  812. set old $::tcltest::tcltest
  813. set ::tcltest::tcltest tcltest
  814.     }
  815.     -body {
  816. set f1 [interpreter]
  817. set f2 [interpreter tclsh]
  818. set f3 [interpreter]
  819. list $f1 $f2 $f3
  820.     }
  821.     -result {tcltest tclsh tclsh}
  822.     -cleanup {
  823. set ::tcltest::tcltest $old
  824.     }
  825. }
  826. # -singleproc, [singleProcess]
  827. set spd [makeDirectory singleprocdir]
  828. makeFile {
  829.     set foo 1
  830. } single1.test $spd
  831. makeFile {
  832.     unset foo
  833. } single2.test $spd
  834. set allfile [makeFile {
  835.     package require tcltest
  836.     namespace import tcltest::*
  837.     testsDirectory [file join [temporaryDirectory] singleprocdir]
  838.     runAllTests
  839. } all-single.tcl $spd]
  840. cd [workingDirectory]
  841. test tcltest-14.1 {-singleproc - single process} {
  842.     -constraints {unixOrPc}
  843.     -body {
  844. slave msg $allfile -singleproc 0 -tmpdir [temporaryDirectory]
  845. set msg
  846.     }
  847.     -result {Test file error: can't unset .foo.: no such variable}
  848.     -match regexp
  849. }
  850. test tcltest-14.2 {-singleproc - multiple process} {
  851.     -constraints {unixOrPc}
  852.     -body {
  853. slave msg $allfile -singleproc 1 -tmpdir [temporaryDirectory]
  854. set msg
  855.     }
  856.     -result {single1.test.*single2.test.*all-single.tcl:.*Total.*0.*Passed.*0.*Skipped.*0.*Failed.*0}
  857.     -match regexp
  858. }
  859. test tcltest-14.3 {singleProcess} {
  860.     -setup {
  861. set old $::tcltest::singleProcess
  862. set ::tcltest::singleProcess 0
  863.     }
  864.     -body {
  865. set f1 [singleProcess]
  866. set f2 [singleProcess 1]
  867. set f3 [singleProcess]
  868. list $f1 $f2 $f3
  869.     }
  870.     -result {0 1 1}
  871.     -cleanup {
  872. set ::tcltest::singleProcess $old
  873.     }
  874. }
  875. removeFile single1.test $spd
  876. removeFile single2.test $spd
  877. removeDirectory singleprocdir
  878. # -asidefromdir, -relateddir, [matchDirectories], [skipDirectories]
  879. # Before running these tests, need to set up test subdirectories with their own
  880. # all.tcl files.
  881. set dtd [makeDirectory dirtestdir]
  882. set dtd1 [makeDirectory dirtestdir2.1 $dtd]
  883. set dtd2 [makeDirectory dirtestdir2.2 $dtd]
  884. set dtd3 [makeDirectory dirtestdir2.3 $dtd]
  885. makeFile {
  886.     package require tcltest
  887.     namespace import -force tcltest::*
  888.     testsDirectory [file join [temporaryDirectory] dirtestdir]
  889.     runAllTests
  890. } all.tcl $dtd
  891. makeFile {
  892.     package require tcltest
  893.     namespace import -force tcltest::*
  894.     testsDirectory [file join [temporaryDirectory] dirtestdir dirtestdir2.1]
  895.     runAllTests
  896. } all.tcl $dtd1
  897. makeFile {
  898.     package require tcltest
  899.     namespace import -force tcltest::*
  900.     testsDirectory [file join [temporaryDirectory]  dirtestdir dirtestdir2.2]
  901.     runAllTests
  902. } all.tcl $dtd2
  903. makeFile {
  904.     package require tcltest
  905.     namespace import -force tcltest::*
  906.     testsDirectory [file join [temporaryDirectory] dirtestdir dirtestdir2.3]
  907.     runAllTests
  908. } all.tcl $dtd3
  909. test tcltest-15.1 {basic directory walking} {
  910.     -constraints {unixOrPc}
  911.     -body {
  912. if {[slave msg 
  913. [file join $dtd all.tcl] 
  914. -tmpdir [temporaryDirectory]] == 1} {
  915.     error $msg
  916. }
  917.     }
  918.     -match regexp
  919.     -returnCodes 1
  920.     -result {Tests located in:.*dirtestdir.*Tests located in:.*dirtestdir2.[123].*Tests located in:.*dirtestdir2.[123].*Tests located in:.*dirtestdir2.[123]}
  921. }
  922. test tcltest-15.2 {-asidefromdir} {
  923.     -constraints {unixOrPc}
  924.     -body {
  925. if {[slave msg 
  926. [file join $dtd all.tcl] 
  927. -asidefromdir dirtestdir2.3 
  928. -tmpdir [temporaryDirectory]] == 1} {
  929.     error $msg
  930. }
  931.     }
  932.     -match regexp
  933.     -returnCodes 1
  934.     -result {Tests located in:.*dirtestdir.*Tests located in:.*dirtestdir2.[12].*Tests located in:.*dirtestdir2.[12].*dirtestdir2.[12] test ended at .*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  935. Error:  No test files remain after applying your match and skip patterns!
  936. Error:  No test files remain after applying your match and skip patterns!
  937. Error:  No test files remain after applying your match and skip patterns!$}
  938. }
  939. test tcltest-15.3 {-relateddir, non-existent dir} {
  940.     -constraints {unixOrPc}
  941.     -body {
  942. if {[slave msg 
  943. [file join $dtd all.tcl] 
  944. -relateddir [file join [temporaryDirectory] dirtestdir0] 
  945. -tmpdir [temporaryDirectory]] == 1} {
  946.     error $msg
  947. }
  948.     }
  949.     -returnCodes 1
  950.     -match regexp
  951.     -result {[^~]|dirtestdir[^2]}
  952. }
  953. test tcltest-15.4 {-relateddir, subdir} {
  954.     -constraints {unixOrPc}
  955.     -body {
  956. if {[slave msg 
  957. [file join $dtd all.tcl] 
  958. -relateddir dirtestdir2.1 -tmpdir [temporaryDirectory]] == 1} {
  959.     error $msg
  960. }
  961.     }
  962.     -returnCodes 1
  963.     -match regexp
  964.     -result {Tests located in:.*dirtestdir2.[^23]}
  965. }
  966. test tcltest-15.5 {-relateddir, -asidefromdir} {
  967.     -constraints {unixOrPc}
  968.     -body {
  969. if {[slave msg 
  970. [file join $dtd all.tcl] 
  971. -relateddir "dirtestdir2.1 dirtestdir2.2" 
  972. -asidefromdir dirtestdir2.2 
  973. -tmpdir [temporaryDirectory]] == 1} {
  974.     error $msg
  975. }
  976.     }
  977.     -match regexp
  978.     -returnCodes 1
  979.     -result {Tests located in:.*dirtestdir2.[^23]}
  980. }
  981. test tcltest-15.6 {matchDirectories} {
  982.     -setup {
  983. set old [matchDirectories]
  984. set ::tcltest::matchDirectories {}
  985.     }
  986.     -body {
  987. set r1 [matchDirectories]
  988. set r2 [matchDirectories foo]
  989. set r3 [matchDirectories]
  990. list $r1 $r2 $r3
  991.     }
  992.     -cleanup {
  993. set ::tcltest::matchDirectories $old
  994.     }
  995.     -result {{} foo foo}
  996. }
  997. test tcltest-15.7 {skipDirectories} {
  998.     -setup {
  999. set old [skipDirectories]
  1000. set ::tcltest::skipDirectories {}
  1001.     }
  1002.     -body {
  1003. set r1 [skipDirectories]
  1004. set r2 [skipDirectories foo]
  1005. set r3 [skipDirectories]
  1006. list $r1 $r2 $r3
  1007.     }
  1008.     -cleanup {
  1009. set ::tcltest::skipDirectories $old
  1010.     }
  1011.     -result {{} foo foo}
  1012. }
  1013. removeDirectory dirtestdir2.3 $dtd
  1014. removeDirectory dirtestdir2.2 $dtd
  1015. removeDirectory dirtestdir2.1 $dtd
  1016. removeDirectory dirtestdir
  1017. # TCLTEST_OPTIONS
  1018. test tcltest-19.1 {TCLTEST_OPTIONS default} -setup {
  1019. if {[info exists ::env(TCLTEST_OPTIONS)]} {
  1020.     set oldoptions $::env(TCLTEST_OPTIONS)
  1021. } else {
  1022.     set oldoptions none
  1023. }
  1024. # set this to { } instead of just {} to get around quirk in
  1025. # Windows env handling that removes empty elements from env array.
  1026. set ::env(TCLTEST_OPTIONS) { }
  1027. interp create slave1
  1028. slave1 eval [list set argv {-debug 2}]
  1029. slave1 alias puts puts
  1030. interp create slave2
  1031. slave2 alias puts puts
  1032.     } -cleanup {
  1033. interp delete slave2
  1034. interp delete slave1
  1035. if {$oldoptions == "none"} {
  1036.     unset ::env(TCLTEST_OPTIONS) 
  1037. } else {
  1038.     set ::env(TCLTEST_OPTIONS) $oldoptions
  1039. }
  1040.     } -body {
  1041. slave1 eval [package ifneeded tcltest [package provide tcltest]]
  1042. slave1 eval tcltest::debug
  1043. set ::env(TCLTEST_OPTIONS) "-debug 3"
  1044. slave2 eval [package ifneeded tcltest [package provide tcltest]]
  1045. slave2 eval tcltest::debug
  1046.     } -result {^3$} -match regexp -output
  1047. {tcltest::debugs+= 2.*tcltest::debugs+= 3}
  1048. # Begin testing of tcltest procs ...
  1049. cd [temporaryDirectory]
  1050. # PrintError
  1051. test tcltest-20.1 {PrintError} {unixOrPc} {
  1052.     set result [slave msg $printerror]
  1053.     list $result [regexp "Error:  a really short string" $msg] 
  1054.     [regexp "     "quotes"" $msg] [regexp "    "Path" $msg] 
  1055.     [regexp "    "Really" $msg] [regexp Problem $msg]
  1056. } {1 1 1 1 1 1}
  1057. cd [workingDirectory]
  1058. removeFile printerror.tcl
  1059. # test::test
  1060. test tcltest-21.0 {name and desc but no args specified} -setup {
  1061.     set v [verbose]
  1062. } -cleanup {
  1063.     verbose $v
  1064. } -body {
  1065.    verbose {}
  1066.    test tcltest-21.0.0 bar
  1067. } -result {}
  1068. test tcltest-21.1 {expect with glob} {
  1069.     -body {
  1070. list a b c d e
  1071.     }
  1072.     -match glob
  1073.     -result {[ab] b c d e}
  1074. }
  1075. test tcltest-21.2 {force a test command failure} {
  1076.     -body {
  1077. test tcltest-21.2.0 {
  1078.     return 2
  1079. } {1}
  1080.     }
  1081.     -returnCodes 1
  1082.     -result {bad option "1": must be -body, -cleanup, -constraints, -errorOutput, -match, -output, -result, -returnCodes, or -setup}
  1083. }
  1084. test tcltest-21.3 {test command with setup} {
  1085.     -setup {
  1086. set foo 1
  1087.     }
  1088.     -body {
  1089. set foo
  1090.     }
  1091.     -cleanup {unset foo}
  1092.     -result {1}
  1093. }
  1094. test tcltest-21.4 {test command with cleanup failure} {
  1095.     -setup {
  1096. if {[info exists foo]} {
  1097.     unset foo
  1098. }
  1099. set fail $::tcltest::currentFailure
  1100. set v [verbose]
  1101.     }
  1102.     -body {
  1103. verbose {}
  1104. test tcltest-21.4.0 {foo-1} {
  1105.     -cleanup {unset foo}
  1106. }
  1107.     }
  1108.     -result {^$}
  1109.     -match regexp
  1110.     -cleanup {verbose $v; set ::tcltest::currentFailure $fail}
  1111.     -output "Test cleanup failed:.*can't unset "foo": no such variable"
  1112. }
  1113. test tcltest-21.5 {test command with setup failure} {
  1114.     -setup {
  1115. if {[info exists foo]} {
  1116.     unset foo
  1117. }
  1118. set fail $::tcltest::currentFailure
  1119.     }
  1120.     -body {
  1121. test tcltest-21.5.0 {foo-2} {
  1122.     -setup {unset foo}
  1123. }
  1124.     }
  1125.     -result {^$}
  1126.     -match regexp
  1127.     -cleanup {set ::tcltest::currentFailure $fail}
  1128.     -output "Test setup failed:.*can't unset "foo": no such variable"
  1129. }
  1130. test tcltest-21.6 {test command - setup occurs before cleanup & before script} {
  1131.     -setup {set v [verbose]; set fail $::tcltest::currentFailure}
  1132.     -body {
  1133. verbose {}
  1134. test tcltest-21.6.0 {foo-3} {
  1135.     -setup {
  1136. if {[info exists foo]} {
  1137.     unset foo
  1138. }
  1139. set foo 1
  1140. set expected 2
  1141.     } 
  1142.     -body {
  1143. incr foo
  1144. set foo
  1145.     }
  1146.     -cleanup {
  1147. if {$foo != 2} {
  1148.     puts [outputChannel] "foo is wrong"
  1149. } else {
  1150.     puts [outputChannel] "foo is 2"
  1151. }
  1152.     }
  1153.     -result {$expected}
  1154. }
  1155.     }
  1156.     -cleanup {verbose $v; set ::tcltest::currentFailure $fail}
  1157.     -result {^$}
  1158.     -match regexp
  1159.     -output "foo is 2"
  1160. }
  1161. test tcltest-21.7 {test command - bad flag} {
  1162.     -setup {set fail $::tcltest::currentFailure}
  1163.     -cleanup {set ::tcltest::currentFailure $fail}
  1164.     -body {
  1165. test tcltest-21.7.0 {foo-4} {
  1166.     -foobar {}
  1167. }
  1168.     }
  1169.     -returnCodes 1
  1170.     -result {bad option "-foobar": must be -body, -cleanup, -constraints, -errorOutput, -match, -output, -result, -returnCodes, or -setup}
  1171. }
  1172. # alternate test command format (these are the same as 21.1-21.6, with the
  1173. # exception of being in the all-inline format)
  1174. test tcltest-21.7a {expect with glob} 
  1175. -body {list a b c d e} 
  1176. -result {[ab] b c d e} 
  1177. -match glob
  1178. test tcltest-21.8 {force a test command failure} 
  1179.     -setup {set fail $::tcltest::currentFailure} 
  1180.     -body {
  1181.         test tcltest-21.8.0 {
  1182.             return 2
  1183.         } {1}
  1184.     } 
  1185.     -returnCodes 1 
  1186.     -cleanup {set ::tcltest::currentFailure $fail} 
  1187.     -result {bad option "1": must be -body, -cleanup, -constraints, -errorOutput, -match, -output, -result, -returnCodes, or -setup}
  1188. test tcltest-21.9 {test command with setup} 
  1189. -setup {set foo 1} 
  1190. -body {set foo} 
  1191. -cleanup {unset foo} 
  1192. -result {1}
  1193. test tcltest-21.10 {test command with cleanup failure} -setup {
  1194.     if {[info exists foo]} {
  1195. unset foo
  1196.     }
  1197.     set fail $::tcltest::currentFailure
  1198.     set v [verbose]
  1199. } -cleanup {
  1200.     verbose $v
  1201.     set ::tcltest::currentFailure $fail
  1202. } -body {
  1203.     verbose {}
  1204.     test tcltest-21.10.0 {foo-1} -cleanup {unset foo}
  1205. } -result {^$} -match regexp 
  1206. -output {Test cleanup failed:.*can't unset "foo": no such variable}
  1207. test tcltest-21.11 {test command with setup failure} -setup {
  1208.     if {[info exists foo]} {
  1209. unset foo
  1210.     }
  1211.     set fail $::tcltest::currentFailure
  1212. } -cleanup {set ::tcltest::currentFailure $fail} -body {
  1213.     test tcltest-21.11.0 {foo-2} -setup {unset foo}
  1214. } -result {^$} -output {Test setup failed:.*can't unset "foo": no such variable} -match regexp
  1215. test tcltest-21.12 {
  1216. test command - setup occurs before cleanup & before script
  1217. } -setup {
  1218. set fail $::tcltest::currentFailure
  1219. set v [verbose]
  1220. } -cleanup {
  1221. verbose $v
  1222. set ::tcltest::currentFailure $fail
  1223. } -body {
  1224.     verbose {}
  1225.     test tcltest-21.12.0 {foo-3} -setup {
  1226. if {[info exists foo]} {
  1227.     unset foo
  1228. }
  1229. set foo 1
  1230. set expected 2
  1231.     }  -body {
  1232. incr foo
  1233. set foo
  1234.     }  -cleanup {
  1235. if {$foo != 2} {
  1236.     puts [outputChannel] "foo is wrong"
  1237. } else {
  1238.     puts [outputChannel] "foo is 2"
  1239. }
  1240.     }  -result {$expected}
  1241. } -result {^$} -output {foo is 2} -match regexp
  1242. # test all.tcl usage (runAllTests); simulate .test file failure, as well as
  1243. # crashes to determine whether or not these errors are logged.
  1244. set atd [makeDirectory alltestdir]
  1245. makeFile {
  1246.     package require tcltest
  1247.     namespace import -force tcltest::*
  1248.     testsDirectory [file join [temporaryDirectory] alltestdir]
  1249.     runAllTests
  1250. } all.tcl $atd
  1251. makeFile {
  1252.     exit 1
  1253. } exit.test $atd
  1254. makeFile {
  1255.     error "throw an error"
  1256. } error.test $atd
  1257. makeFile {
  1258.     package require tcltest
  1259.     namespace import -force tcltest::*
  1260.     test foo-1.1 {foo} {
  1261. -body { return 1 }
  1262. -result {1}
  1263.     }
  1264.     cleanupTests
  1265. } test.test $atd
  1266. # Must use a child process because stdout/stderr parsing can't be
  1267. # duplicated in slave interp.
  1268. test tcltest-22.1 {runAllTests} {
  1269.     -constraints {unixOrPc}
  1270.     -body {
  1271. exec [interpreter] 
  1272. [file join $atd all.tcl] 
  1273. -verbose t -tmpdir [temporaryDirectory]
  1274.     }
  1275.     -match regexp
  1276.     -result "Test files exiting with errors:.*error.test.*exit.test"
  1277. }
  1278. removeDirectory alltestdir
  1279. # makeFile, removeFile, makeDirectory, removeDirectory, viewFile
  1280. test tcltest-23.1 {makeFile} {
  1281.     -setup {
  1282. set mfdir [file join [temporaryDirectory] mfdir]
  1283. file mkdir $mfdir
  1284.     }
  1285.     -body {
  1286. makeFile {} t1.tmp
  1287. makeFile {} et1.tmp $mfdir
  1288. list [file exists [file join [temporaryDirectory] t1.tmp]] 
  1289. [file exists [file join $mfdir et1.tmp]]
  1290.     }
  1291.     -cleanup {
  1292. file delete -force $mfdir 
  1293. [file join [temporaryDirectory] t1.tmp] 
  1294.     }
  1295.     -result {1 1}
  1296. }
  1297. test tcltest-23.2 {removeFile} {
  1298.     -setup {
  1299. set mfdir [file join [temporaryDirectory] mfdir]
  1300. file mkdir $mfdir
  1301. makeFile {} t1.tmp
  1302. makeFile {} et1.tmp $mfdir
  1303. if  {![file exists [file join [temporaryDirectory] t1.tmp]] || 
  1304. ![file exists [file join $mfdir et1.tmp]]} {
  1305.     error "file creation didn't work"
  1306. }
  1307.     }
  1308.     -body {
  1309. removeFile t1.tmp
  1310. removeFile et1.tmp $mfdir
  1311. list [file exists [file join [temporaryDirectory] t1.tmp]] 
  1312. [file exists [file join $mfdir et1.tmp]]
  1313.     }
  1314.     -cleanup {
  1315. file delete -force $mfdir 
  1316. [file join [temporaryDirectory] t1.tmp] 
  1317.     }
  1318.     -result {0 0}
  1319. }
  1320. test tcltest-23.3 {makeDirectory} {
  1321.     -body {
  1322. set mfdir [file join [temporaryDirectory] mfdir]
  1323. file mkdir $mfdir
  1324. makeDirectory d1
  1325. makeDirectory d2 $mfdir
  1326. list [file exists [file join [temporaryDirectory] d1]] 
  1327. [file exists [file join $mfdir d2]]
  1328.     }
  1329.     -cleanup {
  1330. file delete -force [file join [temporaryDirectory] d1] $mfdir
  1331.     }
  1332.     -result {1 1}
  1333. }
  1334. test tcltest-23.4 {removeDirectory} {
  1335.     -setup {
  1336. set mfdir [makeDirectory mfdir]
  1337. makeDirectory t1
  1338. makeDirectory t2 $mfdir
  1339. if {![file exists $mfdir] || 
  1340. ![file exists [file join [temporaryDirectory] $mfdir t2]]} {
  1341.     error "setup failed - directory not created"
  1342. }
  1343.     }
  1344.     -body {
  1345. removeDirectory t1
  1346. removeDirectory t2 $mfdir
  1347. list [file exists [file join [temporaryDirectory] t1]] 
  1348. [file exists [file join $mfdir t2]]
  1349.     }
  1350.     -result {0 0}
  1351. }
  1352. test tcltest-23.5 {viewFile} {
  1353.     -body {
  1354. set mfdir [file join [temporaryDirectory] mfdir]
  1355. file mkdir $mfdir
  1356. makeFile {foobar} t1.tmp
  1357. makeFile {foobarbaz} t2.tmp $mfdir
  1358. list [viewFile t1.tmp] [viewFile t2.tmp $mfdir]
  1359.     }
  1360.     -result {foobar foobarbaz}
  1361.     -cleanup {
  1362. file delete -force $mfdir
  1363. removeFile t1.tmp
  1364.     }
  1365. }
  1366. # customMatch
  1367. proc matchNegative { expected actual } {
  1368.    set match 0
  1369.    foreach a $actual e $expected {
  1370.       if { $a != $e } {
  1371.          set match 1
  1372.         break
  1373.       }
  1374.    }
  1375.    return $match
  1376. }
  1377. test tcltest-24.0 {
  1378. customMatch: syntax
  1379. } -body {
  1380. list [catch {customMatch} result] $result
  1381. } -result [list 1 "wrong # args: should be "customMatch mode script""]
  1382. test tcltest-24.1 {
  1383. customMatch: syntax
  1384. } -body {
  1385. list [catch {customMatch foo} result] $result
  1386. } -result [list 1 "wrong # args: should be "customMatch mode script""]
  1387. test tcltest-24.2 {
  1388. customMatch: syntax
  1389. } -body {
  1390. list [catch {customMatch foo bar baz} result] $result
  1391. } -result [list 1 "wrong # args: should be "customMatch mode script""]
  1392. test tcltest-24.3 {
  1393. customMatch: argument checking
  1394. } -body {
  1395. list [catch {customMatch bad "a { b"} result] $result
  1396. } -result [list 1 "invalid customMatch script; can't evaluate after completion"]
  1397. test tcltest-24.4 {
  1398. test: valid -match values
  1399. } -body {
  1400. list [catch {
  1401. test tcltest-24.4.0 {} 
  1402. -match [namespace current]::noSuchMode
  1403. } result] $result
  1404. } -match glob -result {1 *bad -match value*}
  1405. test tcltest-24.5 {
  1406. test: valid -match values
  1407. } -setup {
  1408. customMatch [namespace current]::alwaysMatch "format 1 ;#"
  1409. } -body {
  1410. list [catch {
  1411. test tcltest-24.5.0 {} 
  1412. -match [namespace current]::noSuchMode
  1413. } result] $result
  1414. } -match glob -result {1 *bad -match value*: must be *alwaysMatch,*}
  1415. test tcltest-24.6 {
  1416. customMatch: -match script that always matches
  1417. } -setup {
  1418. customMatch [namespace current]::alwaysMatch "format 1 ;#"
  1419. set v [verbose]
  1420. } -body {
  1421. verbose {}
  1422. test tcltest-24.6.0 {} -match [namespace current]::alwaysMatch 
  1423. -body {format 1} -result 0
  1424. } -cleanup {
  1425. verbose $v
  1426. } -result {} -output {} -errorOutput {}
  1427. test tcltest-24.7 {
  1428. customMatch: replace default -exact matching
  1429. } -setup {
  1430. set saveExactMatchScript $::tcltest::CustomMatch(exact)
  1431. customMatch exact "format 1 ;#"
  1432. set v [verbose]
  1433. } -body {
  1434. verbose {}
  1435. test tcltest-24.7.0 {} -body {format 1} -result 0
  1436. } -cleanup {
  1437. verbose $v
  1438. customMatch exact $saveExactMatchScript
  1439. unset saveExactMatchScript
  1440. } -result {} -output {}
  1441. test tcltest-24.9 {
  1442. customMatch: error during match
  1443. } -setup {
  1444. proc errorDuringMatch args {return -code error "match returned error"}
  1445. customMatch [namespace current]::errorDuringMatch 
  1446. [namespace code errorDuringMatch]
  1447. set v [verbose]
  1448. set fail $::tcltest::currentFailure
  1449. } -body {
  1450. verbose {}
  1451. test tcltest-24.9.0 {} -match [namespace current]::errorDuringMatch
  1452. } -cleanup {
  1453. verbose $v
  1454. set ::tcltest::currentFailure $fail
  1455. } -match glob -result {} -output {*FAILED*match returned error*}
  1456. test tcltest-24.10 {
  1457. customMatch: bad return from match command
  1458. } -setup {
  1459. proc nonBooleanReturn args {return foo}
  1460. customMatch nonBooleanReturn [namespace code nonBooleanReturn]
  1461. set v [verbose]
  1462. set fail $::tcltest::currentFailure
  1463. } -body {
  1464. verbose {}
  1465. test tcltest-24.10.0 {} -match nonBooleanReturn
  1466. } -cleanup {
  1467. verbose $v
  1468. set ::tcltest::currentFailure $fail
  1469. } -match glob -result {} -output {*FAILED*expected boolean value*}
  1470. test tcltest-24.11 {
  1471. test: -match exact
  1472. } -body {
  1473. set result {A B C}
  1474. } -match exact -result {A B C}
  1475. test tcltest-24.12 {
  1476. test: -match exact match command eval in ::, not caller namespace
  1477. } -setup {
  1478. set saveExactMatchScript $::tcltest::CustomMatch(exact)
  1479. customMatch exact [list string equal]
  1480. set v [verbose]
  1481. proc string args {error {called [string] in caller namespace}}
  1482. } -body {
  1483. verbose {}
  1484. test tcltest-24.12.0 {} -body {format 1} -result 1
  1485. } -cleanup {
  1486. rename string {}
  1487. verbose $v
  1488. customMatch exact $saveExactMatchScript
  1489. unset saveExactMatchScript
  1490. } -match exact -result {} -output {}
  1491. test tcltest-24.13 {
  1492. test: -match exact failure
  1493. } -setup {
  1494. set saveExactMatchScript $::tcltest::CustomMatch(exact)
  1495. customMatch exact [list string equal]
  1496. set v [verbose]
  1497. set fail $::tcltest::currentFailure
  1498. } -body {
  1499. verbose {}
  1500. test tcltest-24.13.0 {} -body {format 1} -result 0
  1501. } -cleanup {
  1502. set ::tcltest::currentFailure $fail
  1503. verbose $v
  1504. customMatch exact $saveExactMatchScript
  1505. unset saveExactMatchScript
  1506. } -match glob -result {} -output {*FAILED*Result was:
  1507. 1*(exact matching):
  1508. 0*}
  1509. test tcltest-24.14 {
  1510. test: -match glob
  1511. } -body {
  1512. set result {A B C}
  1513. } -match glob -result {A B*}
  1514. test tcltest-24.15 {
  1515. test: -match glob failure
  1516. } -setup {
  1517. set v [verbose]
  1518. set fail $::tcltest::currentFailure
  1519. } -body {
  1520. verbose {}
  1521. test tcltest-24.15.0 {} -match glob -body {format {A B C}} 
  1522. -result {A B* }
  1523. } -cleanup {
  1524. set ::tcltest::currentFailure $fail
  1525. verbose $v
  1526. } -match glob -result {} -output {*FAILED*Result was:
  1527. *(glob matching):
  1528. *}
  1529. test tcltest-24.16 {
  1530. test: -match regexp
  1531. } -body {
  1532. set result {A B C}
  1533. } -match regexp -result {A B.*}
  1534. test tcltest-24.17 {
  1535. test: -match regexp failure
  1536. } -setup {
  1537. set fail $::tcltest::currentFailure
  1538. set v [verbose]
  1539. } -body {
  1540. verbose {}
  1541. test tcltest-24.17.0 {} -match regexp -body {format {A B C}} 
  1542. -result {A B.* X}
  1543. } -cleanup {
  1544. set ::tcltest::currentFailure $fail
  1545. verbose $v
  1546. } -match glob -result {} -output {*FAILED*Result was:
  1547. *(regexp matching):
  1548. *}
  1549. test tcltest-24.18 {
  1550. test: -match custom forget namespace qualification
  1551. } -setup {
  1552. set fail $::tcltest::currentFailure
  1553. set v [verbose]
  1554. customMatch negative matchNegative
  1555. } -body {
  1556. verbose {}
  1557. test tcltest-24.18.0 {} -match negative -body {format {A B C}} 
  1558. -result {A B X}
  1559. } -cleanup {
  1560. set ::tcltest::currentFailure $fail
  1561. verbose $v
  1562. } -match glob -result {} -output {*FAILED*Error testing result:*}
  1563. test tcltest-24.19 {
  1564. test: -match custom
  1565. } -setup {
  1566. set v [verbose]
  1567. customMatch negative [namespace code matchNegative]
  1568. } -body {
  1569. verbose {}
  1570. test tcltest-24.19.0 {} -match negative -body {format {A B C}} 
  1571. -result {A B X}
  1572. } -cleanup {
  1573. verbose $v
  1574. } -match exact -result {} -output {}
  1575. test tcltest-24.20 {
  1576. test: -match custom failure
  1577. } -setup {
  1578. set fail $::tcltest::currentFailure
  1579. set v [verbose]
  1580. customMatch negative [namespace code matchNegative]
  1581. } -body {
  1582. verbose {}
  1583. test tcltest-24.20.0 {} -match negative -body {format {A B C}} 
  1584. -result {A B C}
  1585. } -cleanup {
  1586. set ::tcltest::currentFailure $fail
  1587. verbose $v
  1588. } -match glob -result {} -output {*FAILED*Result was:
  1589. *(negative matching):
  1590. *}
  1591. test tcltest-25.1 {
  1592. constraint of setup/cleanup (Bug 589859)
  1593. } -setup {
  1594. set foo 0
  1595. } -body {
  1596. # Buggy tcltest will generate result of 2
  1597. test tcltest-25.1.0 {} -constraints knownBug -setup {
  1598.     incr foo
  1599. } -body {
  1600.     incr foo
  1601. } -cleanup {
  1602.     incr foo
  1603. } -match glob -result *
  1604. set foo
  1605. } -cleanup {
  1606. unset foo
  1607. } -result 0
  1608. test tcltest-25.2 {
  1609. puts -nonewline (Bug 612786)
  1610. } -body {
  1611. puts -nonewline stdout bla
  1612. puts -nonewline stdout bla
  1613. } -output {blabla}
  1614. test tcltest-25.3 {
  1615. reported return code (Bug 611922)
  1616. } -setup {
  1617. set fail $::tcltest::currentFailure
  1618. set v [verbose]
  1619. } -body {
  1620. verbose {}
  1621. test tcltest-25.3.0 {} -body {
  1622.     error foo
  1623. }
  1624. } -cleanup {
  1625. set ::tcltest::currentFailure $fail
  1626. verbose $v
  1627. } -match glob -output {*generated error; Return code was: 1*}
  1628. test tcltest-26.1 {Bug/RFE 1017151} -setup {
  1629.     makeFile {
  1630. package require tcltest
  1631. set errorInfo "Should never see this"
  1632. tcltest::test tcltest-26.1.0 {
  1633.     no errorInfo when only return code mismatch
  1634. } -body {
  1635.     set x 1
  1636. } -returnCodes error -result 1
  1637. tcltest::cleanupTests
  1638.     } test.tcl
  1639. } -body {
  1640.     slave msg [file join [temporaryDirectory] test.tcl]
  1641.     set msg
  1642. } -cleanup {
  1643.     removeFile test.tcl
  1644. } -match glob -result {*
  1645. ---- Return code should have been one of: 1
  1646. ==== tcltest-26.1.0 FAILED*}
  1647. test tcltest-26.2 {Bug/RFE 1017151} -setup {
  1648.     makeFile {
  1649. package require tcltest
  1650. set errorInfo "Should never see this"
  1651. tcltest::test tcltest-26.2.0 {do not mask body errorInfo} -body {
  1652.     error "body error"
  1653. } -cleanup {
  1654.     error "cleanup error"
  1655. } -result 1
  1656. tcltest::cleanupTests
  1657.     } test.tcl
  1658. } -body {
  1659.     slave msg [file join [temporaryDirectory] test.tcl]
  1660.     set msg
  1661. } -cleanup {
  1662.     removeFile test.tcl
  1663. } -match glob -result {*
  1664. ---- errorInfo: body error
  1665. *
  1666. ---- errorInfo(cleanup): cleanup error*}
  1667. cleanupTests
  1668. }
  1669. namespace delete ::tcltest::test
  1670. return