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