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

通讯编程

开发平台:

Visual C++

  1. # This file contains a collection of tests for generic/tclMain.c.
  2. #
  3. # RCS: @(#) $Id: main.test,v 1.13.2.4 2006/09/04 21:36:55 dgp Exp $
  4. if {[catch {package require tcltest 2.0.2}]} {
  5.     puts stderr "Skipping tests in [info script]. tcltest 2.0.2 required."
  6.     return
  7. }
  8. namespace eval ::tcl::test::main {
  9.     namespace import ::tcltest::test
  10.     namespace import ::tcltest::testConstraint
  11.     namespace import ::tcltest::interpreter
  12.     namespace import ::tcltest::cleanupTests
  13.     namespace import ::tcltest::makeFile
  14.     namespace import ::tcltest::removeFile
  15.     namespace import ::tcltest::temporaryDirectory
  16.     namespace import ::tcltest::workingDirectory
  17.     # Is [exec] defined?
  18.     testConstraint exec [llength [info commands exec]]
  19.     # Is the Tcltest package loaded?
  20.     # - that is, the special C-coded testing commands in tclTest.c
  21.     #   - tests use testing commands introduced in Tcltest 8.4
  22.     testConstraint Tcltest [expr {
  23. [llength [package provide Tcltest]]
  24. && [package vsatisfies [package provide Tcltest] 8.4]}]
  25.     # Procedure to simulate interactive typing of commands, line by line
  26.     proc type {chan script} {
  27. foreach line [split $script n] {
  28.     if {[catch {
  29.         puts $chan $line
  30.         flush $chan
  31.     }]} {
  32. return
  33.     }
  34.     # Grrr... Behavior depends on this value.
  35.     after 1000
  36. }
  37.     }
  38.     cd [temporaryDirectory]
  39.     # Tests Tcl_Main-1.*: variable initializations
  40.     test Tcl_Main-1.1 {
  41. Tcl_Main: startup script - normal
  42.     } -constraints {
  43. stdio
  44.     } -setup {
  45. makeFile {puts [list $argv0 $argv $tcl_interactive]} script
  46. catch {set f [open "|[list [interpreter] script]" r]}
  47.     } -body {
  48. read $f
  49.     } -cleanup {
  50. close $f
  51. removeFile script
  52.     } -result [list script {} 0]n
  53.     test Tcl_Main-1.2 {
  54. Tcl_Main: startup script - can't begin with '-'
  55.     } -constraints {
  56. stdio
  57.     } -setup {
  58. makeFile {puts [list $argv0 $argv $tcl_interactive]} -script
  59. catch {set f [open "|[list [interpreter] -script]" w+]}
  60.     } -body {
  61. puts $f {puts [list $argv0 $argv $tcl_interactive]; exit}
  62. flush $f
  63. read $f
  64.     } -cleanup {
  65. close $f
  66. removeFile -script
  67.     } -result [list [interpreter] -script 0]n
  68.     test Tcl_Main-1.3 {
  69. Tcl_Main: encoding of arguments: done by system encoding
  70. Note the shortcoming explained in Tcl Feature Request 491789
  71.     } -constraints {
  72. stdio
  73.     } -setup {
  74. makeFile {puts [list $argv0 $argv $tcl_interactive]} script
  75. catch {set f [open "|[list [interpreter] script u00c0]" r]}
  76.     } -body {
  77. read $f
  78.     } -cleanup {
  79. close $f
  80. removeFile script
  81.     } -result [list script [list [encoding convertfrom [encoding system] 
  82. [encoding convertto [encoding system] u00c0]]] 0]n
  83.     test Tcl_Main-1.4 {
  84. Tcl_Main: encoding of arguments: done by system encoding
  85. Note the shortcoming explained in Tcl Feature Request 491789
  86.     } -constraints {
  87. stdio tempNotWin
  88.     } -setup {
  89. makeFile {puts [list $argv0 $argv $tcl_interactive]} script
  90. catch {set f [open "|[list [interpreter] script u20ac]" r]}
  91.     } -body {
  92. read $f
  93.     } -cleanup {
  94. close $f
  95. removeFile script
  96.     } -result [list script [list [encoding convertfrom [encoding system] 
  97. [encoding convertto [encoding system] u20ac]]] 0]n
  98.     test Tcl_Main-1.5 {
  99. Tcl_Main: encoding of script name: system encoding loss
  100. Note the shortcoming explained in Tcl Feature Request 491789
  101.     } -constraints {
  102. stdio
  103.     } -setup {
  104. makeFile {puts [list $argv0 $argv $tcl_interactive]} u00c0
  105. catch {set f [open "|[list [interpreter] u00c0]" r]}
  106.     } -body {
  107. read $f
  108.     } -cleanup {
  109. close $f
  110. removeFile u00c0
  111.     } -result [list [list [encoding convertfrom [encoding system] 
  112. [encoding convertto [encoding system] u00c0]]] {} 0]n
  113.     test Tcl_Main-1.6 {
  114. Tcl_Main: encoding of script name: system encoding loss
  115. Note the shortcoming explained in Tcl Feature Request 491789
  116.     } -constraints {
  117. stdio tempNotWin
  118.     } -setup {
  119. makeFile {puts [list $argv0 $argv $tcl_interactive]} u20ac
  120. catch {set f [open "|[list [interpreter] u20ac]" r]}
  121.     } -body {
  122. read $f
  123.     } -cleanup {
  124. close $f
  125. removeFile u20ac
  126.     } -result [list [list [encoding convertfrom [encoding system] 
  127. [encoding convertto [encoding system] u20ac]]] {} 0]n
  128.     # Tests Tcl_Main-2.*: application-initialization procedure
  129.     test Tcl_Main-2.1 {
  130. Tcl_Main: appInitProc returns error
  131.     } -constraints {
  132. exec Tcltest
  133.     } -setup {
  134. makeFile {puts "In script"} script
  135.     } -body {
  136. exec [interpreter] script -appinitprocerror >& result
  137. set f [open result]
  138. read $f
  139.     } -cleanup {
  140. close $f
  141. file delete result
  142. removeFile script
  143.     } -result "application-specific initialization failed: nIn scriptn"
  144.     test Tcl_Main-2.2 {
  145. Tcl_Main: appInitProc returns error
  146.     } -constraints {
  147. exec Tcltest
  148.     } -body {
  149. exec [interpreter] << {puts "In script"} -appinitprocerror >& result
  150. set f [open result]
  151. read $f
  152.     } -cleanup {
  153. close $f
  154. file delete result
  155.     } -result "application-specific initialization failed: nIn scriptn"
  156.     test Tcl_Main-2.3 {
  157. Tcl_Main: appInitProc deletes interp
  158.     } -constraints {
  159. exec Tcltest
  160.     } -setup {
  161. makeFile {puts "In script"} script
  162.     } -body {
  163. exec [interpreter] script -appinitprocdeleteinterp >& result
  164. set f [open result]
  165. read $f
  166.     } -cleanup {
  167. close $f
  168. file delete result
  169. removeFile script
  170.     } -result "application-specific initialization failed: n"
  171.     test Tcl_Main-2.4 {
  172. Tcl_Main: appInitProc deletes interp
  173.     } -constraints {
  174. exec Tcltest
  175.     } -body {
  176. exec [interpreter] << {puts "In script"} 
  177. -appinitprocdeleteinterp >& result
  178. set f [open result]
  179. read $f
  180.     } -cleanup {
  181. close $f
  182. file delete result
  183.     } -result "application-specific initialization failed: n"
  184.     test Tcl_Main-2.5 {
  185. Tcl_Main: appInitProc closes stderr
  186.     } -constraints {
  187. exec Tcltest
  188.     } -body {
  189. exec [interpreter] << {puts "In script"} 
  190. -appinitprocclosestderr >& result
  191. set f [open result]
  192. read $f
  193.     } -cleanup {
  194. close $f
  195. file delete result
  196.     } -result "In scriptn"
  197.     # Tests Tcl_Main-3.*: startup script evaluation
  198.     test Tcl_Main-3.1 {
  199. Tcl_Main: startup script does not exist
  200.     } -constraints {
  201. exec
  202.     } -setup {
  203. if {[file exists no-such-file]} {
  204.     error "Can't run test Tcl_Main-3.1
  205.     where a file named "no-such-file" exists"
  206. }
  207.     } -body {
  208. set code [catch {exec [interpreter] no-such-file >& result} result]
  209. set f [open result]
  210. list $code $result [read $f]
  211.     } -cleanup {
  212. close $f
  213. file delete result
  214.     } -match glob -result [list 1 {child process exited abnormally} 
  215. {couldn't read file "no-such-file":*}]
  216.     test Tcl_Main-3.2 {
  217. Tcl_Main: startup script raises error
  218.     } -constraints {
  219. exec
  220.     } -setup {
  221. makeFile {error ERROR} script
  222.     } -body {
  223. set code [catch {exec [interpreter] script >& result} result]
  224. set f [open result]
  225. list $code $result [read $f]
  226.     } -cleanup {
  227. close $f
  228. file delete result
  229. removeFile script
  230.     } -match glob -result [list 1 {child process exited abnormally} 
  231. "ERRORn    while executing*"]
  232.     test Tcl_Main-3.3 {
  233. Tcl_Main: startup script closes stderr
  234.     } -constraints {
  235. exec
  236.     } -setup {
  237. makeFile {close stderr; error ERROR} script
  238.     } -body {
  239. set code [catch {exec [interpreter] script >& result} result]
  240. set f [open result]
  241. list $code $result [read $f]
  242.     } -cleanup {
  243. close $f
  244. file delete result
  245. removeFile script
  246.     } -result [list 1 {child process exited abnormally} {}]
  247.     test Tcl_Main-3.4 {
  248. Tcl_Main: startup script holds incomplete script
  249.     } -constraints {
  250. exec
  251.     } -setup {
  252. makeFile "if 1 {" script
  253.     } -body {
  254. set code [catch {exec [interpreter] script >& result} result]
  255. set f [open result]
  256. join [list $code $result [read $f]] n
  257.     } -cleanup {
  258. close $f
  259. file delete result
  260. removeFile script
  261.     } -match glob -result [join [list 1 {child process exited abnormally}
  262. "missing close-bracen    while executing*"] n]
  263.     test Tcl_Main-3.5 {
  264. Tcl_Main: startup script sets main loop
  265.     } -constraints {
  266. exec Tcltest
  267.     } -setup {
  268. makeFile {
  269. rename exit _exit
  270. proc exit {code} {
  271.     puts "In exit"
  272.     _exit $code
  273. }
  274. after 0 {
  275. puts event
  276. testexitmainloop
  277. }
  278. testexithandler create 0
  279. testsetmainloop
  280. } script
  281.     } -body {
  282. exec [interpreter] script >& result
  283. set f [open result]
  284. read $f
  285.     } -cleanup {
  286. close $f
  287. file delete result
  288. removeFile script
  289.     } -result "eventnExit MainLoopnIn exitneven 0n"
  290.     test Tcl_Main-3.6 {
  291. Tcl_Main: startup script sets main loop and closes stdin
  292.     } -constraints {
  293. exec Tcltest
  294.     } -setup {
  295. makeFile {
  296. close stdin
  297. testsetmainloop
  298. rename exit _exit
  299. proc exit {code} {
  300.     puts "In exit"
  301.     _exit $code
  302. }
  303. after 0 {
  304. puts event
  305. testexitmainloop
  306. }
  307. testexithandler create 0
  308. } script
  309.     } -body {
  310. exec [interpreter] script >& result
  311. set f [open result]
  312. read $f
  313.     } -cleanup {
  314. close $f
  315. file delete result
  316. removeFile script
  317.     } -result "eventnExit MainLoopnIn exitneven 0n"
  318.     test Tcl_Main-3.7 {
  319. Tcl_Main: startup script deletes interp
  320.     } -constraints {
  321. exec Tcltest
  322.     } -setup {
  323. makeFile {
  324. rename exit _exit
  325. proc exit {code} {
  326.     puts "In exit"
  327.     _exit $code
  328. }
  329. testexithandler create 0
  330. testinterpdelete {}
  331. } script
  332.     } -body {
  333. exec [interpreter] script >& result
  334. set f [open result]
  335. read $f
  336.     } -cleanup {
  337. close $f
  338. file delete result
  339. removeFile script
  340.     } -result "even 0n"
  341.     test Tcl_Main-3.8 {
  342. Tcl_Main: startup script deletes interp and sets mainloop
  343.     } -constraints {
  344. exec Tcltest
  345.     } -setup {
  346. makeFile {
  347. testsetmainloop
  348. rename exit _exit
  349. proc exit {code} {
  350.     puts "In exit"
  351.     _exit $code
  352. }
  353. testexitmainloop
  354. testexithandler create 0
  355. testinterpdelete {}
  356. } script
  357.     } -body {
  358. exec [interpreter] script >& result
  359. set f [open result]
  360. read $f
  361.     } -cleanup {
  362. close $f
  363. file delete result
  364. removeFile script
  365.     } -result "Exit MainLoopneven 0n"
  366.     test Tcl_Main-3.9 {
  367. Tcl_Main: startup script can set tcl_interactive without limit
  368.     } -constraints {
  369. exec
  370.     } -setup {
  371. makeFile {set tcl_interactive foo} script
  372.     } -body {
  373. exec [interpreter] script >& result
  374. set f [open result]
  375. read $f
  376.     } -cleanup {
  377. close $f
  378. file delete result
  379. removeFile script
  380.     } -result {}
  381.     # Tests Tcl_Main-4.*: rc file evaluation
  382.     test Tcl_Main-4.1 {
  383. Tcl_Main: rcFile evaluation deletes interp
  384.     } -constraints {
  385. exec Tcltest
  386.     } -setup {
  387. set rc [makeFile {testinterpdelete {}} rc]
  388.     } -body {
  389. exec [interpreter] << {puts "In script"} 
  390. -appinitprocsetrcfile $rc >& result
  391. set f [open result]
  392. read $f
  393.     } -cleanup {
  394. close $f
  395. file delete result
  396. removeFile rc
  397.     } -result "application-specific initialization failed: n"
  398.     test Tcl_Main-4.2 {
  399. Tcl_Main: rcFile evaluation closes stdin
  400.     } -constraints {
  401. exec Tcltest
  402.     } -setup {
  403. set rc [makeFile {close stdin} rc]
  404.     } -body {
  405. exec [interpreter] << {puts "In script"} 
  406. -appinitprocsetrcfile $rc >& result
  407. set f [open result]
  408. read $f
  409.     } -cleanup {
  410. close $f
  411. file delete result
  412. removeFile rc
  413.     } -result "application-specific initialization failed: n"
  414.     test Tcl_Main-4.3 {
  415. Tcl_Main: rcFile evaluation closes stdin and sets main loop
  416.     } -constraints {
  417. exec Tcltest
  418.     } -setup {
  419. set rc [makeFile {
  420. close stdin
  421. testsetmainloop
  422. after 0 testexitmainloop
  423. testexithandler create 0
  424. rename exit _exit
  425. proc exit code {
  426.     puts "In exit"
  427.     _exit $code
  428. }
  429. } rc]
  430.     } -body {
  431. exec [interpreter] << {puts "In script"} 
  432. -appinitprocsetrcfile $rc >& result
  433. set f [open result]
  434. read $f
  435.     } -cleanup {
  436. close $f
  437. file delete result
  438. removeFile rc
  439.     } -result "application-specific initialization failed:
  440. nExit MainLoopnIn exitneven 0n"
  441.     test Tcl_Main-4.4 {
  442. Tcl_Main: rcFile evaluation sets main loop
  443.     } -constraints {
  444. exec Tcltest
  445.     } -setup {
  446. set rc [makeFile {
  447. testsetmainloop
  448. after 0 testexitmainloop
  449. testexithandler create 0
  450. rename exit _exit
  451. proc exit code {
  452.     puts "In exit"
  453.     _exit $code
  454. }
  455. } rc]
  456.     } -body {
  457. exec [interpreter] << {} 
  458. -appinitprocsetrcfile $rc >& result
  459. set f [open result]
  460. read $f
  461.     } -cleanup {
  462. close $f
  463. file delete result
  464. removeFile rc
  465.     } -result "application-specific initialization failed:
  466. nExit MainLoopnIn exitneven 0n"
  467.     test Tcl_Main-4.5 {
  468. Tcl_Main: Bug 1481986
  469.     } -constraints {
  470. exec Tcltest
  471.     } -setup {
  472. set rc [makeFile {
  473. testsetmainloop
  474. after 0 {puts "Event callback"}
  475. } rc]
  476.     } -body {
  477. set f [open "|[list [interpreter] -appinitprocsetrcfile $rc]" w+]
  478. after 1000
  479. type $f {puts {Interactive output}
  480.     exit
  481. }
  482. read $f
  483.     } -cleanup {
  484. catch {close $f}
  485. removeFile rc
  486.     } -result "Event callbacknInteractive outputn"
  487.     # Tests Tcl_Main-5.*: interactive operations
  488.     test Tcl_Main-5.1 {
  489. Tcl_Main: tcl_interactive must be boolean
  490.     } -constraints {
  491. exec
  492.     } -body {
  493. exec [interpreter] << {set tcl_interactive foo} >& result
  494. set f [open result]
  495. read $f
  496.     } -cleanup {
  497. close $f
  498. file delete result
  499.     } -result "can't set "tcl_interactive":
  500.      variable must have boolean valuen"
  501.     test Tcl_Main-5.2 {
  502. Tcl_Main able to handle non-blocking stdin
  503.     } -constraints {
  504. exec
  505.     } -setup {
  506. catch {set f [open "|[list [interpreter]]" w+]}
  507.     } -body {
  508. type $f {
  509.     fconfigure stdin -blocking 0
  510.     puts SUCCESS
  511. }
  512. list [catch {gets $f} line] $line
  513.     } -cleanup {
  514. close $f
  515.     } -result [list 0 SUCCESS]
  516.     test Tcl_Main-5.3 {
  517. Tcl_Main handles stdin EOF in mid-command
  518.     } -constraints {
  519. exec
  520.     } -setup {
  521. catch {set f [open "|[list [interpreter]]" w+]}
  522. catch {fconfigure $f -blocking 0}
  523.     } -body {
  524. type $f "fconfigure stdin -eofchar \032
  525.     if 1 {n32"
  526. variable wait
  527. fileevent $f readable 
  528. [list set [namespace which -variable wait] "child exit"]
  529. set id [after 2000 [list set [namespace which -variable wait] timeout]]
  530. vwait [namespace which -variable wait]
  531. after cancel $id
  532. set wait
  533.     } -cleanup {
  534. if {[string equal timeout $wait]
  535. && [string equal unix $::tcl_platform(platform)]} {
  536.     exec kill [pid $f]
  537. }
  538. close $f
  539.     } -result {child exit}
  540.     test Tcl_Main-5.4 {
  541. Tcl_Main handles stdin EOF in mid-command
  542.     } -constraints {
  543. exec
  544.     } -setup {
  545. set cmd {makeFile "if 1 {" script}
  546. catch {set f [open "|[list [interpreter]] < [list [eval $cmd]]" r]}
  547. catch {fconfigure $f -blocking 0}
  548.     } -body {
  549. variable wait
  550. fileevent $f readable 
  551. [list set [namespace which -variable wait] "child exit"]
  552. set id [after 2000 [list set [namespace which -variable wait] timeout]]
  553. vwait [namespace which -variable wait]
  554. after cancel $id
  555. set wait
  556.     } -cleanup {
  557. if {[string equal timeout $wait]
  558. && [string equal unix $::tcl_platform(platform)]} {
  559.     exec kill [pid $f]
  560. }
  561. close $f
  562. removeFile script
  563.     } -result {child exit}
  564.     test Tcl_Main-5.5 {
  565. Tcl_Main: error raised in interactive mode
  566.     } -constraints {
  567. exec
  568.     } -body {
  569. exec [interpreter] << {error foo} >& result
  570. set f [open result]
  571. read $f
  572.     } -cleanup {
  573. close $f
  574. file delete result
  575.     } -result "foon"
  576.     test Tcl_Main-5.6 {
  577. Tcl_Main: interactive mode: errors don't stop command loop
  578.     } -constraints {
  579. exec
  580.     } -body {
  581. exec [interpreter] << {
  582. error foo
  583. puts bar
  584. } >& result
  585. set f [open result]
  586. read $f
  587.     } -cleanup {
  588. close $f
  589. file delete result
  590.     } -result "foonbarn"
  591.     test Tcl_Main-5.7 {
  592. Tcl_Main: interactive mode: closed stderr
  593.     } -constraints {
  594. exec
  595.     } -body {
  596. exec [interpreter] << {
  597. close stderr
  598. error foo
  599. puts bar
  600. } >& result
  601. set f [open result]
  602. read $f
  603.     } -cleanup {
  604. close $f
  605. file delete result
  606.     } -result "barn"
  607.     test Tcl_Main-5.8 {
  608. Tcl_Main: interactive mode: close stdin
  609. -> main loop & [exit] & exit handlers
  610.     } -constraints {
  611. exec Tcltest
  612.     } -body {
  613. exec [interpreter] << {
  614. rename exit _exit
  615. proc exit code {
  616.     puts "In exit"
  617.     _exit $code
  618. }
  619. testsetmainloop
  620. testexitmainloop
  621. testexithandler create 0
  622. close stdin
  623. } >& result
  624. set f [open result]
  625. read $f
  626.     } -cleanup {
  627. close $f
  628. file delete result
  629.     } -result "Exit MainLoopnIn exitneven 0n"
  630.     test Tcl_Main-5.9 {
  631. Tcl_Main: interactive mode: delete interp 
  632. -> main loop & exit handlers, but no [exit]
  633.     } -constraints {
  634. exec Tcltest
  635.     } -body {
  636. exec [interpreter] << {
  637. rename exit _exit
  638. proc exit code {
  639.     puts "In exit"
  640.     _exit $code
  641. }
  642. testsetmainloop
  643. testexitmainloop
  644. testexithandler create 0
  645. testinterpdelete {}
  646. } >& result
  647. set f [open result]
  648. read $f
  649.     } -cleanup {
  650. close $f
  651. file delete result
  652.     } -result "Exit MainLoopneven 0n"
  653.     test Tcl_Main-5.10 {
  654. Tcl_Main: exit main loop in mid-interactive command
  655.     } -constraints {
  656. exec Tcltest
  657.     } -setup {
  658. catch {set f [open "|[list [interpreter]]" w+]}
  659. catch {fconfigure $f -blocking 0}
  660.     } -body {
  661. type $f "testsetmainloop
  662.          after 2000 testexitmainloop
  663.          puts {1 2"
  664. after 4000
  665. type $f "3 4}"
  666. set code1 [catch {gets $f} line1]
  667. set code2 [catch {gets $f} line2]
  668. set code3 [catch {gets $f} line3]
  669. list $code1 $line1 $code2 $line2 $code3 $line3
  670.     } -cleanup {
  671. close $f
  672.     } -result [list 0 {Exit MainLoop} 0 {1 2} 0 {3 4}]
  673.     test Tcl_Main-5.11 {
  674. Tcl_Main: EOF in interactive main loop
  675.     } -constraints {
  676. exec Tcltest
  677.     } -body {
  678. exec [interpreter] << {
  679. rename exit _exit
  680. proc exit code {
  681.     puts "In exit"
  682.     _exit $code
  683. }
  684. testexithandler create 0
  685. after 0 testexitmainloop
  686. testsetmainloop
  687. } >& result
  688. set f [open result]
  689. read $f
  690.     } -cleanup {
  691. close $f
  692. file delete result
  693.     } -result "Exit MainLoopnIn exitneven 0n"
  694.     test Tcl_Main-5.12 {
  695. Tcl_Main: close stdin in interactive main loop
  696.     } -constraints {
  697. exec Tcltest
  698.     } -body {
  699. exec [interpreter] << {
  700. rename exit _exit
  701. proc exit code {
  702.     puts "In exit"
  703.     _exit $code
  704. }
  705. testexithandler create 0
  706. after 100 testexitmainloop
  707. testsetmainloop
  708. close stdin
  709. puts "don't reach this"
  710. } >& result
  711. set f [open result]
  712. read $f
  713.     } -cleanup {
  714. close $f
  715. file delete result
  716.     } -result "Exit MainLoopnIn exitneven 0n"
  717.     # Tests Tcl_Main-6.*: interactive operations with prompts
  718.     test Tcl_Main-6.1 {
  719. Tcl_Main: enable prompts with tcl_interactive
  720.     } -constraints {
  721. exec
  722.     } -body {
  723. exec [interpreter] << {set tcl_interactive 1} >& result
  724. set f [open result]
  725. read $f
  726.     } -cleanup {
  727. close $f
  728. file delete result
  729.     } -result "1n% "
  730.     test Tcl_Main-6.2 {
  731. Tcl_Main: prompt deletes interp
  732.     } -constraints {
  733. exec Tcltest
  734.     } -body {
  735. exec [interpreter] << {
  736. set tcl_prompt1 {testinterpdelete {}}
  737. set tcl_interactive 1
  738. puts "not reached"
  739. } >& result
  740. set f [open result]
  741. read $f
  742.     } -cleanup {
  743. close $f
  744. file delete result
  745.     } -result "1n"
  746.     test Tcl_Main-6.3 {
  747. Tcl_Main: prompt closes stdin
  748.     } -constraints {
  749. exec
  750.     } -body {
  751. exec [interpreter] << {
  752. set tcl_prompt1 {close stdin}
  753. set tcl_interactive 1
  754. puts "not reached"
  755. } >& result
  756. set f [open result]
  757. read $f
  758.     } -cleanup {
  759. close $f
  760. file delete result
  761.     } -result "1n"
  762.     test Tcl_Main-6.4 {
  763. Tcl_Main: interactive output, closed stdout
  764.     } -constraints {
  765. exec
  766.     } -body {
  767. exec [interpreter] << {
  768. set tcl_interactive 1
  769. close stdout
  770. set a NO
  771. puts stderr YES
  772. } >& result
  773. set f [open result]
  774. read $f
  775.     } -cleanup {
  776. close $f
  777. file delete result
  778.     } -result "1n% YESn"
  779.     test Tcl_Main-6.5 {
  780. Tcl_Main: interactive entry to main loop
  781.     } -constraints {
  782. exec Tcltest
  783.     } -body {
  784. exec [interpreter] << {
  785. set tcl_interactive 1
  786. testsetmainloop
  787. testexitmainloop} >& result
  788. set f [open result]
  789. read $f
  790.     } -cleanup {
  791. close $f
  792. file delete result
  793.     } -result "1n% % % Exit MainLoopn"
  794.     test Tcl_Main-6.6 {
  795. Tcl_Main: number of prompts during stdin close exit
  796.     } -constraints {
  797. exec
  798.     } -body {
  799. exec [interpreter] << {
  800. set tcl_interactive 1
  801. close stdin} >& result
  802. set f [open result]
  803. read $f
  804.     } -cleanup {
  805. close $f
  806. file delete result
  807.     } -result "1n% "
  808.     test Tcl_Main-6.7 {
  809. [unknown]: interactive auto-completion.
  810.     } -constraints {
  811. exec
  812.     } -body {
  813. exec [interpreter] << {
  814. proc foo{ x {}
  815. set ::auto_noexec xxx
  816. set tcl_interactive 1
  817. foo y} >& result
  818. set f [open result]
  819. read $f
  820.     } -cleanup {
  821. close $f
  822. file delete result
  823.     } -result "1n% % "
  824.     # Tests Tcl_Main-7.*: exiting
  825.     test Tcl_Main-7.1 {
  826. Tcl_Main: [exit] defined as no-op -> still have exithandlers
  827.     } -constraints {
  828. exec Tcltest
  829.     } -body {
  830. exec [interpreter] << {
  831. proc exit args {}
  832. testexithandler create 0
  833. } >& result
  834. set f [open result]
  835. read $f
  836.     } -cleanup {
  837. close $f
  838. file delete result
  839.     } -result "even 0n"
  840.     test Tcl_Main-7.2 {
  841. Tcl_Main: [exit] defined as no-op -> still have exithandlers
  842.     } -constraints {
  843. exec Tcltest
  844.     } -body {
  845. exec [interpreter] << {
  846. proc exit args {}
  847. testexithandler create 0
  848. after 0 testexitmainloop
  849. testsetmainloop
  850. } >& result
  851. set f [open result]
  852. read $f
  853.     } -cleanup {
  854. close $f
  855. file delete result
  856.     } -result "Exit MainLoopneven 0n"
  857.     # Tests Tcl_Main-8.*: StdinProc operations
  858.     test Tcl_Main-8.1 {
  859. StdinProc: handles non-blocking stdin
  860.     } -constraints {
  861. exec Tcltest
  862.     } -body {
  863. exec [interpreter] << {
  864. testsetmainloop
  865. fconfigure stdin -blocking 0
  866. testexitmainloop
  867. } >& result
  868. set f [open result]
  869. read $f
  870.     } -cleanup {
  871. close $f
  872. file delete result
  873.     } -result "Exit MainLoopn"
  874.     test Tcl_Main-8.2 {
  875. StdinProc: handles stdin EOF
  876.     } -constraints {
  877. exec Tcltest
  878.     } -body {
  879. exec [interpreter] << {
  880. testsetmainloop
  881. testexithandler create 0
  882. rename exit _exit
  883. proc exit code {
  884.     puts "In exit"
  885.     _exit $code
  886. }
  887. after 100 testexitmainloop
  888. } >& result
  889. set f [open result]
  890. read $f
  891.     } -cleanup {
  892. close $f
  893. file delete result
  894.     } -result "Exit MainLoopnIn exitneven 0n"
  895.     test Tcl_Main-8.3 {
  896. StdinProc: handles interactive stdin EOF
  897.     } -constraints {
  898. exec Tcltest
  899.     } -body {
  900. exec [interpreter] << {
  901. testsetmainloop
  902. testexithandler create 0
  903. rename exit _exit
  904. proc exit code {
  905.     puts "In exit"
  906.     _exit $code
  907. }
  908. set tcl_interactive 1} >& result
  909. set f [open result]
  910. read $f
  911.     } -cleanup {
  912. close $f
  913. file delete result
  914.     } -result "1n% even 0n"
  915.     test Tcl_Main-8.4 {
  916. StdinProc: handles stdin close
  917.     } -constraints {
  918. exec Tcltest
  919.     } -body {
  920. exec [interpreter] << {
  921. testsetmainloop
  922. rename exit _exit
  923. proc exit code {
  924.     puts "In exit"
  925.     _exit $code
  926. }
  927. after 100 testexitmainloop
  928. after 0 puts 1
  929. close stdin
  930. } >& result
  931. set f [open result]
  932. read $f
  933.     } -cleanup {
  934. close $f
  935. file delete result
  936.     } -result "1nExit MainLoopnIn exitn"
  937.     test Tcl_Main-8.5 {
  938. StdinProc: handles interactive stdin close
  939.     } -constraints {
  940. exec Tcltest
  941.     } -body {
  942. exec [interpreter] << {
  943. testsetmainloop
  944. set tcl_interactive 1
  945. rename exit _exit
  946. proc exit code {
  947.     puts "In exit"
  948.     _exit $code
  949. }
  950. after 100 testexitmainloop
  951. after 0 puts 1
  952. close stdin
  953. } >& result
  954. set f [open result]
  955. read $f
  956.     } -cleanup {
  957. close $f
  958. file delete result
  959.     } -result "1n% % % after#0n% after#1n% 1nExit MainLoopnIn exitn"
  960.     test Tcl_Main-8.6 {
  961. StdinProc: handles event loop re-entry
  962.     } -constraints {
  963. exec Tcltest
  964.     } -body {
  965. exec [interpreter] << {
  966. testsetmainloop
  967. after 100 {puts 1; set delay 1}
  968. vwait delay
  969. puts 2
  970. testexitmainloop
  971. } >& result
  972. set f [open result]
  973. read $f
  974.     } -cleanup {
  975. close $f
  976. file delete result
  977.     } -result "1n2nExit MainLoopn"
  978.     test Tcl_Main-8.7 {
  979. StdinProc: handling of errors
  980.     } -constraints {
  981. exec Tcltest
  982.     } -body {
  983. exec [interpreter] << {
  984. testsetmainloop
  985. error foo
  986. testexitmainloop
  987. } >& result
  988. set f [open result]
  989. read $f
  990.     } -cleanup {
  991. close $f
  992. file delete result
  993.     } -result "foonExit MainLoopn"
  994.     test Tcl_Main-8.8 {
  995. StdinProc: handling of errors, closed stderr
  996.     } -constraints {
  997. exec Tcltest
  998.     } -body {
  999. exec [interpreter] << {
  1000. testsetmainloop
  1001. close stderr
  1002. error foo
  1003. testexitmainloop
  1004. } >& result
  1005. set f [open result]
  1006. read $f
  1007.     } -cleanup {
  1008. close $f
  1009. file delete result
  1010.     } -result "Exit MainLoopn"
  1011.     test Tcl_Main-8.9 {
  1012. StdinProc: interactive output
  1013.     } -constraints {
  1014. exec Tcltest
  1015.     } -body {
  1016. exec [interpreter] << {
  1017. testsetmainloop
  1018. set tcl_interactive 1
  1019. testexitmainloop} >& result
  1020. set f [open result]
  1021. read $f
  1022.     } -cleanup {
  1023. close $f
  1024. file delete result
  1025.     } -result "1n% % Exit MainLoopn"
  1026.     test Tcl_Main-8.10 {
  1027. StdinProc: interactive output, closed stdout
  1028.     } -constraints {
  1029. exec Tcltest
  1030.     } -body {
  1031. exec [interpreter] << {
  1032. testsetmainloop
  1033. close stdout
  1034. set tcl_interactive 1
  1035. testexitmainloop
  1036. } >& result
  1037. set f [open result]
  1038. read $f
  1039.     } -cleanup {
  1040. close $f
  1041. file delete result
  1042.     } -result {}
  1043.     test Tcl_Main-8.11 {
  1044. StdinProc: prompt deletes interp
  1045.     } -constraints {
  1046. exec Tcltest
  1047.     } -body {
  1048. exec [interpreter] << {
  1049. testsetmainloop
  1050. set tcl_prompt1 {testinterpdelete {}}
  1051. set tcl_interactive 1} >& result
  1052. set f [open result]
  1053. read $f
  1054.     } -cleanup {
  1055. close $f
  1056. file delete result
  1057.     } -result "1n"
  1058.     test Tcl_Main-8.12 {
  1059. StdinProc: prompt closes stdin
  1060.     } -constraints {
  1061. exec Tcltest
  1062.     } -body {
  1063. exec [interpreter] << {
  1064. testsetmainloop
  1065. set tcl_prompt1 {close stdin}
  1066. after 100 testexitmainloop
  1067. set tcl_interactive 1
  1068. puts "not reached"
  1069. } >& result
  1070. set f [open result]
  1071. read $f
  1072.     } -cleanup {
  1073. close $f
  1074. file delete result
  1075.     } -result "1nExit MainLoopn"
  1076.     # Tests Tcl_Main-9.*: Prompt operations
  1077.     test Tcl_Main-9.1 {
  1078. Prompt: custom prompt variables
  1079.     } -constraints {
  1080. exec
  1081.     } -body {
  1082. exec [interpreter] << {
  1083. set tcl_prompt1 {puts -nonewline stdout "one "}
  1084. set tcl_prompt2 {puts -nonewline stdout "two "}
  1085. set tcl_interactive 1
  1086. puts {This is
  1087. a test}} >& result
  1088. set f [open result]
  1089. read $f
  1090.     } -cleanup {
  1091. close $f
  1092. file delete result
  1093.     } -result "1none two This isntta testnone "
  1094.     test Tcl_Main-9.2 {
  1095. Prompt: error in custom prompt variables
  1096.     } -constraints {
  1097. exec
  1098.     } -body {
  1099. exec [interpreter] << {
  1100. set tcl_prompt1 {error foo}
  1101. set tcl_interactive 1
  1102. set errorInfo} >& result
  1103. set f [open result]
  1104. read $f
  1105.     } -cleanup {
  1106. close $f
  1107. file delete result
  1108.     } -result "1nfoon% foon    while executingn"error foo"n    (script
  1109. that generates prompt)nfoon% "
  1110.     test Tcl_Main-9.3 {
  1111. Prompt: error in custom prompt variables, closed stderr
  1112.     } -constraints {
  1113. exec
  1114.     } -body {
  1115. exec [interpreter] << {
  1116. set tcl_prompt1 {close stderr; error foo}
  1117. set tcl_interactive 1} >& result
  1118. set f [open result]
  1119. read $f
  1120.     } -cleanup {
  1121. close $f
  1122. file delete result
  1123.     } -result "1n% "
  1124.     test Tcl_Main-9.4 {
  1125. Prompt: error in custom prompt variables, closed stdout
  1126.     } -constraints {
  1127. exec
  1128.     } -body {
  1129. exec [interpreter] << {
  1130. set tcl_prompt1 {close stdout; error foo}
  1131. set tcl_interactive 1} >& result
  1132. set f [open result]
  1133. read $f
  1134.     } -cleanup {
  1135. close $f
  1136. file delete result
  1137.     } -result "1nfoon"
  1138.     cd [workingDirectory]
  1139.     cleanupTests
  1140. }
  1141. namespace delete ::tcl::test::main
  1142. return