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

通讯编程

开发平台:

Visual C++

  1.     set s [format "abcndefn%cqrsntuv" 26]
  2.     puts $f $s
  3.     close $f
  4.     set f [open $path(test1) r]
  5.     fconfigure $f -eofchar x1a
  6.     fconfigure $f -translation auto
  7.     set l ""
  8.     lappend l [gets $f]
  9.     lappend l [gets $f]
  10.     lappend l [eof $f]
  11.     lappend l [gets $f]
  12.     lappend l [eof $f]
  13.     close $f
  14.     set l
  15. } {abc def 0 {} 1}
  16. test io-31.21 {Tcl_Write, no newline ^Z in middle, Tcl_Gets auto, eofChar} {
  17.     file delete $path(test1)
  18.     set f [open $path(test1) w]
  19.     fconfigure $f -translation lf
  20.     set s [format "abcndefn%cqrsntuv" 26]
  21.     puts $f $s
  22.     close $f
  23.     set f [open $path(test1) r]
  24.     fconfigure $f -eofchar x1a -translation auto
  25.     set l ""
  26.     lappend l [gets $f]
  27.     lappend l [gets $f]
  28.     lappend l [eof $f]
  29.     lappend l [gets $f]
  30.     lappend l [eof $f]
  31.     close $f
  32.     set l
  33. } {abc def 0 {} 1}
  34. test io-31.22 {Tcl_Write, ^Z in middle ignored, Tcl_Gets lf} {
  35.     file delete $path(test1)
  36.     set f [open $path(test1) w]
  37.     fconfigure $f -translation lf -eofchar {}
  38.     set s [format "abcndefn%cqrsntuv" 26]
  39.     puts $f $s
  40.     close $f
  41.     set f [open $path(test1) r]
  42.     fconfigure $f -translation lf -eofchar {}
  43.     set l ""
  44.     lappend l [gets $f]
  45.     lappend l [gets $f]
  46.     lappend l [eof $f]
  47.     lappend l [gets $f]
  48.     lappend l [eof $f]
  49.     lappend l [gets $f]
  50.     lappend l [eof $f]
  51.     lappend l [gets $f]
  52.     lappend l [eof $f]
  53.     close $f
  54.     set l
  55. } "abc def 0 x1aqrs 0 tuv 0 {} 1"
  56. test io-31.23 {Tcl_Write, ^Z in middle ignored, Tcl_Gets cr} {
  57.     file delete $path(test1)
  58.     set f [open $path(test1) w]
  59.     fconfigure $f -translation cr -eofchar {}
  60.     set s [format "abcndefn%cqrsntuv" 26]
  61.     puts $f $s
  62.     close $f
  63.     set f [open $path(test1) r]
  64.     fconfigure $f -translation cr -eofchar {}
  65.     set l ""
  66.     lappend l [gets $f]
  67.     lappend l [gets $f]
  68.     lappend l [eof $f]
  69.     lappend l [gets $f]
  70.     lappend l [eof $f]
  71.     lappend l [gets $f]
  72.     lappend l [eof $f]
  73.     lappend l [gets $f]
  74.     lappend l [eof $f]
  75.     close $f
  76.     set l
  77. } "abc def 0 x1aqrs 0 tuv 0 {} 1"
  78. test io-31.24 {Tcl_Write, ^Z in middle ignored, Tcl_Gets crlf} {
  79.     file delete $path(test1)
  80.     set f [open $path(test1) w]
  81.     fconfigure $f -translation crlf -eofchar {}
  82.     set s [format "abcndefn%cqrsntuv" 26]
  83.     puts $f $s
  84.     close $f
  85.     set f [open $path(test1) r]
  86.     fconfigure $f -translation crlf -eofchar {}
  87.     set l ""
  88.     lappend l [gets $f]
  89.     lappend l [gets $f]
  90.     lappend l [eof $f]
  91.     lappend l [gets $f]
  92.     lappend l [eof $f]
  93.     lappend l [gets $f]
  94.     lappend l [eof $f]
  95.     lappend l [gets $f]
  96.     lappend l [eof $f]
  97.     close $f
  98.     set l
  99. } "abc def 0 x1aqrs 0 tuv 0 {} 1"
  100. test io-31.25 {Tcl_Write lf, ^Z in middle, Tcl_Gets auto} {
  101.     file delete $path(test1)
  102.     set f [open $path(test1) w]
  103.     fconfigure $f -translation lf
  104.     set s [format "abcndefn%cqrsntuv" 26]
  105.     puts $f $s
  106.     close $f
  107.     set f [open $path(test1) r]
  108.     fconfigure $f -translation auto -eofchar x1a
  109.     set l ""
  110.     lappend l [gets $f]
  111.     lappend l [gets $f]
  112.     lappend l [eof $f]
  113.     lappend l [gets $f]
  114.     lappend l [eof $f]
  115.     close $f
  116.     set l
  117. } {abc def 0 {} 1}
  118. test io-31.26 {Tcl_Write lf, ^Z in middle, Tcl_Gets lf} {
  119.     file delete $path(test1)
  120.     set f [open $path(test1) w]
  121.     fconfigure $f -translation lf
  122.     set s [format "abcndefn%cqrsntuv" 26]
  123.     puts $f $s
  124.     close $f
  125.     set f [open $path(test1) r]
  126.     fconfigure $f -translation lf -eofchar x1a
  127.     set l ""
  128.     lappend l [gets $f]
  129.     lappend l [gets $f]
  130.     lappend l [eof $f]
  131.     lappend l [gets $f]
  132.     lappend l [eof $f]
  133.     close $f
  134.     set l
  135. } {abc def 0 {} 1}
  136. test io-31.27 {Tcl_Write cr, ^Z in middle, Tcl_Gets auto} {
  137.     file delete $path(test1)
  138.     set f [open $path(test1) w]
  139.     fconfigure $f -translation cr -eofchar {}
  140.     set s [format "abcndefn%cqrsntuv" 26]
  141.     puts $f $s
  142.     close $f
  143.     set f [open $path(test1) r]
  144.     fconfigure $f -translation auto -eofchar x1a
  145.     set l ""
  146.     lappend l [gets $f]
  147.     lappend l [gets $f]
  148.     lappend l [eof $f]
  149.     lappend l [gets $f]
  150.     lappend l [eof $f]
  151.     close $f
  152.     set l
  153. } {abc def 0 {} 1}
  154. test io-31.28 {Tcl_Write cr, ^Z in middle, Tcl_Gets cr} {
  155.     file delete $path(test1)
  156.     set f [open $path(test1) w]
  157.     fconfigure $f -translation cr -eofchar {}
  158.     set s [format "abcndefn%cqrsntuv" 26]
  159.     puts $f $s
  160.     close $f
  161.     set f [open $path(test1) r]
  162.     fconfigure $f -translation cr -eofchar x1a
  163.     set l ""
  164.     lappend l [gets $f]
  165.     lappend l [gets $f]
  166.     lappend l [eof $f]
  167.     lappend l [gets $f]
  168.     lappend l [eof $f]
  169.     close $f
  170.     set l
  171. } {abc def 0 {} 1}
  172. test io-31.29 {Tcl_Write crlf, ^Z in middle, Tcl_Gets auto} {
  173.     file delete $path(test1)
  174.     set f [open $path(test1) w]
  175.     fconfigure $f -translation crlf -eofchar {}
  176.     set s [format "abcndefn%cqrsntuv" 26]
  177.     puts $f $s
  178.     close $f
  179.     set f [open $path(test1) r]
  180.     fconfigure $f -translation auto -eofchar x1a
  181.     set l ""
  182.     lappend l [gets $f]
  183.     lappend l [gets $f]
  184.     lappend l [eof $f]
  185.     lappend l [gets $f]
  186.     lappend l [eof $f]
  187.     close $f
  188.     set l
  189. } {abc def 0 {} 1}
  190. test io-31.30 {Tcl_Write crlf, ^Z in middle, Tcl_Gets crlf} {
  191.     file delete $path(test1)
  192.     set f [open $path(test1) w]
  193.     fconfigure $f -translation crlf -eofchar {}
  194.     set s [format "abcndefn%cqrsntuv" 26]
  195.     puts $f $s
  196.     close $f
  197.     set f [open $path(test1) r]
  198.     fconfigure $f -translation crlf -eofchar x1a
  199.     set l ""
  200.     lappend l [gets $f]
  201.     lappend l [gets $f]
  202.     lappend l [eof $f]
  203.     lappend l [gets $f]
  204.     lappend l [eof $f]
  205.     close $f
  206.     set l
  207. } {abc def 0 {} 1}
  208. test io-31.31 {Tcl_Write crlf on block boundary, Tcl_Gets crlf} {
  209.     file delete $path(test1)
  210.     set f [open $path(test1) w]
  211.     fconfigure $f -translation crlf
  212.     set line "123456789ABCDE" ;# 14 char plus crlf
  213.     puts -nonewline $f x ;# shift crlf across block boundary
  214.     for {set i 0} {$i < 700} {incr i} {
  215. puts $f $line
  216.     }
  217.     close $f
  218.     set f [open $path(test1) r]
  219.     fconfigure $f -translation crlf 
  220.     set c ""
  221.     while {[gets $f line] >= 0} {
  222. append c $linen
  223.     }
  224.     close $f
  225.     string length $c
  226. } [expr 700*15+1]
  227. test io-31.32 {Tcl_Write crlf on block boundary, Tcl_Gets auto} {
  228.     file delete $path(test1)
  229.     set f [open $path(test1) w]
  230.     fconfigure $f -translation crlf
  231.     set line "123456789ABCDE" ;# 14 char plus crlf
  232.     puts -nonewline $f x ;# shift crlf across block boundary
  233.     for {set i 0} {$i < 700} {incr i} {
  234. puts $f $line
  235.     }
  236.     close $f
  237.     set f [open $path(test1) r]
  238.     fconfigure $f -translation auto
  239.     set c ""
  240.     while {[gets $f line] >= 0} {
  241. append c $linen
  242.     }
  243.     close $f
  244.     string length $c
  245. } [expr 700*15+1]
  246. # Test Tcl_Read and buffering.
  247. test io-32.1 {Tcl_Read, channel not readable} {
  248.     list [catch {read stdout} msg] $msg
  249. } {1 {channel "stdout" wasn't opened for reading}}
  250. test io-32.2 {Tcl_Read, zero byte count} {
  251.     read stdin 0
  252. } ""
  253. test io-32.3 {Tcl_Read, negative byte count} {
  254.     set f [open $path(longfile) r]
  255.     set l [list [catch {read $f -1} msg] $msg]
  256.     close $f
  257.     set l
  258. } {1 {bad argument "-1": should be "nonewline"}}
  259. test io-32.4 {Tcl_Read, positive byte count} {
  260.     set f [open $path(longfile) r]
  261.     set x [read $f 1024]
  262.     set s [string length $x]
  263.     unset x
  264.     close $f
  265.     set s
  266. } 1024
  267. test io-32.5 {Tcl_Read, multiple buffers} {
  268.     set f [open $path(longfile) r]
  269.     fconfigure $f -buffersize 100
  270.     set x [read $f 1024]
  271.     set s [string length $x]
  272.     unset x
  273.     close $f
  274.     set s
  275. } 1024
  276. test io-32.6 {Tcl_Read, very large read} {
  277.     set f1 [open $path(longfile) r]
  278.     set z [read $f1 1000000]
  279.     close $f1
  280.     set l [string length $z]
  281.     set x ok
  282.     set z [file size $path(longfile)]
  283.     if {$z != $l} {
  284. set x broken
  285.     }
  286.     set x
  287. } ok
  288. test io-32.7 {Tcl_Read, nonblocking, file} {nonBlockFiles} {
  289.     set f1 [open $path(longfile) r]
  290.     fconfigure $f1 -blocking off
  291.     set z [read $f1 20]
  292.     close $f1
  293.     set l [string length $z]
  294.     set x ok
  295.     if {$l != 20} {
  296. set x broken
  297.     }
  298.     set x
  299. } ok
  300. test io-32.8 {Tcl_Read, nonblocking, file} {nonBlockFiles} {
  301.     set f1 [open $path(longfile) r]
  302.     fconfigure $f1 -blocking off
  303.     set z [read $f1 1000000]
  304.     close $f1
  305.     set x ok
  306.     set l [string length $z]
  307.     set z [file size $path(longfile)]
  308.     if {$z != $l} {
  309. set x broken
  310.     }
  311.     set x
  312. } ok
  313. test io-32.9 {Tcl_Read, read to end of file} {
  314.     set f1 [open $path(longfile) r]
  315.     set z [read $f1]
  316.     close $f1
  317.     set l [string length $z]
  318.     set x ok
  319.     set z [file size $path(longfile)]
  320.     if {$z != $l} {
  321. set x broken
  322.     }
  323.     set x
  324. } ok
  325. test io-32.10 {Tcl_Read from a pipe} {stdio openpipe} {
  326.     file delete $path(pipe)
  327.     set f1 [open $path(pipe) w]
  328.     puts $f1 {puts [gets stdin]}
  329.     close $f1
  330.     set f1 [open "|[list [interpreter] $path(pipe)]" r+]
  331.     puts $f1 hello
  332.     flush $f1
  333.     set x [read $f1]
  334.     close $f1
  335.     set x
  336. } "hellon"
  337. test io-32.11 {Tcl_Read from a pipe} {stdio openpipe} {
  338.     file delete $path(pipe)
  339.     set f1 [open $path(pipe) w]
  340.     puts $f1 {puts [gets stdin]}
  341.     puts $f1 {puts [gets stdin]}
  342.     close $f1
  343.     set f1 [open "|[list [interpreter] $path(pipe)]" r+]
  344.     puts $f1 hello
  345.     flush $f1
  346.     set x ""
  347.     lappend x [read $f1 6]
  348.     puts $f1 hello
  349.     flush $f1
  350.     lappend x [read $f1]
  351.     close $f1
  352.     set x
  353. } {{hello
  354. } {hello
  355. }}
  356. test io-32.12 {Tcl_Read, -nonewline} {
  357.     file delete $path(test1)
  358.     set f1 [open $path(test1) w]
  359.     puts $f1 hello
  360.     puts $f1 bye
  361.     close $f1
  362.     set f1 [open $path(test1) r]
  363.     set c [read -nonewline $f1]
  364.     close $f1
  365.     set c
  366. } {hello
  367. bye}
  368. test io-32.13 {Tcl_Read, -nonewline} {
  369.     file delete $path(test1)
  370.     set f1 [open $path(test1) w]
  371.     puts $f1 hello
  372.     puts $f1 bye
  373.     close $f1
  374.     set f1 [open $path(test1) r]
  375.     set c [read -nonewline $f1]
  376.     close $f1
  377.     list [string length $c] $c
  378. } {9 {hello
  379. bye}}
  380. test io-32.14 {Tcl_Read, reading in small chunks} {
  381.     file delete $path(test1)
  382.     set f [open $path(test1) w]
  383.     puts $f "Two lines: this one"
  384.     puts $f "and this one"
  385.     close $f
  386.     set f [open $path(test1)]
  387.     set x [list [read $f 1] [read $f 2] [read $f]]
  388.     close $f
  389.     set x
  390. } {T wo { lines: this one
  391. and this one
  392. }}
  393. test io-32.15 {Tcl_Read, asking for more input than available} {
  394.     file delete $path(test1)
  395.     set f [open $path(test1) w]
  396.     puts $f "Two lines: this one"
  397.     puts $f "and this one"
  398.     close $f
  399.     set f [open $path(test1)]
  400.     set x [read $f 100]
  401.     close $f
  402.     set x
  403. } {Two lines: this one
  404. and this one
  405. }
  406. test io-32.16 {Tcl_Read, read to end of file with -nonewline} {
  407.     file delete $path(test1)
  408.     set f [open $path(test1) w]
  409.     puts $f "Two lines: this one"
  410.     puts $f "and this one"
  411.     close $f
  412.     set f [open $path(test1)]
  413.     set x [read -nonewline $f]
  414.     close $f
  415.     set x
  416. } {Two lines: this one
  417. and this one}
  418. # Test Tcl_Gets.
  419. test io-33.1 {Tcl_Gets, reading what was written} {
  420.     file delete $path(test1)
  421.     set f1 [open $path(test1) w]
  422.     set y "first line"
  423.     puts $f1 $y
  424.     close $f1
  425.     set f1 [open $path(test1) r]
  426.     set x [gets $f1]
  427.     set z ok
  428.     if {"$x" != "$y"} {
  429. set z broken
  430.     }
  431.     close $f1
  432.     set z
  433. } ok
  434. test io-33.2 {Tcl_Gets into variable} {
  435.     set f1 [open $path(longfile) r]
  436.     set c [gets $f1 x]
  437.     set l [string length x]
  438.     set z ok
  439.     if {$l != $l} {
  440. set z broken
  441.     }
  442.     close $f1
  443.     set z
  444. } ok
  445. test io-33.3 {Tcl_Gets from pipe} {stdio openpipe} {
  446.     file delete $path(pipe)
  447.     set f1 [open $path(pipe) w]
  448.     puts $f1 {puts [gets stdin]}
  449.     close $f1
  450.     set f1 [open "|[list [interpreter] $path(pipe)]" r+]
  451.     puts $f1 hello
  452.     flush $f1
  453.     set x [gets $f1]
  454.     close $f1
  455.     set z ok
  456.     if {"$x" != "hello"} {
  457. set z broken
  458.     }
  459.     set z
  460. } ok
  461. test io-33.4 {Tcl_Gets with long line} {
  462.     file delete $path(test3)
  463.     set f [open $path(test3) w]
  464.     puts -nonewline $f "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  465.     puts -nonewline $f "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  466.     puts -nonewline $f "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  467.     puts -nonewline $f "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  468.     puts $f "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  469.     close $f
  470.     set f [open $path(test3)]
  471.     set x [gets $f]
  472.     close $f
  473.     set x
  474. } {abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ}
  475. test io-33.5 {Tcl_Gets with long line} {
  476.     set f [open $path(test3)]
  477.     set x [gets $f y]
  478.     close $f
  479.     list $x $y
  480. } {260 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ}
  481. test io-33.6 {Tcl_Gets and end of file} {
  482.     file delete $path(test3)
  483.     set f [open $path(test3) w]
  484.     puts -nonewline $f "Test1nTest2"
  485.     close $f
  486.     set f [open $path(test3)]
  487.     set x {}
  488.     set y {}
  489.     lappend x [gets $f y] $y
  490.     set y {}
  491.     lappend x [gets $f y] $y
  492.     set y {}
  493.     lappend x [gets $f y] $y
  494.     close $f
  495.     set x
  496. } {5 Test1 5 Test2 -1 {}}
  497. test io-33.7 {Tcl_Gets and bad variable} {
  498.     set f [open $path(test3) w]
  499.     puts $f "Line 1"
  500.     puts $f "Line 2"
  501.     close $f
  502.     catch {unset x}
  503.     set x 24
  504.     set f [open $path(test3) r]
  505.     set result [list [catch {gets $f x(0)} msg] $msg]
  506.     close $f
  507.     set result
  508. } {1 {can't set "x(0)": variable isn't array}}
  509. test io-33.8 {Tcl_Gets, exercising double buffering} {
  510.     set f [open $path(test3) w]
  511.     fconfigure $f -translation lf -eofchar {}
  512.     set x ""
  513.     for {set y 0} {$y < 99} {incr y} {set x "a$x"}
  514.     for {set y 0} {$y < 100} {incr y} {puts $f $x}
  515.     close $f
  516.     set f [open $path(test3) r]
  517.     fconfigure $f -translation lf
  518.     for {set y 0} {$y < 100} {incr y} {gets $f}
  519.     close $f
  520.     set y
  521. } 100
  522. test io-33.9 {Tcl_Gets, exercising double buffering} {
  523.     set f [open $path(test3) w]
  524.     fconfigure $f -translation lf -eofchar {}
  525.     set x ""
  526.     for {set y 0} {$y < 99} {incr y} {set x "a$x"}
  527.     for {set y 0} {$y < 200} {incr y} {puts $f $x}
  528.     close $f
  529.     set f [open $path(test3) r]
  530.     fconfigure $f -translation lf
  531.     for {set y 0} {$y < 200} {incr y} {gets $f}
  532.     close $f
  533.     set y
  534. } 200
  535. test io-33.10 {Tcl_Gets, exercising double buffering} {
  536.     set f [open $path(test3) w]
  537.     fconfigure $f -translation lf -eofchar {}
  538.     set x ""
  539.     for {set y 0} {$y < 99} {incr y} {set x "a$x"}
  540.     for {set y 0} {$y < 300} {incr y} {puts $f $x}
  541.     close $f
  542.     set f [open $path(test3) r]
  543.     fconfigure $f -translation lf
  544.     for {set y 0} {$y < 300} {incr y} {gets $f}
  545.     close $f
  546.     set y
  547. } 300
  548. # Test Tcl_Seek and Tcl_Tell.
  549. test io-34.1 {Tcl_Seek to current position at start of file} {
  550.     set f1 [open $path(longfile) r]
  551.     seek $f1 0 current
  552.     set c [tell $f1]
  553.     close $f1
  554.     set c
  555. } 0
  556. test io-34.2 {Tcl_Seek to offset from start} {
  557.     file delete $path(test1)
  558.     set f1 [open $path(test1) w]
  559.     fconfigure $f1 -translation lf -eofchar {}
  560.     puts $f1 "abcdefghijklmnopqrstuvwxyz"
  561.     puts $f1 "abcdefghijklmnopqrstuvwxyz"
  562.     close $f1
  563.     set f1 [open $path(test1) r]
  564.     seek $f1 10 start
  565.     set c [tell $f1]
  566.     close $f1
  567.     set c
  568. } 10
  569. test io-34.3 {Tcl_Seek to end of file} {
  570.     file delete $path(test1)
  571.     set f1 [open $path(test1) w]
  572.     fconfigure $f1 -translation lf -eofchar {}
  573.     puts $f1 "abcdefghijklmnopqrstuvwxyz"
  574.     puts $f1 "abcdefghijklmnopqrstuvwxyz"
  575.     close $f1
  576.     set f1 [open $path(test1) r]
  577.     seek $f1 0 end
  578.     set c [tell $f1]
  579.     close $f1
  580.     set c
  581. } 54
  582. test io-34.4 {Tcl_Seek to offset from end of file} {
  583.     file delete $path(test1)
  584.     set f1 [open $path(test1) w]
  585.     fconfigure $f1 -translation lf -eofchar {}
  586.     puts $f1 "abcdefghijklmnopqrstuvwxyz"
  587.     puts $f1 "abcdefghijklmnopqrstuvwxyz"
  588.     close $f1
  589.     set f1 [open $path(test1) r]
  590.     seek $f1 -10 end
  591.     set c [tell $f1]
  592.     close $f1
  593.     set c
  594. } 44
  595. test io-34.5 {Tcl_Seek to offset from current position} {
  596.     file delete $path(test1)
  597.     set f1 [open $path(test1) w]
  598.     fconfigure $f1 -translation lf -eofchar {}
  599.     puts $f1 "abcdefghijklmnopqrstuvwxyz"
  600.     puts $f1 "abcdefghijklmnopqrstuvwxyz"
  601.     close $f1
  602.     set f1 [open $path(test1) r]
  603.     seek $f1 10 current
  604.     seek $f1 10 current
  605.     set c [tell $f1]
  606.     close $f1
  607.     set c
  608. } 20
  609. test io-34.6 {Tcl_Seek to offset from end of file} {
  610.     file delete $path(test1)
  611.     set f1 [open $path(test1) w]
  612.     fconfigure $f1 -translation lf -eofchar {}
  613.     puts $f1 "abcdefghijklmnopqrstuvwxyz"
  614.     puts $f1 "abcdefghijklmnopqrstuvwxyz"
  615.     close $f1
  616.     set f1 [open $path(test1) r]
  617.     seek $f1 -10 end
  618.     set c [tell $f1]
  619.     set r [read $f1]
  620.     close $f1
  621.     list $c $r
  622. } {44 {rstuvwxyz
  623. }}
  624. test io-34.7 {Tcl_Seek to offset from end of file, then to current position} {
  625.     file delete $path(test1)
  626.     set f1 [open $path(test1) w]
  627.     fconfigure $f1 -translation lf -eofchar {}
  628.     puts $f1 "abcdefghijklmnopqrstuvwxyz"
  629.     puts $f1 "abcdefghijklmnopqrstuvwxyz"
  630.     close $f1
  631.     set f1 [open $path(test1) r]
  632.     seek $f1 -10 end
  633.     set c1 [tell $f1]
  634.     set r1 [read $f1 5]
  635.     seek $f1 0 current
  636.     set c2 [tell $f1]
  637.     close $f1
  638.     list $c1 $r1 $c2
  639. } {44 rstuv 49}
  640. test io-34.8 {Tcl_Seek on pipes: not supported} {stdio openpipe} {
  641.     set f1 [open "|[list [interpreter]]" r+]
  642.     set x [list [catch {seek $f1 0 current} msg] $msg]
  643.     close $f1
  644.     regsub {".*":} $x {"":} x
  645.     string tolower $x
  646. } {1 {error during seek on "": invalid argument}}
  647. test io-34.9 {Tcl_Seek, testing buffered input flushing} {
  648.     file delete $path(test3)
  649.     set f [open $path(test3) w]
  650.     fconfigure $f -eofchar {}
  651.     puts -nonewline $f "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  652.     close $f
  653.     set f [open $path(test3) RDWR]
  654.     set x [read $f 1]
  655.     seek $f 3
  656.     lappend x [read $f 1]
  657.     seek $f 0 start
  658.     lappend x [read $f 1]
  659.     seek $f 10 current
  660.     lappend x [read $f 1]
  661.     seek $f -2 end
  662.     lappend x [read $f 1]
  663.     seek $f 50 end
  664.     lappend x [read $f 1]
  665.     seek $f 1
  666.     lappend x [read $f 1]
  667.     close $f
  668.     set x
  669. } {a d a l Y {} b}
  670. set path(test3) [makeFile {} test3]
  671. test io-34.10 {Tcl_Seek testing flushing of buffered input} {
  672.     set f [open $path(test3) w]
  673.     fconfigure $f -translation lf
  674.     puts $f xyzn123
  675.     close $f
  676.     set f [open $path(test3) r+]
  677.     fconfigure $f -translation lf
  678.     set x [gets $f]
  679.     seek $f 0 current
  680.     puts $f 456
  681.     close $f
  682.     list $x [viewFile test3]
  683. } "xyz {xyz
  684. 456}"
  685. test io-34.11 {Tcl_Seek testing flushing of buffered output} {
  686.     set f [open $path(test3) w]
  687.     puts $f xyzn123
  688.     close $f
  689.     set f [open $path(test3) w+]
  690.     puts $f xyzzy
  691.     seek $f 2
  692.     set x [gets $f]
  693.     close $f
  694.     list $x [viewFile test3]
  695. } "zzy xyzzy"
  696. test io-34.12 {Tcl_Seek testing combination of write, seek back and read} {
  697.     set f [open $path(test3) w]
  698.     fconfigure $f -translation lf -eofchar {}
  699.     puts $f xyzn123
  700.     close $f
  701.     set f [open $path(test3) a+]
  702.     fconfigure $f -translation lf -eofchar {}
  703.     puts $f xyzzy
  704.     flush $f
  705.     set x [tell $f]
  706.     seek $f -4 cur
  707.     set y [gets $f]
  708.     close $f
  709.     list $x [viewFile test3] $y
  710. } {14 {xyz
  711. 123
  712. xyzzy} zzy}
  713. test io-34.13 {Tcl_Tell at start of file} {
  714.     file delete $path(test1)
  715.     set f1 [open $path(test1) w]
  716.     set p [tell $f1]
  717.     close $f1
  718.     set p
  719. } 0
  720. test io-34.14 {Tcl_Tell after seek to end of file} {
  721.     file delete $path(test1)
  722.     set f1 [open $path(test1) w]
  723.     fconfigure $f1 -translation lf -eofchar {}
  724.     puts $f1 "abcdefghijklmnopqrstuvwxyz"
  725.     puts $f1 "abcdefghijklmnopqrstuvwxyz"
  726.     close $f1
  727.     set f1 [open $path(test1) r]
  728.     seek $f1 0 end
  729.     set c1 [tell $f1]
  730.     close $f1
  731.     set c1
  732. } 54
  733. test io-34.15 {Tcl_Tell combined with seeking} {
  734.     file delete $path(test1)
  735.     set f1 [open $path(test1) w]
  736.     fconfigure $f1 -translation lf -eofchar {}
  737.     puts $f1 "abcdefghijklmnopqrstuvwxyz"
  738.     puts $f1 "abcdefghijklmnopqrstuvwxyz"
  739.     close $f1
  740.     set f1 [open $path(test1) r]
  741.     seek $f1 10 start
  742.     set c1 [tell $f1]
  743.     seek $f1 10 current
  744.     set c2 [tell $f1]
  745.     close $f1
  746.     list $c1 $c2
  747. } {10 20}
  748. test io-34.16 {Tcl_tell on pipe: always -1} {stdio openpipe} {
  749.     set f1 [open "|[list [interpreter]]" r+]
  750.     set c [tell $f1]
  751.     close $f1
  752.     set c
  753. } -1
  754. test io-34.17 {Tcl_Tell on pipe: always -1} {stdio openpipe} {
  755.     set f1 [open "|[list [interpreter]]" r+]
  756.     puts $f1 {puts hello}
  757.     flush $f1
  758.     set c [tell $f1]
  759.     gets $f1
  760.     close $f1
  761.     set c
  762. } -1
  763. test io-34.18 {Tcl_Tell combined with seeking and reading} {
  764.     file delete $path(test2)
  765.     set f [open $path(test2) w]
  766.     fconfigure $f -translation lf -eofchar {}
  767.     puts -nonewline $f "line1nline2nline3nline4nline5n"
  768.     close $f
  769.     set f [open $path(test2)]
  770.     fconfigure $f -translation lf
  771.     set x [tell $f]
  772.     read $f 3
  773.     lappend x [tell $f]
  774.     seek $f 2
  775.     lappend x [tell $f]
  776.     seek $f 10 current
  777.     lappend x [tell $f]
  778.     seek $f 0 end
  779.     lappend x [tell $f]
  780.     close $f
  781.     set x
  782. } {0 3 2 12 30}
  783. test io-34.19 {Tcl_Tell combined with opening in append mode} {
  784.     set f [open $path(test3) w]
  785.     fconfigure $f -translation lf -eofchar {}
  786.     puts $f "abcdefghijklmnopqrstuvwxyz"
  787.     puts $f "abcdefghijklmnopqrstuvwxyz"
  788.     close $f
  789.     set f [open $path(test3) a]
  790.     set c [tell $f]
  791.     close $f
  792.     set c
  793. } 54
  794. test io-34.20 {Tcl_Tell combined with writing} {
  795.     set f [open $path(test3) w]
  796.     set l ""
  797.     seek $f 29 start
  798.     lappend l [tell $f]
  799.     puts -nonewline $f a
  800.     seek $f 39 start
  801.     lappend l [tell $f]
  802.     puts -nonewline $f a
  803.     lappend l [tell $f]
  804.     seek $f 407 end
  805.     lappend l [tell $f]
  806.     close $f
  807.     set l
  808. } {29 39 40 447}
  809. test io-34.21 {Tcl_Seek and Tcl_Tell on large files} {largefileSupport} {
  810.     file delete $path(test3)
  811.     set f [open $path(test3) w]
  812.     fconfigure $f -encoding binary
  813.     set l ""
  814.     lappend l [tell $f]
  815.     puts -nonewline $f abcdef
  816.     lappend l [tell $f]
  817.     flush $f
  818.     lappend l [tell $f]
  819.     # 4GB offset!
  820.     seek $f 0x100000000
  821.     lappend l [tell $f]
  822.     puts -nonewline $f abcdef
  823.     lappend l [tell $f]
  824.     close $f
  825.     lappend l [file size $f]
  826.     # truncate...
  827.     close [open $path(test3) w]
  828.     lappend l [file size $f]
  829.     set l
  830. } {0 6 6 4294967296 4294967302 4294967302 0}
  831. # Test Tcl_Eof
  832. test io-35.1 {Tcl_Eof} {
  833.     file delete $path(test1)
  834.     set f [open $path(test1) w]
  835.     puts $f hello
  836.     puts $f hello
  837.     close $f
  838.     set f [open $path(test1)]
  839.     set x [eof $f]
  840.     lappend x [eof $f]
  841.     gets $f
  842.     lappend x [eof $f]
  843.     gets $f
  844.     lappend x [eof $f]
  845.     gets $f
  846.     lappend x [eof $f]
  847.     lappend x [eof $f]
  848.     close $f
  849.     set x
  850. } {0 0 0 0 1 1}
  851. test io-35.2 {Tcl_Eof with pipe} {stdio openpipe} {
  852.     file delete $path(pipe)
  853.     set f1 [open $path(pipe) w]
  854.     puts $f1 {gets stdin}
  855.     puts $f1 {puts hello}
  856.     close $f1
  857.     set f1 [open "|[list [interpreter] $path(pipe)]" r+]
  858.     puts $f1 hello
  859.     set x [eof $f1]
  860.     flush $f1
  861.     lappend x [eof $f1]
  862.     gets $f1
  863.     lappend x [eof $f1]
  864.     gets $f1
  865.     lappend x [eof $f1]
  866.     close $f1
  867.     set x
  868. } {0 0 0 1}
  869. test io-35.3 {Tcl_Eof with pipe} {stdio openpipe} {
  870.     file delete $path(pipe)
  871.     set f1 [open $path(pipe) w]
  872.     puts $f1 {gets stdin}
  873.     puts $f1 {puts hello}
  874.     close $f1
  875.     set f1 [open "|[list [interpreter] $path(pipe)]" r+]
  876.     puts $f1 hello
  877.     set x [eof $f1]
  878.     flush $f1
  879.     lappend x [eof $f1]
  880.     gets $f1
  881.     lappend x [eof $f1]
  882.     gets $f1
  883.     lappend x [eof $f1]
  884.     gets $f1
  885.     lappend x [eof $f1]
  886.     gets $f1
  887.     lappend x [eof $f1]
  888.     close $f1
  889.     set x
  890. } {0 0 0 1 1 1}
  891. test io-35.4 {Tcl_Eof, eof detection on nonblocking file} {nonBlockFiles} {
  892.     file delete $path(test1)
  893.     set f [open $path(test1) w]
  894.     close $f
  895.     set f [open $path(test1) r]
  896.     fconfigure $f -blocking off
  897.     set l ""
  898.     lappend l [gets $f]
  899.     lappend l [eof $f]
  900.     close $f
  901.     set l
  902. } {{} 1}
  903. test io-35.5 {Tcl_Eof, eof detection on nonblocking pipe} {stdio openpipe} {
  904.     file delete $path(pipe)
  905.     set f [open $path(pipe) w]
  906.     puts $f {
  907. exit
  908.     }
  909.     close $f
  910.     set f [open "|[list [interpreter] $path(pipe)]" r]
  911.     set l ""
  912.     lappend l [gets $f]
  913.     lappend l [eof $f]
  914.     close $f
  915.     set l
  916. } {{} 1}
  917. test io-35.6 {Tcl_Eof, eof char, lf write, auto read} {
  918.     file delete $path(test1)
  919.     set f [open $path(test1) w]
  920.     fconfigure $f -translation lf -eofchar x1a
  921.     puts $f abcndef
  922.     close $f
  923.     set s [file size $path(test1)]
  924.     set f [open $path(test1) r]
  925.     fconfigure $f -translation auto -eofchar x1a
  926.     set l [string length [read $f]]
  927.     set e [eof $f]
  928.     close $f
  929.     list $s $l $e
  930. } {9 8 1}
  931. test io-35.7 {Tcl_Eof, eof char, lf write, lf read} {
  932.     file delete $path(test1)
  933.     set f [open $path(test1) w]
  934.     fconfigure $f -translation lf -eofchar x1a
  935.     puts $f abcndef
  936.     close $f
  937.     set s [file size $path(test1)]
  938.     set f [open $path(test1) r]
  939.     fconfigure $f -translation lf -eofchar x1a
  940.     set l [string length [read $f]]
  941.     set e [eof $f]
  942.     close $f
  943.     list $s $l $e
  944. } {9 8 1}
  945. test io-35.8 {Tcl_Eof, eof char, cr write, auto read} {
  946.     file delete $path(test1)
  947.     set f [open $path(test1) w]
  948.     fconfigure $f -translation cr -eofchar x1a
  949.     puts $f abcndef
  950.     close $f
  951.     set s [file size $path(test1)]
  952.     set f [open $path(test1) r]
  953.     fconfigure $f -translation auto -eofchar x1a
  954.     set l [string length [read $f]]
  955.     set e [eof $f]
  956.     close $f
  957.     list $s $l $e
  958. } {9 8 1}
  959. test io-35.9 {Tcl_Eof, eof char, cr write, cr read} {
  960.     file delete $path(test1)
  961.     set f [open $path(test1) w]
  962.     fconfigure $f -translation cr -eofchar x1a
  963.     puts $f abcndef
  964.     close $f
  965.     set s [file size $path(test1)]
  966.     set f [open $path(test1) r]
  967.     fconfigure $f -translation cr -eofchar x1a
  968.     set l [string length [read $f]]
  969.     set e [eof $f]
  970.     close $f
  971.     list $s $l $e
  972. } {9 8 1}
  973. test io-35.10 {Tcl_Eof, eof char, crlf write, auto read} {
  974.     file delete $path(test1)
  975.     set f [open $path(test1) w]
  976.     fconfigure $f -translation crlf -eofchar x1a
  977.     puts $f abcndef
  978.     close $f
  979.     set s [file size $path(test1)]
  980.     set f [open $path(test1) r]
  981.     fconfigure $f -translation auto -eofchar x1a
  982.     set l [string length [read $f]]
  983.     set e [eof $f]
  984.     close $f
  985.     list $s $l $e
  986. } {11 8 1}
  987. test io-35.11 {Tcl_Eof, eof char, crlf write, crlf read} {
  988.     file delete $path(test1)
  989.     set f [open $path(test1) w]
  990.     fconfigure $f -translation crlf -eofchar x1a
  991.     puts $f abcndef
  992.     close $f
  993.     set s [file size $path(test1)]
  994.     set f [open $path(test1) r]
  995.     fconfigure $f -translation crlf -eofchar x1a
  996.     set l [string length [read $f]]
  997.     set e [eof $f]
  998.     close $f
  999.     list $s $l $e
  1000. } {11 8 1}
  1001. test io-35.12 {Tcl_Eof, eof char in middle, lf write, auto read} {
  1002.     file delete $path(test1)
  1003.     set f [open $path(test1) w]
  1004.     fconfigure $f -translation lf -eofchar {}
  1005.     set i [format abcndefn%cqrsnuvw 26]
  1006.     puts $f $i
  1007.     close $f
  1008.     set c [file size $path(test1)]
  1009.     set f [open $path(test1) r]
  1010.     fconfigure $f -translation auto -eofchar x1a
  1011.     set l [string length [read $f]]
  1012.     set e [eof $f]
  1013.     close $f
  1014.     list $c $l $e
  1015. } {17 8 1}
  1016. test io-35.13 {Tcl_Eof, eof char in middle, lf write, lf read} {
  1017.     file delete $path(test1)
  1018.     set f [open $path(test1) w]
  1019.     fconfigure $f -translation lf -eofchar {}
  1020.     set i [format abcndefn%cqrsnuvw 26]
  1021.     puts $f $i
  1022.     close $f
  1023.     set c [file size $path(test1)]
  1024.     set f [open $path(test1) r]
  1025.     fconfigure $f -translation lf -eofchar x1a
  1026.     set l [string length [read $f]]
  1027.     set e [eof $f]
  1028.     close $f
  1029.     list $c $l $e
  1030. } {17 8 1}
  1031. test io-35.14 {Tcl_Eof, eof char in middle, cr write, auto read} {
  1032.     file delete $path(test1)
  1033.     set f [open $path(test1) w]
  1034.     fconfigure $f -translation cr -eofchar {}
  1035.     set i [format abcndefn%cqrsnuvw 26]
  1036.     puts $f $i
  1037.     close $f
  1038.     set c [file size $path(test1)]
  1039.     set f [open $path(test1) r]
  1040.     fconfigure $f -translation auto -eofchar x1a
  1041.     set l [string length [read $f]]
  1042.     set e [eof $f]
  1043.     close $f
  1044.     list $c $l $e
  1045. } {17 8 1}
  1046. test io-35.15 {Tcl_Eof, eof char in middle, cr write, cr read} {
  1047.     file delete $path(test1)
  1048.     set f [open $path(test1) w]
  1049.     fconfigure $f -translation cr -eofchar {}
  1050.     set i [format abcndefn%cqrsnuvw 26]
  1051.     puts $f $i
  1052.     close $f
  1053.     set c [file size $path(test1)]
  1054.     set f [open $path(test1) r]
  1055.     fconfigure $f -translation cr -eofchar x1a
  1056.     set l [string length [read $f]]
  1057.     set e [eof $f]
  1058.     close $f
  1059.     list $c $l $e
  1060. } {17 8 1}
  1061. test io-35.16 {Tcl_Eof, eof char in middle, crlf write, auto read} {
  1062.     file delete $path(test1)
  1063.     set f [open $path(test1) w]
  1064.     fconfigure $f -translation crlf -eofchar {}
  1065.     set i [format abcndefn%cqrsnuvw 26]
  1066.     puts $f $i
  1067.     close $f
  1068.     set c [file size $path(test1)]
  1069.     set f [open $path(test1) r]
  1070.     fconfigure $f -translation auto -eofchar x1a
  1071.     set l [string length [read $f]]
  1072.     set e [eof $f]
  1073.     close $f
  1074.     list $c $l $e
  1075. } {21 8 1}
  1076. test io-35.17 {Tcl_Eof, eof char in middle, crlf write, crlf read} {
  1077.     file delete $path(test1)
  1078.     set f [open $path(test1) w]
  1079.     fconfigure $f -translation crlf -eofchar {}
  1080.     set i [format abcndefn%cqrsnuvw 26]
  1081.     puts $f $i
  1082.     close $f
  1083.     set c [file size $path(test1)]
  1084.     set f [open $path(test1) r]
  1085.     fconfigure $f -translation crlf -eofchar x1a
  1086.     set l [string length [read $f]]
  1087.     set e [eof $f]
  1088.     close $f
  1089.     list $c $l $e
  1090. } {21 8 1}
  1091. # Test Tcl_InputBlocked
  1092. test io-36.1 {Tcl_InputBlocked on nonblocking pipe} {stdio openpipe} {
  1093.     set f1 [open "|[list [interpreter]]" r+]
  1094.     puts $f1 {puts hello_from_pipe}
  1095.     flush $f1
  1096.     gets $f1
  1097.     fconfigure $f1 -blocking off -buffering full
  1098.     puts $f1 {puts hello}
  1099.     set x ""
  1100.     lappend x [gets $f1]
  1101.     lappend x [fblocked $f1]
  1102.     flush $f1
  1103.     after 200
  1104.     lappend x [gets $f1]
  1105.     lappend x [fblocked $f1]
  1106.     lappend x [gets $f1]
  1107.     lappend x [fblocked $f1]
  1108.     close $f1
  1109.     set x
  1110. } {{} 1 hello 0 {} 1}
  1111. test io-36.2 {Tcl_InputBlocked on blocking pipe} {stdio openpipe} {
  1112.     set f1 [open "|[list [interpreter]]" r+]
  1113.     fconfigure $f1 -buffering line
  1114.     puts $f1 {puts hello_from_pipe}
  1115.     set x ""
  1116.     lappend x [gets $f1]
  1117.     lappend x [fblocked $f1]
  1118.     puts $f1 {exit}
  1119.     lappend x [gets $f1]
  1120.     lappend x [fblocked $f1]
  1121.     lappend x [eof $f1]
  1122.     close $f1
  1123.     set x
  1124. } {hello_from_pipe 0 {} 0 1}
  1125. test io-36.3 {Tcl_InputBlocked vs files, short read} {
  1126.     file delete $path(test1)
  1127.     set f [open $path(test1) w]
  1128.     puts $f abcdefghijklmnop
  1129.     close $f
  1130.     set f [open $path(test1) r]
  1131.     set l ""
  1132.     lappend l [fblocked $f]
  1133.     lappend l [read $f 3]
  1134.     lappend l [fblocked $f]
  1135.     lappend l [read -nonewline $f]
  1136.     lappend l [fblocked $f]
  1137.     lappend l [eof $f]
  1138.     close $f
  1139.     set l
  1140. } {0 abc 0 defghijklmnop 0 1}
  1141. test io-36.4 {Tcl_InputBlocked vs files, event driven read} {fileevent} {
  1142.     proc in {f} {
  1143.         variable l
  1144.         variable x
  1145. lappend l [read $f 3]
  1146. if {[eof $f]} {lappend l eof; close $f; set x done}
  1147.     }
  1148.     file delete $path(test1)
  1149.     set f [open $path(test1) w]
  1150.     puts $f abcdefghijklmnop
  1151.     close $f
  1152.     set f [open $path(test1) r]
  1153.     set l ""
  1154.     fileevent $f readable [namespace code [list in $f]]
  1155.     variable x
  1156.     vwait [namespace which -variable x]
  1157.     set l
  1158. } {abc def ghi jkl mno {p
  1159. } eof}
  1160. test io-36.5 {Tcl_InputBlocked vs files, short read, nonblocking} {nonBlockFiles} {
  1161.     file delete $path(test1)
  1162.     set f [open $path(test1) w]
  1163.     puts $f abcdefghijklmnop
  1164.     close $f
  1165.     set f [open $path(test1) r]
  1166.     fconfigure $f -blocking off
  1167.     set l ""
  1168.     lappend l [fblocked $f]
  1169.     lappend l [read $f 3]
  1170.     lappend l [fblocked $f]
  1171.     lappend l [read -nonewline $f]
  1172.     lappend l [fblocked $f]
  1173.     lappend l [eof $f]
  1174.     close $f
  1175.     set l
  1176. } {0 abc 0 defghijklmnop 0 1}
  1177. test io-36.6 {Tcl_InputBlocked vs files, event driven read} {nonBlockFiles fileevent} {
  1178.     proc in {f} {
  1179.         variable l
  1180.         variable x
  1181. lappend l [read $f 3]
  1182. if {[eof $f]} {lappend l eof; close $f; set x done}
  1183.     }
  1184.     file delete $path(test1)
  1185.     set f [open $path(test1) w]
  1186.     puts $f abcdefghijklmnop
  1187.     close $f
  1188.     set f [open $path(test1) r]
  1189.     fconfigure $f -blocking off
  1190.     set l ""
  1191.     fileevent $f readable [namespace code [list in $f]]
  1192.     variable x
  1193.     vwait [namespace which -variable x]
  1194.     set l
  1195. } {abc def ghi jkl mno {p
  1196. } eof}
  1197. # Test Tcl_InputBuffered
  1198. test io-37.1 {Tcl_InputBuffered} {testchannel} {
  1199.     set f [open $path(longfile) r]
  1200.     fconfigure $f -buffersize 4096
  1201.     read $f 3
  1202.     set l ""
  1203.     lappend l [testchannel inputbuffered $f]
  1204.     lappend l [tell $f]
  1205.     close $f
  1206.     set l
  1207. } {4093 3}
  1208. test io-37.2 {Tcl_InputBuffered, test input flushing on seek} {testchannel} {
  1209.     set f [open $path(longfile) r]
  1210.     fconfigure $f -buffersize 4096
  1211.     read $f 3
  1212.     set l ""
  1213.     lappend l [testchannel inputbuffered $f]
  1214.     lappend l [tell $f]
  1215.     seek $f 0 current
  1216.     lappend l [testchannel inputbuffered $f]
  1217.     lappend l [tell $f]
  1218.     close $f
  1219.     set l
  1220. } {4093 3 0 3}
  1221. # Test Tcl_SetChannelBufferSize, Tcl_GetChannelBufferSize
  1222. test io-38.1 {Tcl_GetChannelBufferSize, default buffer size} {
  1223.     set f [open $path(longfile) r]
  1224.     set s [fconfigure $f -buffersize]
  1225.     close $f
  1226.     set s
  1227. } 4096
  1228. test io-38.2 {Tcl_SetChannelBufferSize, Tcl_GetChannelBufferSize} {
  1229.     set f [open $path(longfile) r]
  1230.     set l ""
  1231.     lappend l [fconfigure $f -buffersize]
  1232.     fconfigure $f -buffersize 10000
  1233.     lappend l [fconfigure $f -buffersize]
  1234.     fconfigure $f -buffersize 1
  1235.     lappend l [fconfigure $f -buffersize]
  1236.     fconfigure $f -buffersize -1
  1237.     lappend l [fconfigure $f -buffersize]
  1238.     fconfigure $f -buffersize 0
  1239.     lappend l [fconfigure $f -buffersize]
  1240.     fconfigure $f -buffersize 100000
  1241.     lappend l [fconfigure $f -buffersize]
  1242.     fconfigure $f -buffersize 10000000
  1243.     lappend l [fconfigure $f -buffersize]
  1244.     close $f
  1245.     set l
  1246. } {4096 10000 1 1 1 100000 100000}
  1247. test io-38.3 {Tcl_SetChannelBufferSize, changing buffersize between reads} {
  1248.     # This test crashes the interp if Bug #427196 is not fixed
  1249.     set chan [open [info script] r]
  1250.     fconfigure $chan -buffersize 10
  1251.     set var [read $chan 2]
  1252.     fconfigure $chan -buffersize 32
  1253.     append var [read $chan]
  1254.     close $chan
  1255. } {}
  1256. # Test Tcl_SetChannelOption, Tcl_GetChannelOption
  1257. test io-39.1 {Tcl_GetChannelOption} {
  1258.     file delete $path(test1)
  1259.     set f1 [open $path(test1) w]
  1260.     set x [fconfigure $f1 -blocking]
  1261.     close $f1
  1262.     set x
  1263. } 1
  1264. #
  1265. # Test 17.2 was removed.
  1266. #
  1267. test io-39.2 {Tcl_GetChannelOption} {
  1268.     file delete $path(test1)
  1269.     set f1 [open $path(test1) w]
  1270.     set x [fconfigure $f1 -buffering]
  1271.     close $f1
  1272.     set x
  1273. } full
  1274. test io-39.3 {Tcl_GetChannelOption} {
  1275.     file delete $path(test1)
  1276.     set f1 [open $path(test1) w]
  1277.     fconfigure $f1 -buffering line
  1278.     set x [fconfigure $f1 -buffering]
  1279.     close $f1
  1280.     set x
  1281. } line
  1282. test io-39.4 {Tcl_GetChannelOption, Tcl_SetChannelOption} {
  1283.     file delete $path(test1)
  1284.     set f1 [open $path(test1) w]
  1285.     set l ""
  1286.     lappend l [fconfigure $f1 -buffering]
  1287.     fconfigure $f1 -buffering line
  1288.     lappend l [fconfigure $f1 -buffering]
  1289.     fconfigure $f1 -buffering none
  1290.     lappend l [fconfigure $f1 -buffering]
  1291.     fconfigure $f1 -buffering line
  1292.     lappend l [fconfigure $f1 -buffering]
  1293.     fconfigure $f1 -buffering full
  1294.     lappend l [fconfigure $f1 -buffering]
  1295.     close $f1
  1296.     set l
  1297. } {full line none line full}
  1298. test io-39.5 {Tcl_GetChannelOption, invariance} {
  1299.     file delete $path(test1)
  1300.     set f1 [open $path(test1) w]
  1301.     set l ""
  1302.     lappend l [fconfigure $f1 -buffering]
  1303.     lappend l [list [catch {fconfigure $f1 -buffering green} msg] $msg]
  1304.     lappend l [fconfigure $f1 -buffering]
  1305.     close $f1
  1306.     set l
  1307. } {full {1 {bad value for -buffering: must be one of full, line, or none}} full}
  1308. test io-39.6 {Tcl_SetChannelOption, multiple options} {
  1309.     file delete $path(test1)
  1310.     set f1 [open $path(test1) w]
  1311.     fconfigure $f1 -translation lf -buffering line
  1312.     puts $f1 hello
  1313.     puts $f1 bye
  1314.     set x [file size $path(test1)]
  1315.     close $f1
  1316.     set x
  1317. } 10
  1318. test io-39.7 {Tcl_SetChannelOption, buffering, translation} {
  1319.     file delete $path(test1)
  1320.     set f1 [open $path(test1) w]
  1321.     fconfigure $f1 -translation lf
  1322.     puts $f1 hello
  1323.     puts $f1 bye
  1324.     set x ""
  1325.     fconfigure $f1 -buffering line
  1326.     lappend x [file size $path(test1)]
  1327.     puts $f1 really_bye
  1328.     lappend x [file size $path(test1)]
  1329.     close $f1
  1330.     set x
  1331. } {0 21}
  1332. test io-39.8 {Tcl_SetChannelOption, different buffering options} {
  1333.     file delete $path(test1)
  1334.     set f1 [open $path(test1) w]
  1335.     set l ""
  1336.     fconfigure $f1 -translation lf -buffering none -eofchar {}
  1337.     puts -nonewline $f1 hello
  1338.     lappend l [file size $path(test1)]
  1339.     puts -nonewline $f1 hello
  1340.     lappend l [file size $path(test1)]
  1341.     fconfigure $f1 -buffering full
  1342.     puts -nonewline $f1 hello
  1343.     lappend l [file size $path(test1)]
  1344.     fconfigure $f1 -buffering none
  1345.     lappend l [file size $path(test1)]
  1346.     puts -nonewline $f1 hello
  1347.     lappend l [file size $path(test1)]
  1348.     close $f1
  1349.     lappend l [file size $path(test1)]
  1350.     set l
  1351. } {5 10 10 10 20 20}
  1352. test io-39.9 {Tcl_SetChannelOption, blocking mode} {nonBlockFiles} {
  1353.     file delete $path(test1)
  1354.     set f1 [open $path(test1) w]
  1355.     close $f1
  1356.     set f1 [open $path(test1) r]
  1357.     set x ""
  1358.     lappend x [fconfigure $f1 -blocking]
  1359.     fconfigure $f1 -blocking off
  1360.     lappend x [fconfigure $f1 -blocking]
  1361.     lappend x [gets $f1]
  1362.     lappend x [read $f1 1000]
  1363.     lappend x [fblocked $f1]
  1364.     lappend x [eof $f1]
  1365.     close $f1
  1366.     set x
  1367. } {1 0 {} {} 0 1}
  1368. test io-39.10 {Tcl_SetChannelOption, blocking mode} {stdio openpipe} {
  1369.     file delete $path(pipe)
  1370.     set f1 [open $path(pipe) w]
  1371.     puts $f1 {
  1372. gets stdin
  1373. after 100
  1374. puts hi
  1375. gets stdin
  1376.     }
  1377.     close $f1
  1378.     set x ""
  1379.     set f1 [open "|[list [interpreter] $path(pipe)]" r+]
  1380.     fconfigure $f1 -blocking off -buffering line
  1381.     lappend x [fconfigure $f1 -blocking]
  1382.     lappend x [gets $f1]
  1383.     lappend x [fblocked $f1]
  1384.     fconfigure $f1 -blocking on
  1385.     puts $f1 hello
  1386.     fconfigure $f1 -blocking off
  1387.     lappend x [gets $f1]
  1388.     lappend x [fblocked $f1]
  1389.     fconfigure $f1 -blocking on
  1390.     puts $f1 bye
  1391.     fconfigure $f1 -blocking off
  1392.     lappend x [gets $f1]
  1393.     lappend x [fblocked $f1]
  1394.     fconfigure $f1 -blocking on
  1395.     lappend x [fconfigure $f1 -blocking]
  1396.     lappend x [gets $f1]
  1397.     lappend x [fblocked $f1]
  1398.     lappend x [eof $f1]
  1399.     lappend x [gets $f1]
  1400.     lappend x [eof $f1]
  1401.     close $f1
  1402.     set x
  1403. } {0 {} 1 {} 1 {} 1 1 hi 0 0 {} 1}
  1404. test io-39.11 {Tcl_SetChannelOption, Tcl_GetChannelOption, buffer size} {
  1405.     file delete $path(test1)
  1406.     set f [open $path(test1) w]
  1407.     fconfigure $f -buffersize -10
  1408.     set x [fconfigure $f -buffersize]
  1409.     close $f
  1410.     set x
  1411. } 4096
  1412. test io-39.12 {Tcl_SetChannelOption, Tcl_GetChannelOption buffer size} {
  1413.     file delete $path(test1)
  1414.     set f [open $path(test1) w]
  1415.     fconfigure $f -buffersize 10000000
  1416.     set x [fconfigure $f -buffersize]
  1417.     close $f
  1418.     set x
  1419. } 4096
  1420. test io-39.13 {Tcl_SetChannelOption, Tcl_GetChannelOption, buffer size} {
  1421.     file delete $path(test1)
  1422.     set f [open $path(test1) w]
  1423.     fconfigure $f -buffersize 40000
  1424.     set x [fconfigure $f -buffersize]
  1425.     close $f
  1426.     set x
  1427. } 40000
  1428. test io-39.14 {Tcl_SetChannelOption: -encoding, binary & utf-8} {
  1429.     file delete $path(test1)
  1430.     set f [open $path(test1) w]
  1431.     fconfigure $f -encoding {} 
  1432.     puts -nonewline $f xe7x89xa6
  1433.     close $f
  1434.     set f [open $path(test1) r]
  1435.     fconfigure $f -encoding utf-8
  1436.     set x [read $f]
  1437.     close $f
  1438.     set x
  1439. } u7266
  1440. test io-39.15 {Tcl_SetChannelOption: -encoding, binary & utf-8} {
  1441.     file delete $path(test1)
  1442.     set f [open $path(test1) w]
  1443.     fconfigure $f -encoding binary
  1444.     puts -nonewline $f xe7x89xa6
  1445.     close $f
  1446.     set f [open $path(test1) r]
  1447.     fconfigure $f -encoding utf-8
  1448.     set x [read $f]
  1449.     close $f
  1450.     set x
  1451. } u7266
  1452. test io-39.16 {Tcl_SetChannelOption: -encoding, errors} {
  1453.     file delete $path(test1)
  1454.     set f [open $path(test1) w]
  1455.     set result [list [catch {fconfigure $f -encoding foobar} msg] $msg]
  1456.     close $f
  1457.     set result
  1458. } {1 {unknown encoding "foobar"}}
  1459. test io-39.17 {Tcl_SetChannelOption: -encoding, clearing CHANNEL_NEED_MORE_DATA} {stdio openpipe fileevent} {
  1460.     set f [open "|[list [interpreter] $path(cat)]" r+]
  1461.     fconfigure $f -encoding binary
  1462.     puts -nonewline $f "xe7"
  1463.     flush $f
  1464.     fconfigure $f -encoding utf-8 -blocking 0
  1465.     variable x {}
  1466.     fileevent $f readable [namespace code { lappend x [read $f] }]
  1467.     vwait [namespace which -variable x]
  1468.     after 300 [namespace code { lappend x timeout }]
  1469.     vwait [namespace which -variable x]
  1470.     fconfigure $f -encoding utf-8
  1471.     vwait [namespace which -variable x]
  1472.     after 300 [namespace code { lappend x timeout }]
  1473.     vwait [namespace which -variable x]
  1474.     fconfigure $f -encoding binary
  1475.     vwait [namespace which -variable x]
  1476.     after 300 [namespace code { lappend x timeout }]
  1477.     vwait [namespace which -variable x]
  1478.     close $f
  1479.     set x
  1480. } "{} timeout {} timeout xe7 timeout"
  1481. test io-39.18 {Tcl_SetChannelOption, setting read mode independently} 
  1482. {socket} {
  1483.     proc accept {s a p} {close $s}
  1484.     set s1 [socket -server [namespace code accept] 0]
  1485.     set port [lindex [fconfigure $s1 -sockname] 2]
  1486.     set s2 [socket 127.0.0.1 $port]
  1487.     update
  1488.     fconfigure $s2 -translation {auto lf}
  1489.     set modes [fconfigure $s2 -translation]
  1490.     close $s1
  1491.     close $s2
  1492.     set modes
  1493. } {auto lf}
  1494. test io-39.19 {Tcl_SetChannelOption, setting read mode independently} 
  1495. {socket} {
  1496.     proc accept {s a p} {close $s}
  1497.     set s1 [socket -server [namespace code accept] 0]
  1498.     set port [lindex [fconfigure $s1 -sockname] 2]
  1499.     set s2 [socket 127.0.0.1 $port]
  1500.     update
  1501.     fconfigure $s2 -translation {auto crlf}
  1502.     set modes [fconfigure $s2 -translation]
  1503.     close $s1
  1504.     close $s2
  1505.     set modes
  1506. } {auto crlf}
  1507. test io-39.20 {Tcl_SetChannelOption, setting read mode independently} 
  1508. {socket} {
  1509.     proc accept {s a p} {close $s}
  1510.     set s1 [socket -server [namespace code accept] 0]
  1511.     set port [lindex [fconfigure $s1 -sockname] 2]
  1512.     set s2 [socket 127.0.0.1 $port]
  1513.     update
  1514.     fconfigure $s2 -translation {auto cr}
  1515.     set modes [fconfigure $s2 -translation]
  1516.     close $s1
  1517.     close $s2
  1518.     set modes
  1519. } {auto cr}
  1520. test io-39.21 {Tcl_SetChannelOption, setting read mode independently} 
  1521. {socket} {
  1522.     proc accept {s a p} {close $s}
  1523.     set s1 [socket -server [namespace code accept] 0]
  1524.     set port [lindex [fconfigure $s1 -sockname] 2]
  1525.     set s2 [socket 127.0.0.1 $port]
  1526.     update
  1527.     fconfigure $s2 -translation {auto auto}
  1528.     set modes [fconfigure $s2 -translation]
  1529.     close $s1
  1530.     close $s2
  1531.     set modes
  1532. } {auto crlf}
  1533. test io-39.22 {Tcl_SetChannelOption, invariance} {unixOnly} {
  1534.     file delete $path(test1)
  1535.     set f1 [open $path(test1) w+]
  1536.     set l ""
  1537.     lappend l [fconfigure $f1 -eofchar]
  1538.     fconfigure $f1 -eofchar {ON GO}
  1539.     lappend l [fconfigure $f1 -eofchar]
  1540.     fconfigure $f1 -eofchar D
  1541.     lappend l [fconfigure $f1 -eofchar]
  1542.     close $f1
  1543.     set l
  1544. } {{{} {}} {O G} {D D}}
  1545. test io-39.22a {Tcl_SetChannelOption, invariance} {
  1546.     file delete $path(test1)
  1547.     set f1 [open $path(test1) w+]
  1548.     set l [list]
  1549.     fconfigure $f1 -eofchar {ON GO}
  1550.     lappend l [fconfigure $f1 -eofchar]
  1551.     fconfigure $f1 -eofchar D
  1552.     lappend l [fconfigure $f1 -eofchar]
  1553.     lappend l [list [catch {fconfigure $f1 -eofchar {1 2 3}} msg] $msg]
  1554.     close $f1
  1555.     set l
  1556. } {{O G} {D D} {1 {bad value for -eofchar: should be a list of zero, one, or two elements}}}
  1557. test io-39.23 {Tcl_GetChannelOption, server socket is not readable or
  1558.         writeable, it should still have valid -eofchar and -translation options } {
  1559.     set l [list]
  1560.     set sock [socket -server [namespace code accept] 0]
  1561.     lappend l [fconfigure $sock -eofchar] [fconfigure $sock -translation]
  1562.     close $sock
  1563.     set l
  1564. } {{{}} auto}
  1565. test io-39.24 {Tcl_SetChannelOption, server socket is not readable or
  1566.         writable so we can't change -eofchar or -translation } {
  1567.     set l [list]
  1568.     set sock [socket -server [namespace code accept] 0]
  1569.     fconfigure $sock -eofchar D -translation lf
  1570.     lappend l [fconfigure $sock -eofchar] [fconfigure $sock -translation]
  1571.     close $sock
  1572.     set l
  1573. } {{{}} auto}
  1574. test io-40.1 {POSIX open access modes: RDWR} {
  1575.     file delete $path(test3)
  1576.     set f [open $path(test3) w]
  1577.     puts $f xyzzy
  1578.     close $f
  1579.     set f [open $path(test3) RDWR]
  1580.     puts -nonewline $f "ab"
  1581.     seek $f 0 current
  1582.     set x [gets $f]
  1583.     close $f
  1584.     set f [open $path(test3) r]
  1585.     lappend x [gets $f]
  1586.     close $f
  1587.     set x
  1588. } {zzy abzzy}
  1589. test io-40.2 {POSIX open access modes: CREAT} {unixOnly} {
  1590.     file delete $path(test3)
  1591.     set f [open $path(test3) {WRONLY CREAT} 0600]
  1592.     file stat $path(test3) stats
  1593.     set x [format "0%o" [expr $stats(mode)&0777]]
  1594.     puts $f "line 1"
  1595.     close $f
  1596.     set f [open $path(test3) r]
  1597.     lappend x [gets $f]
  1598.     close $f
  1599.     set x
  1600. } {0600 {line 1}}
  1601. # some tests can only be run is umask is 2
  1602. # if "umask" cannot be run, the tests will be skipped.
  1603. catch {testConstraint umask2 [expr {[exec umask] == 2}]}
  1604. test io-40.3 {POSIX open access modes: CREAT} {unixOnly umask2} {
  1605.     # This test only works if your umask is 2, like ouster's.
  1606.     file delete $path(test3)
  1607.     set f [open $path(test3) {WRONLY CREAT}]
  1608.     close $f
  1609.     file stat test3 stats
  1610.     format "0%o" [expr $stats(mode)&0777]
  1611. } 0664
  1612. test io-40.4 {POSIX open access modes: CREAT} {
  1613.     file delete $path(test3)
  1614.     set f [open $path(test3) w]
  1615.     fconfigure $f -eofchar {}
  1616.     puts $f xyzzy
  1617.     close $f
  1618.     set f [open $path(test3) {WRONLY CREAT}]
  1619.     fconfigure $f -eofchar {}
  1620.     puts -nonewline $f "ab"
  1621.     close $f
  1622.     set f [open $path(test3) r]
  1623.     set x [gets $f]
  1624.     close $f
  1625.     set x
  1626. } abzzy
  1627. test io-40.5 {POSIX open access modes: APPEND} {
  1628.     file delete $path(test3)
  1629.     set f [open $path(test3) w]
  1630.     fconfigure $f -translation lf -eofchar {}
  1631.     puts $f xyzzy
  1632.     close $f
  1633.     set f [open $path(test3) {WRONLY APPEND}]
  1634.     fconfigure $f -translation lf
  1635.     puts $f "new line"
  1636.     seek $f 0
  1637.     puts $f "abc"
  1638.     close $f
  1639.     set f [open $path(test3) r]
  1640.     fconfigure $f -translation lf
  1641.     set x ""
  1642.     seek $f 6 current
  1643.     lappend x [gets $f]
  1644.     lappend x [gets $f]
  1645.     close $f
  1646.     set x
  1647. } {{new line} abc}
  1648. test io-40.6 {POSIX open access modes: EXCL} -match regexp -body {
  1649.     file delete $path(test3)
  1650.     set f [open $path(test3) w]
  1651.     puts $f xyzzy
  1652.     close $f
  1653.     open $path(test3) {WRONLY CREAT EXCL}
  1654. } -returnCodes error -result {(?i)couldn't open ".*test3": file (already )?exists}
  1655. test io-40.7 {POSIX open access modes: EXCL} {
  1656.     file delete $path(test3)
  1657.     set f [open $path(test3) {WRONLY CREAT EXCL}]
  1658.     fconfigure $f -eofchar {}
  1659.     puts $f "A test line"
  1660.     close $f
  1661.     viewFile test3
  1662. } {A test line}
  1663. test io-40.8 {POSIX open access modes: TRUNC} {
  1664.     file delete $path(test3)
  1665.     set f [open $path(test3) w]
  1666.     puts $f xyzzy
  1667.     close $f
  1668.     set f [open $path(test3) {WRONLY TRUNC}]
  1669.     puts $f abc
  1670.     close $f
  1671.     set f [open $path(test3) r]
  1672.     set x [gets $f]
  1673.     close $f
  1674.     set x
  1675. } abc
  1676. test io-40.9 {POSIX open access modes: NONBLOCK} {nonPortable macOrUnix} {
  1677.     file delete $path(test3)
  1678.     set f [open $path(test3) {WRONLY NONBLOCK CREAT}]
  1679.     puts $f "NONBLOCK test"
  1680.     close $f
  1681.     set f [open $path(test3) r]
  1682.     set x [gets $f]
  1683.     close $f
  1684.     set x
  1685. } {NONBLOCK test}
  1686. test io-40.10 {POSIX open access modes: RDONLY} {
  1687.     set f [open $path(test1) w]
  1688.     puts $f "two lines: this one"
  1689.     puts $f "and this"
  1690.     close $f
  1691.     set f [open $path(test1) RDONLY]
  1692.     set x [list [gets $f] [catch {puts $f Test} msg] $msg]
  1693.     close $f
  1694.     string compare [string tolower $x] 
  1695. [list {two lines: this one} 1 
  1696. [format "channel "%s" wasn't opened for writing" $f]]
  1697. } 0
  1698. test io-40.11 {POSIX open access modes: RDONLY} -match regexp -body {
  1699.     file delete $path(test3)
  1700.     open $path(test3) RDONLY
  1701. } -returnCodes error -result {(?i)couldn't open ".*test3": no such file or directory}
  1702. test io-40.12 {POSIX open access modes: WRONLY} -match regexp -body {
  1703.     file delete $path(test3)
  1704.     open $path(test3) WRONLY
  1705. } -returnCodes error -result {(?i)couldn't open ".*test3": no such file or directory}
  1706. test io-40.13 {POSIX open access modes: WRONLY} {
  1707.     makeFile xyzzy test3
  1708.     set f [open $path(test3) WRONLY]
  1709.     fconfigure $f -eofchar {}
  1710.     puts -nonewline $f "ab"
  1711.     seek $f 0 current
  1712.     set x [list [catch {gets $f} msg] $msg]
  1713.     close $f
  1714.     lappend x [viewFile test3]
  1715.     string compare [string tolower $x] 
  1716. [list 1 "channel "$f" wasn't opened for reading" abzzy]
  1717. } 0
  1718. test io-40.14 {POSIX open access modes: RDWR} -match regexp -body {
  1719.     file delete $path(test3)
  1720.     open $path(test3) RDWR
  1721. } -returnCodes error -result {(?i)couldn't open ".*test3": no such file or directory}
  1722. test io-40.15 {POSIX open access modes: RDWR} {
  1723.     makeFile xyzzy test3
  1724.     set f [open $path(test3) RDWR]
  1725.     puts -nonewline $f "ab"
  1726.     seek $f 0 current
  1727.     set x [gets $f]
  1728.     close $f
  1729.     lappend x [viewFile test3]
  1730. } {zzy abzzy}
  1731. if {![file exists ~/_test_] && [file writable ~]} {
  1732.     test io-40.16 {tilde substitution in open} -setup {
  1733. makeFile {Some text} _test_ ~
  1734.     } -body {
  1735. file exists [file join $env(HOME) _test_]
  1736.     } -cleanup {
  1737. removeFile _test_ ~
  1738.     } -result 1
  1739. }
  1740. test io-40.17 {tilde substitution in open} {
  1741.     set home $env(HOME)
  1742.     unset env(HOME)
  1743.     set x [list [catch {open ~/foo} msg] $msg]
  1744.     set env(HOME) $home
  1745.     set x
  1746. } {1 {couldn't find HOME environment variable to expand path}}
  1747. test io-41.1 {Tcl_FileeventCmd: errors} {fileevent} {
  1748.     list [catch {fileevent foo} msg] $msg
  1749. } {1 {wrong # args: should be "fileevent channelId event ?script?"}}
  1750. test io-41.2 {Tcl_FileeventCmd: errors} {fileevent} {
  1751.     list [catch {fileevent foo bar baz q} msg] $msg
  1752. } {1 {wrong # args: should be "fileevent channelId event ?script?"}}
  1753. test io-41.3 {Tcl_FileeventCmd: errors} {fileevent} {
  1754.     list [catch {fileevent gorp readable} msg] $msg
  1755. } {1 {can not find channel named "gorp"}}
  1756. test io-41.4 {Tcl_FileeventCmd: errors} {fileevent} {
  1757.     list [catch {fileevent gorp writable} msg] $msg
  1758. } {1 {can not find channel named "gorp"}}
  1759. test io-41.5 {Tcl_FileeventCmd: errors} {fileevent} {
  1760.     list [catch {fileevent gorp who-knows} msg] $msg
  1761. } {1 {bad event name "who-knows": must be readable or writable}}
  1762. #
  1763. # Test fileevent on a file
  1764. #
  1765. set path(foo) [makeFile {} foo]
  1766. set f [open $path(foo) w+]
  1767. test io-42.1 {Tcl_FileeventCmd: creating, deleting, querying} {fileevent} {
  1768.     list [fileevent $f readable] [fileevent $f writable]
  1769. } {{} {}}
  1770. test io-42.2 {Tcl_FileeventCmd: replacing} {fileevent} {
  1771.     set result {}
  1772.     fileevent $f r "first script"
  1773.     lappend result [fileevent $f readable]
  1774.     fileevent $f r "new script"
  1775.     lappend result [fileevent $f readable]
  1776.     fileevent $f r "yet another"
  1777.     lappend result [fileevent $f readable]
  1778.     fileevent $f r ""
  1779.     lappend result [fileevent $f readable]
  1780. } {{first script} {new script} {yet another} {}}
  1781. test io-42.3 {Tcl_FileeventCmd: replacing, with NULL chars in script} {fileevent} {
  1782.     set result {}
  1783.     fileevent $f r "first script"
  1784.     lappend result [string length [fileevent $f readable]]
  1785.     fileevent $f r "new script"
  1786.     lappend result [string length [fileevent $f readable]]
  1787.     fileevent $f r "yet another"
  1788.     lappend result [string length [fileevent $f readable]]
  1789.     fileevent $f r ""
  1790.     lappend result [fileevent $f readable]
  1791. } {13 11 12 {}}
  1792. test io-43.1 {Tcl_FileeventCmd: creating, deleting, querying} {stdio unixExecs fileevent} {
  1793.     set result {}
  1794.     fileevent $f readable "script 1"
  1795.     lappend result [fileevent $f readable] [fileevent $f writable]
  1796.     fileevent $f writable "write script"
  1797.     lappend result [fileevent $f readable] [fileevent $f writable]
  1798.     fileevent $f readable {}
  1799.     lappend result [fileevent $f readable] [fileevent $f writable]
  1800.     fileevent $f writable {}
  1801.     lappend result [fileevent $f readable] [fileevent $f writable]
  1802. } {{script 1} {} {script 1} {write script} {} {write script} {} {}}
  1803. test io-43.2 {Tcl_FileeventCmd: deleting when many present} -setup {
  1804.     set f2 [open "|[list cat -u]" r+]
  1805.     set f3 [open "|[list cat -u]" r+]
  1806. } -constraints {stdio unixExecs fileevent openpipe} -body {
  1807.     set result {}
  1808.     lappend result [fileevent $f r] [fileevent $f2 r] [fileevent $f3 r]
  1809.     fileevent $f r "read f"
  1810.     fileevent $f2 r "read f2"
  1811.     fileevent $f3 r "read f3"
  1812.     lappend result [fileevent $f r] [fileevent $f2 r] [fileevent $f3 r]
  1813.     fileevent $f2 r {}
  1814.     lappend result [fileevent $f r] [fileevent $f2 r] [fileevent $f3 r]
  1815.     fileevent $f3 r {}
  1816.     lappend result [fileevent $f r] [fileevent $f2 r] [fileevent $f3 r]
  1817.     fileevent $f r {}
  1818.     lappend result [fileevent $f r] [fileevent $f2 r] [fileevent $f3 r]
  1819. } -cleanup {
  1820.     catch {close $f2}
  1821.     catch {close $f3}
  1822. } -result {{} {} {} {read f} {read f2} {read f3} {read f} {} {read f3} {read f} {} {} {} {} {}}
  1823. test io-44.1 {FileEventProc procedure: normal read event} -setup {
  1824.     set f2 [open "|[list cat -u]" r+]
  1825.     set f3 [open "|[list cat -u]" r+]
  1826. } -constraints {stdio unixExecs fileevent openpipe} -body {
  1827.     fileevent $f2 readable [namespace code {
  1828. set x [gets $f2]; fileevent $f2 readable {}
  1829.     }]
  1830.     puts $f2 text; flush $f2
  1831.     variable x initial
  1832.     vwait [namespace which -variable x]
  1833.     set x
  1834. } -cleanup {
  1835.     catch {close $f2}
  1836.     catch {close $f3}
  1837. } -result {text}
  1838. test io-44.2 {FileEventProc procedure: error in read event} -setup {
  1839.     set f2 [open "|[list cat -u]" r+]
  1840.     set f3 [open "|[list cat -u]" r+]
  1841. } -constraints {stdio unixExecs fileevent openpipe} -body {
  1842.     proc ::bgerror args "set [namespace which -variable x] $args"
  1843.     fileevent $f2 readable {error bogus}
  1844.     puts $f2 text; flush $f2
  1845.     variable x initial
  1846.     vwait [namespace which -variable x]
  1847.     rename ::bgerror {}
  1848.     list $x [fileevent $f2 readable]
  1849. } -cleanup {
  1850.     catch {close $f2}
  1851.     catch {close $f3}
  1852. } -result {bogus {}}
  1853. test io-44.3 {FileEventProc procedure: normal write event} -setup {
  1854.     set f2 [open "|[list cat -u]" r+]
  1855.     set f3 [open "|[list cat -u]" r+]
  1856. } -constraints {stdio unixExecs fileevent openpipe} -body {
  1857.     fileevent $f2 writable [namespace code {
  1858. lappend x "triggered"
  1859. incr count -1
  1860. if {$count <= 0} {
  1861.     fileevent $f2 writable {}
  1862. }
  1863.     }]
  1864.     variable x initial
  1865.     set count 3
  1866.     vwait [namespace which -variable x]
  1867.     vwait [namespace which -variable x]
  1868.     vwait [namespace which -variable x]
  1869.     set x
  1870. } -cleanup {
  1871.     catch {close $f2}
  1872.     catch {close $f3}
  1873. } -result {initial triggered triggered triggered}
  1874. test io-44.4 {FileEventProc procedure: eror in write event} -setup {
  1875.     set f2 [open "|[list cat -u]" r+]
  1876.     set f3 [open "|[list cat -u]" r+]
  1877. } -constraints {stdio unixExecs fileevent openpipe} -body {
  1878.     proc ::bgerror args "set [namespace which -variable x] $args"
  1879.     fileevent $f2 writable {error bad-write}
  1880.     variable x initial
  1881.     vwait [namespace which -variable x]
  1882.     rename ::bgerror {}
  1883.     list $x [fileevent $f2 writable]
  1884. } -cleanup {
  1885.     catch {close $f2}
  1886.     catch {close $f3}
  1887. } -result {bad-write {}}
  1888. test io-44.5 {FileEventProc procedure: end of file} {stdio unixExecs openpipe fileevent} {
  1889.     set f4 [open "|[list [interpreter] $path(cat) << foo]" r]
  1890.     fileevent $f4 readable [namespace code {
  1891. if {[gets $f4 line] < 0} {
  1892.     lappend x eof
  1893.     fileevent $f4 readable {}
  1894. } else {
  1895.     lappend x $line
  1896. }
  1897.     }]
  1898.     variable x initial
  1899.     vwait [namespace which -variable x]
  1900.     vwait [namespace which -variable x]
  1901.     close $f4
  1902.     set x
  1903. } {initial foo eof}
  1904. close $f
  1905. makeFile "foo bar" foo
  1906. test io-45.1 {DeleteFileEvent, cleanup on close} {fileevent} {
  1907.     set f [open $path(foo) r]
  1908.     fileevent $f readable [namespace code {
  1909. lappend x "binding triggered: "[gets $f]""
  1910. fileevent $f readable {}
  1911.     }]
  1912.     close $f
  1913.     set x initial
  1914.     after 100 [namespace code { set y done }]
  1915.     variable y
  1916.     vwait [namespace which -variable y]
  1917.     set x
  1918. } {initial}
  1919. test io-45.2 {DeleteFileEvent, cleanup on close} {fileevent} {
  1920.     set f  [open $path(foo) r]
  1921.     set f2 [open $path(foo) r]
  1922.     fileevent $f readable [namespace code {
  1923.     lappend x "f triggered: "[gets $f]""
  1924.     fileevent $f readable {}
  1925. }]
  1926.     fileevent $f2 readable [namespace code {
  1927. lappend x "f2 triggered: "[gets $f2]""
  1928. fileevent $f2 readable {}
  1929.     }]
  1930.     close $f
  1931.     variable x initial
  1932.     vwait [namespace which -variable x]
  1933.     close $f2
  1934.     set x
  1935. } {initial {f2 triggered: "foo bar"}}
  1936. test io-45.3 {DeleteFileEvent, cleanup on close} {fileevent} {
  1937.     set f  [open $path(foo) r]
  1938.     set f2 [open $path(foo) r]
  1939.     set f3 [open $path(foo) r]
  1940.     fileevent $f readable {f script}
  1941.     fileevent $f2 readable {f2 script}
  1942.     fileevent $f3 readable {f3 script}
  1943.     set x {}
  1944.     close $f2
  1945.     lappend x [catch {fileevent $f readable} msg] $msg 
  1946.     [catch {fileevent $f2 readable}] 
  1947.     [catch {fileevent $f3 readable} msg] $msg
  1948.     close $f3
  1949.     lappend x [catch {fileevent $f readable} msg] $msg 
  1950.     [catch {fileevent $f2 readable}] 
  1951.     [catch {fileevent $f3 readable}]
  1952.     close $f
  1953.     lappend x [catch {fileevent $f readable}] 
  1954.     [catch {fileevent $f2 readable}] 
  1955.     [catch {fileevent $f3 readable}]
  1956. } {0 {f script} 1 0 {f3 script} 0 {f script} 1 1 1 1 1}
  1957. # Execute these tests only if the "testfevent" command is present.
  1958. testConstraint testfevent [llength [info commands testfevent]]
  1959. test io-46.1 {Tcl event loop vs multiple interpreters} {testfevent fileevent} {
  1960.     testfevent create
  1961.     set script "set f [[list open $path(foo) r]]n"
  1962.     append script {
  1963. set x "no event"
  1964. fileevent $f readable [namespace code {
  1965.     set x "f triggered: [gets $f]"
  1966.     fileevent $f readable {}
  1967. }]
  1968.     }
  1969.     testfevent cmd $script
  1970.     after 1 ;# We must delay because Windows takes a little time to notice
  1971.     update
  1972.     testfevent cmd {close $f}
  1973.     list [testfevent cmd {set x}] [testfevent cmd {info commands after}]
  1974. } {{f triggered: foo bar} after}
  1975. test io-46.2 {Tcl event loop vs multiple interpreters} testfevent {
  1976.     testfevent create
  1977.     testfevent cmd {
  1978.         variable x 0
  1979.         after 100 {set x triggered}
  1980.         vwait [namespace which -variable x]
  1981.         set x
  1982.     }
  1983. } {triggered}
  1984. test io-46.3 {Tcl event loop vs multiple interpreters} testfevent {
  1985.     testfevent create
  1986.     testfevent cmd {
  1987.         set x 0
  1988.         after 10 {lappend x timer}
  1989.         after 30
  1990.         set result $x
  1991.         update idletasks
  1992.         lappend result $x
  1993.         update
  1994.         lappend result $x
  1995.     }
  1996. } {0 0 {0 timer}}
  1997. test io-47.1 {fileevent vs multiple interpreters} {testfevent fileevent} {
  1998.     set f  [open $path(foo) r]
  1999.     set f2 [open $path(foo) r]
  2000.     set f3 [open $path(foo) r]
  2001.     fileevent $f readable {script 1}
  2002.     testfevent create
  2003.     testfevent share $f2
  2004.     testfevent cmd "fileevent $f2 readable {script 2}"
  2005.     fileevent $f3 readable {sript 3}
  2006.     set x {}
  2007.     lappend x [fileevent $f2 readable]
  2008.     testfevent delete
  2009.     lappend x [fileevent $f readable] [fileevent $f2 readable] 
  2010.         [fileevent $f3 readable]
  2011.     close $f
  2012.     close $f2
  2013.     close $f3
  2014.     set x
  2015. } {{} {script 1} {} {sript 3}}
  2016. test io-47.2 {deleting fileevent on interpreter delete} {testfevent fileevent} {
  2017.     set f  [open $path(foo) r]
  2018.     set f2 [open $path(foo) r]
  2019.     set f3 [open $path(foo) r]
  2020.     set f4 [open $path(foo) r]
  2021.     fileevent $f readable {script 1}
  2022.     testfevent create
  2023.     testfevent share $f2
  2024.     testfevent share $f3
  2025.     testfevent cmd "fileevent $f2 readable {script 2}
  2026.         fileevent $f3 readable {script 3}"
  2027.     fileevent $f4 readable {script 4}
  2028.     testfevent delete
  2029.     set x [list [fileevent $f readable] [fileevent $f2 readable] 
  2030.                 [fileevent $f3 readable] [fileevent $f4 readable]]
  2031.     close $f
  2032.     close $f2
  2033.     close $f3
  2034.     close $f4
  2035.     set x
  2036. } {{script 1} {} {} {script 4}}
  2037. test io-47.3 {deleting fileevent on interpreter delete} {testfevent fileevent} {
  2038.     set f  [open $path(foo) r]
  2039.     set f2 [open $path(foo) r]
  2040.     set f3 [open $path(foo) r]
  2041.     set f4 [open $path(foo) r]
  2042.     testfevent create
  2043.     testfevent share $f3
  2044.     testfevent share $f4
  2045.     fileevent $f readable {script 1}
  2046.     fileevent $f2 readable {script 2}
  2047.     testfevent cmd "fileevent $f3 readable {script 3}
  2048.       fileevent $f4 readable {script 4}"
  2049.     testfevent delete
  2050.     set x [list [fileevent $f readable] [fileevent $f2 readable] 
  2051.                 [fileevent $f3 readable] [fileevent $f4 readable]]
  2052.     close $f
  2053.     close $f2
  2054.     close $f3
  2055.     close $f4
  2056.     set x
  2057. } {{script 1} {script 2} {} {}}
  2058. test io-47.4 {file events on shared files and multiple interpreters} {testfevent fileevent} {
  2059.     set f  [open $path(foo) r]
  2060.     set f2 [open $path(foo) r]
  2061.     testfevent create
  2062.     testfevent share $f
  2063.     testfevent cmd "fileevent $f readable {script 1}"
  2064.     fileevent $f readable {script 2}
  2065.     fileevent $f2 readable {script 3}
  2066.     set x [list [fileevent $f2 readable] 
  2067.                 [testfevent cmd "fileevent $f readable"] 
  2068.                 [fileevent $f readable]]
  2069.     testfevent delete
  2070.     close $f
  2071.     close $f2
  2072.     set x
  2073. } {{script 3} {script 1} {script 2}}
  2074. test io-47.5 {file events on shared files, deleting file events} {testfevent fileevent} {
  2075.     set f [open $path(foo) r]
  2076.     testfevent create
  2077.     testfevent share $f
  2078.     testfevent cmd "fileevent $f readable {script 1}"
  2079.     fileevent $f readable {script 2}
  2080.     testfevent cmd "fileevent $f readable {}"
  2081.     set x [list [testfevent cmd "fileevent $f readable"] 
  2082.                 [fileevent $f readable]]
  2083.     testfevent delete
  2084.     close $f
  2085.     set x
  2086. } {{} {script 2}}
  2087. test io-47.6 {file events on shared files, deleting file events} {testfevent fileevent} {
  2088.     set f [open $path(foo) r]
  2089.     testfevent create
  2090.     testfevent share $f
  2091.     testfevent cmd "fileevent $f readable {script 1}"
  2092.     fileevent $f readable {script 2}
  2093.     fileevent $f readable {}
  2094.     set x [list [testfevent cmd "fileevent $f readable"] 
  2095.                 [fileevent $f readable]]
  2096.     testfevent delete
  2097.     close $f
  2098.     set x
  2099. } {{script 1} {}}
  2100. set path(bar) [makeFile {} bar]
  2101. test io-48.1 {testing readability conditions} {fileevent} {
  2102.     set f [open $path(bar) w]
  2103.     puts $f abcdefg
  2104.     puts $f abcdefg
  2105.     puts $f abcdefg
  2106.     puts $f abcdefg
  2107.     puts $f abcdefg
  2108.     close $f
  2109.     set f [open $path(bar) r]
  2110.     fileevent $f readable [namespace code [list consume $f]]
  2111.     proc consume {f} {
  2112. variable l
  2113. variable x
  2114. lappend l called
  2115. if {[eof $f]} {
  2116.     close $f
  2117.     set x done
  2118. } else {
  2119.     gets $f
  2120. }
  2121.     }
  2122.     set l ""
  2123.     variable x not_done
  2124.     vwait [namespace which -variable x]
  2125.     list $x $l
  2126. } {done {called called called called called called called}}
  2127. test io-48.2 {testing readability conditions} {nonBlockFiles fileevent} {
  2128.     set f [open $path(bar) w]
  2129.     puts $f abcdefg
  2130.     puts $f abcdefg
  2131.     puts $f abcdefg
  2132.     puts $f abcdefg
  2133.     puts $f abcdefg
  2134.     close $f
  2135.     set f [open $path(bar) r]
  2136.     fileevent $f readable [namespace code [list consume $f]]
  2137.     fconfigure $f -blocking off
  2138.     proc consume {f} {
  2139. variable x
  2140. variable l
  2141. lappend l called
  2142. if {[eof $f]} {
  2143.     close $f
  2144.     set x done
  2145. } else {
  2146.     gets $f
  2147. }
  2148.     }
  2149.     set l ""
  2150.     variable x not_done
  2151.     vwait [namespace which -variable x]
  2152.     list $x $l
  2153. } {done {called called called called called called called}}
  2154. set path(my_script) [makeFile {} my_script]
  2155. test io-48.3 {testing readability conditions} {stdio unixOnly nonBlockFiles openpipe fileevent} {
  2156.     set f [open $path(bar) w]
  2157.     puts $f abcdefg
  2158.     puts $f abcdefg
  2159.     puts $f abcdefg
  2160.     puts $f abcdefg
  2161.     puts $f abcdefg
  2162.     close $f
  2163.     set f [open $path(my_script) w]
  2164.     puts $f {
  2165. proc copy_slowly {f} {
  2166.     while {![eof $f]} {
  2167. puts [gets $f]
  2168. after 200
  2169.     }
  2170.     close $f
  2171. }
  2172.     }
  2173.     close $f
  2174.     set f [open "|[list [interpreter]]" r+]
  2175.     fileevent  $f readable [namespace code [list consume $f]]
  2176.     fconfigure $f -buffering line
  2177.     fconfigure $f -blocking off
  2178.     proc consume {f} {
  2179. variable l
  2180. variable x
  2181. if {[eof $f]} {
  2182.     set x done
  2183. } else {
  2184.     gets $f
  2185.     lappend l [fblocked $f]
  2186.     gets $f
  2187.     lappend l [fblocked $f]
  2188. }
  2189.     }
  2190.     set l ""
  2191.     variable x not_done
  2192.     puts $f [list source $path(my_script)]
  2193.     puts $f "set f [[list open $path(bar) r]]"
  2194.     puts $f {copy_slowly $f}
  2195.     puts $f {exit}
  2196.     vwait [namespace which -variable x]
  2197.     close $f
  2198.     list $x $l
  2199. } {done {0 1 0 1 0 1 0 1 0 1 0 1 0 0}}
  2200. test io-48.4 {lf write, testing readability, ^Z termination, auto read mode} {fileevent} {
  2201.     file delete $path(test1)
  2202.     set f [open $path(test1) w]
  2203.     fconfigure $f -translation lf
  2204.     variable c [format "abcndefn%c" 26]
  2205.     puts -nonewline $f $c
  2206.     close $f
  2207.     proc consume {f} {
  2208. variable l
  2209. variable c
  2210. variable x
  2211. if {[eof $f]} {
  2212.    set x done
  2213.    close $f
  2214. } else {
  2215.    lappend l [gets $f]
  2216.    incr c
  2217. }
  2218.     }
  2219.     set c 0
  2220.     set l ""
  2221.     set f [open $path(test1) r]
  2222.     fconfigure $f -translation auto -eofchar x1a
  2223.     fileevent $f readable [namespace code [list consume $f]]
  2224.     variable x
  2225.     vwait [namespace which -variable x]
  2226.     list $c $l
  2227. } {3 {abc def {}}}
  2228. test io-48.5 {lf write, testing readability, ^Z in middle, auto read mode} {fileevent} {
  2229.     file delete $path(test1)
  2230.     set f [open $path(test1) w]
  2231.     fconfigure $f -translation lf
  2232.     set c [format "abcndefn%cfoonbarn" 26]
  2233.     puts -nonewline $f $c
  2234.     close $f
  2235.     proc consume {f} {
  2236. variable l
  2237. variable x
  2238. variable c
  2239. if {[eof $f]} {
  2240.    set x done
  2241.    close $f
  2242. } else {
  2243.    lappend l [gets $f]
  2244.    incr c
  2245. }
  2246.     }
  2247.     set c 0
  2248.     set l ""
  2249.     set f [open $path(test1) r]
  2250.     fconfigure $f -eofchar x1a -translation auto
  2251.     fileevent $f readable [namespace code [list consume $f]]
  2252.     variable x
  2253.     vwait [namespace which -variable x]
  2254.     list $c $l
  2255. } {3 {abc def {}}}
  2256. test io-48.6 {cr write, testing readability, ^Z termination, auto read mode} {fileevent} {
  2257.     file delete $path(test1)
  2258.     set f [open $path(test1) w]
  2259.     fconfigure $f -translation cr
  2260.     set c [format "abcndefn%c" 26]
  2261.     puts -nonewline $f $c
  2262.     close $f
  2263.     proc consume {f} {
  2264. variable l
  2265. variable x
  2266. variable c
  2267. if {[eof $f]} {
  2268.    set x done
  2269.    close $f
  2270. } else {
  2271.    lappend l [gets $f]
  2272.    incr c
  2273. }
  2274.     }
  2275.     set c 0
  2276.     set l ""
  2277.     set f [open $path(test1) r]
  2278.     fconfigure $f -translation auto -eofchar x1a
  2279.     fileevent $f readable [namespace code [list consume $f]]
  2280.     variable x
  2281.     vwait [namespace which -variable x]
  2282.     list $c $l
  2283. } {3 {abc def {}}}
  2284. test io-48.7 {cr write, testing readability, ^Z in middle, auto read mode} {fileevent} {
  2285.     file delete $path(test1)
  2286.     set f [open $path(test1) w]
  2287.     fconfigure $f -translation cr
  2288.     set c [format "abcndefn%cfoonbarn" 26]
  2289.     puts -nonewline $f $c
  2290.     close $f
  2291.     proc consume {f} {
  2292. variable l
  2293. variable c
  2294. variable x
  2295. if {[eof $f]} {
  2296.    set x done
  2297.    close $f
  2298. } else {
  2299.    lappend l [gets $f]
  2300.    incr c
  2301. }
  2302.     }
  2303.     set c 0
  2304.     set l ""
  2305.     set f [open $path(test1) r]
  2306.     fconfigure $f -eofchar x1a -translation auto
  2307.     fileevent $f readable [namespace code [list consume $f]]
  2308.     variable x
  2309.     vwait [namespace which -variable x]
  2310.     list $c $l
  2311. } {3 {abc def {}}}
  2312. test io-48.8 {crlf write, testing readability, ^Z termination, auto read mode} {fileevent} {
  2313.     file delete $path(test1)
  2314.     set f [open $path(test1) w]
  2315.     fconfigure $f -translation crlf
  2316.     set c [format "abcndefn%c" 26]
  2317.     puts -nonewline $f $c
  2318.     close $f
  2319.     proc consume {f} {
  2320. variable l
  2321. variable x
  2322. variable c
  2323. if {[eof $f]} {
  2324.    set x done
  2325.    close $f
  2326. } else {
  2327.    lappend l [gets $f]
  2328.    incr c
  2329. }
  2330.     }
  2331.     set c 0
  2332.     set l ""
  2333.     set f [open $path(test1) r]
  2334.     fconfigure $f -translation auto -eofchar x1a
  2335.     fileevent $f readable [namespace code [list consume $f]]
  2336.     variable x
  2337.     vwait [namespace which -variable x]
  2338.     list $c $l
  2339. } {3 {abc def {}}}
  2340. test io-48.9 {crlf write, testing readability, ^Z in middle, auto read mode} {fileevent} {
  2341.     file delete $path(test1)
  2342.     set f [open $path(test1) w]
  2343.     fconfigure $f -translation crlf
  2344.     set c [format "abcndefn%cfoonbarn" 26]
  2345.     puts -nonewline $f $c
  2346.     close $f
  2347.     proc consume {f} {
  2348. variable l
  2349. variable c
  2350. variable x
  2351. if {[eof $f]} {
  2352.    set x done
  2353.    close $f
  2354. } else {
  2355.    lappend l [gets $f]
  2356.    incr c
  2357. }
  2358.     }
  2359.     set c 0
  2360.     set l ""
  2361.     set f [open $path(test1) r]
  2362.     fconfigure $f -eofchar x1a -translation auto
  2363.     fileevent $f readable [namespace code [list consume $f]]
  2364.     variable x
  2365.     vwait [namespace which -variable x]
  2366.     list $c $l
  2367. } {3 {abc def {}}}
  2368. test io-48.10 {lf write, testing readability, ^Z in middle, lf read mode} {fileevent} {
  2369.     file delete $path(test1)
  2370.     set f [open $path(test1) w]
  2371.     fconfigure $f -translation lf
  2372.     set c [format "abcndefn%cfoonbarn" 26]
  2373.     puts -nonewline $f $c
  2374.     close $f
  2375.     proc consume {f} {
  2376. variable l
  2377. variable c
  2378. variable x
  2379. if {[eof $f]} {
  2380.    set x done
  2381.    close $f
  2382. } else {
  2383.    lappend l [gets $f]
  2384.    incr c
  2385. }
  2386.     }
  2387.     set c 0
  2388.     set l ""
  2389.     set f [open $path(test1) r]
  2390.     fconfigure $f -eofchar x1a -translation lf
  2391.     fileevent $f readable [namespace code [list consume $f]]
  2392.     variable x
  2393.     vwait [namespace which -variable x]
  2394.     list $c $l
  2395. } {3 {abc def {}}}
  2396. test io-48.11 {lf write, testing readability, ^Z termination, lf read mode} {fileevent} {
  2397.     file delete $path(test1)
  2398.     set f [open $path(test1) w]
  2399.     fconfigure $f -translation lf
  2400.     set c [format "abcndefn%c" 26]
  2401.     puts -nonewline $f $c
  2402.     close $f
  2403.     proc consume {f} {
  2404. variable l
  2405. variable x
  2406. variable c
  2407. if {[eof $f]} {
  2408.    set x done
  2409.    close $f
  2410. } else {
  2411.    lappend l [gets $f]
  2412.    incr c
  2413. }
  2414.     }
  2415.     set c 0
  2416.     set l ""
  2417.     set f [open $path(test1) r]
  2418.     fconfigure $f -translation lf -eofchar x1a
  2419.     fileevent $f readable [namespace code [list consume $f]]
  2420.     variable x
  2421.     vwait [namespace which -variable x]
  2422.     list $c $l
  2423. } {3 {abc def {}}}
  2424. test io-48.12 {cr write, testing readability, ^Z in middle, cr read mode} {fileevent} {
  2425.     file delete $path(test1)
  2426.     set f [open $path(test1) w]
  2427.     fconfigure $f -translation cr
  2428.     set c [format "abcndefn%cfoonbarn" 26]
  2429.     puts -nonewline $f $c
  2430.     close $f
  2431.     proc consume {f} {
  2432. variable l
  2433. variable x
  2434. variable c
  2435. if {[eof $f]} {
  2436.    set x done
  2437.    close $f
  2438. } else {
  2439.    lappend l [gets $f]
  2440.    incr c
  2441. }
  2442.     }
  2443.     set c 0
  2444.     set l ""
  2445.     set f [open $path(test1) r]
  2446.     fconfigure $f -eofchar x1a -translation cr
  2447.     fileevent $f readable [namespace code [list consume $f]]
  2448.     variable x
  2449.     vwait [namespace which -variable x]
  2450.     list $c $l
  2451. } {3 {abc def {}}}
  2452. test io-48.13 {cr write, testing readability, ^Z termination, cr read mode} {fileevent} {
  2453.     file delete $path(test1)
  2454.     set f [open $path(test1) w]
  2455.     fconfigure $f -translation cr
  2456.     set c [format "abcndefn%c" 26]
  2457.     puts -nonewline $f $c
  2458.     close $f
  2459.     proc consume {f} {
  2460. variable c
  2461. variable x
  2462. variable l
  2463. if {[eof $f]} {
  2464.    set x done
  2465.    close $f
  2466. } else {
  2467.    lappend l [gets $f]
  2468.    incr c
  2469. }
  2470.     }
  2471.     set c 0
  2472.     set l ""
  2473.     set f [open $path(test1) r]
  2474.     fconfigure $f -translation cr -eofchar x1a
  2475.     fileevent $f readable [namespace code [list consume $f]]
  2476.     variable x
  2477.     vwait [namespace which -variable x]
  2478.     list $c $l
  2479. } {3 {abc def {}}}
  2480. test io-48.14 {crlf write, testing readability, ^Z in middle, crlf read mode} {fileevent} {
  2481.     file delete $path(test1)
  2482.     set f [open $path(test1) w]
  2483.     fconfigure $f -translation crlf
  2484.     set c [format "abcndefn%cfoonbarn" 26]
  2485.     puts -nonewline $f $c
  2486.     close $f
  2487.     proc consume {f} {
  2488. variable c
  2489. variable x
  2490. variable l
  2491. if {[eof $f]} {
  2492.    set x done
  2493.    close $f
  2494. } else {
  2495.    lappend l [gets $f]
  2496.    incr c
  2497. }
  2498.     }
  2499.     set c 0
  2500.     set l ""
  2501.     set f [open $path(test1) r]
  2502.     fconfigure $f -eofchar x1a -translation crlf
  2503.     fileevent $f readable [namespace code [list consume $f]]
  2504.     variable x
  2505.     vwait [namespace which -variable x]
  2506.     list $c $l
  2507. } {3 {abc def {}}}
  2508. test io-48.15 {crlf write, testing readability, ^Z termi, crlf read mode} {fileevent} {
  2509.     file delete $path(test1)
  2510.     set f [open $path(test1) w]
  2511.     fconfigure $f -translation crlf
  2512.     set c [format "abcndefn%c" 26]
  2513.     puts -nonewline $f $c
  2514.     close $f
  2515.     proc consume {f} {
  2516. variable c
  2517. variable x
  2518. variable l
  2519. if {[eof $f]} {
  2520.    set x done
  2521.    close $f
  2522. } else {
  2523.    lappend l [gets $f]
  2524.    incr c
  2525. }
  2526.     }
  2527.     set c 0
  2528.     set l ""
  2529.     set f [open $path(test1) r]
  2530.     fconfigure $f -translation crlf -eofchar x1a
  2531.     fileevent $f readable [namespace code [list consume $f]]
  2532.     variable x
  2533.     vwait [namespace which -variable x]
  2534.     list $c $l
  2535. } {3 {abc def {}}}
  2536. test io-49.1 {testing crlf reading, leftover cr disgorgment} {
  2537.     file delete $path(test1)
  2538.     set f [open $path(test1) w]
  2539.     fconfigure $f -translation lf
  2540.     puts -nonewline $f "arbrcrn"
  2541.     close $f
  2542.     set f [open $path(test1) r]
  2543.     set l ""
  2544.     lappend l [file size $path(test1)]
  2545.     fconfigure $f -translation crlf
  2546.     lappend l [read $f 1]
  2547.     lappend l [tell $f]
  2548.     lappend l [read $f 1]
  2549.     lappend l [tell $f]
  2550.     lappend l [read $f 1]
  2551.     lappend l [tell $f]
  2552.     lappend l [read $f 1]
  2553.     lappend l [tell $f]
  2554.     lappend l [read $f 1]
  2555.     lappend l [tell $f]
  2556.     lappend l [read $f 1]
  2557.     lappend l [tell $f]
  2558.     lappend l [eof $f]
  2559.     lappend l [read $f 1]
  2560.     lappend l [eof $f]
  2561.     close $f
  2562.     set l
  2563. } "7 a 1 [list r] 2 b 3 [list r] 4 c 5 {
  2564. } 7 0 {} 1"
  2565. test io-49.2 {testing crlf reading, leftover cr disgorgment} {
  2566.     file delete $path(test1)
  2567.     set f [open $path(test1) w]
  2568.     fconfigure $f -translation lf
  2569.     puts -nonewline $f "arbrcrn"
  2570.     close $f
  2571.     set f [open $path(test1) r]
  2572.     set l ""
  2573.     lappend l [file size $path(test1)]
  2574.     fconfigure $f -translation crlf
  2575.     lappend l [read $f 2]
  2576.     lappend l [tell $f]
  2577.     lappend l [read $f 2]
  2578.     lappend l [tell $f]
  2579.     lappend l [read $f 2]
  2580.     lappend l [tell $f]
  2581.     lappend l [eof $f]
  2582.     lappend l [read $f 2]
  2583.     lappend l [tell $f]
  2584.     lappend l [eof $f]
  2585.     close $f
  2586.     set l
  2587. } "7 [list ar] 2 [list br] 4 [list cn] 7 0 {} 7 1"
  2588. test io-49.3 {testing crlf reading, leftover cr disgorgment} {
  2589.     file delete $path(test1)
  2590.     set f [open $path(test1) w]
  2591.     fconfigure $f -translation lf
  2592.     puts -nonewline $f "arbrcrn"
  2593.     close $f
  2594.     set f [open $path(test1) r]
  2595.     set l ""
  2596.     lappend l [file size $path(test1)]
  2597.     fconfigure $f -translation crlf
  2598.     lappend l [read $f 3]
  2599.     lappend l [tell $f]
  2600.     lappend l [read $f 3]
  2601.     lappend l [tell $f]
  2602.     lappend l [eof $f]
  2603.     lappend l [read $f 3]
  2604.     lappend l [tell $f]
  2605.     lappend l [eof $f]
  2606.     close $f
  2607.     set l
  2608. } "7 [list arb] 3 [list rcn] 7 0 {} 7 1"
  2609. test io-49.4 {testing crlf reading, leftover cr disgorgment} {
  2610.     file delete $path(test1)
  2611.     set f [open $path(test1) w]
  2612.     fconfigure $f -translation lf
  2613.     puts -nonewline $f "arbrcrn"
  2614.     close $f
  2615.     set f [open $path(test1) r]
  2616.     set l ""
  2617.     lappend l [file size $path(test1)]
  2618.     fconfigure $f -translation crlf
  2619.     lappend l [read $f 3]
  2620.     lappend l [tell $f]
  2621.     lappend l [gets $f]
  2622.     lappend l [tell $f]
  2623.     lappend l [eof $f]
  2624.     lappend l [gets $f]
  2625.     lappend l [tell $f]
  2626.     lappend l [eof $f]
  2627.     close $f
  2628.     set l
  2629. } "7 [list arb] 3 [list rc] 7 0 {} 7 1"
  2630. test io-49.5 {testing crlf reading, leftover cr disgorgment} {
  2631.     file delete $path(test1)
  2632.     set f [open $path(test1) w]
  2633.     fconfigure $f -translation lf
  2634.     puts -nonewline $f "arbrcrn"
  2635.     close $f
  2636.     set f [open $path(test1) r]
  2637.     set l ""
  2638.     lappend l [file size $path(test1)]
  2639.     fconfigure $f -translation crlf
  2640.     lappend l [set x [gets $f]]
  2641.     lappend l [tell $f]
  2642.     lappend l [gets $f]
  2643.     lappend l [tell $f]
  2644.     lappend l [eof $f]
  2645.     close $f
  2646.     set l
  2647. } [list 7 arbrc 7 {} 7 1]
  2648.     
  2649. testConstraint testchannelevent [llength [info commands testchannelevent]]
  2650. test io-50.1 {testing handler deletion} {testchannelevent} {
  2651.     file delete $path(test1)
  2652.     set f [open $path(test1) w]
  2653.     close $f
  2654.     set f [open $path(test1) r]
  2655.     testchannelevent $f add readable [namespace code [list delhandler $f]]
  2656.     proc delhandler {f} {
  2657. variable z
  2658. set z called
  2659. testchannelevent $f delete 0
  2660.     }
  2661.     set z not_called
  2662.     update
  2663.     close $f
  2664.     set z
  2665. } called
  2666. test io-50.2 {testing handler deletion with multiple handlers} {testchannelevent} {
  2667.     file delete $path(test1)
  2668.     set f [open $path(test1) w]
  2669.     close $f
  2670.     set f [open $path(test1) r]
  2671.     testchannelevent $f add readable [namespace code [list delhandler $f 1]]
  2672.     testchannelevent $f add readable [namespace code [list delhandler $f 0]]
  2673.     proc delhandler {f i} {
  2674. variable z
  2675. lappend z "called delhandler $f $i"
  2676. testchannelevent $f delete 0
  2677.     }
  2678.     set z ""
  2679.     update
  2680.     close $f
  2681.     string compare [string tolower $z] 
  2682. [list [list called delhandler $f 0] [list called delhandler $f 1]]
  2683. } 0
  2684. test io-50.3 {testing handler deletion with multiple handlers} {testchannelevent} {
  2685.     file delete $path(test1)
  2686.     set f [open $path(test1) w]
  2687.     close $f
  2688.     set f [open $path(test1) r]
  2689.     testchannelevent $f add readable [namespace code [list notcalled $f 1]]
  2690.     testchannelevent $f add readable [namespace code [list delhandler $f 0]]
  2691.     set z ""
  2692.     proc notcalled {f i} {
  2693. variable z
  2694. lappend z "notcalled was called!! $f $i"
  2695.     }
  2696.     proc delhandler {f i} {
  2697. variable z
  2698. testchannelevent $f delete 1
  2699. lappend z "delhandler $f $i called"
  2700. testchannelevent $f delete 0
  2701. lappend z "delhandler $f $i deleted myself"
  2702.     }
  2703.     set z ""
  2704.     update
  2705.     close $f
  2706.     string compare [string tolower $z] 
  2707. [list [list delhandler $f 0 called] 
  2708.       [list delhandler $f 0 deleted myself]]
  2709. } 0
  2710. test io-50.4 {testing handler deletion vs reentrant calls} {testchannelevent} {
  2711.     file delete $path(test1)
  2712.     set f [open $path(test1) w]
  2713.     close $f
  2714.     set f [open $path(test1) r]
  2715.     testchannelevent $f add readable [namespace code [list delrecursive $f]]
  2716.     proc delrecursive {f} {
  2717. variable z
  2718. variable u
  2719. if {"$u" == "recursive"} {
  2720.     testchannelevent $f delete 0
  2721.     lappend z "delrecursive deleting recursive"
  2722. } else {
  2723.     lappend z "delrecursive calling recursive"
  2724.     set u recursive
  2725.     update
  2726. }
  2727.     }
  2728.     set u toplevel
  2729.     set z ""
  2730.     update
  2731.     close $f
  2732.     string compare [string tolower $z] 
  2733. {{delrecursive calling recursive} {delrecursive deleting recursive}}
  2734. } 0
  2735. test io-50.5 {testing handler deletion vs reentrant calls} {testchannelevent} {
  2736.     file delete $path(test1)
  2737.     set f [open $path(test1) w]
  2738.     close $f
  2739.     set f [open $path(test1) r]
  2740.     testchannelevent $f add readable [namespace code [list notcalled $f]]
  2741.     testchannelevent $f add readable [namespace code [list del $f]]
  2742.     proc notcalled {f} {
  2743. variable z
  2744. lappend z "notcalled was called!! $f"
  2745.     }
  2746.     proc del {f} {
  2747. variable u
  2748. variable z
  2749. if {"$u" == "recursive"} {
  2750.     testchannelevent $f delete 1
  2751.     testchannelevent $f delete 0
  2752.     lappend z "del deleted notcalled"
  2753.     lappend z "del deleted myself"
  2754. } else {
  2755.     set u recursive
  2756.     lappend z "del calling recursive"
  2757.     update
  2758.     lappend z "del after update"
  2759. }
  2760.     }
  2761.     set z ""
  2762.     set u toplevel
  2763.     update
  2764.     close $f
  2765.     string compare [string tolower $z] 
  2766. [list {del calling recursive} {del deleted notcalled} 
  2767.       {del deleted myself} {del after update}]
  2768. } 0
  2769. test io-50.6 {testing handler deletion vs reentrant calls} {testchannelevent} {
  2770.     file delete $path(test1)
  2771.     set f [open $path(test1) w]
  2772.     close $f
  2773.     set f [open $path(test1) r]
  2774.     testchannelevent $f add readable [namespace code [list second $f]]
  2775.     testchannelevent $f add readable [namespace code [list first $f]]
  2776.     proc first {f} {
  2777. variable u
  2778. variable z
  2779. if {"$u" == "toplevel"} {
  2780.     lappend z "first called"
  2781.     set u first
  2782.     update
  2783.     lappend z "first after update"
  2784. } else {
  2785.     lappend z "first called not toplevel"
  2786. }
  2787.     }
  2788.     proc second {f} {
  2789. variable u
  2790. variable z
  2791. if {"$u" == "first"} {
  2792.     lappend z "second called, first time"
  2793.     set u second
  2794.     testchannelevent $f delete 0
  2795. } elseif {"$u" == "second"} {
  2796.     lappend z "second called, second time"
  2797.     testchannelevent $f delete 0
  2798. } else {
  2799.     lappend z "second called, cannot happen!"
  2800.     testchannelevent $f removeall
  2801. }
  2802.     }
  2803.     set z ""
  2804.     set u toplevel
  2805.     update
  2806.     close $f
  2807.     string compare [string tolower $z] 
  2808. [list {first called} {first called not toplevel} 
  2809.       {second called, first time} {second called, second time} 
  2810.       {first after update}]
  2811. } 0
  2812. test io-51.1 {Test old socket deletion on Macintosh} {socket} {
  2813.     set x 0
  2814.     set result ""
  2815.     proc accept {s a p} {
  2816. variable x
  2817. variable wait
  2818. fconfigure $s -blocking off
  2819. puts $s "sock[incr x]"
  2820. close $s
  2821. set wait done
  2822.     }
  2823.     set ss [socket -server [namespace code accept] 0]
  2824.     variable wait ""
  2825.     set cs [socket [info hostname] [lindex [fconfigure $ss -sockname] 2]]
  2826.     vwait [namespace which -variable wait]
  2827.     lappend result [gets $cs]
  2828.     close $cs
  2829.     set wait ""
  2830.     set cs [socket [info hostname] [lindex [fconfigure $ss -sockname] 2]]
  2831.     vwait [namespace which -variable wait]
  2832.     lappend result [gets $cs]
  2833.     close $cs
  2834.     set wait ""
  2835.     set cs [socket [info hostname] [lindex [fconfigure $ss -sockname] 2]]
  2836.     vwait [namespace which -variable wait]
  2837.     lappend result [gets $cs]
  2838.     close $cs
  2839.     set wait ""
  2840.     set cs [socket [info hostname] [lindex [fconfigure $ss -sockname] 2]]
  2841.     vwait [namespace which -variable wait]
  2842.     lappend result [gets $cs]
  2843.     close $cs
  2844.     close $ss
  2845.     set result
  2846. } {sock1 sock2 sock3 sock4}
  2847. test io-52.1 {TclCopyChannel} {fcopy} {
  2848.     file delete $path(test1)
  2849.     set f1 [open $thisScript]
  2850.     set f2 [open $path(test1) w]
  2851.     fcopy $f1 $f2 -command { # }
  2852.     catch { fcopy $f1 $f2 } msg
  2853.     close $f1
  2854.     close $f2
  2855.     string compare $msg "channel "$f1" is busy"
  2856. } {0}
  2857. test io-52.2 {TclCopyChannel} {fcopy} {
  2858.     file delete $path(test1)
  2859.     set f1 [open $thisScript]
  2860.     set f2 [open $path(test1) w]
  2861.     set f3 [open $thisScript]
  2862.     fcopy $f1 $f2 -command { # }
  2863.     catch { fcopy $f3 $f2 } msg
  2864.     close $f1
  2865.     close $f2
  2866.     close $f3
  2867.     string compare $msg "channel "$f2" is busy"
  2868. } {0}
  2869. test io-52.3 {TclCopyChannel} {fcopy} {
  2870.     file delete $path(test1)
  2871.     set f1 [open $thisScript]
  2872.     set f2 [open $path(test1) w]
  2873.     fconfigure $f1 -translation lf -blocking 0
  2874.     fconfigure $f2 -translation cr -blocking 0
  2875.     set s0 [fcopy $f1 $f2]
  2876.     set result [list [fconfigure $f1 -blocking] [fconfigure $f2 -blocking]]
  2877.     close $f1
  2878.     close $f2
  2879.     set s1 [file size $thisScript]
  2880.     set s2 [file size $path(test1)]
  2881.     if {("$s1" == "$s2") && ($s0 == $s1)} {
  2882.         lappend result ok
  2883.     }
  2884.     set result
  2885. } {0 0 ok}
  2886. test io-52.4 {TclCopyChannel} {fcopy} {
  2887.     file delete $path(test1)
  2888.     set f1 [open $thisScript]
  2889.     set f2 [open $path(test1) w]
  2890.     fconfigure $f1 -translation lf -blocking 0
  2891.     fconfigure $f2 -translation cr -blocking 0
  2892.     fcopy $f1 $f2 -size 40
  2893.     set result [list [fconfigure $f1 -blocking] [fconfigure $f2 -blocking]]
  2894.     close $f1
  2895.     close $f2
  2896.     lappend result [file size $path(test1)]
  2897. } {0 0 40}
  2898. test io-52.5 {TclCopyChannel} {fcopy} {
  2899.     file delete $path(test1)
  2900.     set f1 [open $thisScript]
  2901.     set f2 [open $path(test1) w]
  2902.     fconfigure $f1 -translation lf -blocking 0
  2903.     fconfigure $f2 -translation lf -blocking 0
  2904.     fcopy $f1 $f2 -size -1
  2905.     set result [list [fconfigure $f1 -blocking] [fconfigure $f2 -blocking]]
  2906.     close $f1
  2907.     close $f2
  2908.     set s1 [file size $thisScript]
  2909.     set s2 [file size $path(test1)]
  2910.     if {"$s1" == "$s2"} {
  2911.         lappend result ok
  2912.     }
  2913.     set result
  2914. } {0 0 ok}
  2915. test io-52.6 {TclCopyChannel} {fcopy} {
  2916.     file delete $path(test1)
  2917.     set f1 [open $thisScript]
  2918.     set f2 [open $path(test1) w]
  2919.     fconfigure $f1 -translation lf -blocking 0
  2920.     fconfigure $f2 -translation lf -blocking 0
  2921.     set s0 [fcopy $f1 $f2 -size [expr [file size $thisScript] + 5]]
  2922.     set result [list [fconfigure $f1 -blocking] [fconfigure $f2 -blocking]]
  2923.     close $f1
  2924.     close $f2
  2925.     set s1 [file size $thisScript]
  2926.     set s2 [file size $path(test1)]
  2927.     if {("$s1" == "$s2") && ($s0 == $s1)} {
  2928.         lappend result ok
  2929.     }
  2930.     set result
  2931. } {0 0 ok}
  2932. test io-52.7 {TclCopyChannel} {fcopy} {
  2933.     file delete $path(test1)
  2934.     set f1 [open $thisScript]
  2935.     set f2 [open $path(test1) w]
  2936.     fconfigure $f1 -translation lf -blocking 0
  2937.     fconfigure $f2 -translation lf -blocking 0
  2938.     fcopy $f1 $f2
  2939.     set result [list [fconfigure $f1 -blocking] [fconfigure $f2 -blocking]]
  2940.     set s1 [file size $thisScript]
  2941.     set s2 [file size $path(test1)]
  2942.     close $f1
  2943.     close $f2
  2944.     if {"$s1" == "$s2"} {
  2945.         lappend result ok
  2946.     }
  2947.     set result
  2948. } {0 0 ok}
  2949. test io-52.8 {TclCopyChannel} {stdio openpipe fcopy} {
  2950.     file delete $path(test1)
  2951.     file delete $path(pipe)
  2952.     set f1 [open $path(pipe) w]
  2953.     fconfigure $f1 -translation lf
  2954.     puts $f1 "
  2955. puts ready
  2956. gets stdin
  2957. set f1 [open [list $thisScript] r]
  2958. fconfigure $f1 -translation lf
  2959. puts [read $f1 100]
  2960. close $f1
  2961.     "
  2962.     close $f1
  2963.     set f1 [open "|[list [interpreter] $path(pipe)]" r+]
  2964.     fconfigure $f1 -translation lf
  2965.     gets $f1
  2966.     puts $f1 ready
  2967.     flush $f1
  2968.     set f2 [open $path(test1) w]
  2969.     fconfigure $f2 -translation lf
  2970.     set s0 [fcopy $f1 $f2 -size 40]
  2971.     catch {close $f1}
  2972.     close $f2
  2973.     list $s0 [file size $path(test1)]
  2974. } {40 40}
  2975. # Empty files, to register them with the test facility
  2976. set path(kyrillic.txt)   [makeFile {} kyrillic.txt]
  2977. set path(utf8-fcopy.txt) [makeFile {} utf8-fcopy.txt]
  2978. set path(utf8-rp.txt)    [makeFile {} utf8-rp.txt]
  2979. # Create kyrillic file, use lf translation to avoid os eol issues
  2980. set out [open $path(kyrillic.txt) w]
  2981. fconfigure $out -encoding koi8-r -translation lf
  2982. puts       $out "u0410u0410"
  2983. close      $out
  2984. test io-52.9 {TclCopyChannel & encodings} {fcopy} {
  2985.     # Copy kyrillic to UTF-8, using fcopy.
  2986.     set in  [open $path(kyrillic.txt) r]
  2987.     set out [open $path(utf8-fcopy.txt) w]
  2988.     fconfigure $in  -encoding koi8-r -translation lf
  2989.     fconfigure $out -encoding utf-8 -translation lf
  2990.     fcopy $in $out
  2991.     close $in
  2992.     close $out
  2993.     # Do the same again, but differently (read/puts).
  2994.     set in  [open $path(kyrillic.txt) r]
  2995.     set out [open $path(utf8-rp.txt) w]
  2996.     fconfigure $in  -encoding koi8-r -translation lf
  2997.     fconfigure $out -encoding utf-8 -translation lf
  2998.     puts -nonewline $out [read $in]
  2999.     close $in
  3000.     close $out
  3001.     list [file size $path(kyrillic.txt)] 
  3002.     [file size $path(utf8-fcopy.txt)] 
  3003.     [file size $path(utf8-rp.txt)]
  3004. } {3 5 5}
  3005. test io-52.10 {TclCopyChannel & encodings} {fcopy} {
  3006.     # encoding to binary (=> implies that the
  3007.     # internal utf-8 is written)
  3008.     set in  [open $path(kyrillic.txt) r]
  3009.     set out [open $path(utf8-fcopy.txt) w]
  3010.     fconfigure $in  -encoding koi8-r -translation lf
  3011.     # -translation binary is also -encoding binary
  3012.     fconfigure $out -translation binary
  3013.     fcopy $in $out
  3014.     close $in
  3015.     close $out
  3016.     file size $path(utf8-fcopy.txt)
  3017. } 5
  3018. test io-52.11 {TclCopyChannel & encodings} {fcopy} {
  3019.     # binary to encoding => the input has to be
  3020.     # in utf-8 to make sense to the encoder
  3021.     set in  [open $path(utf8-fcopy.txt) r]
  3022.     set out [open $path(kyrillic.txt) w]
  3023.     # -translation binary is also -encoding binary
  3024.     fconfigure $in  -translation binary
  3025.     fconfigure $out -encoding koi8-r -translation lf
  3026.     fcopy $in $out
  3027.     close $in
  3028.     close $out
  3029.     file size $path(kyrillic.txt)
  3030. } 3
  3031. test io-53.1 {CopyData} {fcopy} {
  3032.     file delete $path(test1)
  3033.     set f1 [open $thisScript]
  3034.     set f2 [open $path(test1) w]
  3035.     fconfigure $f1 -translation lf -blocking 0
  3036.     fconfigure $f2 -translation cr -blocking 0
  3037.     fcopy $f1 $f2 -size 0
  3038.     set result [list [fconfigure $f1 -blocking] [fconfigure $f2 -blocking]]
  3039.     close $f1
  3040.     close $f2
  3041.     lappend result [file size $path(test1)]
  3042. } {0 0 0}
  3043. test io-53.2 {CopyData} {fcopy} {
  3044.     file delete $path(test1)
  3045.     set f1 [open $thisScript]
  3046.     set f2 [open $path(test1) w]
  3047.     fconfigure $f1 -translation lf -blocking 0
  3048.     fconfigure $f2 -translation cr -blocking 0
  3049.     fcopy $f1 $f2 -command [namespace code {set s0}]
  3050.     set result [list [fconfigure $f1 -blocking] [fconfigure $f2 -blocking]]
  3051.     variable s0
  3052.     vwait [namespace which -variable s0]
  3053.     close $f1
  3054.     close $f2
  3055.     set s1 [file size $thisScript]
  3056.     set s2 [file size $path(test1)]
  3057.     if {("$s1" == "$s2") && ($s0 == $s1)} {
  3058.         lappend result ok
  3059.     }
  3060.     set result
  3061. } {0 0 ok}
  3062. test io-53.3 {CopyData: background read underflow} {stdio unixOnly openpipe fcopy} {
  3063.     file delete $path(test1)
  3064.     file delete $path(pipe)
  3065.     set f1 [open $path(pipe) w]
  3066.     puts -nonewline $f1 {
  3067. puts ready
  3068. flush stdout ;# Don't assume line buffered!
  3069. fcopy stdin stdout -command { set x }
  3070. vwait x
  3071. set f [}
  3072.     puts $f1 [list open $path(test1) w]]
  3073.     puts $f1 {
  3074. fconfigure $f -translation lf
  3075. puts $f "done"
  3076. close $f
  3077.     }
  3078.     close $f1
  3079.     set f1 [open "|[list [interpreter] $path(pipe)]" r+]
  3080.     set result [gets $f1]
  3081.     puts $f1 line1
  3082.     flush $f1
  3083.     lappend result [gets $f1]
  3084.     puts $f1 line2
  3085.     flush $f1
  3086.     lappend result [gets $f1]
  3087.     close $f1
  3088.     after 500
  3089.     set f [open $path(test1)]
  3090.     lappend result [read $f]
  3091.     close $f
  3092.     set result
  3093. } "ready line1 line2 {donen}"
  3094. test io-53.4 {CopyData: background write overflow} {stdio unixOnly openpipe fileevent fcopy} {
  3095.     set big bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbn
  3096.     variable x
  3097.     for {set x 0} {$x < 12} {incr x} {
  3098. append big $big
  3099.     }
  3100.     file delete $path(test1)
  3101.     file delete $path(pipe)
  3102.     set f1 [open $path(pipe) w]
  3103.     puts $f1 {
  3104. puts ready
  3105. fcopy stdin stdout -command { set x }
  3106. vwait x
  3107. set f [open $path(test1) w]
  3108. fconfigure $f -translation lf
  3109. puts $f "done"
  3110. close $f
  3111.     }
  3112.     close $f1
  3113.     set f1 [open "|[list [interpreter] $path(pipe)]" r+]
  3114.     set result [gets $f1]
  3115.     fconfigure $f1 -blocking 0
  3116.     puts $f1 $big
  3117.     flush $f1
  3118.     after 500
  3119.     set result ""
  3120.     fileevent $f1 read [namespace code {
  3121. append result [read $f1 1024]
  3122. if {[string length $result] >= [string length $big]} {
  3123.     set x done
  3124. }
  3125.     }]
  3126.     vwait [namespace which -variable x]
  3127.     close $f1
  3128.     set big {}
  3129.     set x
  3130. } done
  3131. set result {}
  3132. proc FcopyTestAccept {sock args} {
  3133.     after 1000 "close $sock"
  3134. }
  3135. proc FcopyTestDone {bytes {error {}}} {
  3136.     variable fcopyTestDone
  3137.     if {[string length $error]} {
  3138. set fcopyTestDone 1
  3139.     } else {
  3140. set fcopyTestDone 0
  3141.     }
  3142. }
  3143. test io-53.5 {CopyData: error during fcopy} {socket fcopy} {
  3144.     variable fcopyTestDone
  3145.     set listen [socket -server [namespace code FcopyTestAccept] 0]
  3146.     set in [open $thisScript] ;# 126 K
  3147.     set out [socket 127.0.0.1 [lindex [fconfigure $listen -sockname] 2]]
  3148.     catch {unset fcopyTestDone}
  3149.     close $listen ;# This means the socket open never really succeeds
  3150.     fcopy $in $out -command [namespace code FcopyTestDone]
  3151.     variable fcopyTestDone
  3152.     if ![info exists fcopyTestDone] {
  3153. vwait [namespace which -variable fcopyTestDone] ;# The error occurs here in the b.g.
  3154.     }
  3155.     close $in
  3156.     close $out
  3157.     set fcopyTestDone ;# 1 for error condition
  3158. } 1
  3159. test io-53.6 {CopyData: error during fcopy} {stdio openpipe fcopy} {
  3160.     variable fcopyTestDone
  3161.     file delete $path(pipe)
  3162.     file delete $path(test1)
  3163.     catch {unset fcopyTestDone}
  3164.     set f1 [open $path(pipe) w]
  3165.     puts $f1 "exit 1"
  3166.     close $f1
  3167.     set in [open "|[list [interpreter] $path(pipe)]" r+]
  3168.     set out [open $path(test1) w]
  3169.     fcopy $in $out -command [namespace code FcopyTestDone]
  3170.     variable fcopyTestDone
  3171.     if ![info exists fcopyTestDone] {
  3172. vwait [namespace which -variable fcopyTestDone]
  3173.     }
  3174.     catch {close $in}
  3175.     close $out
  3176.     set fcopyTestDone ;# 0 for plain end of file
  3177. } {0}
  3178. proc doFcopy {in out {bytes 0} {error {}}} {
  3179.     variable fcopyTestDone
  3180.     variable fcopyTestCount
  3181.     incr fcopyTestCount $bytes
  3182.     if {[string length $error]} {
  3183.     set fcopyTestDone 1
  3184.     } elseif {[eof $in]} {
  3185.     set fcopyTestDone 0
  3186.     } else {
  3187.         # Delay next fcopy to wait for size>0 input bytes
  3188.         after 100 [list 
  3189.             fcopy $in $out -size 1000 
  3190.     -command [namespace code [list doFcopy $in $out]]
  3191.         ]
  3192.     }
  3193. }
  3194. test io-53.7 {CopyData: Flooding fcopy from pipe} {stdio openpipe fcopy} {
  3195.     variable fcopyTestDone
  3196.     file delete $path(pipe)
  3197.     catch {unset fcopyTestDone}
  3198.     set fcopyTestCount 0
  3199.     set f1 [open $path(pipe) w]
  3200.     puts $f1 {
  3201. # Write  10 bytes / 10 msec
  3202. proc Write {count} {
  3203.     puts -nonewline "1234567890"
  3204.     if {[incr count -1]} {
  3205.         after 10 [list Write $count]
  3206.     } else {
  3207.         set ::ready 1
  3208.     }
  3209. }
  3210. fconfigure stdout -buffering none
  3211. Write 345 ;# 3450 bytes ~3.45 sec
  3212. vwait ready
  3213. exit 0
  3214.     }
  3215.     close $f1
  3216.     set in [open "|[list [interpreter] $path(pipe) &]" r+]
  3217.     set out [open $path(test1) w]
  3218.     doFcopy $in $out
  3219.     variable fcopyTestDone
  3220.     if ![info exists fcopyTestDone] {
  3221. vwait [namespace which -variable fcopyTestDone]
  3222.     }
  3223.     catch {close $in}
  3224.     close $out
  3225.     # -1=error 0=script error N=number of bytes
  3226.     expr ($fcopyTestDone == 0) ? $fcopyTestCount : -1
  3227. } {3450}
  3228. test io-54.1 {Recursive channel events} {socket fileevent} {
  3229.     # This test checks to see if file events are delivered during recursive
  3230.     # event loops when there is buffered data on the channel.
  3231.     proc accept {s a p} {
  3232. variable as
  3233. fconfigure $s -translation lf
  3234. puts $s "line 1nline2nline3"
  3235. flush $s
  3236. set as $s
  3237.     }
  3238.     proc readit {s next} {
  3239. variable x
  3240. variable result
  3241. lappend result $next
  3242. if {$next == 1} {
  3243.     fileevent $s readable [namespace code [list readit $s 2]]
  3244.     vwait [namespace which -variable x]
  3245. }
  3246. incr x
  3247.     }
  3248.     set ss [socket -server [namespace code accept] 0]
  3249.     # We need to delay on some systems until the creation of the
  3250.     # server socket completes.
  3251.     set done 0
  3252.     for {set i 0} {$i < 10} {incr i} {
  3253. if {![catch {set cs [socket [info hostname] [lindex [fconfigure $ss -sockname] 2]]}]} {
  3254.     set done 1
  3255.     break
  3256. }
  3257. after 100
  3258.     }
  3259.     if {$done == 0} {
  3260. close $ss
  3261. error "failed to connect to server"
  3262.     }
  3263.     variable result {}
  3264.     variable x 0
  3265.     variable as
  3266.     vwait [namespace which -variable as]
  3267.     fconfigure $cs -translation lf
  3268.     lappend result [gets $cs]
  3269.     fconfigure $cs -blocking off
  3270.     fileevent $cs readable [namespace code [list readit $cs 1]]
  3271.     set a [after 2000 [namespace code { set x failure }]]
  3272.     vwait [namespace which -variable x]
  3273.     after cancel $a
  3274.     close $as
  3275.     close $ss
  3276.     close $cs
  3277.     list $result $x
  3278. } {{{line 1} 1 2} 2}
  3279. test io-54.2 {Testing for busy-wait in recursive channel events} {socket fileevent} {
  3280.     set accept {}
  3281.     set after {}
  3282.     variable s [socket -server [namespace code accept] 0]
  3283.     proc accept {s a p} {
  3284. variable counter
  3285. variable accept
  3286. set accept $s
  3287. set counter 0
  3288. fconfigure $s -blocking off -buffering line -translation lf
  3289. fileevent $s readable [namespace code "doit $s"]
  3290.     }
  3291.     proc doit {s} {
  3292. variable counter
  3293. variable after
  3294. incr counter
  3295. set l [gets $s]
  3296. if {"$l" == ""} {
  3297.     fileevent $s readable [namespace code "doit1 $s"]
  3298.     set after [after 1000 [namespace code newline]]
  3299. }
  3300.     }
  3301.     proc doit1 {s} {
  3302. variable counter
  3303. variable accept
  3304. incr counter
  3305. set l [gets $s]
  3306. close $s
  3307. set accept {}
  3308.     }
  3309.     proc producer {} {
  3310. variable s
  3311. variable writer
  3312. set writer [socket 127.0.0.1 [lindex [fconfigure $s -sockname] 2]]
  3313. fconfigure $writer -buffering line
  3314. puts -nonewline $writer hello
  3315. flush $writer
  3316.     }
  3317.     proc newline {} {
  3318. variable done
  3319. variable writer
  3320. puts $writer hello
  3321. flush $writer
  3322. set done 1
  3323.     }
  3324.     producer
  3325.     variable done
  3326.     vwait [namespace which -variable done]
  3327.     close $writer
  3328.     close $s
  3329.     after cancel $after
  3330.     if {$accept != {}} {close $accept}
  3331.     set counter
  3332. } 1
  3333. set path(fooBar) [makeFile {} fooBar]
  3334. test io-55.1 {ChannelEventScriptInvoker: deletion} {fileevent} {
  3335.     variable x
  3336.     proc eventScript {fd} {
  3337. variable x
  3338. close $fd
  3339. error "planned error"
  3340. set x whoops
  3341.     }
  3342.     proc ::bgerror {args} "set [namespace which -variable x] got_error"
  3343.     set f [open $path(fooBar) w]
  3344.     fileevent $f writable [namespace code [list eventScript $f]]
  3345.     variable x not_done
  3346.     vwait [namespace which -variable x]
  3347.     set x
  3348. } {got_error}
  3349. test io-56.1 {ChannelTimerProc} {testchannelevent} {
  3350.     set f [open $path(fooBar) w]
  3351.     puts $f "this is a test"
  3352.     close $f
  3353.     set f [open $path(fooBar) r]
  3354.     testchannelevent $f add readable [namespace code {
  3355. read $f 1
  3356. incr x
  3357.     }]
  3358.     variable x 0
  3359.     vwait [namespace which -variable x]
  3360.     vwait [namespace which -variable x]
  3361.     set result $x
  3362.     testchannelevent $f set 0 none
  3363.     after idle [namespace code {set y done}]
  3364.     variable y
  3365.     vwait [namespace which -variable y]
  3366.     close $f
  3367.     lappend result $y
  3368. } {2 done}
  3369. test io-57.1 {buffered data and file events, gets} {fileevent} {
  3370.     proc accept {sock args} {
  3371. variable s2
  3372. set s2 $sock
  3373.     }
  3374.     set server [socket -server [namespace code accept] 0]
  3375.     set s [socket 127.0.0.1 [lindex [fconfigure $server -sockname] 2]]
  3376.     variable s2
  3377.     vwait [namespace which -variable s2]
  3378.     update
  3379.     fileevent $s2 readable [namespace code {lappend result readable}]
  3380.     puts $s "12n34567890"
  3381.     flush $s
  3382.     variable result [gets $s2]
  3383.     after 1000 [namespace code {lappend result timer}]
  3384.     vwait [namespace which -variable result]
  3385.     lappend result [gets $s2]
  3386.     vwait [namespace which -variable result]
  3387.     close $s
  3388.     close $s2
  3389.     close $server
  3390.     set result
  3391. } {12 readable 34567890 timer}
  3392. test io-57.2 {buffered data and file events, read} {fileevent} {
  3393.     proc accept {sock args} {
  3394. variable s2
  3395. set s2 $sock
  3396.     }
  3397.     set server [socket -server [namespace code accept] 0]
  3398.     set s [socket 127.0.0.1 [lindex [fconfigure $server -sockname] 2]]
  3399.     variable s2
  3400.     vwait [namespace which -variable s2]
  3401.     update
  3402.     fileevent $s2 readable [namespace code {lappend result readable}]
  3403.     puts -nonewline $s "1234567890"
  3404.     flush $s
  3405.     variable result [read $s2 1]
  3406.     after 1000 [namespace code {lappend result timer}]
  3407.     vwait [namespace which -variable result]
  3408.     lappend result [read $s2 9]
  3409.     vwait [namespace which -variable result]
  3410.     close $s
  3411.     close $s2
  3412.     close $server
  3413.     set result
  3414. } {1 readable 234567890 timer}
  3415.         
  3416. test io-58.1 {Tcl_NotifyChannel and error when closing} {stdio unixOrPc openpipe fileevent} {
  3417.     set out [open $path(script) w]
  3418.     puts $out {
  3419. puts "normal message from pipe"
  3420. puts stderr "error message from pipe"
  3421. exit 1
  3422.     }
  3423.     proc readit {pipe} {
  3424. variable x
  3425. variable result
  3426. if {[eof $pipe]} {
  3427.     set x [catch {close $pipe} line]
  3428.     lappend result catch $line
  3429. } else {
  3430.     gets $pipe line
  3431.     lappend result gets $line
  3432. }
  3433.     }
  3434.     close $out
  3435.     set pipe [open "|[list [interpreter] $path(script)]" r]
  3436.     fileevent $pipe readable [namespace code [list readit $pipe]]
  3437.     variable x ""
  3438.     set result ""
  3439.     vwait [namespace which -variable x]
  3440.     list $x $result
  3441. } {1 {gets {normal message from pipe} gets {} catch {error message from pipe}}}
  3442. testConstraint testmainthread [llength [info commands testmainthread]]
  3443. test io-59.1 {Thread reference of channels} {testmainthread testchannel} {
  3444.     # TIP #10
  3445.     # More complicated tests (like that the reference changes as a
  3446.     # channel is moved from thread to thread) can be done only in the
  3447.     # extension which fully implements the moving of channels between
  3448.     # threads, i.e. 'Threads'. Or we have to extend [testthread] as well.
  3449.     set f [open $path(longfile) r]
  3450.     set result [testchannel mthread $f]
  3451.     close $f
  3452.     string equal $result [testmainthread]
  3453. } {1}
  3454. test io-60.1 {writing illegal utf sequences} {openpipe fileevent} {
  3455.     # This test will hang in older revisions of the core.
  3456.     set out [open $path(script) w]
  3457.     puts $out {
  3458. puts [encoding convertfrom identity xe2]
  3459. exit 1
  3460.     }
  3461.     proc readit {pipe} {
  3462. variable x
  3463. variable result
  3464. if {[eof $pipe]} {
  3465.     set x [catch {close $pipe} line]
  3466.     lappend result catch $line
  3467. } else {
  3468.     gets $pipe line
  3469.     lappend result gets $line
  3470. }
  3471.     }
  3472.     close $out
  3473.     set pipe [open "|[list [interpreter] $path(script)]" r]
  3474.     fileevent $pipe readable [namespace code [list readit $pipe]]
  3475.     variable x ""
  3476.     set result ""
  3477.     vwait [namespace which -variable x]
  3478.     # cut of the remainder of the error stack, especially the filename
  3479.     set result [lreplace $result 3 3 [lindex [split [lindex $result 3] n] 0]]
  3480.     list $x $result
  3481. } {1 {gets {} catch {error writing "stdout": invalid argument}}}
  3482. test io-61.1 {Reset eof state after changing the eof char} -setup {
  3483.     set datafile [makeFile {} eofchar]
  3484.     set f [open $datafile w]
  3485.     fconfigure $f -translation binary
  3486.     puts -nonewline $f [string repeat "Ho humn" 11]
  3487.     puts $f =
  3488.     set line [string repeat "Ge gla " 4]
  3489.     puts -nonewline $f [string repeat [string trimright $line]n 834]
  3490.     close $f
  3491. } -body {
  3492.     set f [open $datafile r]
  3493.     fconfigure $f -eofchar =
  3494.     set res {}
  3495.     lappend res [read $f; tell $f]
  3496.     fconfigure $f -eofchar {}
  3497.     lappend res [read $f 1]
  3498.     lappend res [read $f; tell $f]
  3499.     # Any seek zaps the internals into a good state.
  3500.     #seek $f 0 start
  3501.     #seek $f 0 current
  3502.     #lappend res [read $f; tell $f]
  3503.     close $f
  3504.     set res
  3505. } -cleanup {
  3506.     removeFile eofchar
  3507. } -result {77 = 23431}
  3508. # cleanup
  3509. foreach file [list fooBar longfile script output test1 pipe my_script foo 
  3510. bar test2 test3 cat stdout kyrillic.txt utf8-fcopy.txt utf8-rp.txt] {
  3511.     removeFile $file
  3512. }
  3513. cleanupTests
  3514. }
  3515. namespace delete ::tcl::test::io
  3516. return