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

通讯编程

开发平台:

Visual C++

  1. # The file tests the tclCmdAH.c file.
  2. #
  3. # This file contains a collection of tests for one or more of the Tcl
  4. # built-in commands.  Sourcing this file into Tcl runs the tests and
  5. # generates output for errors.  No output means no errors were found.
  6. #
  7. # Copyright (c) 1996-1998 by Sun Microsystems, Inc.
  8. # Copyright (c) 1998-1999 by Scriptics Corporation.
  9. #
  10. # See the file "license.terms" for information on usage and redistribution
  11. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  12. #
  13. # RCS: @(#) $Id: cmdAH.test,v 1.30.2.6 2006/10/01 13:17:34 patthoyts Exp $
  14. if {[lsearch [namespace children] ::tcltest] == -1} {
  15.     package require tcltest 2.1
  16.     namespace import -force ::tcltest::*
  17. }
  18. tcltest::testConstraint testchmod [string equal testchmod [info commands testchmod]]
  19. global env
  20. set cmdAHwd [pwd]
  21. catch {set platform [testgetplatform]}
  22. test cmdAH-0.1 {Tcl_BreakObjCmd, errors} {
  23.     list [catch {break foo} msg] $msg
  24. } {1 {wrong # args: should be "break"}}
  25. test cmdAH-0.2 {Tcl_BreakObjCmd, success} {
  26.     list [catch {break} msg] $msg
  27. } {3 {}}
  28. # Tcl_CaseObjCmd is tested in case.test
  29. test cmdAH-1.1 {Tcl_CatchObjCmd, errors} {
  30.     list [catch {catch} msg] $msg
  31. } {1 {wrong # args: should be "catch command ?varName?"}}
  32. test cmdAH-1.2 {Tcl_CatchObjCmd, errors} {
  33.     list [catch {catch foo bar baz} msg] $msg
  34. } {1 {wrong # args: should be "catch command ?varName?"}}
  35. test cmdAH-2.1 {Tcl_CdObjCmd} {
  36.     list [catch {cd foo bar} msg] $msg
  37. } {1 {wrong # args: should be "cd ?dirName?"}}
  38. set foodir [file join [temporaryDirectory] foo]
  39. test cmdAH-2.2 {Tcl_CdObjCmd} {
  40.     file delete -force $foodir
  41.     file mkdir $foodir
  42.     cd $foodir
  43.     set result [file tail [pwd]]
  44.     cd ..
  45.     file delete $foodir
  46.     set result
  47. } foo
  48. test cmdAH-2.3 {Tcl_CdObjCmd} {
  49.     global env
  50.     set oldpwd [pwd]
  51.     set temp $env(HOME)
  52.     set env(HOME) $oldpwd
  53.     file delete -force $foodir
  54.     file mkdir $foodir
  55.     cd $foodir
  56.     cd ~
  57.     set result [string equal [pwd] $oldpwd]
  58.     file delete $foodir
  59.     set env(HOME) $temp
  60.     set result
  61. } 1
  62. test cmdAH-2.4 {Tcl_CdObjCmd} {
  63.     global env
  64.     set oldpwd [pwd]
  65.     set temp $env(HOME)
  66.     set env(HOME) $oldpwd
  67.     file delete -force $foodir
  68.     file mkdir $foodir
  69.     cd $foodir
  70.     cd
  71.     set result [string equal [pwd] $oldpwd]
  72.     file delete $foodir
  73.     set env(HOME) $temp
  74.     set result
  75. } 1
  76. test cmdAH-2.5 {Tcl_CdObjCmd} {
  77.     list [catch {cd ~~} msg] $msg
  78. } {1 {user "~" doesn't exist}}
  79. test cmdAH-2.6 {Tcl_CdObjCmd} {
  80.     list [catch {cd _foobar} msg] $msg
  81. } {1 {couldn't change working directory to "_foobar": no such file or directory}}
  82. test cmdAH-2.6.1 {Tcl_CdObjCmd} {
  83.     list [catch {cd ""} msg] $msg
  84. } {1 {couldn't change working directory to "": no such file or directory}}
  85. test cmdAH-2.7 {Tcl_ConcatObjCmd} {
  86.     concat
  87. } {}
  88. test cmdAH-2.8 {Tcl_ConcatObjCmd} {
  89.     concat a
  90. } a
  91. test cmdAH-2.9 {Tcl_ConcatObjCmd} {
  92.     concat a {b c}
  93. } {a b c}
  94. test cmdAH-3.1 {Tcl_ContinueObjCmd, errors} {
  95.     list [catch {continue foo} msg] $msg
  96. } {1 {wrong # args: should be "continue"}}
  97. test cmdAH-3.2 {Tcl_ContinueObjCmd, success} {
  98.     list [catch {continue} msg] $msg
  99. } {4 {}}
  100. test cmdAH-4.1 {Tcl_EncodingObjCmd} {
  101.     list [catch {encoding} msg] $msg
  102. } {1 {wrong # args: should be "encoding option ?arg ...?"}}
  103. test cmdAH-4.2 {Tcl_EncodingObjCmd} {
  104.     list [catch {encoding foo} msg] $msg
  105. } {1 {bad option "foo": must be convertfrom, convertto, names, or system}}
  106. test cmdAH-4.3 {Tcl_EncodingObjCmd} {
  107.     list [catch {encoding convertto} msg] $msg
  108. } {1 {wrong # args: should be "encoding convertto ?encoding? data"}}
  109. test cmdAH-4.4 {Tcl_EncodingObjCmd} {
  110.     list [catch {encoding convertto foo bar} msg] $msg
  111. } {1 {unknown encoding "foo"}}
  112. test cmdAH-4.5 {Tcl_EncodingObjCmd} {
  113.     set system [encoding system]
  114.     encoding system jis0208
  115.     set x [encoding convertto u4e4e]
  116.     encoding system $system
  117.     set x
  118. } 8C
  119. test cmdAH-4.6 {Tcl_EncodingObjCmd} {
  120.     set system [encoding system]
  121.     encoding system identity
  122.     set x [encoding convertto jis0208 u4e4e]
  123.     encoding system $system
  124.     set x
  125. } 8C
  126. test cmdAH-4.7 {Tcl_EncodingObjCmd} {
  127.     list [catch {encoding convertfrom} msg] $msg
  128. } {1 {wrong # args: should be "encoding convertfrom ?encoding? data"}}
  129. test cmdAH-4.8 {Tcl_EncodingObjCmd} {
  130.     list [catch {encoding convertfrom foo bar} msg] $msg
  131. } {1 {unknown encoding "foo"}}
  132. test cmdAH-4.9 {Tcl_EncodingObjCmd} {
  133.     set system [encoding system]
  134.     encoding system jis0208
  135.     set x [encoding convertfrom 8C]
  136.     encoding system $system
  137.     set x
  138. } u4e4e
  139. test cmdAH-4.10 {Tcl_EncodingObjCmd} {
  140.     set system [encoding system]
  141.     encoding system identity
  142.     set x [encoding convertfrom jis0208 8C]
  143.     encoding system $system
  144.     set x
  145. } u4e4e
  146. test cmdAH-4.11 {Tcl_EncodingObjCmd} {
  147.     list [catch {encoding names foo} msg] $msg
  148. } {1 {wrong # args: should be "encoding names"}}
  149. test cmdAH-4.12 {Tcl_EncodingObjCmd} {
  150.     list [catch {encoding system foo bar} msg] $msg
  151. } {1 {wrong # args: should be "encoding system ?encoding?"}}
  152. test cmdAH-4.13 {Tcl_EncodingObjCmd} {
  153.     set system [encoding system]
  154.     encoding system identity
  155.     set x [encoding system]
  156.     encoding system $system
  157.     set x
  158. } identity
  159. test cmdAH-5.1 {Tcl_FileObjCmd} {
  160.     list [catch file msg] $msg
  161. } {1 {wrong # args: should be "file option ?arg ...?"}}
  162. test cmdAH-5.2 {Tcl_FileObjCmd} {
  163.     list [catch {file x} msg] $msg
  164. } {1 {bad option "x": must be atime, attributes, channels, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, link, lstat, mtime, mkdir, nativename, normalize, owned, pathtype, readable, readlink, rename, rootname, separator, size, split, stat, system, tail, type, volumes, or writable}}
  165. test cmdAH-5.3 {Tcl_FileObjCmd} {
  166.     list [catch {file exists} msg] $msg
  167. } {1 {wrong # args: should be "file exists name"}}
  168. test cmdAH-5.4 {Tcl_FileObjCmd} {
  169.     list [catch {file exists ""} msg] $msg
  170. } {0 0}
  171. #volume
  172. test cmdAH-6.1 {Tcl_FileObjCmd: volumes} {
  173.     list [catch {file volumes x} msg] $msg
  174. } {1 {wrong # args: should be "file volumes"}}
  175. test cmdAH-6.2 {Tcl_FileObjCmd: volumes} {
  176. set volumeList [file volumes]
  177. if { [llength $volumeList] == 0 } {
  178. set result 0
  179. } else {
  180. set result 1
  181. }
  182. } {1}
  183. test cmdAH-6.3 {Tcl_FileObjCmd: volumes} {macOrUnix} {
  184.     set volumeList [file volumes]
  185.     catch [list glob -nocomplain [lindex $volumeList 0]*]
  186. } {0}
  187. test cmdAH-6.4 {Tcl_FileObjCmd: volumes} winOnly {
  188.     set volumeList [string tolower [file volumes]]
  189.     list [catch {lsearch $volumeList "c:/"} element] [expr $element != -1] [catch {list glob -nocomplain [lindex $volumeList $element]*}]
  190. } {0 1 0}
  191. test cmdAH-6.5 {cd} {unixOnly nonPortable} {
  192.     set dir [pwd]
  193.     cd /
  194.     set res [pwd]
  195.     cd $dir
  196.     set res
  197. } {/}
  198. # attributes
  199. test cmdAH-7.1 {Tcl_FileObjCmd - file attrs} {
  200.     set foofile [makeFile abcde foo.file]
  201.     catch {file delete -force $foofile}
  202.     close [open $foofile w]
  203.     set res [catch {file attributes $foofile}]
  204.     # We used [makeFile] so we undo with [removeFile]
  205.     removeFile $foofile
  206.     set res
  207. } {0}
  208. # dirname
  209. if {[info commands testsetplatform] == {}} {
  210.     puts "This application hasn't been compiled with the "testsetplatform""
  211.     puts "command, so I can't test Tcl_FileObjCmd etc."
  212. } else {
  213. test cmdAH-8.1 {Tcl_FileObjCmd: dirname} {
  214.     testsetplatform unix
  215.     list [catch {file dirname a b} msg] $msg
  216. } {1 {wrong # args: should be "file dirname name"}}
  217. test cmdAH-8.2 {Tcl_FileObjCmd: dirname} {
  218.     testsetplatform unix
  219.     file dirname /a/b
  220. } /a
  221. test cmdAH-8.3 {Tcl_FileObjCmd: dirname} {
  222.     testsetplatform unix
  223.     file dirname {}
  224. } .
  225. test cmdAH-8.4 {Tcl_FileObjCmd: dirname} {
  226.     testsetplatform mac
  227.     file dirname {}
  228. } :
  229. test cmdAH-8.5 {Tcl_FileObjCmd: dirname} {
  230.     testsetplatform win
  231.     file dirname {}
  232. } .
  233. test cmdAH-8.6 {Tcl_FileObjCmd: dirname} {
  234.     testsetplatform unix
  235.     file dirname .def
  236. } .
  237. test cmdAH-8.7 {Tcl_FileObjCmd: dirname} {
  238.     testsetplatform mac
  239.     file dirname a
  240. } :
  241. test cmdAH-8.8 {Tcl_FileObjCmd: dirname} {
  242.     testsetplatform win
  243.     file dirname a
  244. } .
  245. test cmdAH-8.9 {Tcl_FileObjCmd: dirname} {
  246.     testsetplatform unix
  247.     file dirname a/b/c.d
  248. } a/b
  249. test cmdAH-8.10 {Tcl_FileObjCmd: dirname} {
  250.     testsetplatform unix
  251.     file dirname a/b.c/d
  252. } a/b.c
  253. test cmdAH-8.11 {Tcl_FileObjCmd: dirname} {
  254.     testsetplatform unix
  255.     file dirname /.
  256. } /
  257. test cmdAH-8.12 {Tcl_FileObjCmd: dirname} {
  258.     testsetplatform unix
  259.     list [catch {file dirname /} msg] $msg
  260. } {0 /}
  261. test cmdAH-8.13 {Tcl_FileObjCmd: dirname} {
  262.     testsetplatform unix
  263.     list [catch {file dirname /foo} msg] $msg
  264. } {0 /}
  265. test cmdAH-8.14 {Tcl_FileObjCmd: dirname} {
  266.     testsetplatform unix
  267.     list [catch {file dirname //foo} msg] $msg
  268. } {0 /}
  269. test cmdAH-8.15 {Tcl_FileObjCmd: dirname} {
  270.     testsetplatform unix
  271.     list [catch {file dirname //foo/bar} msg] $msg
  272. } {0 /foo}
  273. test cmdAH-8.16 {Tcl_FileObjCmd: dirname} {
  274.     testsetplatform unix
  275.     list [catch {file dirname {//foo/bar/baz}} msg] $msg
  276. } {0 {/foo/bar}}
  277. test cmdAH-8.17 {Tcl_FileObjCmd: dirname} {
  278.     testsetplatform unix
  279.     list [catch {file dirname {//foo/bar/baz/blat}} msg] $msg
  280. } {0 {/foo/bar/baz}}
  281. test cmdAH-8.18 {Tcl_FileObjCmd: dirname} {
  282.     testsetplatform unix
  283.     list [catch {file dirname /foo//} msg] $msg
  284. } {0 /}
  285. test cmdAH-8.19 {Tcl_FileObjCmd: dirname} {
  286.     testsetplatform unix
  287.     list [catch {file dirname ./a} msg] $msg
  288. } {0 .}
  289. test cmdAH-8.20 {Tcl_FileObjCmd: dirname} {
  290.     testsetplatform unix
  291.     list [catch {file dirname a/.a} msg] $msg
  292. } {0 a}
  293. test cmdAH-8.21 {Tcl_FileObjCmd: dirname} {
  294.     testsetplatform windows
  295.     list [catch {file dirname c:foo} msg] $msg
  296. } {0 c:}
  297. test cmdAH-8.22 {Tcl_FileObjCmd: dirname} {
  298.     testsetplatform windows
  299.     list [catch {file dirname c:} msg] $msg
  300. } {0 c:}
  301. test cmdAH-8.23 {Tcl_FileObjCmd: dirname} {
  302.     testsetplatform windows
  303.     list [catch {file dirname c:/} msg] $msg
  304. } {0 c:/}
  305. test cmdAH-8.24 {Tcl_FileObjCmd: dirname} {
  306.     testsetplatform windows
  307.     list [catch {file dirname {c:foo}} msg] $msg
  308. } {0 c:/}
  309. test cmdAH-8.25 {Tcl_FileObjCmd: dirname} {
  310.     testsetplatform windows
  311.     list [catch {file dirname {//foo/bar/baz}} msg] $msg
  312. } {0 //foo/bar}
  313. test cmdAH-8.26 {Tcl_FileObjCmd: dirname} {
  314.     testsetplatform windows
  315.     list [catch {file dirname {//foo/bar}} msg] $msg
  316. } {0 //foo/bar}
  317. test cmdAH-8.27 {Tcl_FileObjCmd: dirname} {
  318.     testsetplatform mac
  319.     list [catch {file dirname :} msg] $msg
  320. } {0 :}
  321. test cmdAH-8.28 {Tcl_FileObjCmd: dirname} {
  322.     testsetplatform mac
  323.     list [catch {file dirname :Foo} msg] $msg
  324. } {0 :}
  325. test cmdAH-8.29 {Tcl_FileObjCmd: dirname} {
  326.     testsetplatform mac
  327.     list [catch {file dirname Foo:} msg] $msg
  328. } {0 Foo:}
  329. test cmdAH-8.30 {Tcl_FileObjCmd: dirname} {
  330.     testsetplatform mac
  331.     list [catch {file dirname Foo:bar} msg] $msg
  332. } {0 Foo:}
  333. test cmdAH-8.31 {Tcl_FileObjCmd: dirname} {
  334.     testsetplatform mac
  335.     list [catch {file dirname :Foo:bar} msg] $msg
  336. } {0 :Foo}
  337. test cmdAH-8.32 {Tcl_FileObjCmd: dirname} {
  338.     testsetplatform mac
  339.     list [catch {file dirname ::} msg] $msg
  340. } {0 :}
  341. test cmdAH-8.33 {Tcl_FileObjCmd: dirname} {
  342.     testsetplatform mac
  343.     list [catch {file dirname :::} msg] $msg
  344. } {0 ::}
  345. test cmdAH-8.34 {Tcl_FileObjCmd: dirname} {
  346.     testsetplatform mac
  347.     list [catch {file dirname /foo/bar/} msg] $msg
  348. } {0 foo:}
  349. test cmdAH-8.35 {Tcl_FileObjCmd: dirname} {
  350.     testsetplatform mac
  351.     list [catch {file dirname /foo/bar} msg] $msg
  352. } {0 foo:}
  353. test cmdAH-8.36 {Tcl_FileObjCmd: dirname} {
  354.     testsetplatform mac
  355.     list [catch {file dirname /foo} msg] $msg
  356. } {0 foo:}
  357. test cmdAH-8.37 {Tcl_FileObjCmd: dirname} {
  358.     testsetplatform mac
  359.     list [catch {file dirname foo} msg] $msg
  360. } {0 :}
  361. test cmdAH-8.38 {Tcl_FileObjCmd: dirname} {
  362.     testsetplatform unix
  363.     list [catch {file dirname ~/foo} msg] $msg
  364. } {0 ~}
  365. test cmdAH-8.39 {Tcl_FileObjCmd: dirname} {
  366.     testsetplatform unix
  367.     list [catch {file dirname ~bar/foo} msg] $msg
  368. } {0 ~bar}
  369. test cmdAH-8.40 {Tcl_FileObjCmd: dirname} {
  370.     testsetplatform mac
  371.     list [catch {file dirname ~bar/foo} msg] $msg
  372. } {0 ~bar:}
  373. test cmdAH-8.41 {Tcl_FileObjCmd: dirname} {
  374.     testsetplatform mac
  375.     list [catch {file dirname ~/foo} msg] $msg
  376. } {0 ~:}
  377. test cmdAH-8.42 {Tcl_FileObjCmd: dirname} {
  378.     testsetplatform mac
  379.     list [catch {file dirname ~:baz} msg] $msg
  380. } {0 ~:}
  381. test cmdAH-8.43 {Tcl_FileObjCmd: dirname} {
  382.     global env
  383.     set temp $env(HOME)
  384.     set env(HOME) "/homewontexist/test"
  385.     testsetplatform unix
  386.     set result [list [catch {file dirname ~} msg] $msg]
  387.     set env(HOME) $temp
  388.     set result
  389. } {0 /homewontexist}
  390. test cmdAH-8.44 {Tcl_FileObjCmd: dirname} {
  391.     global env
  392.     set temp $env(HOME)
  393.     set env(HOME) "~"
  394.     testsetplatform unix
  395.     set result [list [catch {file dirname ~} msg] $msg]
  396.     set env(HOME) $temp
  397.     set result
  398. } {0 ~}
  399. test cmdAH-8.45 {Tcl_FileObjCmd: dirname} {
  400.     global env
  401.     set temp $env(HOME)
  402.     set env(HOME) "/homewontexist/test"
  403.     testsetplatform windows
  404.     set result [list [catch {file dirname ~} msg] $msg]
  405.     set env(HOME) $temp
  406.     set result
  407. } {0 /homewontexist}
  408. test cmdAH-8.46 {Tcl_FileObjCmd: dirname} {
  409.     global env
  410.     set temp $env(HOME)
  411.     set env(HOME) "/home/test"
  412.     testsetplatform mac
  413.     set result [list [catch {file dirname ~} msg] $msg]
  414.     set env(HOME) $temp
  415.     set result
  416. } {0 home:}
  417. # tail
  418. test cmdAH-9.1 {Tcl_FileObjCmd: tail} {
  419.     testsetplatform unix
  420.     list [catch {file tail a b} msg] $msg
  421. } {1 {wrong # args: should be "file tail name"}}
  422. test cmdAH-9.2 {Tcl_FileObjCmd: tail} {
  423.     testsetplatform unix
  424.     file tail /a/b
  425. } b
  426. test cmdAH-9.3 {Tcl_FileObjCmd: tail} {
  427.     testsetplatform unix
  428.     file tail {}
  429. } {}
  430. test cmdAH-9.4 {Tcl_FileObjCmd: tail} {
  431.     testsetplatform mac
  432.     file tail {}
  433. } {}
  434. test cmdAH-9.5 {Tcl_FileObjCmd: tail} {
  435.     testsetplatform win
  436.     file tail {}
  437. } {}
  438. test cmdAH-9.6 {Tcl_FileObjCmd: tail} {
  439.     testsetplatform unix
  440.     file tail .def
  441. } .def
  442. test cmdAH-9.7 {Tcl_FileObjCmd: tail} {
  443.     testsetplatform mac
  444.     file tail a
  445. } a
  446. test cmdAH-9.8 {Tcl_FileObjCmd: tail} {
  447.     testsetplatform win
  448.     file tail a
  449. } a
  450. test cmdAH-9.9 {Tcl_FileObjCmd: tail} {
  451.     testsetplatform unix
  452.     file ta a/b/c.d
  453. } c.d
  454. test cmdAH-9.10 {Tcl_FileObjCmd: tail} {
  455.     testsetplatform unix
  456.     file tail a/b.c/d
  457. } d
  458. test cmdAH-9.11 {Tcl_FileObjCmd: tail} {
  459.     testsetplatform unix
  460.     file tail /.
  461. } .
  462. test cmdAH-9.12 {Tcl_FileObjCmd: tail} {
  463.     testsetplatform unix
  464.     file tail /
  465. } {}
  466. test cmdAH-9.13 {Tcl_FileObjCmd: tail} {
  467.     testsetplatform unix
  468.     file tail /foo
  469. } foo
  470. test cmdAH-9.14 {Tcl_FileObjCmd: tail} {
  471.     testsetplatform unix
  472.     file tail //foo
  473. } foo
  474. test cmdAH-9.15 {Tcl_FileObjCmd: tail} {
  475.     testsetplatform unix
  476.     file tail //foo/bar
  477. } bar
  478. test cmdAH-9.16 {Tcl_FileObjCmd: tail} {
  479.     testsetplatform unix
  480.     file tail {//foo/bar/baz}
  481. } baz
  482. test cmdAH-9.17 {Tcl_FileObjCmd: tail} {
  483.     testsetplatform unix
  484.     file tail {//foo/bar/baz/blat}
  485. } blat
  486. test cmdAH-9.18 {Tcl_FileObjCmd: tail} {
  487.     testsetplatform unix
  488.     file tail /foo//
  489. } foo
  490. test cmdAH-9.19 {Tcl_FileObjCmd: tail} {
  491.     testsetplatform unix
  492.     file tail ./a
  493. } a
  494. test cmdAH-9.20 {Tcl_FileObjCmd: tail} {
  495.     testsetplatform unix
  496.     file tail a/.a
  497. } .a
  498. test cmdAH-9.21 {Tcl_FileObjCmd: tail} {
  499.     testsetplatform windows
  500.     file tail c:foo
  501. } foo
  502. test cmdAH-9.22 {Tcl_FileObjCmd: tail} {
  503.     testsetplatform windows
  504.     file tail c:
  505. } {}
  506. test cmdAH-9.23 {Tcl_FileObjCmd: tail} {
  507.     testsetplatform windows
  508.     file tail c:/
  509. } {}
  510. test cmdAH-9.24 {Tcl_FileObjCmd: tail} {
  511.     testsetplatform windows
  512.     file tail {c:foo}
  513. } foo
  514. test cmdAH-9.25 {Tcl_FileObjCmd: tail} {
  515.     testsetplatform windows
  516.     file tail {//foo/bar/baz}
  517. } baz
  518. test cmdAH-9.26 {Tcl_FileObjCmd: tail} {
  519.     testsetplatform windows
  520.     file tail {//foo/bar}
  521. } {}
  522. test cmdAH-9.27 {Tcl_FileObjCmd: tail} {
  523.     testsetplatform mac
  524.     file tail :
  525. } :
  526. test cmdAH-9.28 {Tcl_FileObjCmd: tail} {
  527.     testsetplatform mac
  528.     file tail :Foo
  529. } Foo
  530. test cmdAH-9.29 {Tcl_FileObjCmd: tail} {
  531.     testsetplatform mac
  532.     file tail Foo:
  533. } {}
  534. test cmdAH-9.30 {Tcl_FileObjCmd: tail} {
  535.     testsetplatform mac
  536.     file tail Foo:bar
  537. } bar
  538. test cmdAH-9.31 {Tcl_FileObjCmd: tail} {
  539.     testsetplatform mac
  540.     file tail :Foo:bar
  541. } bar
  542. test cmdAH-9.32 {Tcl_FileObjCmd: tail} {
  543.     testsetplatform mac
  544.     file tail ::
  545. } ::
  546. test cmdAH-9.33 {Tcl_FileObjCmd: tail} {
  547.     testsetplatform mac
  548.     file tail :::
  549. } ::
  550. test cmdAH-9.34 {Tcl_FileObjCmd: tail} {
  551.     testsetplatform mac
  552.     file tail /foo/bar/
  553. } bar
  554. test cmdAH-9.35 {Tcl_FileObjCmd: tail} {
  555.     testsetplatform mac
  556.     file tail /foo/bar
  557. } bar
  558. test cmdAH-9.36 {Tcl_FileObjCmd: tail} {
  559.     testsetplatform mac
  560.     file tail /foo
  561. } {}
  562. test cmdAH-9.37 {Tcl_FileObjCmd: tail} {
  563.     testsetplatform mac
  564.     file tail foo
  565. } foo
  566. test cmdAH-9.38 {Tcl_FileObjCmd: tail} {
  567.     testsetplatform mac
  568.     file tail ~:foo
  569. } foo
  570. test cmdAH-9.39 {Tcl_FileObjCmd: tail} {
  571.     testsetplatform mac
  572.     file tail ~bar:foo
  573. } foo
  574. test cmdAH-9.40 {Tcl_FileObjCmd: tail} {
  575.     testsetplatform mac
  576.     file tail ~bar/foo
  577. } foo
  578. test cmdAH-9.41 {Tcl_FileObjCmd: tail} {
  579.     testsetplatform mac
  580.     file tail ~/foo
  581. } foo
  582. test cmdAH-9.42 {Tcl_FileObjCmd: tail} {
  583.     global env
  584.     set temp $env(HOME)
  585.     set env(HOME) "/home/test"
  586.     testsetplatform unix
  587.     set result [file tail ~]
  588.     set env(HOME) $temp
  589.     set result
  590. } test
  591. test cmdAH-9.43 {Tcl_FileObjCmd: tail} {
  592.     global env
  593.     set temp $env(HOME)
  594.     set env(HOME) "~"
  595.     testsetplatform unix
  596.     set result [file tail ~]
  597.     set env(HOME) $temp
  598.     set result
  599. } {}
  600. test cmdAH-9.44 {Tcl_FileObjCmd: tail} {
  601.     global env
  602.     set temp $env(HOME)
  603.     set env(HOME) "/home/test"
  604.     testsetplatform windows
  605.     set result [file tail ~]
  606.     set env(HOME) $temp
  607.     set result
  608. } test
  609. test cmdAH-9.45 {Tcl_FileObjCmd: tail} {
  610.     global env
  611.     set temp $env(HOME)
  612.     set env(HOME) "/home/test"
  613.     testsetplatform mac
  614.     set result [file tail ~]
  615.     set env(HOME) $temp
  616.     set result
  617. } test
  618. test cmdAH-9.46 {Tcl_FileObjCmd: tail} {
  619.     testsetplatform unix
  620.     file tail {f.oobar/baz.bat}
  621. } baz.bat
  622. test cmdAH-9.47 {Tcl_FileObjCmd: tail} {
  623.     testsetplatform windows
  624.     file tail c:foo
  625. } foo
  626. test cmdAH-9.48 {Tcl_FileObjCmd: tail} {
  627.     testsetplatform windows
  628.     file tail c:
  629. } {}
  630. test cmdAH-9.49 {Tcl_FileObjCmd: tail} {
  631.     testsetplatform windows
  632.     file tail c:/foo
  633. } foo
  634. test cmdAH-9.50 {Tcl_FileObjCmd: tail} {
  635.     testsetplatform windows
  636.     file tail {c:/foobar}
  637. } bar
  638. test cmdAH-9.51 {Tcl_FileObjCmd: tail} {
  639.     testsetplatform windows
  640.     file tail {foobar}
  641. } bar
  642. # rootname
  643. test cmdAH-10.1 {Tcl_FileObjCmd: rootname} {
  644.     testsetplatform unix
  645.     list [catch {file rootname a b} msg] $msg
  646. } {1 {wrong # args: should be "file rootname name"}}
  647. test cmdAH-10.2 {Tcl_FileObjCmd: rootname} {
  648.     testsetplatform unix
  649.     file rootname {}
  650. } {}
  651. test cmdAH-10.3 {Tcl_FileObjCmd: rootname} {
  652.     testsetplatform unix
  653.     file ro foo
  654. } foo
  655. test cmdAH-10.4 {Tcl_FileObjCmd: rootname} {
  656.     testsetplatform unix
  657.     file rootname foo.
  658. } foo
  659. test cmdAH-10.5 {Tcl_FileObjCmd: rootname} {
  660.     testsetplatform unix
  661.     file rootname .foo
  662. } {}
  663. test cmdAH-10.6 {Tcl_FileObjCmd: rootname} {
  664.     testsetplatform unix
  665.     file rootname abc.def
  666. } abc
  667. test cmdAH-10.7 {Tcl_FileObjCmd: rootname} {
  668.     testsetplatform unix
  669.     file rootname abc.def.ghi
  670. } abc.def
  671. test cmdAH-10.8 {Tcl_FileObjCmd: rootname} {
  672.     testsetplatform unix
  673.     file rootname a/b/c.d
  674. } a/b/c
  675. test cmdAH-10.9 {Tcl_FileObjCmd: rootname} {
  676.     testsetplatform unix
  677.     file rootname a/b.c/d
  678. } a/b.c/d
  679. test cmdAH-10.10 {Tcl_FileObjCmd: rootname} {
  680.     testsetplatform unix
  681.     file rootname a/b.c/
  682. } a/b.c/
  683. test cmdAH-10.11 {Tcl_FileObjCmd: rootname} {
  684.     testsetplatform mac
  685.     file ro foo
  686. } foo
  687. test cmdAH-10.12 {Tcl_FileObjCmd: rootname} {
  688.     testsetplatform mac
  689.     file rootname {}
  690. } {}
  691. test cmdAH-10.13 {Tcl_FileObjCmd: rootname} {
  692.     testsetplatform mac
  693.     file rootname foo.
  694. } foo
  695. test cmdAH-10.14 {Tcl_FileObjCmd: rootname} {
  696.     testsetplatform mac
  697.     file rootname .foo
  698. } {}
  699. test cmdAH-10.15 {Tcl_FileObjCmd: rootname} {
  700.     testsetplatform mac
  701.     file rootname abc.def
  702. } abc
  703. test cmdAH-10.16 {Tcl_FileObjCmd: rootname} {
  704.     testsetplatform mac
  705.     file rootname abc.def.ghi
  706. } abc.def
  707. test cmdAH-10.17 {Tcl_FileObjCmd: rootname} {
  708.     testsetplatform mac
  709.     file rootname a:b:c.d
  710. } a:b:c
  711. test cmdAH-10.18 {Tcl_FileObjCmd: rootname} {
  712.     testsetplatform mac
  713.     file rootname a:b.c:d
  714. } a:b.c:d
  715. test cmdAH-10.19 {Tcl_FileObjCmd: rootname} {
  716.     testsetplatform mac
  717.     file rootname a/b/c.d
  718. } a/b/c
  719. test cmdAH-10.20 {Tcl_FileObjCmd: rootname} {
  720.     testsetplatform mac
  721.     file rootname a/b.c/d
  722. } a/b.c/d
  723. test cmdAH-10.21 {Tcl_FileObjCmd: rootname} {
  724.     testsetplatform mac
  725.     file rootname /a.b
  726. } /a
  727. test cmdAH-10.22 {Tcl_FileObjCmd: rootname} {
  728.     testsetplatform mac
  729.     file rootname foo.c:
  730. } foo.c:
  731. test cmdAH-10.23 {Tcl_FileObjCmd: rootname} {
  732.     testsetplatform windows
  733.     file rootname {}
  734. } {}
  735. test cmdAH-10.24 {Tcl_FileObjCmd: rootname} {
  736.     testsetplatform windows
  737.     file ro foo
  738. } foo
  739. test cmdAH-10.25 {Tcl_FileObjCmd: rootname} {
  740.     testsetplatform windows
  741.     file rootname foo.
  742. } foo
  743. test cmdAH-10.26 {Tcl_FileObjCmd: rootname} {
  744.     testsetplatform windows
  745.     file rootname .foo
  746. } {}
  747. test cmdAH-10.27 {Tcl_FileObjCmd: rootname} {
  748.     testsetplatform windows
  749.     file rootname abc.def
  750. } abc
  751. test cmdAH-10.28 {Tcl_FileObjCmd: rootname} {
  752.     testsetplatform windows
  753.     file rootname abc.def.ghi
  754. } abc.def
  755. test cmdAH-10.29 {Tcl_FileObjCmd: rootname} {
  756.     testsetplatform windows
  757.     file rootname a/b/c.d
  758. } a/b/c
  759. test cmdAH-10.30 {Tcl_FileObjCmd: rootname} {
  760.     testsetplatform windows
  761.     file rootname a/b.c/d
  762. } a/b.c/d
  763. test cmdAH-10.31 {Tcl_FileObjCmd: rootname} {
  764.     testsetplatform windows
  765.     file rootname a\b.c\
  766. } a\b.c\
  767. test cmdAH-10.32 {Tcl_FileObjCmd: rootname} {
  768.     testsetplatform windows
  769.     file rootname a\b\c.d
  770. } a\b\c
  771. test cmdAH-10.33 {Tcl_FileObjCmd: rootname} {
  772.     testsetplatform windows
  773.     file rootname a\b.c\d
  774. } a\b.c\d
  775. test cmdAH-10.34 {Tcl_FileObjCmd: rootname} {
  776.     testsetplatform windows
  777.     file rootname a\b.c\
  778. } a\b.c\
  779. set num 35
  780. foreach outer { {} a .a a. a.a } {
  781.   foreach inner { {} a .a a. a.a } {
  782.     set thing [format %s/%s $outer $inner]
  783. ;   test cmdAH-6.$num {Tcl_FileObjCmd: rootname and extension options} {
  784. testsetplatform unix
  785. format %s%s [file rootname $thing] [file ext $thing]
  786.     } $thing
  787.     set num [expr $num+1]
  788.   }
  789. }
  790. # extension
  791. test cmdAH-11.1 {Tcl_FileObjCmd: extension} {
  792.     testsetplatform unix
  793.     list [catch {file extension a b} msg] $msg
  794. } {1 {wrong # args: should be "file extension name"}}
  795. test cmdAH-11.2 {Tcl_FileObjCmd: extension} {
  796.     testsetplatform unix
  797.     file extension {}
  798. } {}
  799. test cmdAH-11.3 {Tcl_FileObjCmd: extension} {
  800.     testsetplatform unix
  801.     file ext foo
  802. } {}
  803. test cmdAH-11.4 {Tcl_FileObjCmd: extension} {
  804.     testsetplatform unix
  805.     file extension foo.
  806. } .
  807. test cmdAH-11.5 {Tcl_FileObjCmd: extension} {
  808.     testsetplatform unix
  809.     file extension .foo
  810. } .foo
  811. test cmdAH-11.6 {Tcl_FileObjCmd: extension} {
  812.     testsetplatform unix
  813.     file extension abc.def
  814. } .def
  815. test cmdAH-11.7 {Tcl_FileObjCmd: extension} {
  816.     testsetplatform unix
  817.     file extension abc.def.ghi
  818. } .ghi
  819. test cmdAH-11.8 {Tcl_FileObjCmd: extension} {
  820.     testsetplatform unix
  821.     file extension a/b/c.d
  822. } .d
  823. test cmdAH-11.9 {Tcl_FileObjCmd: extension} {
  824.     testsetplatform unix
  825.     file extension a/b.c/d
  826. } {}
  827. test cmdAH-11.10 {Tcl_FileObjCmd: extension} {
  828.     testsetplatform unix
  829.     file extension a/b.c/
  830. } {}
  831. test cmdAH-11.11 {Tcl_FileObjCmd: extension} {
  832.     testsetplatform mac
  833.     file ext foo
  834. } {}
  835. test cmdAH-11.12 {Tcl_FileObjCmd: extension} {
  836.     testsetplatform mac
  837.     file extension {}
  838. } {}
  839. test cmdAH-11.13 {Tcl_FileObjCmd: extension} {
  840.     testsetplatform mac
  841.     file extension foo.
  842. } .
  843. test cmdAH-11.14 {Tcl_FileObjCmd: extension} {
  844.     testsetplatform mac
  845.     file extension .foo
  846. } .foo
  847. test cmdAH-11.15 {Tcl_FileObjCmd: extension} {
  848.     testsetplatform mac
  849.     file extension abc.def
  850. } .def
  851. test cmdAH-11.16 {Tcl_FileObjCmd: extension} {
  852.     testsetplatform mac
  853.     file extension abc.def.ghi
  854. } .ghi
  855. test cmdAH-11.17 {Tcl_FileObjCmd: extension} {
  856.     testsetplatform mac
  857.     file extension a:b:c.d
  858. } .d
  859. test cmdAH-11.18 {Tcl_FileObjCmd: extension} {
  860.     testsetplatform mac
  861.     file extension a:b.c:d
  862. } {}
  863. test cmdAH-11.19 {Tcl_FileObjCmd: extension} {
  864.     testsetplatform mac
  865.     file extension a/b/c.d
  866. } .d
  867. test cmdAH-11.20 {Tcl_FileObjCmd: extension} {
  868.     testsetplatform mac
  869.     file extension a/b.c/d
  870. } {}
  871. test cmdAH-11.21 {Tcl_FileObjCmd: extension} {
  872.     testsetplatform mac
  873.     file extension /a.b
  874. } .b
  875. test cmdAH-11.22 {Tcl_FileObjCmd: extension} {
  876.     testsetplatform mac
  877.     file extension foo.c:
  878. } {}
  879. test cmdAH-11.23 {Tcl_FileObjCmd: extension} {
  880.     testsetplatform windows
  881.     file extension {}
  882. } {}
  883. test cmdAH-11.24 {Tcl_FileObjCmd: extension} {
  884.     testsetplatform windows
  885.     file ext foo
  886. } {}
  887. test cmdAH-11.25 {Tcl_FileObjCmd: extension} {
  888.     testsetplatform windows
  889.     file extension foo.
  890. } .
  891. test cmdAH-11.26 {Tcl_FileObjCmd: extension} {
  892.     testsetplatform windows
  893.     file extension .foo
  894. } .foo
  895. test cmdAH-11.27 {Tcl_FileObjCmd: extension} {
  896.     testsetplatform windows
  897.     file extension abc.def
  898. } .def
  899. test cmdAH-11.28 {Tcl_FileObjCmd: extension} {
  900.     testsetplatform windows
  901.     file extension abc.def.ghi
  902. } .ghi
  903. test cmdAH-11.29 {Tcl_FileObjCmd: extension} {
  904.     testsetplatform windows
  905.     file extension a/b/c.d
  906. } .d
  907. test cmdAH-11.30 {Tcl_FileObjCmd: extension} {
  908.     testsetplatform windows
  909.     file extension a/b.c/d
  910. } {}
  911. test cmdAH-11.31 {Tcl_FileObjCmd: extension} {
  912.     testsetplatform windows
  913.     file extension a\b.c\
  914. } {}
  915. test cmdAH-11.32 {Tcl_FileObjCmd: extension} {
  916.     testsetplatform windows
  917.     file extension a\b\c.d
  918. } .d
  919. test cmdAH-11.33 {Tcl_FileObjCmd: extension} {
  920.     testsetplatform windows
  921.     file extension a\b.c\d
  922. } {}
  923. test cmdAH-11.34 {Tcl_FileObjCmd: extension} {
  924.     testsetplatform windows
  925.     file extension a\b.c\
  926. } {}
  927. set num 35
  928. foreach value {a..b a...b a.c..b ..b} result {.b .b .b .b} {
  929.     foreach p {unix mac windows} {
  930. ; test cmdAH-7.$num {Tcl_FileObjCmd: extension} "
  931.     testsetplatform $p
  932.     file extension $value
  933. " $result
  934. incr num
  935.     }
  936. }
  937. # pathtype
  938. test cmdAH-12.1 {Tcl_FileObjCmd: pathtype} {
  939.     testsetplatform unix
  940.     list [catch {file pathtype a b} msg] $msg
  941. } {1 {wrong # args: should be "file pathtype name"}}
  942. test cmdAH-12.2 {Tcl_FileObjCmd: pathtype} {
  943.     testsetplatform unix
  944.     file pathtype /a
  945. } absolute
  946. test cmdAH-12.3 {Tcl_FileObjCmd: pathtype} {
  947.     testsetplatform unix
  948.     file p a
  949. } relative
  950. test cmdAH-12.4 {Tcl_FileObjCmd: pathtype} {
  951.     testsetplatform windows
  952.     file pathtype c:a
  953. } volumerelative
  954. # split
  955. test cmdAH-13.1 {Tcl_FileObjCmd: split} {
  956.     testsetplatform unix
  957.     list [catch {file split a b} msg] $msg
  958. } {1 {wrong # args: should be "file split name"}}
  959. test cmdAH-13.2 {Tcl_FileObjCmd: split} {
  960.     testsetplatform unix
  961.     file split a
  962. } a
  963. test cmdAH-13.3 {Tcl_FileObjCmd: split} {
  964.     testsetplatform unix
  965.     file split a/b
  966. } {a b}
  967. # join
  968. test cmdAH-14.1 {Tcl_FileObjCmd: join} {
  969.     testsetplatform unix
  970.     file join a
  971. } a
  972. test cmdAH-14.2 {Tcl_FileObjCmd: join} {
  973.     testsetplatform unix
  974.     file join a b
  975. } a/b
  976. test cmdAH-14.3 {Tcl_FileObjCmd: join} {
  977.     testsetplatform unix
  978.     file join a b c d
  979. } a/b/c/d
  980. # error handling of Tcl_TranslateFileName
  981. test cmdAH-15.1 {Tcl_FileObjCmd} {
  982.     testsetplatform unix
  983.     list [catch {file atime ~_bad_user} msg] $msg
  984. } {1 {user "_bad_user" doesn't exist}}
  985. testsetplatform $platform
  986. }
  987. # readable
  988. set gorpfile [makeFile abcde gorp.file]
  989. set dirfile [makeDirectory dir.file]
  990. if {[info commands testchmod] == {}} {
  991.     puts "This application hasn't been compiled with the "testchmod""
  992.     puts "command, so I can't test Tcl_FileObjCmd etc."
  993. } else {
  994. test cmdAH-16.1 {Tcl_FileObjCmd: readable} {testchmod} {
  995.     list [catch {file readable a b} msg] $msg
  996. } {1 {wrong # args: should be "file readable name"}}
  997. testchmod 0444 $gorpfile
  998. test cmdAH-16.2 {Tcl_FileObjCmd: readable} {testchmod} {
  999.     file readable $gorpfile
  1000. } 1
  1001. testchmod 0333 $gorpfile
  1002. test cmdAH-16.3 {Tcl_FileObjCmd: readable} {unixOnly notRoot testchmod} {
  1003.     file reada $gorpfile
  1004. } 0
  1005. # writable
  1006. test cmdAH-17.1 {Tcl_FileObjCmd: writable} {testchmod} {
  1007.     list [catch {file writable a b} msg] $msg
  1008. } {1 {wrong # args: should be "file writable name"}}
  1009. testchmod 0555 $gorpfile
  1010. test cmdAH-17.2 {Tcl_FileObjCmd: writable} {notRoot testchmod} {
  1011.     file writable $gorpfile
  1012. } 0
  1013. testchmod 0222 $gorpfile
  1014. test cmdAH-17.3 {Tcl_FileObjCmd: writable} {testchmod} {
  1015.     file writable $gorpfile
  1016. } 1
  1017. }
  1018. # executable
  1019. removeFile $gorpfile
  1020. removeDirectory $dirfile
  1021. set dirfile [makeDirectory dir.file]
  1022. set gorpfile [makeFile abcde gorp.file]
  1023. test cmdAH-18.1 {Tcl_FileObjCmd: executable} {testchmod} {
  1024.     list [catch {file executable a b} msg] $msg
  1025. } {1 {wrong # args: should be "file executable name"}}
  1026. test cmdAH-18.2 {Tcl_FileObjCmd: executable} {testchmod notRoot} {
  1027.     file executable $gorpfile
  1028. } 0
  1029. test cmdAH-18.3 {Tcl_FileObjCmd: executable} {unixOnly testchmod} {
  1030.     # Only on unix will setting the execute bit on a regular file
  1031.     # cause that file to be executable.
  1032.     testchmod 0775 $gorpfile
  1033.     file exe $gorpfile
  1034. } 1
  1035. test cmdAH-18.4 {Tcl_FileObjCmd: executable} {macOnly testchmod} {
  1036.     # On mac, the only executable files are of type APPL.
  1037.     set x [file exe $gorpfile]
  1038.     file attrib $gorpfile -type APPL
  1039.     lappend x [file exe $gorpfile]
  1040. } {0 1}
  1041. test cmdAH-18.5 {Tcl_FileObjCmd: executable} {winOnly testchmod} {
  1042.     # On pc, must be a .exe, .com, etc.
  1043.     set x [file exe $gorpfile]
  1044.     set gorpexe [makeFile foo gorp.exe]
  1045.     lappend x [file exe $gorpexe]
  1046.     removeFile $gorpexe
  1047.     set x
  1048. } {0 1}
  1049. test cmdAH-18.6 {Tcl_FileObjCmd: executable} {testchmod} {
  1050.     # Directories are always executable.
  1051.     file exe $dirfile
  1052. } 1
  1053. removeDirectory $dirfile
  1054. removeFile $gorpfile
  1055. set linkfile [file join [temporaryDirectory] link.file]
  1056. file delete $linkfile
  1057. # exists
  1058. test cmdAH-19.1 {Tcl_FileObjCmd: exists} {
  1059.     list [catch {file exists a b} msg] $msg
  1060. } {1 {wrong # args: should be "file exists name"}}
  1061. test cmdAH-19.2 {Tcl_FileObjCmd: exists} {file exists $gorpfile} 0
  1062. test cmdAH-19.3 {Tcl_FileObjCmd: exists} {
  1063.     file exists [file join [temporaryDirectory] dir.file gorp.file]
  1064. } 0
  1065. catch {
  1066.     set gorpfile [makeFile abcde gorp.file]
  1067.     set dirfile [makeDirectory dir.file]
  1068.     set subgorp [makeFile 12345 [file join $dirfile gorp.file]]
  1069. }
  1070. test cmdAH-19.4 {Tcl_FileObjCmd: exists} {
  1071.     file exists $gorpfile
  1072. } 1
  1073. test cmdAH-19.5 {Tcl_FileObjCmd: exists} {
  1074.     file exists $subgorp
  1075. } 1
  1076. # nativename
  1077. if {[info commands testsetplatform] == {}} {
  1078.     puts "This application hasn't been compiled with the "testsetplatform""
  1079.     puts "command, so I can't test Tcl_FileObjCmd etc."
  1080. } else {
  1081. test cmdAH-19.6 {Tcl_FileObjCmd: nativename} {
  1082.     testsetplatform unix
  1083.     list [catch {file nativename a/b} msg] $msg [testsetplatform $platform]
  1084. } {0 a/b {}}
  1085. test cmdAH-19.7 {Tcl_FileObjCmd: nativename} {
  1086.     testsetplatform windows
  1087.     list [catch {file nativename a/b} msg] $msg [testsetplatform $platform]
  1088. } {0 {ab} {}}
  1089. test cmdAH-19.8 {Tcl_FileObjCmd: nativename} {
  1090.     testsetplatform mac
  1091.     list [catch {file nativename a/b} msg] $msg [testsetplatform $platform]
  1092. } {0 :a:b {}}
  1093. }
  1094. test cmdAH-19.9 {Tcl_FileObjCmd: ~ : exists} {
  1095.     file exists ~nOsUcHuSeR
  1096. } 0
  1097. test cmdAH-19.10 {Tcl_FileObjCmd: ~ : nativename} {
  1098.     # should probably be 0 in fact...
  1099.     catch {file nativename ~nOsUcHuSeR}
  1100. } 1
  1101. # The test below has to be done in /tmp rather than the current
  1102. # directory in order to guarantee (?) a local file system:  some
  1103. # NFS file systems won't do the stuff below correctly.
  1104. test cmdAH-19.11 {Tcl_FileObjCmd: exists} {unixOnly notRoot} {
  1105.     file delete -force /tmp/tcl.foo.dir/file
  1106.     file delete -force /tmp/tcl.foo.dir
  1107.     makeDirectory /tmp/tcl.foo.dir
  1108.     makeFile 12345 /tmp/tcl.foo.dir/file
  1109.     file attributes /tmp/tcl.foo.dir -permissions 0000
  1110.     set result [file exists /tmp/tcl.foo.dir/file]
  1111.     file attributes /tmp/tcl.foo.dir -permissions 0775
  1112.     removeFile /tmp/tcl.foo.dir/file
  1113.     removeDirectory /tmp/tcl.foo.dir
  1114.     set result
  1115. } 0
  1116. # Stat related commands
  1117. catch {testsetplatform $platform}
  1118. removeFile $gorpfile
  1119. set gorpfile [makeFile "Test string" gorp.file]
  1120. catch {file attributes $gorpfile -permissions 0765}
  1121. # atime
  1122. set file [makeFile "data" touch.me]
  1123. test cmdAH-20.1 {Tcl_FileObjCmd: atime} {
  1124.     list [catch {file atime a b c} msg] $msg
  1125. } {1 {wrong # args: should be "file atime name ?time?"}}
  1126. test cmdAH-20.2 {Tcl_FileObjCmd: atime} {
  1127.     catch {unset stat}
  1128.     file stat $gorpfile stat
  1129.     list [expr {[file mtime $gorpfile] == $stat(mtime)}] 
  1130.     [expr {[file atime $gorpfile] == $stat(atime)}]
  1131. } {1 1}
  1132. test cmdAH-20.3 {Tcl_FileObjCmd: atime} {
  1133.     string tolower [list [catch {file atime _bogus_} msg] 
  1134.     $msg $errorCode]
  1135. } {1 {could not read "_bogus_": no such file or directory} {posix enoent {no such file or directory}}}
  1136. test cmdAH-20.4 {Tcl_FileObjCmd: atime} {
  1137.     list [catch {file atime $file notint} msg] $msg
  1138. } {1 {expected integer but got "notint"}}
  1139. test cmdAH-20.5 {Tcl_FileObjCmd: atime touch} {unixOrPc} {
  1140.     if {[string equal $tcl_platform(platform) "windows"]} {
  1141. set old [pwd]
  1142. cd $::tcltest::temporaryDirectory
  1143. if {![string equal "NTFS" [testvolumetype]]} {
  1144.     # Windows FAT doesn't understand atime, but NTFS does
  1145.     # May also fail for Windows on NFS mounted disks
  1146.     cd $old
  1147.     return 1
  1148. }
  1149. cd $old
  1150.     }
  1151.     set atime [file atime $file]
  1152.     after 1100; # pause a sec to notice change in atime
  1153.     set newatime [clock seconds]
  1154.     set modatime [file atime $file $newatime]
  1155.     expr {$newatime == $modatime ? 1 : "$newatime != $modatime"}
  1156. } 1
  1157. removeFile touch.me
  1158. # isdirectory
  1159. test cmdAH-21.1 {Tcl_FileObjCmd: isdirectory} {
  1160.     list [catch {file isdirectory a b} msg] $msg
  1161. } {1 {wrong # args: should be "file isdirectory name"}}
  1162. test cmdAH-21.2 {Tcl_FileObjCmd: isdirectory} {
  1163.     file isdirectory $gorpfile
  1164. } 0
  1165. test cmdAH-21.3 {Tcl_FileObjCmd: isdirectory} {
  1166.     file isd $dirfile
  1167. } 1
  1168. # isfile
  1169. test cmdAH-22.1 {Tcl_FileObjCmd: isfile} {
  1170.     list [catch {file isfile a b} msg] $msg
  1171. } {1 {wrong # args: should be "file isfile name"}}
  1172. test cmdAH-22.2 {Tcl_FileObjCmd: isfile} {file isfile $gorpfile} 1
  1173. test cmdAH-22.3 {Tcl_FileObjCmd: isfile} {file isfile $dirfile} 0
  1174. # lstat and readlink:  don't run these tests everywhere, since not all
  1175. # sites will have symbolic links
  1176. catch {file link -symbolic $linkfile $gorpfile}
  1177. test cmdAH-23.1 {Tcl_FileObjCmd: lstat} {
  1178.     list [catch {file lstat a} msg] $msg
  1179. } {1 {wrong # args: should be "file lstat name varName"}}
  1180. test cmdAH-23.2 {Tcl_FileObjCmd: lstat} {
  1181.     list [catch {file lstat a b c} msg] $msg
  1182. } {1 {wrong # args: should be "file lstat name varName"}}
  1183. test cmdAH-23.3 {Tcl_FileObjCmd: lstat} {unixOnly nonPortable} {
  1184.     catch {unset stat}
  1185.     file lstat $linkfile stat
  1186.     lsort [array names stat]
  1187. } {atime ctime dev gid ino mode mtime nlink size type uid}
  1188. test cmdAH-23.4 {Tcl_FileObjCmd: lstat} {unixOnly nonPortable} {
  1189.     catch {unset stat}
  1190.     file lstat $linkfile stat
  1191.     list $stat(nlink) [expr $stat(mode)&0777] $stat(type)
  1192. } {1 511 link}
  1193. test cmdAH-23.5 {Tcl_FileObjCmd: lstat errors} {nonPortable} {
  1194.     string tolower [list [catch {file lstat _bogus_ stat} msg] 
  1195.     $msg $errorCode]
  1196. } {1 {could not read "_bogus_": no such file or directory} {posix enoent {no such file or directory}}}
  1197. test cmdAH-23.6 {Tcl_FileObjCmd: lstat errors} {
  1198.     catch {unset x}
  1199.     set x 44
  1200.     list [catch {file lstat $gorpfile x} msg] $msg $errorCode
  1201. } {1 {can't set "x(dev)": variable isn't array} NONE}
  1202. catch {unset stat}
  1203. # mkdir
  1204. set dirA [file join [temporaryDirectory] a]
  1205. set dirB [file join [temporaryDirectory] a]
  1206. test cmdAH-23.7 {Tcl_FileObjCmd: mkdir} {
  1207.     catch {file delete -force $dirA}
  1208.     file mkdir $dirA
  1209.     set res [file isdirectory $dirA]
  1210.     file delete $dirA
  1211.     set res
  1212. } {1}
  1213. test cmdAH-23.8 {Tcl_FileObjCmd: mkdir} {
  1214.     catch {file delete -force $dirA}
  1215.     file mkdir $dirA/b
  1216.     set res [file isdirectory $dirA/b]
  1217.     file delete -force $dirA
  1218.     set res
  1219. } {1}
  1220. test cmdAH-23.9 {Tcl_FileObjCmd: mkdir} {
  1221.     catch {file delete -force $dirA}
  1222.     file mkdir $dirA/b/c
  1223.     set res [file isdirectory $dirA/b/c]
  1224.     file delete -force $dirA
  1225.     set res
  1226. } {1}
  1227. test cmdAH-23.10 {Tcl_FileObjCmd: mkdir} {
  1228.     catch {file delete -force $dirA}
  1229.     catch {file delete -force $dirB}
  1230.     file mkdir $dirA/b $dirB/a/c
  1231.     set res [list [file isdirectory $dirA/b] [file isdirectory $dirB/a/c]]
  1232.     file delete -force $dirA
  1233.     file delete -force $dirB
  1234.     set res
  1235. } {1 1}
  1236. # mtime
  1237. proc waitForEvenSecondForFAT {} {
  1238.     # Windows 9x uses filesystems (the FAT* family of FSes) without
  1239.     # enough data in its timestamps for even per-second-accurate
  1240.     # timings.  :^(
  1241.     # This procedure based on work by Helmut Giese
  1242.     global tcl_platform
  1243.     if {$tcl_platform(platform) ne "windows"} {return}
  1244.     if {[lindex [file system [temporaryDirectory]] 1] == "NTFS"} {return}
  1245.     # Assume non-NTFS means FAT{12,16,32} and hence in need of special help
  1246.     set start [clock seconds]
  1247.     while {1} {
  1248. set now [clock seconds]
  1249. if {$now!=$start && !($now & 1)} {
  1250.     return
  1251. }
  1252. after 50
  1253.     }
  1254. }
  1255. set file [makeFile "data" touch.me]
  1256. test cmdAH-24.1 {Tcl_FileObjCmd: mtime} {
  1257.     list [catch {file mtime a b c} msg] $msg
  1258. } {1 {wrong # args: should be "file mtime name ?time?"}}
  1259. # Check (allowing for clock-skew and OS interrupts as best we can)
  1260. # that the change in mtime on a file being written is the time elapsed
  1261. # between writes.  Note that this can still fail on very busy systems
  1262. # if there are long preemptions between the writes and the reading of
  1263. # the clock, but there's not much you can do about that other than the
  1264. # completely horrible "keep on trying to write until you managed to do
  1265. # it all in less than a second."  - DKF
  1266. test cmdAH-24.2 {Tcl_FileObjCmd: mtime} {
  1267.     waitForEvenSecondForFAT
  1268.     set f [open $gorpfile w]
  1269.     puts $f "More text"
  1270.     close $f
  1271.     set clockOld [clock seconds]
  1272.     set fileOld [file mtime $gorpfile]
  1273.     after 2000
  1274.     set f [open $gorpfile w]
  1275.     puts $f "More text"
  1276.     close $f
  1277.     set clockNew [clock seconds]
  1278.     set fileNew [file mtime $gorpfile]
  1279.     expr {
  1280. (($fileNew > $fileOld) && ($clockNew > $clockOld) &&
  1281. (abs(($fileNew-$fileOld) - ($clockNew-$clockOld)) <= 1)) ? "1" :
  1282. "file:($fileOld=>$fileNew) clock:($clockOld=>$clockNew)"
  1283.     }
  1284. } {1}
  1285. test cmdAH-24.3 {Tcl_FileObjCmd: mtime} {
  1286.     catch {unset stat}
  1287.     file stat $gorpfile stat
  1288.     list [expr {[file mtime $gorpfile] == $stat(mtime)}] 
  1289.     [expr {[file atime $gorpfile] == $stat(atime)}]
  1290. } {1 1}
  1291. test cmdAH-24.4 {Tcl_FileObjCmd: mtime} {
  1292.     string tolower [list [catch {file mtime _bogus_} msg] $msg 
  1293.     $errorCode]
  1294. } {1 {could not read "_bogus_": no such file or directory} {posix enoent {no such file or directory}}}
  1295. test cmdAH-24.5 {Tcl_FileObjCmd: mtime} {
  1296.     # Under Unix, use a file in /tmp to avoid clock skew due to NFS.
  1297.     # On other platforms, just use a file in the local directory.
  1298.     if {[string equal $tcl_platform(platform) "unix"]} {
  1299. set name /tmp/tcl.test.[pid]
  1300.     } else {
  1301. set name [file join [temporaryDirectory] tf]
  1302.     }
  1303.     # Make sure that a new file's time is correct.  10 seconds variance
  1304.     # is allowed used due to slow networks or clock skew on a network drive.
  1305.     file delete -force $name
  1306.     close [open $name w]
  1307.     set a [expr abs([clock seconds]-[file mtime $name])<10]
  1308.     file delete $name
  1309.     set a
  1310. } {1}
  1311. test cmdAH-24.7 {Tcl_FileObjCmd: mtime} {
  1312.     list [catch {file mtime $file notint} msg] $msg
  1313. } {1 {expected integer but got "notint"}}
  1314. test cmdAH-24.8 {Tcl_FileObjCmd: mtime touch} macOrUnix {
  1315.     set mtime [file mtime $file]
  1316.     after 1100; # pause a sec to notice change in mtime
  1317.     set newmtime [clock seconds]
  1318.     set modmtime [file mtime $file $newmtime]
  1319.     expr {$newmtime == $modmtime ? 1 : "$newmtime != $modmtime"}
  1320. } 1
  1321. test cmdAH-24.9 {Tcl_FileObjCmd: mtime touch with non-ascii chars} macOrUnix {
  1322.     set oldfile $file
  1323.     # introduce some non-ascii characters.
  1324.     append file u2022
  1325.     file delete -force $file
  1326.     file rename $oldfile $file
  1327.     set mtime [file mtime $file]
  1328.     after 1100; # pause a sec to notice change in mtime
  1329.     set newmtime [clock seconds]
  1330.     set err [catch {file mtime $file $newmtime} modmtime]
  1331.     file rename $file $oldfile
  1332.     if {$err} {
  1333. error $modmtime
  1334.     }
  1335.     expr {$newmtime == $modmtime ? 1 : "$newmtime != $modmtime"}
  1336. } 1
  1337. test cmdAH-24.10 {Tcl_FileObjCmd: mtime touch} winOnly {
  1338.     waitForEvenSecondForFAT
  1339.     set mtime [file mtime $file]
  1340.     after 2100; # pause two secs to notice change in mtime on FAT fs'es
  1341.     set newmtime [clock seconds]
  1342.     set modmtime [file mtime $file $newmtime]
  1343.     expr {$newmtime == $modmtime ? 1 : "$newmtime != $modmtime"}
  1344. } 1
  1345. test cmdAH-24.11 {Tcl_FileObjCmd: mtime touch with non-ascii chars} winOnly {
  1346.     waitForEvenSecondForFAT
  1347.     set oldfile $file
  1348.     # introduce some non-ascii characters.
  1349.     append file u2022
  1350.     file delete -force $file
  1351.     file rename $oldfile $file
  1352.     set mtime [file mtime $file]
  1353.     after 2100; # pause two secs to notice change in mtime on FAT fs'es
  1354.     set newmtime [clock seconds]
  1355.     set err [catch {file mtime $file $newmtime} modmtime]
  1356.     file rename $file $oldfile
  1357.     if {$err} {
  1358. error $modmtime
  1359.     }
  1360.     expr {$newmtime == $modmtime ? 1 : "$newmtime != $modmtime"}
  1361. } 1
  1362. removeFile touch.me
  1363. rename waitForEvenSecondForFAT {}
  1364. test cmdAH-24.12 {Tcl_FileObjCmd: mtime and daylight savings} {
  1365.     set name [file join [temporaryDirectory] clockchange]
  1366.     file delete -force $name
  1367.     close [open $name w]
  1368.     set time [clock scan "21:00:00 October 30 2004 GMT"]
  1369.     file mtime $name $time
  1370.     set newmtime [file mtime $name]
  1371.     file delete $name
  1372.     expr {$newmtime == $time ? 1 : "$newmtime != $time"}
  1373. } {1}
  1374. # bug 1420432: setting mtime fails for directories on windows.
  1375. test cmdAH-24.13 {Tcl_FileObjCmd: directory mtime} {
  1376.     set dirname [file join [temporaryDirectory] tmp[pid]]
  1377.     file delete -force $dirname
  1378.     file mkdir $dirname
  1379.     set res [catch {
  1380.         set old [file mtime $dirname]
  1381.         file mtime $dirname 0
  1382.         set new [file mtime $dirname]
  1383.         list $new [expr {$old != $new}]
  1384.     } err]
  1385.     file delete -force $dirname
  1386.     list $res $err
  1387. } {0 {0 1}}
  1388. # owned
  1389. test cmdAH-25.1 {Tcl_FileObjCmd: owned} {
  1390.     list [catch {file owned a b} msg] $msg
  1391. } {1 {wrong # args: should be "file owned name"}}
  1392. test cmdAH-25.2 {Tcl_FileObjCmd: owned} {
  1393.     file owned $gorpfile
  1394. } 1
  1395. test cmdAH-25.3 {Tcl_FileObjCmd: owned} {unixOnly notRoot} {
  1396.     file owned /
  1397. } 0
  1398. # readlink
  1399. test cmdAH-26.1 {Tcl_FileObjCmd: readlink} {
  1400.     list [catch {file readlink a b} msg] $msg
  1401. } {1 {wrong # args: should be "file readlink name"}}
  1402. test cmdAH-26.2 {Tcl_FileObjCmd: readlink} {unixOnly nonPortable} {
  1403.     file readlink $linkfile
  1404. } $gorpfile
  1405. test cmdAH-26.3 {Tcl_FileObjCmd: readlink errors} {unixOnly nonPortable} {
  1406.     list [catch {file readlink _bogus_} msg] [string tolower $msg] 
  1407.     [string tolower $errorCode]
  1408. } {1 {could not readlink "_bogus_": no such file or directory} {posix enoent {no such file or directory}}}
  1409. test cmdAH-26.4 {Tcl_FileObjCmd: readlink errors} {macOnly nonPortable} {
  1410.     list [catch {file readlink _bogus_} msg] [string tolower $msg] 
  1411.     [string tolower $errorCode]
  1412. } {1 {could not readlink "_bogus_": no such file or directory} {posix enoent {no such file or directory}}}
  1413. test cmdAH-26.5 {Tcl_FileObjCmd: readlink errors} {winOnly nonPortable} {
  1414.     list [catch {file readlink _bogus_} msg] [string tolower $msg] 
  1415.     [string tolower $errorCode]
  1416. } {1 {could not readlink "_bogus_": invalid argument} {posix einval {invalid argument}}}
  1417. # size
  1418. test cmdAH-27.1 {Tcl_FileObjCmd: size} {
  1419.     list [catch {file size a b} msg] $msg
  1420. } {1 {wrong # args: should be "file size name"}}
  1421. test cmdAH-27.2 {Tcl_FileObjCmd: size} {
  1422.     set oldsize [file size $gorpfile]
  1423.     set f [open $gorpfile a]
  1424.     fconfigure $f -translation lf -eofchar {}
  1425.     puts $f "More text"
  1426.     close $f
  1427.     expr {[file size $gorpfile] - $oldsize}
  1428. } {10}
  1429. test cmdAH-27.3 {Tcl_FileObjCmd: size} {
  1430.     string tolower [list [catch {file size _bogus_} msg] $msg 
  1431.     $errorCode]
  1432. } {1 {could not read "_bogus_": no such file or directory} {posix enoent {no such file or directory}}}
  1433. # stat
  1434. catch {testsetplatform $platform}
  1435. removeFile $gorpfile
  1436. set gorpfile [makeFile "Test string" gorp.file]
  1437. catch {file attributes $gorpfile -permissions 0765}
  1438. test cmdAH-28.1 {Tcl_FileObjCmd: stat} {
  1439.     list [catch {file stat _bogus_} msg] $msg $errorCode
  1440. } {1 {wrong # args: should be "file stat name varName"} NONE}
  1441. test cmdAH-28.2 {Tcl_FileObjCmd: stat} {
  1442.     list [catch {file stat _bogus_ a b} msg] $msg $errorCode
  1443. } {1 {wrong # args: should be "file stat name varName"} NONE}
  1444. test cmdAH-28.3 {Tcl_FileObjCmd: stat} {
  1445.     catch {unset stat}
  1446.     file stat $gorpfile stat
  1447.     lsort [array names stat]
  1448. } {atime ctime dev gid ino mode mtime nlink size type uid}
  1449. test cmdAH-28.4 {Tcl_FileObjCmd: stat} {
  1450.     catch {unset stat}
  1451.     file stat $gorpfile stat
  1452.     list $stat(nlink) $stat(size) $stat(type)
  1453. } {1 12 file}
  1454. test cmdAH-28.5 {Tcl_FileObjCmd: stat} {unixOnly} {
  1455.     catch {unset stat}
  1456.     file stat $gorpfile stat
  1457.     expr $stat(mode)&0777
  1458. } {501}
  1459. test cmdAH-28.6 {Tcl_FileObjCmd: stat} {
  1460.     string tolower [list [catch {file stat _bogus_ stat} msg] 
  1461.     $msg $errorCode]
  1462. } {1 {could not read "_bogus_": no such file or directory} {posix enoent {no such file or directory}}}
  1463. test cmdAH-28.7 {Tcl_FileObjCmd: stat} {
  1464.     catch {unset x}
  1465.     set x 44
  1466.     list [catch {file stat $gorpfile x} msg] $msg $errorCode
  1467. } {1 {can't set "x(dev)": variable isn't array} NONE}
  1468. test cmdAH-28.8 {Tcl_FileObjCmd: stat} {
  1469.     # Sign extension of purported unsigned short to int.
  1470.     set filename [makeFile "" foo.text]
  1471.     file stat $filename stat
  1472.     set x [expr {$stat(mode) > 0}]
  1473.     removeFile $filename
  1474.     set x
  1475. } 1
  1476. test cmdAH-28.9 {Tcl_FileObjCmd: stat} winOnly {
  1477.     # stat of root directory was failing.
  1478.     # don't care about answer, just that test runs.
  1479.     # relative paths that resolve to root
  1480.     set old [pwd]
  1481.     cd c:/
  1482.     file stat c: stat
  1483.     file stat c:. stat
  1484.     file stat . stat
  1485.     cd $old
  1486.     file stat / stat
  1487.     file stat c:/ stat
  1488.     file stat c:/. stat
  1489. } {}
  1490. test cmdAH-28.10 {Tcl_FileObjCmd: stat} {winOnly nonPortable} {
  1491.     # stat of root directory was failing.
  1492.     # don't care about answer, just that test runs.
  1493.     file stat //pop/$env(USERNAME) stat
  1494.     file stat //pop/$env(USERNAME)/ stat
  1495.     file stat //pop/$env(USERNAME)/. stat
  1496. } {}
  1497. test cmdAH-28.11 {Tcl_FileObjCmd: stat} {winOnly nonPortable} {
  1498.     # stat of network directory was returning id of current local drive.
  1499.     set old [pwd]
  1500.     cd c:/
  1501.     file stat //pop/$env(USERNAME) stat
  1502.     cd $old
  1503.     expr {$stat(dev) == 2}
  1504. } 0
  1505. test cmdAH-28.12 {Tcl_FileObjCmd: stat} {
  1506.     # stat(mode) with S_IFREG flag was returned as a negative number
  1507.     # if mode_t was a short instead of an unsigned short.
  1508.     set filename [makeFile "" foo.test]
  1509.     file stat $filename stat
  1510.     removeFile $filename
  1511.     expr {$stat(mode) > 0}
  1512. } 1
  1513. catch {unset stat}
  1514. # type
  1515. test cmdAH-29.1 {Tcl_FileObjCmd: type} {
  1516.     list [catch {file size a b} msg] $msg
  1517. } {1 {wrong # args: should be "file size name"}}
  1518. test cmdAH-29.2 {Tcl_FileObjCmd: type} {
  1519.     file type $dirfile
  1520. } directory
  1521. test cmdAH-29.3.0 {Tcl_FileObjCmd: delete removes link not file} {unixOnly nonPortable} {
  1522.     set exists [list [file exists $linkfile] [file exists $gorpfile]]
  1523.     file delete $linkfile
  1524.     set exists2 [list [file exists $linkfile] [file exists $gorpfile]]
  1525.     list $exists $exists2
  1526. } {{1 1} {0 1}}
  1527. test cmdAH-29.3 {Tcl_FileObjCmd: type} {
  1528.     file type $gorpfile
  1529. } file
  1530. test cmdAH-29.4 {Tcl_FileObjCmd: type} {unixOnly} {
  1531.     catch {file delete $linkfile}
  1532.     # Unlike [exec ln -s], [file link] requires an existing target
  1533.     file link -symbolic $linkfile $gorpfile
  1534.     set result [file type $linkfile]
  1535.     file delete $linkfile
  1536.     set result
  1537. } link
  1538. if {[string equal $tcl_platform(platform) "windows"]} {
  1539.     if {[string index $tcl_platform(osVersion) 0] >= 5 
  1540.       && ([lindex [file system [temporaryDirectory]] 1] == "NTFS")} {
  1541. tcltest::testConstraint linkDirectory 1
  1542.     } else {
  1543. tcltest::testConstraint linkDirectory 0
  1544.     }
  1545. } else {
  1546.     tcltest::testConstraint linkDirectory 1
  1547. }
  1548. test cmdAH-29.4.1 {Tcl_FileObjCmd: type} {linkDirectory} {
  1549.     set tempdir [makeDirectory temp]
  1550.     set linkdir [file join [temporaryDirectory] link.dir]
  1551.     file link -symbolic $linkdir $tempdir
  1552.     set result [file type $linkdir]
  1553.     file delete $linkdir
  1554.     removeDirectory $tempdir
  1555.     set result
  1556. } link
  1557. test cmdAH-29.5 {Tcl_FileObjCmd: type} {
  1558.     string tolower [list [catch {file type _bogus_} msg] $msg $errorCode]
  1559. } {1 {could not read "_bogus_": no such file or directory} {posix enoent {no such file or directory}}}
  1560. # Error conditions
  1561. test cmdAH-30.1 {Tcl_FileObjCmd: error conditions} {
  1562.     list [catch {file gorp x} msg] $msg
  1563. } {1 {bad option "gorp": must be atime, attributes, channels, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, link, lstat, mtime, mkdir, nativename, normalize, owned, pathtype, readable, readlink, rename, rootname, separator, size, split, stat, system, tail, type, volumes, or writable}}
  1564. test cmdAH-30.2 {Tcl_FileObjCmd: error conditions} {
  1565.     list [catch {file ex x} msg] $msg
  1566. } {1 {ambiguous option "ex": must be atime, attributes, channels, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, link, lstat, mtime, mkdir, nativename, normalize, owned, pathtype, readable, readlink, rename, rootname, separator, size, split, stat, system, tail, type, volumes, or writable}}
  1567. test cmdAH-30.3 {Tcl_FileObjCmd: error conditions} {
  1568.     list [catch {file is x} msg] $msg
  1569. } {1 {ambiguous option "is": must be atime, attributes, channels, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, link, lstat, mtime, mkdir, nativename, normalize, owned, pathtype, readable, readlink, rename, rootname, separator, size, split, stat, system, tail, type, volumes, or writable}}
  1570. test cmdAH-30.4 {Tcl_FileObjCmd: error conditions} {
  1571.     list [catch {file z x} msg] $msg
  1572. } {1 {bad option "z": must be atime, attributes, channels, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, link, lstat, mtime, mkdir, nativename, normalize, owned, pathtype, readable, readlink, rename, rootname, separator, size, split, stat, system, tail, type, volumes, or writable}}
  1573. test cmdAH-30.5 {Tcl_FileObjCmd: error conditions} {
  1574.     list [catch {file read x} msg] $msg
  1575. } {1 {ambiguous option "read": must be atime, attributes, channels, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, link, lstat, mtime, mkdir, nativename, normalize, owned, pathtype, readable, readlink, rename, rootname, separator, size, split, stat, system, tail, type, volumes, or writable}}
  1576. test cmdAH-30.6 {Tcl_FileObjCmd: error conditions} {
  1577.     list [catch {file s x} msg] $msg
  1578. } {1 {ambiguous option "s": must be atime, attributes, channels, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, link, lstat, mtime, mkdir, nativename, normalize, owned, pathtype, readable, readlink, rename, rootname, separator, size, split, stat, system, tail, type, volumes, or writable}}
  1579. test cmdAH-30.7 {Tcl_FileObjCmd: error conditions} {
  1580.     list [catch {file t x} msg] $msg
  1581. } {1 {ambiguous option "t": must be atime, attributes, channels, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, link, lstat, mtime, mkdir, nativename, normalize, owned, pathtype, readable, readlink, rename, rootname, separator, size, split, stat, system, tail, type, volumes, or writable}}
  1582. test cmdAH-30.8 {Tcl_FileObjCmd: error conditions} {
  1583.     list [catch {file dirname ~woohgy} msg] $msg
  1584. } {1 {user "woohgy" doesn't exist}}
  1585. # channels
  1586. # In testing 'file channels', we need to make sure that a channel
  1587. # created in one interp isn't visible in another.
  1588. interp create simpleInterp
  1589. interp create -safe safeInterp
  1590. interp c
  1591. safeInterp expose file file
  1592. test cmdAH-31.1 {Tcl_FileObjCmd: channels, too many args} {
  1593.     list [catch {file channels a b} msg] $msg
  1594. } {1 {wrong # args: should be "file channels ?pattern?"}}
  1595. test cmdAH-31.2 {Tcl_FileObjCmd: channels, too many args} {
  1596.     # Normal interps start out with only the standard channels
  1597.     lsort [simpleInterp eval [list file chan]]
  1598. } [lsort {stderr stdout stdin}]
  1599. test cmdAH-31.3 {Tcl_FileObjCmd: channels, globbing} {
  1600.     string equal [file channels] [file channels *]
  1601. } {1}
  1602. test cmdAH-31.4 {Tcl_FileObjCmd: channels, globbing} {
  1603.     lsort [file channels std*]
  1604. } [lsort {stdout stderr stdin}]
  1605. set newFileId [open $gorpfile w]
  1606. test cmdAH-31.5 {Tcl_FileObjCmd: channels} {
  1607.     set res [file channels $newFileId]
  1608.     string equal $newFileId $res
  1609. } {1}
  1610. test cmdAH-31.6 {Tcl_FileObjCmd: channels in other interp} {
  1611.     # Safe interps start out with no channels
  1612.     safeInterp eval [list file channels]
  1613. } {}
  1614. test cmdAH-31.7 {Tcl_FileObjCmd: channels in other interp} {
  1615.     list [catch {safeInterp eval [list puts $newFileId "hello"]} msg] $msg
  1616. } [list 1 "can not find channel named "$newFileId""]
  1617. interp share {} $newFileId safeInterp
  1618. interp share {} stdout safeInterp
  1619. test cmdAH-31.8 {Tcl_FileObjCmd: channels in other interp} {
  1620.     # $newFileId should now be visible in both interps
  1621.     list [file channels $newFileId] 
  1622.     [safeInterp eval [list file channels $newFileId]]
  1623. } [list $newFileId $newFileId]
  1624. test cmdAH-31.9 {Tcl_FileObjCmd: channels in other interp} {
  1625.     lsort [safeInterp eval [list file channels]]
  1626. } [lsort [list stdout $newFileId]]
  1627. test cmdAH-31.10 {Tcl_FileObjCmd: channels in other interp} {
  1628.     # we can now write to $newFileId from slave
  1629.     safeInterp eval [list puts $newFileId "hello"]
  1630. } {}
  1631. interp transfer {} $newFileId safeInterp
  1632. test cmdAH-31.11 {Tcl_FileObjCmd: channels in other interp} {
  1633.     # $newFileId should now be visible only in safeInterp
  1634.     list [file channels $newFileId] 
  1635.     [safeInterp eval [list file channels $newFileId]]
  1636. } [list {} $newFileId]
  1637. test cmdAH-31.12 {Tcl_FileObjCmd: channels in other interp} {
  1638.     lsort [safeInterp eval [list file channels]]
  1639. } [lsort [list stdout $newFileId]]
  1640. test cmdAH-31.13 {Tcl_FileObjCmd: channels in other interp} {
  1641.     safeInterp eval [list close $newFileId]
  1642.     safeInterp eval [list file channels]
  1643. } {stdout}
  1644. # This shouldn't work, but just in case a test above failed...
  1645. catch {close $newFileId}
  1646. interp delete safeInterp
  1647. interp delete simpleInterp
  1648. # cleanup
  1649. catch {testsetplatform $platform}
  1650. catch {unset platform}
  1651. # Tcl_ForObjCmd is tested in for.test
  1652. catch {file attributes $dirfile -permissions 0777}
  1653. removeDirectory $dirfile
  1654. removeFile $gorpfile
  1655. # No idea how well [removeFile] copes with links...
  1656. file delete $linkfile
  1657. cd $cmdAHwd
  1658. ::tcltest::cleanupTests
  1659. return