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

通讯编程

开发平台:

Visual C++

  1. # This file tests the tclFCmd.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-1997 Sun Microsystems, Inc.
  8. # Copyright (c) 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: fCmd.test,v 1.26.2.9 2007/05/17 14:18:42 dgp Exp $
  14. #
  15. if {[lsearch [namespace children] ::tcltest] == -1} {
  16.     package require tcltest 2
  17.     namespace import -force ::tcltest::*
  18. }
  19. tcltest::testConstraint testsetplatform [string equal testsetplatform [info commands testsetplatform]]
  20. tcltest::testConstraint testchmod [string equal testchmod [info commands testchmod]]
  21. tcltest::testConstraint notNetworkFilesystem 0
  22. testConstraint 95or98 [expr {[testConstraint 95] || [testConstraint 98]}]
  23. testConstraint 2000orNewer [expr {![testConstraint 95or98]}]
  24. # Several tests require need to match results against the unix username
  25. set user {}
  26. if {$tcl_platform(platform) == "unix"} {
  27.     catch {set user [exec whoami]}
  28.     if {$user == ""} {
  29. catch {regexp {^[^(]*(([^)]*))} [exec id] dummy user}
  30.     }
  31.     if {$user == ""} {
  32. set user "root"
  33.     }
  34. }
  35. proc createfile {file {string a}} {
  36.     set f [open $file w]
  37.     puts -nonewline $f $string
  38.     close $f
  39.     return $string
  40. }
  41. # checkcontent --
  42. #
  43. #  Ensures that file "file" contains only the string "matchString"
  44. #  returns 0 if the file does not exist, or has a different content
  45. #
  46. proc checkcontent {file matchString} {
  47.     if {[catch {
  48. set f [open $file]
  49. set fileString [read $f]
  50. close $f 
  51.     }]} {
  52. return 0
  53.     }
  54.     return [string match $matchString $fileString]
  55. }
  56. proc openup {path} {
  57.     testchmod 777 $path
  58.     if {[file isdirectory $path]} {
  59. catch {
  60.     foreach p [glob -directory $path *] {
  61. openup $p
  62.     }
  63. }
  64.     }
  65. }
  66. proc cleanup {args} {
  67.     if {$::tcl_platform(platform) == "macintosh"} {
  68. set wd [list :]
  69.     } else {
  70. set wd [list .]
  71.     }
  72.     foreach p [concat $wd $args] {
  73. set x ""
  74. catch {
  75.     set x [glob -directory $p tf* td*]
  76. }
  77. foreach file $x {
  78.     if {[catch {file delete -force -- $file}]} {
  79. catch {openup $file}
  80. catch {file delete -force -- $file}
  81.     }
  82. }
  83.     }
  84. }
  85. proc contents {file} {
  86.     set f [open $file r]
  87.     set r [read $f]
  88.     close $f
  89.     set r
  90. }
  91. cd [temporaryDirectory]
  92. set ::tcltest::testConstraints(fileSharing) 0
  93. set ::tcltest::testConstraints(notFileSharing) 1
  94. if {$tcl_platform(platform) == "macintosh"} {
  95.     catch {file delete -force foo.dir}
  96.     file mkdir foo.dir
  97.     if {[catch {file attributes foo.dir -readonly 1}] == 0} {
  98.      set ::tcltest::testConstraints(fileSharing) 1
  99.      set ::tcltest::testConstraints(notFileSharing) 0
  100.     }
  101.     file delete -force foo.dir
  102. }
  103. set ::tcltest::testConstraints(xdev) 0
  104. if {$tcl_platform(platform) == "unix"} {
  105.     if {[catch {set m1 [exec df .]; set m2 [exec df /tmp]}] == 0} {
  106. set m1 [string range $m1 0 [expr [string first " " $m1]-1]]
  107. set m2 [string range $m2 0 [expr [string first " " $m2]-1]]
  108. if {$m1 != "" && $m2 != "" && $m1 != $m2 && [file exists $m1] && [file exists $m2]} {
  109.     set ::tcltest::testConstraints(xdev) 1
  110. }
  111.     }
  112. }
  113. set root [lindex [file split [pwd]] 0]
  114. # A really long file name
  115. # length of long is 1216 chars, which should be greater than any static
  116. # buffer or allowable filename.
  117. set long "abcdefghihjllmnopqrstuvwxyz01234567890"
  118. append long $long
  119. append long $long
  120. append long $long
  121. append long $long
  122. append long $long
  123. test fCmd-1.1 {TclFileRenameCmd} {notRoot} {
  124.     cleanup
  125.     createfile tf1
  126.     file rename tf1 tf2
  127.     glob tf*
  128. } {tf2}
  129. test fCmd-2.1 {TclFileCopyCmd} {notRoot} {
  130.     cleanup
  131.     createfile tf1
  132.     file copy tf1 tf2
  133.     lsort [glob tf*]
  134. } {tf1 tf2}
  135. test fCmd-3.1 {FileCopyRename: FileForceOption fails} {notRoot} {
  136.     list [catch {file rename -xyz} msg] $msg
  137. } {1 {bad option "-xyz": should be -force or --}}
  138. test fCmd-3.2 {FileCopyRename: not enough args} {notRoot} {
  139.     list [catch {file rename xyz} msg] $msg
  140. } {1 {wrong # args: should be "file rename ?options? source ?source ...? target"}}
  141. test fCmd-3.3 {FileCopyRename: Tcl_TranslateFileName fails} {notRoot} {
  142.     list [catch {file rename xyz ~_totally_bogus_user} msg] $msg
  143. } {1 {user "_totally_bogus_user" doesn't exist}}
  144. test fCmd-3.4 {FileCopyRename: Tcl_TranslateFileName passes} {notRoot} {
  145.     cleanup
  146.     list [catch {file copy tf1 ~} msg] $msg
  147. } {1 {error copying "tf1": no such file or directory}}
  148. test fCmd-3.5 {FileCopyRename: target doesn't exist: stat(target) != 0} {notRoot} {
  149.     cleanup
  150.     list [catch {file rename tf1 tf2 tf3} msg] $msg
  151. } {1 {error renaming: target "tf3" is not a directory}}
  152. test fCmd-3.6 {FileCopyRename: target tf3 is not a dir: !S_ISDIR(target)} 
  153. {notRoot} {
  154.     cleanup
  155.     createfile tf3
  156.     list [catch {file rename tf1 tf2 tf3} msg] $msg
  157. } {1 {error renaming: target "tf3" is not a directory}}
  158. test fCmd-3.7 {FileCopyRename: target exists & is directory} {notRoot} {
  159.     cleanup
  160.     file mkdir td1
  161.     createfile tf1 tf1
  162.     file rename tf1 td1
  163.     contents [file join td1 tf1]
  164. } {tf1}
  165. test fCmd-3.8 {FileCopyRename: too many arguments: argc - i > 2} {notRoot} {
  166.     cleanup
  167.     list [catch {file rename tf1 tf2 tf3} msg] $msg
  168. } {1 {error renaming: target "tf3" is not a directory}}
  169. test fCmd-3.9 {FileCopyRename: too many arguments: argc - i > 2} {notRoot} {
  170.     cleanup
  171.     list [catch {file copy -force -- tf1 tf2 tf3} msg] $msg
  172. } {1 {error copying: target "tf3" is not a directory}}
  173. test fCmd-3.10 {FileCopyRename: just 2 arguments} {notRoot} {
  174.     cleanup
  175.     createfile tf1 tf1
  176.     file rename tf1 tf2
  177.     contents tf2
  178. } {tf1}
  179. test fCmd-3.11 {FileCopyRename: just 2 arguments} {notRoot} {
  180.     cleanup
  181.     createfile tf1 tf1
  182.     file rename -force -force -- tf1 tf2
  183.     contents tf2
  184. } {tf1}
  185. test fCmd-3.12 {FileCopyRename: move each source: 1 source} {notRoot} {
  186.     cleanup
  187.     createfile tf1 tf1
  188.     file mkdir td1
  189.     file rename tf1 td1
  190.     contents [file join td1 tf1]
  191. } {tf1}
  192. test fCmd-3.13 {FileCopyRename: move each source: multiple sources} {notRoot} {
  193.     cleanup
  194.     createfile tf1 tf1
  195.     createfile tf2 tf2
  196.     createfile tf3 tf3
  197.     createfile tf4 tf4
  198.     file mkdir td1
  199.     file rename tf1 tf2 tf3 tf4 td1
  200.     list [contents [file join td1 tf1]] [contents [file join td1 tf2]] 
  201. [contents [file join td1 tf3]] [contents [file join td1 tf4]]
  202. } {tf1 tf2 tf3 tf4}
  203. test fCmd-3.14 {FileCopyRename: FileBasename fails} {notRoot} {
  204.     cleanup
  205.     file mkdir td1
  206.     list [catch {file rename ~_totally_bogus_user td1} msg] $msg
  207. } {1 {user "_totally_bogus_user" doesn't exist}}
  208. test fCmd-3.15 {FileCopyRename: source[0] == ''} {notRoot unixOrPc} {
  209.     cleanup
  210.     file mkdir td1
  211.     list [catch {file rename / td1} msg] $msg
  212. } {1 {error renaming "/" to "td1": file already exists}}
  213. test fCmd-3.16 {FileCopyRename: break on first error} {notRoot} {
  214.     cleanup
  215.     createfile tf1 
  216.     createfile tf2 
  217.     createfile tf3 
  218.     createfile tf4 
  219.     file mkdir td1
  220.     createfile [file join td1 tf3]
  221.     list [catch {file rename tf1 tf2 tf3 tf4 td1} msg] $msg
  222. } [subst {1 {error renaming "tf3" to "[file join td1 tf3]": file already exists}}]
  223. test fCmd-4.1 {TclFileMakeDirsCmd: make each dir: 1 dir} {notRoot} {
  224.     cleanup
  225.     file mkdir td1
  226.     glob td*
  227. } {td1}
  228. test fCmd-4.2 {TclFileMakeDirsCmd: make each dir: multiple dirs} {notRoot} {
  229.     cleanup
  230.     file mkdir td1 td2 td3
  231.     lsort [glob td*]
  232. } {td1 td2 td3}
  233. test fCmd-4.3 {TclFileMakeDirsCmd: stops on first error} {notRoot} {
  234.     cleanup
  235.     createfile tf1
  236.     catch {file mkdir td1 td2 tf1 td3 td4}
  237.     glob td1 td2 tf1 td3 td4
  238. } {td1 td2 tf1}
  239. test fCmd-4.4 {TclFileMakeDirsCmd: Tcl_TranslateFileName fails} {notRoot} {
  240.     cleanup
  241.     list [catch {file mkdir ~_totally_bogus_user} msg] $msg
  242. } {1 {user "_totally_bogus_user" doesn't exist}}
  243. test fCmd-4.5 {TclFileMakeDirsCmd: Tcl_SplitPath returns 0: *name == ''} 
  244. {notRoot} {
  245.     cleanup
  246.     list [catch {file mkdir ""} msg] $msg
  247. } {1 {can't create directory "": no such file or directory}}
  248. test fCmd-4.6 {TclFileMakeDirsCmd: one level deep} {notRoot} {
  249.     cleanup
  250.     file mkdir td1
  251.     glob td1
  252. } {td1}
  253. test fCmd-4.7 {TclFileMakeDirsCmd: multi levels deep} {notRoot} {
  254.     cleanup
  255.     file mkdir [file join td1 td2 td3 td4]
  256.     glob td1 [file join td1 td2]
  257. } "td1 [file join td1 td2]"
  258. test fCmd-4.8 {TclFileMakeDirsCmd: already exist: lstat(target) == 0} {notRoot} {
  259.     cleanup
  260.     file mkdir td1
  261.     set x [file exists td1]
  262.     file mkdir td1
  263.     list $x [file exists td1]
  264. } {1 1}
  265. test fCmd-4.9 {TclFileMakeDirsCmd: exists, not dir} {notRoot} {
  266.     cleanup
  267.     createfile tf1
  268.     list [catch {file mkdir tf1} msg] $msg
  269. } [subst {1 {can't create directory "[file join tf1]": file already exists}}]
  270. test fCmd-4.10 {TclFileMakeDirsCmd: exists, is dir} {notRoot} {
  271.     cleanup
  272.     file mkdir td1
  273.     set x [file exists td1]
  274.     file mkdir td1
  275.     list $x [file exists td1]
  276. } {1 1}
  277. test fCmd-4.11 {TclFileMakeDirsCmd: doesn't exist: errno != ENOENT} 
  278. {unixOnly notRoot testchmod} {
  279.     cleanup
  280.     file mkdir td1/td2/td3
  281.     testchmod 000 td1/td2
  282.     set msg [list [catch {file mkdir td1/td2/td3/td4} msg] $msg]
  283.     testchmod 755 td1/td2
  284.     set msg
  285. } {1 {can't create directory "td1/td2/td3": permission denied}}
  286. test fCmd-4.12 {TclFileMakeDirsCmd: doesn't exist: errno != ENOENT} {macOnly} {
  287.     cleanup
  288.     list [catch {file mkdir nonexistentvolume:} msg] $msg
  289. } {1 {can't create directory "nonexistentvolume:": invalid argument}}
  290. test fCmd-4.13 {TclFileMakeDirsCmd: doesn't exist: errno == ENOENT} {notRoot} {
  291.     cleanup
  292.     set x [file exists td1]
  293.     file mkdir td1
  294.     list $x [file exists td1]
  295. } {0 1}
  296. test fCmd-4.14 {TclFileMakeDirsCmd: TclpCreateDirectory fails} 
  297. {unixOnly notRoot} {
  298.     cleanup
  299.     file delete -force foo
  300.     file mkdir foo
  301.     file attr foo -perm 040000
  302.     set result [list [catch {file mkdir foo/tf1} msg] $msg]
  303.     file delete -force foo
  304.     set result
  305. } {1 {can't create directory "foo/tf1": permission denied}}
  306. test fCmd-4.15 {TclFileMakeDirsCmd: TclpCreateDirectory fails} {macOnly} {
  307.     list [catch {file mkdir ${root}:} msg] $msg
  308. } [subst {1 {can't create directory "${root}:": no such file or directory}}]
  309. test fCmd-4.16 {TclFileMakeDirsCmd: TclpCreateDirectory succeeds} {notRoot} {
  310.     cleanup
  311.     file mkdir tf1
  312.     file exists tf1
  313. } {1}
  314. test fCmd-5.1 {TclFileDeleteCmd: FileForceOption fails} {notRoot} {
  315.     list [catch {file delete -xyz} msg] $msg
  316. } {1 {bad option "-xyz": should be -force or --}}
  317. test fCmd-5.2 {TclFileDeleteCmd: not enough args} {notRoot} {
  318.     list [catch {file delete -force -force} msg] $msg
  319. } {1 {wrong # args: should be "file delete ?options? file ?file ...?"}}
  320. test fCmd-5.3 {TclFileDeleteCmd: 1 file} {notRoot} {
  321.     cleanup
  322.     createfile tf1
  323.     createfile tf2
  324.     file mkdir td1
  325.     file delete tf2
  326.     glob tf* td*
  327. } {tf1 td1}
  328. test fCmd-5.4 {TclFileDeleteCmd: multiple files} {notRoot} {
  329.     cleanup
  330.     createfile tf1
  331.     createfile tf2
  332.     file mkdir td1
  333.     set x [list [file exists tf1] [file exists tf2] [file exists td1]]
  334.     file delete tf1 td1 tf2
  335.     lappend x [file exists tf1] [file exists tf2] [file exists tf3]
  336. } {1 1 1 0 0 0}
  337. test fCmd-5.5 {TclFileDeleteCmd: stop at first error} {notRoot unixOrPc} {
  338.     cleanup
  339.     createfile tf1
  340.     createfile tf2
  341.     file mkdir td1
  342.     catch {file delete tf1 td1 $root tf2}
  343.     list [file exists tf1] [file exists tf2] [file exists td1]
  344. } {0 1 0}
  345. test fCmd-5.6 {TclFileDeleteCmd: Tcl_TranslateFileName fails} {notRoot} {
  346.     list [catch {file delete ~_totally_bogus_user} msg] $msg
  347. } {1 {user "_totally_bogus_user" doesn't exist}}
  348. test fCmd-5.7 {TclFileDeleteCmd: Tcl_TranslateFileName succeeds} {notRoot} {
  349.     catch {file delete ~/tf1}
  350.     createfile ~/tf1
  351.     file delete ~/tf1
  352. } {}
  353. test fCmd-5.8 {TclFileDeleteCmd: file doesn't exist: lstat(name) != 0} {notRoot} {
  354.     cleanup
  355.     set x [file exists tf1]
  356.     file delete tf1
  357.     list $x [file exists tf1]
  358. } {0 0}    
  359. test fCmd-5.9 {TclFileDeleteCmd: is directory} {notRoot} {
  360.     cleanup
  361.     file mkdir td1
  362.     file delete td1
  363.     file exists td1
  364. } {0}
  365. test fCmd-5.10 {TclFileDeleteCmd: TclpRemoveDirectory fails} {notRoot} {
  366.     cleanup
  367.     file mkdir [file join td1 td2]
  368.     list [catch {file delete td1} msg] $msg
  369. } {1 {error deleting "td1": directory not empty}}
  370. test fCmd-5.11 {TclFileDeleteCmd: TclpRemoveDirectory with cwd inside} {notRoot} {
  371.     cleanup
  372.     set dir [pwd]
  373.     file mkdir [file join td1 td2]
  374.     cd [file join td1 td2]
  375.     set res [list [catch {file delete -force [file dirname [pwd]]} msg]]
  376.     cd $dir
  377.     lappend res [file exists td1] $msg
  378. } {0 0 {}}
  379. test fCmd-5.12 {TclFileDeleteCmd: TclpRemoveDirectory with bad perms} {unixOnly} {
  380.     cleanup
  381.     file mkdir [file join td1 td2]
  382.     #exec chmod u-rwx [file join td1 td2]
  383.     file attributes [file join td1 td2] -permissions u+rwx
  384.     set res [list [catch {file delete -force td1} msg]]
  385.     lappend res [file exists td1] $msg
  386. } {0 0 {}}
  387. test fCmd-6.1 {CopyRenameOneFile: bad source} {notRoot} {
  388.     # can't test this, because it's caught by FileCopyRename
  389. } {}
  390. test fCmd-6.2 {CopyRenameOneFile: bad target} {notRoot} {
  391.     # can't test this, because it's caught by FileCopyRename
  392. } {}
  393. test fCmd-6.3 {CopyRenameOneFile: lstat(source) != 0} {notRoot} {
  394.     cleanup
  395.     list [catch {file rename tf1 tf2} msg] $msg
  396. } {1 {error renaming "tf1": no such file or directory}}
  397. test fCmd-6.4 {CopyRenameOneFile: lstat(source) == 0} {notRoot} {
  398.     cleanup
  399.     createfile tf1
  400.     file rename tf1 tf2
  401.     glob tf*
  402. } {tf2}
  403. test fCmd-6.5 {CopyRenameOneFile: lstat(target) != 0} {notRoot} {
  404.     cleanup
  405.     createfile tf1
  406.     file rename tf1 tf2
  407.     glob tf*
  408. } {tf2}
  409. test fCmd-6.6 {CopyRenameOneFile: errno != ENOENT} {unixOnly notRoot testchmod} {
  410.     cleanup
  411.     file mkdir td1
  412.     testchmod 000 td1
  413.     createfile tf1
  414.     set msg [list [catch {file rename tf1 td1} msg] $msg]
  415.     testchmod 755 td1
  416.     set msg
  417. } {1 {error renaming "tf1" to "td1/tf1": permission denied}}
  418. test fCmd-6.7 {CopyRenameOneFile: errno != ENOENT} {pcOnly 95} {
  419.     cleanup
  420.     createfile tf1
  421.     list [catch {file rename tf1 $long} msg] $msg
  422. } [subst {1 {error renaming "tf1" to "$long": file name too long}}]
  423. test fCmd-6.8 {CopyRenameOneFile: errno != ENOENT} {macOnly} {
  424.     cleanup
  425.     createfile tf1
  426.     list [catch {file rename tf1 $long} msg] $msg
  427. } [subst {1 {error renaming "tf1" to "$long": file name too long}}]
  428. test fCmd-6.9 {CopyRenameOneFile: errno == ENOENT} {unixOnly notRoot} {
  429.     cleanup
  430.     createfile tf1
  431.     file rename tf1 tf2
  432.     glob tf*
  433. } {tf2}
  434. test fCmd-6.10 {CopyRenameOneFile: lstat(target) == 0} {notRoot} {
  435.     cleanup
  436.     createfile tf1
  437.     createfile tf2
  438.     list [catch {file rename tf1 tf2} msg] $msg
  439. } {1 {error renaming "tf1" to "tf2": file already exists}}
  440. test fCmd-6.11 {CopyRenameOneFile: force == 0} {notRoot} {
  441.     cleanup
  442.     createfile tf1
  443.     createfile tf2
  444.     list [catch {file rename tf1 tf2} msg] $msg
  445. } {1 {error renaming "tf1" to "tf2": file already exists}}
  446. test fCmd-6.12 {CopyRenameOneFile: force != 0} {notRoot} {
  447.     cleanup
  448.     createfile tf1
  449.     createfile tf2
  450.     file rename -force tf1 tf2
  451.     glob tf*
  452. } {tf2}
  453. test fCmd-6.13 {CopyRenameOneFile: source is dir, target is file} {notRoot} {
  454.     cleanup
  455.     file mkdir td1
  456.     file mkdir td2
  457.     createfile [file join td2 td1]
  458.     list [catch {file rename -force td1 td2} msg] $msg
  459. } [subst {1 {can't overwrite file "[file join td2 td1]" with directory "td1"}}]
  460. test fCmd-6.14 {CopyRenameOneFile: source is file, target is dir} {notRoot} {
  461.     cleanup
  462.     createfile tf1
  463.     file mkdir [file join td1 tf1]
  464.     list [catch {file rename -force tf1 td1} msg] $msg
  465. } [subst {1 {can't overwrite directory "[file join td1 tf1]" with file "tf1"}}]
  466. test fCmd-6.15 {CopyRenameOneFile: TclpRenameFile succeeds} {notRoot notNetworkFilesystem} {
  467.     cleanup
  468.     file mkdir [file join td1 td2]
  469.     file mkdir td2
  470.     createfile [file join td2 tf1]
  471.     file rename -force td2 td1
  472.     file exists [file join td1 td2 tf1]
  473. } {1}
  474. test fCmd-6.16 {CopyRenameOneFile: TclpCopyRenameOneFile fails} {notRoot} {
  475.     cleanup
  476.     file mkdir [file join td1 td2]
  477.     createfile [file join td1 td2 tf1]
  478.     file mkdir td2
  479.     list [catch {file rename -force td2 td1} msg] $msg
  480. } [subst {1 {error renaming "td2" to "[file join td1 td2]": file already exists}}]
  481. test fCmd-6.17 {CopyRenameOneFile: errno == EINVAL} {notRoot} {
  482.     cleanup
  483.     list [catch {file rename -force $root tf1} msg] $msg
  484. } [subst {1 {error renaming "$root" to "tf1": trying to rename a volume or move a directory into itself}}]
  485. test fCmd-6.18 {CopyRenameOneFile: errno != EXDEV} {notRoot} {
  486.     cleanup
  487.     file mkdir [file join td1 td2]
  488.     createfile [file join td1 td2 tf1]
  489.     file mkdir td2
  490.     list [catch {file rename -force td2 td1} msg] $msg
  491. } [subst {1 {error renaming "td2" to "[file join td1 td2]": file already exists}}]
  492. test fCmd-6.19 {CopyRenameOneFile: errno == EXDEV} {unixOnly notRoot} {
  493.     cleanup /tmp
  494.     createfile tf1
  495.     file rename tf1 /tmp
  496.     glob tf* /tmp/tf1
  497. } {/tmp/tf1}
  498. test fCmd-6.20 {CopyRenameOneFile: errno == EXDEV} {pcOnly} {
  499.     catch {file delete -force c:/tcl8975@ d:/tcl8975@}
  500.     file mkdir c:/tcl8975@
  501.     if [catch {file rename c:/tcl8975@ d:/}] {
  502. set msg d:/tcl8975@
  503.     } else {
  504. set msg [glob c:/tcl8975@ d:/tcl8975@]
  505. file delete -force d:/tcl8975@
  506.     }
  507.     file delete -force c:/tcl8975@
  508.     set msg
  509. } {d:/tcl8975@}
  510. test fCmd-6.21 {CopyRenameOneFile: copy/rename: S_ISDIR(source)} 
  511. {unixOnly notRoot} {
  512.     cleanup /tmp
  513.     file mkdir td1
  514.     file rename td1 /tmp
  515.     glob td* /tmp/td*
  516. } {/tmp/td1}
  517. test fCmd-6.22 {CopyRenameOneFile: copy/rename: !S_ISDIR(source)} 
  518. {unixOnly notRoot} {
  519.     cleanup /tmp
  520.     createfile tf1
  521.     file rename tf1 /tmp
  522.     glob tf* /tmp/tf*
  523. } {/tmp/tf1}
  524. test fCmd-6.23 {CopyRenameOneFile: TclpCopyDirectory failed} 
  525. {unixOnly notRoot xdev} {
  526.     cleanup /tmp
  527.     file mkdir td1/td2/td3
  528.     file attributes td1 -permissions 0000
  529.     set msg [list [catch {file rename td1 /tmp} msg] $msg]
  530.     file attributes td1 -permissions 0755
  531.     set msg 
  532. } {1 {error renaming "td1": permission denied}}
  533. test fCmd-6.24 {CopyRenameOneFile: error uses original name} 
  534. {unixOnly notRoot} {
  535.     cleanup
  536.     file mkdir ~/td1/td2
  537.     set td1name [file join [file dirname ~] [file tail ~] td1]
  538.     file attributes $td1name -permissions 0000
  539.     set msg [list [catch {file copy ~/td1 td1} msg] $msg]
  540.     file attributes $td1name -permissions 0755
  541.     file delete -force ~/td1
  542.     set msg
  543. } {1 {error copying "~/td1": permission denied}}
  544. test fCmd-6.25 {CopyRenameOneFile: error uses original name} 
  545. {unixOnly notRoot} {
  546.     cleanup
  547.     file mkdir td2
  548.     file mkdir ~/td1
  549.     set td1name [file join [file dirname ~] [file tail ~] td1]
  550.     file attributes $td1name -permissions 0000
  551.     set msg [list [catch {file copy td2 ~/td1} msg] $msg]
  552.     file attributes $td1name -permissions 0755
  553.     file delete -force ~/td1
  554.     set msg
  555. } {1 {error copying "td2" to "~/td1/td2": permission denied}}
  556. test fCmd-6.26 {CopyRenameOneFile: doesn't use original name} 
  557. {unixOnly notRoot} {
  558.     cleanup
  559.     file mkdir ~/td1/td2
  560.     set td2name [file join [file dirname ~] [file tail ~] td1 td2]
  561.     file attributes $td2name -permissions 0000
  562.     set msg [list [catch {file copy ~/td1 td1} msg] $msg]
  563.     file attributes $td2name -permissions 0755
  564.     file delete -force ~/td1
  565.     set msg
  566. } "1 {error copying "~/td1" to "td1": "[file join [file dirname ~] [file tail ~] td1 td2]": permission denied}"
  567. test fCmd-6.27 {CopyRenameOneFile: TclpCopyDirectory failed} 
  568. {unixOnly notRoot xdev} {
  569.     cleanup /tmp
  570.     file mkdir td1/td2/td3
  571.     file mkdir /tmp/td1
  572.     createfile /tmp/td1/tf1
  573.     list [catch {file rename -force td1 /tmp} msg] $msg
  574. } {1 {error renaming "td1" to "/tmp/td1": file already exists}}
  575. test fCmd-6.28 {CopyRenameOneFile: TclpCopyDirectory failed} 
  576. {unixOnly notRoot xdev} {
  577.     cleanup /tmp
  578.     file mkdir td1/td2/td3
  579.     file attributes td1/td2/td3 -permissions 0000
  580.     set msg [list [catch {file rename td1 /tmp} msg] $msg]
  581.     file attributes td1/td2/td3 -permissions 0755
  582.     set msg
  583. } {1 {error renaming "td1" to "/tmp/td1": "td1/td2/td3": permission denied}}
  584. test fCmd-6.29 {CopyRenameOneFile: TclpCopyDirectory passed} 
  585. {unixOnly notRoot xdev} {
  586.     cleanup /tmp
  587.     file mkdir td1/td2/td3
  588.     file rename td1 /tmp
  589.     glob td* /tmp/td1/t*
  590. } {/tmp/td1/td2}
  591. test fCmd-6.30 {CopyRenameOneFile: TclpRemoveDirectory failed} 
  592. {unixOnly notRoot} {
  593.     cleanup
  594.     file mkdir foo/bar
  595.     file attr foo -perm 040555
  596.     set catchResult [catch {file rename foo/bar /tmp} msg]
  597.     set msg [lindex [split $msg :] end]
  598.     catch {file delete /tmp/bar}
  599.     catch {file attr foo -perm 040777}
  600.     catch {file delete -force foo}
  601.     list $catchResult $msg
  602. } {1 { permission denied}}
  603. test fCmd-6.31 {CopyRenameOneFile: TclpDeleteFile passed} 
  604. {unixOnly notRoot xdev} {
  605.     catch {cleanup /tmp}
  606.     file mkdir /tmp/td1
  607.     createfile /tmp/td1/tf1
  608.     file rename /tmp/td1/tf1 tf1
  609.     list [file exists /tmp/td1/tf1] [file exists tf1]
  610. } {0 1}
  611. test fCmd-6.32 {CopyRenameOneFile: copy} {notRoot} {
  612.     cleanup
  613.     list [catch {file copy tf1 tf2} msg] $msg
  614. } {1 {error copying "tf1": no such file or directory}}
  615. catch {cleanup /tmp}
  616. test fCmd-7.1 {FileForceOption: none} {notRoot} {
  617.     cleanup
  618.     file mkdir [file join tf1 tf2]
  619.     list [catch {file delete tf1} msg] $msg
  620. } {1 {error deleting "tf1": directory not empty}}
  621. test fCmd-7.2 {FileForceOption: -force} {notRoot} {
  622.     cleanup
  623.     file mkdir [file join tf1 tf2]
  624.     file delete -force tf1
  625. } {}
  626. test fCmd-7.3 {FileForceOption: --} {notRoot} {
  627.     createfile -tf1
  628.     file delete -- -tf1
  629. } {}
  630. test fCmd-7.4 {FileForceOption: bad option} {notRoot} {
  631.     createfile -tf1
  632.     set msg [list [catch {file delete -tf1} msg] $msg]
  633.     file delete -- -tf1
  634.     set msg
  635. } {1 {bad option "-tf1": should be -force or --}}
  636. test fCmd-7.5 {FileForceOption: multiple times through loop} {notRoot} {
  637.     createfile --
  638.     createfile -force
  639.     file delete -force -force -- -- -force
  640.     list [catch {glob -- -- -force} msg] $msg
  641. } {1 {no files matched glob patterns "-- -force"}}
  642. test fCmd-8.1 {FileBasename: basename of ~user: argc == 1 && *path == ~} 
  643. {unixOnly notRoot knownBug} {
  644.     # Labelled knownBug because it is dangerous [Bug: 3881]
  645.     file mkdir td1
  646.     file attr td1 -perm 040000
  647.     set result [list [catch {file rename ~$user td1} msg] $msg]
  648.     file delete -force td1
  649.     set result
  650. } "1 {error renaming "~$user" to "td1/[file tail ~$user]": permission denied}"
  651. test fCmd-8.2 {FileBasename: basename of ~user: argc == 1 && *path == ~} {
  652.     string equal [file tail ~$user] ~$user
  653. } 0
  654. test fCmd-8.3 {file copy and path translation: ensure correct error} {
  655.     list [catch {file copy ~ [file join this file doesnt exist]} res] $res
  656. } [list 1 
  657.   "error copying "~" to "[file join this file doesnt exist]":
  658.   no such file or directory"]
  659. test fCmd-9.1 {file rename: comprehensive: EACCES} {unixOnly notRoot} {
  660.     cleanup
  661.     file mkdir td1
  662.     file mkdir td2
  663.     file attr td2 -perm 040000
  664.     set result [list [catch {file rename td1 td2/} msg] $msg]
  665.     file delete -force td2
  666.     file delete -force td1
  667.     set result
  668. } {1 {error renaming "td1" to "td2/td1": permission denied}}
  669. test fCmd-9.2 {file rename: comprehensive: source doesn't exist} {notRoot} {
  670.     cleanup
  671.     list [catch {file rename tf1 tf2} msg] $msg
  672. } {1 {error renaming "tf1": no such file or directory}}
  673. test fCmd-9.3 {file rename: comprehensive: file to new name} {notRoot testchmod} {
  674.     cleanup
  675.     createfile tf1
  676.     createfile tf2
  677.     testchmod 444 tf2
  678.     file rename tf1 tf3
  679.     file rename tf2 tf4
  680.     list [lsort [glob tf*]] [file writable tf3] [file writable tf4]
  681. } {{tf3 tf4} 1 0}    
  682. test fCmd-9.4 {file rename: comprehensive: dir to new name} {unixOrPc notRoot testchmod} {
  683.     cleanup
  684.     file mkdir td1 td2
  685.     testchmod 555 td2
  686.     file rename td1 td3
  687.     file rename td2 td4
  688.     list [lsort [glob td*]] [file writable td3] [file writable td4]
  689. } {{td3 td4} 1 0}    
  690. test fCmd-9.5 {file rename: comprehensive: file to self} {notRoot testchmod} {
  691.     cleanup
  692.     createfile tf1 tf1
  693.     createfile tf2 tf2
  694.     testchmod 444 tf2
  695.     file rename -force tf1 tf1
  696.     file rename -force tf2 tf2
  697.     list [contents tf1] [contents tf2] [file writable tf1] [file writable tf2]
  698. } {tf1 tf2 1 0}    
  699. test fCmd-9.6 {file rename: comprehensive: dir to self} {notRoot unixOrPc testchmod} {
  700.     cleanup
  701.     file mkdir td1
  702.     file mkdir td2
  703.     testchmod 555 td2
  704.     file rename -force td1 .
  705.     file rename -force td2 .
  706.     list [lsort [glob td*]] [file writable td1] [file writable td2]
  707. } {{td1 td2} 1 0}    
  708. test fCmd-9.7 {file rename: comprehensive: file to existing file} {notRoot testchmod} {
  709.     cleanup
  710.     createfile tf1
  711.     createfile tf2
  712.     createfile tfs1
  713.     createfile tfs2
  714.     createfile tfs3
  715.     createfile tfs4
  716.     createfile tfd1
  717.     createfile tfd2
  718.     createfile tfd3
  719.     createfile tfd4
  720.     testchmod 444 tfs3
  721.     testchmod 444 tfs4
  722.     testchmod 444 tfd2
  723.     testchmod 444 tfd4
  724.     set msg [list [catch {file rename tf1 tf2} msg] $msg]
  725.     file rename -force tfs1 tfd1
  726.     file rename -force tfs2 tfd2
  727.     file rename -force tfs3 tfd3
  728.     file rename -force tfs4 tfd4
  729.     list [lsort [glob tf*]] $msg [file writable tfd1] [file writable tfd2] [file writable tfd3] [file writable tfd4] 
  730. } {{tf1 tf2 tfd1 tfd2 tfd3 tfd4} {1 {error renaming "tf1" to "tf2": file already exists}} 1 1 0 0}
  731. test fCmd-9.8 {file rename: comprehensive: dir to empty dir} {notRoot testchmod notNetworkFilesystem} {
  732.     # Under unix, you can rename a read-only directory, but you can't
  733.     # move it into another directory.
  734.     cleanup
  735.     file mkdir td1
  736.     file mkdir [file join td2 td1]
  737.     file mkdir tds1
  738.     file mkdir tds2
  739.     file mkdir tds3
  740.     file mkdir tds4
  741.     file mkdir [file join tdd1 tds1]
  742.     file mkdir [file join tdd2 tds2]
  743.     file mkdir [file join tdd3 tds3]
  744.     file mkdir [file join tdd4 tds4]
  745.     if {$tcl_platform(platform) != "unix" && $tcl_platform(platform) != "macintosh"} {
  746. testchmod 555 tds3
  747. testchmod 555 tds4
  748.     }
  749.     if {$tcl_platform(platform) != "macintosh"} {
  750.      testchmod 555 [file join tdd2 tds2]
  751.      testchmod 555 [file join tdd4 tds4]
  752.     }
  753.     set msg [list [catch {file rename td1 td2} msg] $msg]
  754.     file rename -force tds1 tdd1
  755.     file rename -force tds2 tdd2
  756.     file rename -force tds3 tdd3
  757.     file rename -force tds4 tdd4
  758.     if {$tcl_platform(platform) != "unix" && $tcl_platform(platform) != "macintosh"} {
  759. set w3 [file writable [file join tdd3 tds3]]
  760. set w4 [file writable [file join tdd4 tds4]]
  761.     } else {
  762. set w3 0
  763. set w4 0
  764.     }
  765.     list [lsort [glob td*]] $msg [file writable [file join tdd1 tds1]] 
  766.     [file writable [file join tdd2 tds2]] $w3 $w4
  767. } [subst {{td1 td2 tdd1 tdd2 tdd3 tdd4} {1 {error renaming "td1" to "[file join td2 td1]": file already exists}} 1 1 0 0}]
  768. test fCmd-9.9 {file rename: comprehensive: dir to non-empty dir} {notRoot testchmod} {
  769.     cleanup
  770.     file mkdir tds1
  771.     file mkdir tds2
  772.     file mkdir [file join tdd1 tds1 xxx]
  773.     file mkdir [file join tdd2 tds2 xxx]
  774.     if {$tcl_platform(platform) != "unix" && $tcl_platform(platform) != "macintosh"} {
  775. testchmod 555 tds2
  776.     }
  777.     set a1 [list [catch {file rename -force tds1 tdd1} msg] $msg]
  778.     set a2 [list [catch {file rename -force tds2 tdd2} msg] $msg]
  779.     if {$tcl_platform(platform) != "unix" && $tcl_platform(platform) != "macintosh"} {
  780. set w2 [file writable tds2]
  781.     } else {
  782. set w2 0
  783.     }
  784.     list [lsort [glob td*]] $a1 $a2 [file writable tds1] $w2
  785. } [subst {{tdd1 tdd2 tds1 tds2} {1 {error renaming "tds1" to "[file join tdd1 tds1]": file already exists}} {1 {error renaming "tds2" to "[file join tdd2 tds2]": file already exists}} 1 0}]
  786. test fCmd-9.10 {file rename: comprehensive: file to new name and dir} {notRoot testchmod} {
  787.     cleanup
  788.     createfile tf1
  789.     createfile tf2
  790.     file mkdir td1
  791.     testchmod 444 tf2
  792.     file rename tf1 [file join td1 tf3]
  793.     file rename tf2 [file join td1 tf4]
  794.     list [catch {glob tf*}] [lsort [glob -directory td1 t*]] 
  795.     [file writable [file join td1 tf3]] [file writable [file join td1 tf4]]
  796. } [subst {1 {[file join td1 tf3] [file join td1 tf4]} 1 0}]
  797. test fCmd-9.11 {file rename: comprehensive: dir to new name and dir} {notRoot testchmod} {
  798.     cleanup
  799.     file mkdir td1
  800.     file mkdir td2
  801.     file mkdir td3
  802.     if {$tcl_platform(platform) != "unix" && $tcl_platform(platform) != "macintosh"} {
  803. testchmod 555 td2
  804.     }
  805.     file rename td1 [file join td3 td3]
  806.     file rename td2 [file join td3 td4]
  807.     if {$tcl_platform(platform) != "unix" && $tcl_platform(platform) != "macintosh"} {
  808. set w4 [file writable [file join td3 td4]]
  809.     } else {
  810.         set w4 0
  811.     }
  812.     list [lsort [glob td*]] [lsort [glob -directory td3 t*]] 
  813.     [file writable [file join td3 td3]] $w4
  814. } [subst {td3 {[file join td3 td3] [file join td3 td4]} 1 0}]
  815. test fCmd-9.12 {file rename: comprehensive: target exists} {notRoot testchmod notNetworkFilesystem} {
  816.     cleanup
  817.     file mkdir [file join td1 td2] [file join td2 td1]
  818.     if {$tcl_platform(platform) != "macintosh"} {
  819.      testchmod 555 [file join td2 td1]
  820.     }
  821.     file mkdir [file join td3 td4] [file join td4 td3]
  822.     file rename -force td3 td4
  823.     set msg [list [file exists td3] [file exists [file join td4 td3 td4]] 
  824.     [catch {file rename td1 td2} msg] $msg]
  825.     if {$tcl_platform(platform) != "macintosh"} {
  826.      testchmod 755 [file join td2 td1]
  827.     }
  828.     set msg
  829. } [subst {0 1 1 {error renaming "td1" to "[file join td2 td1]": file already exists}}]
  830. test fCmd-9.13 {file rename: comprehensive: can't overwrite target} {notRoot} {
  831.     cleanup
  832.     file mkdir [file join td1 td2] [file join td2 td1 td4]
  833.     list [catch {file rename -force td1 td2} msg] $msg
  834. } [subst {1 {error renaming "td1" to "[file join td2 td1]": file already exists}}]
  835. test fCmd-9.14 {file rename: comprehensive: dir into self} {notRoot} {
  836.     cleanup
  837.     file mkdir td1
  838.     list [glob td*] [list [catch {file rename td1 td1} msg] $msg]
  839. } [subst {td1 {1 {error renaming "td1" to "[file join td1 td1]": trying to rename a volume or move a directory into itself}}}]
  840. test fCmd-9.15 {file rename: comprehensive: source and target incompatible} 
  841. {notRoot} {
  842.     cleanup
  843.     file mkdir td1
  844.     createfile tf1
  845.     list [catch {file rename -force td1 tf1} msg] $msg
  846. } {1 {can't overwrite file "tf1" with directory "td1"}}
  847. test fCmd-9.16 {file rename: comprehensive: source and target incompatible} 
  848. {notRoot} {
  849.     cleanup
  850.     file mkdir td1/tf1
  851.     createfile tf1
  852.     list [catch {file rename -force tf1 td1} msg] $msg
  853. } [subst {1 {can't overwrite directory "[file join td1 tf1]" with file "tf1"}}]
  854. test fCmd-10.1 {file copy: comprehensive: source doesn't exist} {notRoot} {
  855.     cleanup
  856.     list [catch {file copy tf1 tf2} msg] $msg
  857. } {1 {error copying "tf1": no such file or directory}}
  858. test fCmd-10.2 {file copy: comprehensive: file to new name} {notRoot testchmod} {
  859.     cleanup
  860.     createfile tf1 tf1
  861.     createfile tf2 tf2
  862.     testchmod 444 tf2
  863.     file copy tf1 tf3
  864.     file copy tf2 tf4
  865.     list [lsort [glob tf*]] [contents tf3] [contents tf4] [file writable tf3] [file writable tf4]
  866. } {{tf1 tf2 tf3 tf4} tf1 tf2 1 0}
  867. test fCmd-10.3 {file copy: comprehensive: dir to new name} {notRoot unixOrPc 95or98 testchmod} {
  868.     cleanup
  869.     file mkdir [file join td1 tdx]
  870.     file mkdir [file join td2 tdy]
  871.     testchmod 555 td2
  872.     file copy td1 td3
  873.     file copy td2 td4
  874.     set msg [list [lsort [glob td*]] [glob -directory td3 t*] 
  875.     [glob -directory td4 t*] [file writable td3] [file writable td4]]
  876.     if {$tcl_platform(platform) != "macintosh"} {
  877.      testchmod 755 td2
  878.      testchmod 755 td4
  879.     }
  880.     set msg
  881. } [subst {{td1 td2 td3 td4} [file join td3 tdx] [file join td4 tdy] 1 0}]
  882. test fCmd-10.3.1 {file copy: comprehensive: dir to new name} {notRoot pc 2000orNewer testchmod} {
  883.     # On Windows with ACLs, copying a directory is defined like this
  884.     cleanup
  885.     file mkdir [file join td1 tdx]
  886.     file mkdir [file join td2 tdy]
  887.     testchmod 555 td2
  888.     file copy td1 td3
  889.     file copy td2 td4
  890.     set msg [list [lsort [glob td*]] [glob -directory td3 t*] 
  891.     [glob -directory td4 t*] [file writable td3] [file writable td4]]
  892.     testchmod 755 td2
  893.     testchmod 755 td4
  894.     set msg
  895. } [subst {{td1 td2 td3 td4} [file join td3 tdx] [file join td4 tdy] 1 1}]
  896. test fCmd-10.4 {file copy: comprehensive: file to existing file} {notRoot testchmod} {
  897.     cleanup
  898.     createfile tf1
  899.     createfile tf2
  900.     createfile tfs1
  901.     createfile tfs2
  902.     createfile tfs3
  903.     createfile tfs4
  904.     createfile tfd1
  905.     createfile tfd2
  906.     createfile tfd3
  907.     createfile tfd4
  908.     testchmod 444 tfs3
  909.     testchmod 444 tfs4
  910.     testchmod 444 tfd2
  911.     testchmod 444 tfd4
  912.     set msg [list [catch {file copy tf1 tf2} msg] $msg]
  913.     file copy -force tfs1 tfd1
  914.     file copy -force tfs2 tfd2
  915.     file copy -force tfs3 tfd3
  916.     file copy -force tfs4 tfd4
  917.     list [lsort [glob tf*]] $msg [file writable tfd1] [file writable tfd2] [file writable tfd3] [file writable tfd4] 
  918. } {{tf1 tf2 tfd1 tfd2 tfd3 tfd4 tfs1 tfs2 tfs3 tfs4} {1 {error copying "tf1" to "tf2": file already exists}} 1 1 0 0}
  919. test fCmd-10.5 {file copy: comprehensive: dir to empty dir} {notRoot testchmod} {
  920.     cleanup
  921.     file mkdir td1
  922.     file mkdir [file join td2 td1]
  923.     file mkdir tds1
  924.     file mkdir tds2
  925.     file mkdir tds3
  926.     file mkdir tds4
  927.     file mkdir [file join tdd1 tds1]
  928.     file mkdir [file join tdd2 tds2]
  929.     file mkdir [file join tdd3 tds3]
  930.     file mkdir [file join tdd4 tds4]
  931.     if {$tcl_platform(platform) != "macintosh"} {
  932. testchmod 555 tds3
  933. testchmod 555 tds4
  934. testchmod 555 [file join tdd2 tds2]
  935. testchmod 555 [file join tdd4 tds4]
  936.     }
  937.     set a1 [list [catch {file copy td1 td2} msg] $msg]
  938.     set a2 [list [catch {file copy -force tds1 tdd1} msg] $msg]
  939.     set a3 [catch {file copy -force tds2 tdd2}]
  940.     set a4 [catch {file copy -force tds3 tdd3}]
  941.     set a5 [catch {file copy -force tds4 tdd4}]
  942.     list [lsort [glob td*]] $a1 $a2 $a3 $a4 $a5 
  943. } [subst {{td1 td2 tdd1 tdd2 tdd3 tdd4 tds1 tds2 tds3 tds4} {1 {error copying "td1" to "[file join td2 td1]": file already exists}} {1 {error copying "tds1" to "[file join tdd1 tds1]": file already exists}} 1 1 1}]
  944. test fCmd-10.6 {file copy: comprehensive: dir to non-empty dir} 
  945. {notRoot unixOrPc testchmod} {
  946.     cleanup
  947.     file mkdir tds1
  948.     file mkdir tds2
  949.     file mkdir [file join tdd1 tds1 xxx]
  950.     file mkdir [file join tdd2 tds2 xxx]
  951.     testchmod 555 tds2
  952.     set a1 [list [catch {file copy -force tds1 tdd1} msg] $msg]
  953.     set a2 [list [catch {file copy -force tds2 tdd2} msg] $msg]
  954.     list [lsort [glob td*]] $a1 $a2 [file writable tds1] [file writable tds2]
  955. } [subst {{tdd1 tdd2 tds1 tds2} {1 {error copying "tds1" to "[file join tdd1 tds1]": file already exists}} {1 {error copying "tds2" to "[file join tdd2 tds2]": file already exists}} 1 0}]
  956. test fCmd-10.7 {file rename: comprehensive: file to new name and dir} {notRoot testchmod} {
  957.     cleanup
  958.     createfile tf1
  959.     createfile tf2
  960.     file mkdir td1
  961.     testchmod 444 tf2
  962.     file copy tf1 [file join td1 tf3]
  963.     file copy tf2 [file join td1 tf4]
  964.     list [lsort [glob tf*]] [lsort [glob -directory td1 t*]] 
  965.     [file writable [file join td1 tf3]] [file writable [file join td1 tf4]]
  966. } [subst {{tf1 tf2} {[file join td1 tf3] [file join td1 tf4]} 1 0}]
  967. test fCmd-10.8 {file rename: comprehensive: dir to new name and dir} 
  968. {notRoot unixOrPc 95or98 testchmod} {
  969.     cleanup
  970.     file mkdir td1
  971.     file mkdir td2
  972.     file mkdir td3
  973.     testchmod 555 td2
  974.     file copy td1 [file join td3 td3]
  975.     file copy td2 [file join td3 td4]
  976.     list [lsort [glob td*]] [lsort [glob -directory td3 t*]] 
  977.     [file writable [file join td3 td3]] [file writable [file join td3 td4]]
  978. } [subst {{td1 td2 td3} {[file join td3 td3] [file join td3 td4]} 1 0}]
  979. test fCmd-10.8.1 {file rename: comprehensive: dir to new name and dir} 
  980. {notRoot pc 2000orNewer testchmod} {
  981.     # On Windows with ACLs, copying a directory is defined like this
  982.     cleanup
  983.     file mkdir td1
  984.     file mkdir td2
  985.     file mkdir td3
  986.     testchmod 555 td2
  987.     file copy td1 [file join td3 td3]
  988.     file copy td2 [file join td3 td4]
  989.     list [lsort [glob td*]] [lsort [glob -directory td3 t*]] 
  990.     [file writable [file join td3 td3]] [file writable [file join td3 td4]]
  991. } [subst {{td1 td2 td3} {[file join td3 td3] [file join td3 td4]} 1 1}]
  992. test fCmd-10.9 {file copy: comprehensive: source and target incompatible} 
  993. {notRoot} {
  994.     cleanup
  995.     file mkdir td1
  996.     createfile tf1
  997.     list [catch {file copy -force td1 tf1} msg] $msg
  998. } {1 {can't overwrite file "tf1" with directory "td1"}}
  999. test fCmd-10.10 {file copy: comprehensive: source and target incompatible} 
  1000. {notRoot} {
  1001.     cleanup
  1002.     file mkdir [file join td1 tf1]
  1003.     createfile tf1
  1004.     list [catch {file copy -force tf1 td1} msg] $msg
  1005. } [subst {1 {can't overwrite directory "[file join td1 tf1]" with file "tf1"}}]
  1006. test fCmd-10.11 {file copy: copy to empty file name} {
  1007.     cleanup
  1008.     createfile tf1
  1009.     list [catch {file copy tf1 ""} msg] $msg
  1010. } {1 {error copying "tf1" to "": no such file or directory}}
  1011. test fCmd-10.12 {file rename: rename to empty file name} {
  1012.     cleanup
  1013.     createfile tf1
  1014.     list [catch {file rename tf1 ""} msg] $msg
  1015. } {1 {error renaming "tf1" to "": no such file or directory}}
  1016. cleanup    
  1017. # old tests    
  1018. test fCmd-11.1 {TclFileRenameCmd: -- option } {notRoot} {
  1019.     catch {file delete -force -- -tfa1}
  1020.     set s [createfile -tfa1]
  1021.     file rename -- -tfa1 tfa2
  1022.     set result [expr [checkcontent tfa2 $s] && ![file exists -tfa1]]
  1023.     file delete tfa2
  1024.     set result
  1025. } {1}
  1026. test fCmd-11.2 {TclFileRenameCmd: bad option } {notRoot} {
  1027.     catch {file delete -force -- tfa1}
  1028.     set s [createfile tfa1]
  1029.     set r1 [catch {file rename -x tfa1 tfa2}]
  1030.     set result [expr $r1 && [checkcontent tfa1 $s] && ![file exists tfa2]]
  1031.     file delete tfa1
  1032.     set result
  1033. } {1}
  1034. test fCmd-11.3 {TclFileRenameCmd: bad # args} {
  1035.     catch {file rename -- }
  1036. } {1}
  1037. test fCmd-11.4 {TclFileRenameCmd: target filename translation failing} {notRoot} {
  1038.      global env
  1039.      set temp $env(HOME)
  1040.      unset env(HOME)
  1041.      set result [catch {file rename tfa ~/foobar }]
  1042.      set env(HOME) $temp
  1043.      set result
  1044.  } {1}
  1045. test fCmd-11.5 {TclFileRenameCmd: > 1 source & target is not a dir} {notRoot} {
  1046.     catch {file delete -force -- tfa1 tfa2 tfa3}
  1047.     createfile tfa1 
  1048.     createfile tfa2 
  1049.     createfile tfa3 
  1050.     set result [catch {file rename tfa1 tfa2 tfa3}]
  1051.     file delete tfa1 tfa2 tfa3
  1052.     set result
  1053. } {1}
  1054. test fCmd-11.6 {TclFileRenameCmd: : single file into directory} {notRoot} {
  1055.     catch {file delete -force -- tfa1 tfad}
  1056.     set s [createfile tfa1]
  1057.     file mkdir tfad
  1058.     file rename tfa1 tfad
  1059.     set result [expr [checkcontent tfad/tfa1 $s] && ![file exists tfa1]]
  1060.     file delete -force tfad
  1061.     set result
  1062. } {1}
  1063. test fCmd-11.7 {TclFileRenameCmd: : multiple files into directory} {notRoot} {
  1064.     catch {file delete -force -- tfa1 tfa2 tfad}
  1065.     set s1 [createfile tfa1 ]
  1066.     set s2 [createfile tfa2 ]
  1067.     file mkdir tfad
  1068.     file rename tfa1 tfa2 tfad
  1069.     set r1 [checkcontent tfad/tfa1 $s1]
  1070.     set r2 [checkcontent tfad/tfa2 $s2]
  1071.     
  1072.     set result [expr $r1 && $r2 && ![file exists tfa1] && ![file exists tfa2]]
  1073.     
  1074.     file delete -force tfad
  1075.     set result
  1076. } {1}
  1077. test fCmd-11.8 {TclFileRenameCmd: error renaming file to directory} {notRoot} {
  1078.     catch {file delete -force -- tfa tfad}
  1079.     set s [createfile tfa ]
  1080.     file mkdir tfad
  1081.     file mkdir tfad/tfa
  1082.     set r1 [catch {file rename tfa tfad}]
  1083.     set r2 [checkcontent tfa $s]
  1084.     set r3 [file isdir tfad]
  1085.     set result [expr $r1 && $r2 && $r3 ]
  1086.     file delete -force tfa tfad
  1087.     set result
  1088. } {1}
  1089. #
  1090. # Coverage tests for renamefile() ;
  1091. #
  1092. test fCmd-12.1 {renamefile: source filename translation failing} {notRoot} {
  1093.     global env
  1094.     set temp $env(HOME)
  1095.     unset env(HOME)
  1096.     set result [catch {file rename ~/tfa1 tfa2}]
  1097.     set env(HOME) $temp
  1098.     set result
  1099. } {1}
  1100. test fCmd-12.2 {renamefile: src filename translation failing} {notRoot} {
  1101.     global env
  1102.     set temp $env(HOME)
  1103.     unset env(HOME)
  1104.     set s [createfile tfa1]
  1105.     file mkdir tfad
  1106.     set result [catch {file rename tfa1 ~/tfa2 tfad}]
  1107.     set env(HOME) $temp
  1108.     file delete -force tfad
  1109.     set result
  1110. } {1}
  1111. test fCmd-12.3 {renamefile: stat failing on source} {notRoot} {
  1112.     catch {file delete -force -- tfa1 tfa2}
  1113.     set r1 [catch {file rename tfa1 tfa2}]
  1114.     expr {$r1 && ![file exists tfa1] && ![file exists tfa2]}
  1115. } {1}
  1116. test fCmd-12.4 {renamefile: error renaming file to directory} {notRoot} {
  1117.     catch {file delete -force -- tfa tfad}
  1118.     set s1 [createfile tfa ]
  1119.     file mkdir tfad
  1120.     file mkdir tfad/tfa
  1121.     set r1 [catch {file rename tfa tfad}]
  1122.     set r2 [checkcontent tfa $s1]
  1123.     set r3 [file isdir tfad/tfa]
  1124.     set result [expr $r1 && $r2 && $r3]
  1125.     file delete -force tfa tfad
  1126.     set result
  1127. } {1}
  1128. test fCmd-12.5 {renamefile: error renaming directory to file} {notRoot} {
  1129.     catch {file delete -force -- tfa tfad}
  1130.     file mkdir tfa
  1131.     file mkdir tfad
  1132.     set s [createfile tfad/tfa]
  1133.     set r1 [catch {file rename tfa tfad}]
  1134.     set r2 [checkcontent tfad/tfa $s]
  1135.     set r3 [file isdir tfad]
  1136.     set r4 [file isdir tfa]
  1137.     set result [expr $r1 && $r2 && $r3 && $r4 ]
  1138.     file delete -force tfa tfad
  1139.     set result
  1140. } {1}
  1141. test fCmd-12.6 {renamefile: TclRenameFile succeeding} {notRoot} {
  1142.     catch {file delete -force -- tfa1 tfa2}
  1143.     set s [createfile tfa1]
  1144.     file rename tfa1 tfa2
  1145.     set result [expr [checkcontent tfa2 $s] && ![file exists tfa1]]
  1146.     file delete tfa2
  1147.     set result
  1148. } {1}
  1149. test fCmd-12.7 {renamefile: renaming directory into offspring} {notRoot} {
  1150.     catch {file delete -force -- tfad}
  1151.     file mkdir tfad
  1152.     file mkdir tfad/dir
  1153.     set result [catch {file rename tfad tfad/dir}]
  1154.     file delete -force tfad 
  1155.     set result
  1156. } {1}
  1157. test fCmd-12.8 {renamefile: generic error} {unixOnly notRoot} {
  1158.     catch {file delete -force -- tfa}
  1159.     file mkdir tfa
  1160.     file mkdir tfa/dir
  1161.     file attributes tfa -permissions 0555
  1162.     set result [catch {file rename tfa/dir tfa2}]
  1163.     file attributes tfa -permissions 0777
  1164.     file delete -force tfa
  1165.     set result
  1166. } {1}
  1167. test fCmd-12.9 {renamefile: moving a file across volumes} {unixOnly notRoot} {
  1168.     catch {file delete -force -- tfa /tmp/tfa}
  1169.     set s [createfile tfa ]
  1170.     file rename tfa /tmp
  1171.     set result [expr [checkcontent /tmp/tfa $s] && ![file exists tfa]]
  1172.     file delete /tmp/tfa
  1173.     set result
  1174. } {1}
  1175. test fCmd-12.10 {renamefile: moving a directory across volumes } 
  1176. {unixOnly notRoot} {
  1177.     catch {file delete -force -- tfad /tmp/tfad}
  1178.     file mkdir tfad
  1179.     set s [createfile tfad/a ]
  1180.     file rename tfad /tmp
  1181.     set restul [expr [checkcontent /tmp/tfad/a $s] && ![file exists tfad]]
  1182.     file delete -force /tmp/tfad
  1183.     set result
  1184. } {1}
  1185. #
  1186. # Coverage tests for TclCopyFilesCmd()
  1187. #
  1188. test fCmd-13.1 {TclCopyFilesCmd: -force option} {notRoot} {
  1189.     catch {file delete -force -- tfa1}
  1190.     set s [createfile tfa1]
  1191.     file copy -force  tfa1 tfa2
  1192.     set result [expr [checkcontent tfa2 $s] && [checkcontent tfa1 $s]]
  1193.     file delete tfa1 tfa2
  1194.     set result
  1195. } {1}
  1196. test fCmd-13.2 {TclCopyFilesCmd: -- option} {notRoot} {
  1197.     catch {file delete -force -- tfa1}
  1198.     set s [createfile -tfa1]
  1199.     file copy --  -tfa1 tfa2
  1200.     set result [expr [checkcontent tfa2 $s] &&  [checkcontent -tfa1 $s]]
  1201.     file delete -- -tfa1 tfa2
  1202.     set result
  1203. } {1}
  1204. test fCmd-13.3 {TclCopyFilesCmd: bad option} {notRoot} {
  1205.     catch {file delete -force -- tfa1}
  1206.     set s [createfile tfa1]
  1207.     set r1 [catch {file copy -x tfa1 tfa2}]
  1208.     set result [expr $r1 && [checkcontent tfa1 $s] && ![file exists tfa2]]
  1209.     file delete tfa1
  1210.     set result
  1211. } {1}
  1212. test fCmd-13.4 {TclCopyFilesCmd: bad # args} {notRoot} {
  1213.     catch {file copy -- }
  1214. } {1}
  1215. test fCmd-13.5 {TclCopyFilesCmd: target filename translation failing} {
  1216.      global env
  1217.      set temp $env(HOME)
  1218.     unset env(HOME)
  1219.      set result [catch {file copy tfa ~/foobar }]
  1220.      set env(HOME) $temp
  1221.      set result
  1222.  } {1}
  1223. test fCmd-13.6 {TclCopyFilesCmd: > 1 source & target is not a dir} {notRoot} {
  1224.     catch {file delete -force -- tfa1 tfa2 tfa3}
  1225.     createfile tfa1 
  1226.     createfile tfa2 
  1227.     createfile tfa3 
  1228.     set result [catch {file copy tfa1 tfa2 tfa3}]
  1229.     file delete tfa1 tfa2 tfa3
  1230.     set result
  1231. } {1}
  1232. test fCmd-13.7 {TclCopyFilesCmd: single file into directory} {notRoot} {
  1233.     catch {file delete -force -- tfa1 tfad}
  1234.     set s [createfile tfa1]
  1235.     file mkdir tfad
  1236.     file copy tfa1 tfad
  1237.     set result [expr [checkcontent tfad/tfa1 $s] &&  [checkcontent tfa1 $s]]
  1238.     file delete -force tfad tfa1
  1239.     set result
  1240. } {1}
  1241. test fCmd-13.8 {TclCopyFilesCmd: multiple files into directory} {notRoot} {
  1242.     catch {file delete -force -- tfa1 tfa2 tfad}
  1243.     set s1 [createfile tfa1 ]
  1244.     set s2 [createfile tfa2 ]
  1245.     file mkdir tfad
  1246.     file copy tfa1 tfa2 tfad
  1247.     set r1 [checkcontent tfad/tfa1 $s1]
  1248.     set r2 [checkcontent tfad/tfa2 $s2]
  1249.     set r3 [checkcontent tfa1 $s1]
  1250.     set r4 [checkcontent tfa2 $s2]
  1251.     set result [expr $r1 && $r2 && $r3 && $r4 ]
  1252.     
  1253.     file delete -force tfad tfa1 tfa2
  1254.     set result
  1255. } {1}
  1256. test fCmd-13.9 {TclCopyFilesCmd: error copying file to directory} {notRoot} {
  1257.     catch {file delete -force -- tfa tfad}
  1258.     set s [createfile tfa ]
  1259.     file mkdir tfad
  1260.     file mkdir tfad/tfa
  1261.     set r1 [catch {file copy tfa tfad}]
  1262.     set r2 [expr [checkcontent tfa $s] && [file isdir tfad/tfa]]
  1263.     set r3 [file isdir tfad]
  1264.     set result [expr $r1 && $r2 && $r3 ]
  1265.     file delete -force tfa tfad
  1266.     set result
  1267. } {1}
  1268. #
  1269. # Coverage tests for copyfile()
  1270. test fCmd-14.1 {copyfile: source filename translation failing} {notRoot} {
  1271.     global env
  1272.     set temp $env(HOME)
  1273.     unset env(HOME)
  1274.     set result [catch {file copy ~/tfa1 tfa2}]
  1275.     set env(HOME) $temp
  1276.     set result
  1277. } {1}
  1278. test fCmd-14.2 {copyfile: dst filename translation failing} {notRoot} {
  1279.     global env
  1280.     set temp $env(HOME)
  1281.     unset env(HOME)
  1282.     set s [createfile tfa1]
  1283.     file mkdir tfad
  1284.     set r1 [catch {file copy tfa1 ~/tfa2 tfad}]
  1285.     set result [expr $r1 && [checkcontent tfad/tfa1 $s]]
  1286.     set env(HOME) $temp
  1287.     file delete -force tfa1 tfad
  1288.     set result
  1289. } {1}
  1290. test fCmd-14.3 {copyfile: stat failing on source} {notRoot} {
  1291.     catch {file delete -force -- tfa1 tfa2}
  1292.     set r1 [catch {file copy tfa1 tfa2}]
  1293.     expr $r1 && ![file exists tfa1] && ![file exists tfa2]
  1294. } {1}
  1295. test fCmd-14.4 {copyfile: error copying file to directory} {notRoot} {
  1296.     catch {file delete -force -- tfa tfad}
  1297.     set s1 [createfile tfa ]
  1298.     file mkdir tfad
  1299.     file mkdir tfad/tfa
  1300.     set r1 [catch {file copy tfa tfad}]
  1301.     set r2 [checkcontent tfa $s1]
  1302.     set r3 [file isdir tfad]
  1303.     set r4 [file isdir tfad/tfa]
  1304.     set result [expr $r1 && $r2 && $r3 && $r4 ]
  1305.     file delete -force tfa tfad
  1306.     set result
  1307. } {1}
  1308.  test fCmd-14.5 {copyfile: error copying directory to file} {notRoot} {
  1309.      catch {file delete -force -- tfa tfad}
  1310.      file mkdir tfa
  1311.      file mkdir tfad
  1312.      set s [createfile tfad/tfa]
  1313.      set r1 [catch {file copy tfa tfad}]
  1314.      set r2 [checkcontent tfad/tfa $s]
  1315.      set r3 [file isdir tfad]
  1316.      set r4 [file isdir tfa]
  1317.      set result [expr $r1 && $r2 && $r3 && $r4 ]
  1318.      file delete -force tfa tfad
  1319.      set result
  1320. } {1}
  1321. test fCmd-14.6 {copyfile: copy file succeeding} {notRoot} {
  1322.     catch {file delete -force -- tfa tfa2}
  1323.     set s [createfile tfa]
  1324.     file copy tfa tfa2
  1325.     set result [expr  [checkcontent tfa $s] && [checkcontent tfa2 $s]]
  1326.     file delete tfa tfa2
  1327.     set result
  1328. } {1}
  1329. test fCmd-14.7 {copyfile: copy directory succeeding} {notRoot} {
  1330.     catch {file delete -force -- tfa tfa2}
  1331.     file mkdir tfa
  1332.     set s [createfile tfa/file]
  1333.     file copy tfa tfa2
  1334.     set result [expr [checkcontent tfa/file $s] && [checkcontent tfa2/file $s]]
  1335.     file delete -force tfa tfa2
  1336.     set result
  1337. } {1}
  1338. test fCmd-14.8 {copyfile: copy directory failing} {unixOnly notRoot} {
  1339.     catch {file delete -force -- tfa}
  1340.     file mkdir tfa/dir/a/b/c
  1341.     file attributes tfa/dir -permissions 0000
  1342.     set r1 [catch {file copy tfa tfa2}]
  1343.     file attributes tfa/dir -permissions 0777
  1344.     set result $r1
  1345.     file delete -force tfa tfa2
  1346.     set result
  1347. } {1}
  1348. #
  1349. # Coverage tests for TclMkdirCmd()
  1350. #
  1351. test fCmd-15.1 {TclMakeDirsCmd: target filename translation failing} {notRoot} {
  1352.     global env
  1353.     set temp $env(HOME)
  1354.     unset env(HOME) 
  1355.     set result [catch {file mkdir ~/tfa}]
  1356.     set env(HOME) $temp
  1357.     set result
  1358. } {1}
  1359. #
  1360. # Can Tcl_SplitPath return argc == 0? If so them we need a
  1361. # test for that code.
  1362. #
  1363. test fCmd-15.2 {TclMakeDirsCmd - one directory } {notRoot} {
  1364.     catch {file delete -force -- tfa}
  1365.     file mkdir tfa
  1366.     set result [file isdirectory tfa]
  1367.     file delete tfa
  1368.     set result
  1369. } {1}
  1370. test fCmd-15.3 {TclMakeDirsCmd: - two directories} {notRoot} {
  1371.     catch {file delete -force -- tfa1 tfa2}
  1372.     file mkdir tfa1 tfa2
  1373.     set result [expr [file isdirectory tfa1] && [file isdirectory tfa2]]
  1374.     file delete tfa1 tfa2
  1375.     set result
  1376. } {1}
  1377. test fCmd-15.4 {TclMakeDirsCmd - stat failing} {unixOnly notRoot} {
  1378.     catch {file delete -force -- tfa}
  1379.     file mkdir tfa
  1380.     createfile tfa/file
  1381.     file attributes tfa -permissions 0000
  1382.     set result [catch {file mkdir tfa/file}]
  1383.     file attributes tfa -permissions 0777
  1384.     file delete -force tfa
  1385.     set result
  1386. } {1}
  1387. test fCmd-15.5 {TclMakeDirsCmd: - making a directory several levels deep} 
  1388. {notRoot} {
  1389.     catch {file delete -force -- tfa}
  1390.     file mkdir tfa/a/b/c
  1391.     set result [file isdir tfa/a/b/c]
  1392.     file delete -force tfa
  1393.     set result
  1394. } {1}
  1395.     
  1396. test fCmd-15.6 {TclMakeDirsCmd: - trying to overwrite a file} {notRoot} {
  1397.     catch {file delete -force -- tfa}
  1398.     set s [createfile tfa]
  1399.     set r1 [catch {file mkdir tfa}]
  1400.     set r2 [file isdir tfa]
  1401.     set r3 [file exists tfa]
  1402.     set result [expr $r1 && !$r2 && $r3 && [checkcontent tfa $s]]
  1403.     file delete tfa
  1404.     set result
  1405. } {1}
  1406. test fCmd-15.7 {TclMakeDirsCmd - making several directories} {notRoot} {
  1407.     catch {file delete -force -- tfa1 tfa2}
  1408.     file mkdir tfa1 tfa2/a/b/c
  1409.     set result [expr [file isdir tfa1] && [file isdir tfa2/a/b/c]]
  1410.     file delete -force tfa1 tfa2
  1411.     set result
  1412. } {1}
  1413. test fCmd-15.8 {TclFileMakeDirsCmd: trying to create an existing dir} {notRoot} {
  1414.     file mkdir tfa
  1415.     file mkdir tfa
  1416.     set result [file isdir tfa]
  1417.     file delete tfa
  1418.     set result
  1419. } {1}
  1420. # Coverage tests for TclDeleteFilesCommand()
  1421. test fCmd-16.1 {test the -- argument} {notRoot} {
  1422.     catch {file delete -force -- tfa}
  1423.     createfile tfa
  1424.     file delete -- tfa
  1425.     file exists tfa
  1426. } {0}
  1427. test fCmd-16.2 {test the -force and -- arguments} {notRoot} {
  1428.     catch {file delete -force -- tfa}
  1429.     createfile tfa
  1430.     file delete -force -- tfa
  1431.     file exists tfa
  1432. } {0}
  1433. test fCmd-16.3 {test bad option} {notRoot} {
  1434.     catch {file delete -force -- tfa}
  1435.     createfile tfa
  1436.     set result [catch {file delete -dog tfa}]
  1437.     file delete tfa
  1438.     set result
  1439. } {1}
  1440. test fCmd-16.4 {test not enough args} {notRoot} {
  1441.     catch {file delete}
  1442. } {1}
  1443. test fCmd-16.5 {test not enough args with options} {notRoot} {
  1444.     catch {file delete --}
  1445. } {1}
  1446. test fCmd-16.6 {delete: source filename translation failing} {notRoot} {
  1447.     global env
  1448.     set temp $env(HOME)
  1449.     unset env(HOME)
  1450.     set result [catch {file delete ~/tfa}]
  1451.     set env(HOME) $temp
  1452.     set result
  1453. } {1}
  1454. test fCmd-16.7 {remove a non-empty directory without -force } {notRoot} {
  1455.     catch {file delete -force -- tfa}
  1456.     file mkdir tfa
  1457.     createfile tfa/a
  1458.     set result [catch  {file delete tfa }]
  1459.     file delete -force tfa
  1460.     set result
  1461. } {1}
  1462. test fCmd-16.8 {remove a normal file } {notRoot} {
  1463.     catch {file delete -force -- tfa}
  1464.     file mkdir tfa
  1465.     createfile tfa/a
  1466.     set result [catch  {file delete tfa }]
  1467.     file delete -force tfa
  1468.     set result
  1469. } {1}
  1470. test fCmd-16.9 {error while deleting file } {unixOnly notRoot} {
  1471.     catch {file delete -force -- tfa}
  1472.     file mkdir tfa
  1473.     createfile tfa/a
  1474.     file attributes tfa -permissions 0555
  1475.     set result [catch  {file delete tfa/a }]
  1476.     #######
  1477.     #######  If any directory in a tree that is being removed does not 
  1478.     #######  have write permission, the process will fail!
  1479.     #######  This is also the case with "rm -rf"
  1480.     #######
  1481.     file attributes tfa -permissions 0777
  1482.     file delete -force tfa
  1483.     set result
  1484. } {1}
  1485. test fCmd-16.10 {deleting multiple files} {notRoot} {
  1486.     catch {file delete -force -- tfa1 tfa2}
  1487.     createfile tfa1
  1488.     createfile tfa2
  1489.     file delete tfa1 tfa2
  1490.     expr ![file exists tfa1] && ![file exists tfa2]
  1491. } {1}
  1492. test fCmd-16.11 {TclFileDeleteCmd: removing a nonexistant file} {notRoot} {
  1493.     catch {file delete -force -- tfa}
  1494.     file delete tfa
  1495.     set result 1
  1496. } {1}
  1497. # More coverage tests for mkpath()
  1498.  test fCmd-17.1 {mkdir stat failing on target but not ENOENT} {unixOnly notRoot} {
  1499.      catch {file delete -force -- tfa1}
  1500.      file mkdir tfa1
  1501.      file attributes tfa1 -permissions 0555
  1502.      set result [catch {file mkdir tfa1/tfa2}]
  1503.      file attributes tfa1 -permissions 0777
  1504.      file delete -force tfa1
  1505.      set result
  1506. } {1}
  1507. test fCmd-17.2 {mkdir several levels deep - relative } {notRoot} {
  1508.     catch {file delete -force -- tfa}
  1509.     file mkdir tfa/a/b
  1510.     set result [file isdir tfa/a/b ]
  1511.     file delete tfa/a/b tfa/a tfa
  1512.     set result
  1513. } {1}
  1514. test fCmd-17.3 {mkdir several levels deep - absolute } {notRoot} {
  1515.     catch {file delete -force -- tfa}
  1516.     set f [file join [pwd] tfa a ]
  1517.     file mkdir $f
  1518.     set result [file isdir $f ]
  1519.     file delete $f [file join [pwd] tfa]
  1520.     set result
  1521. } {1}
  1522. #
  1523. # Functionality tests for TclFileRenameCmd()
  1524. #
  1525. test fCmd-18.1 {TclFileRenameCmd: rename (first form) in the same directory} 
  1526. {notRoot} {
  1527.     catch {file delete -force -- tfad}
  1528.     file mkdir tfad/dir
  1529.     cd tfad/dir
  1530.     set s [createfile foo ]
  1531.     file rename  foo bar
  1532.     file rename bar ./foo
  1533.     file rename ./foo bar
  1534.     file rename ./bar ./foo
  1535.     file rename foo ../dir/bar
  1536.     file rename ../dir/bar ./foo
  1537.     file rename ../../tfad/dir/foo ../../tfad/dir/bar
  1538.     file rename [file join [pwd] bar] foo
  1539.     file rename foo [file join [pwd] bar]
  1540.     set result [expr [checkcontent bar $s] && ![file exists foo]]
  1541.     cd ../..
  1542.     file delete -force tfad
  1543.     set result
  1544. } {1}
  1545. test fCmd-18.2 {TclFileRenameCmd: single dir to nonexistant} {notRoot} {
  1546.     catch {file delete -force -- tfa1 tfa2}
  1547.     file mkdir tfa1
  1548.     file rename tfa1 tfa2
  1549.     set result [expr [file exists tfa2] && ![file exists tfa1]]
  1550.     file delete tfa2
  1551.     set result
  1552. } {1}
  1553. test fCmd-18.3 {TclFileRenameCmd: mixed dirs and files into directory} {notRoot} {
  1554.     catch {file delete -force -- tfa1 tfad1 tfad2}
  1555.     set s [createfile tfa1 ]
  1556.     file mkdir tfad1 tfad2
  1557.     file rename tfa1 tfad1 tfad2
  1558.     set r1 [checkcontent  tfad2/tfa1 $s]
  1559.     set r2 [file isdir tfad2/tfad1]
  1560.     set result [expr $r1 && $r2 && ![file exists tfa1] && ![file exists tfad1]]
  1561.     file delete tfad2/tfa1
  1562.     file delete -force tfad2
  1563.     set result
  1564. } {1}
  1565. test fCmd-18.4 {TclFileRenameCmd: attempt to replace non-dir with dir} {notRoot} {
  1566.     catch {file delete -force -- tfa tfad}
  1567.     set s [createfile tfa ]
  1568.     file mkdir tfad
  1569.     set r1 [catch {file rename tfad tfa}]
  1570.     set r2 [checkcontent tfa $s]
  1571.     set r3 [file isdir tfad]
  1572.     set result [expr $r1 && $r2 && $r3 ]
  1573.     file delete tfa tfad
  1574.     set result
  1575. } {1}
  1576. test fCmd-18.5 {TclFileRenameCmd: attempt to replace dir with non-dir} {notRoot} {
  1577.     catch {file delete -force -- tfa tfad}
  1578.     set s [createfile tfa ]
  1579.     file mkdir tfad/tfa
  1580.     set r1 [catch {file rename tfa tfad}]
  1581.     set r2 [checkcontent tfa $s]
  1582.     set r3 [file isdir tfad/tfa]
  1583.     set result [expr $r1 && $r2 && $r3 ]
  1584.     file delete -force  tfa tfad
  1585.     set result
  1586. } {1}
  1587. #
  1588. # On Windows there is no easy way to determine if two files are the same
  1589. #
  1590. test fCmd-18.6 {TclFileRenameCmd: rename a file to itself} {macOrUnix notRoot} {
  1591.     catch {file delete -force -- tfa}
  1592.     set s [createfile tfa]
  1593.     set r1 [catch {file rename tfa tfa}]
  1594.     set result [expr $r1 && [checkcontent tfa $s]]
  1595.     file delete tfa
  1596.     set result
  1597. } {1}
  1598. test fCmd-18.7 {TclFileRenameCmd: rename dir on top of another empty dir w/o -force} 
  1599. {notRoot} {
  1600.     catch {file delete -force -- tfa tfad}
  1601.     file mkdir tfa tfad/tfa
  1602.     set r1 [catch {file rename tfa tfad}]
  1603.     set result [expr $r1 && [file isdir tfa]]
  1604.     file delete -force tfa tfad
  1605.     set result
  1606. } {1}
  1607. test fCmd-18.8 {TclFileRenameCmd: rename dir on top of another empty dir w/ -force} 
  1608. {notRoot notNetworkFilesystem} {
  1609.     catch {file delete -force -- tfa tfad}
  1610.     file mkdir tfa tfad/tfa
  1611.     file rename -force tfa tfad
  1612.     set result [expr ![file isdir tfa]]
  1613.     file delete -force tfad
  1614.     set result
  1615. } {1}
  1616. test fCmd-18.9 {TclFileRenameCmd: rename dir on top of a non-empty dir w/o -force} 
  1617. {notRoot} {
  1618.     catch {file delete -force -- tfa tfad}
  1619.     file mkdir tfa tfad/tfa/file
  1620.     set r1 [catch {file rename tfa tfad}]
  1621.     set result [expr $r1 && [file isdir tfa] && [file isdir tfad/tfa/file]]
  1622.     file delete -force tfa tfad
  1623.     set result
  1624. } {1}
  1625. test fCmd-18.10 {TclFileRenameCmd: rename dir on top of a non-empty dir w/ -force} 
  1626. {notRoot notNetworkFilesystem} {
  1627.     catch {file delete -force -- tfa tfad}
  1628.     file mkdir tfa tfad/tfa/file
  1629.     set r1 [catch {file rename -force tfa tfad}]
  1630.     set result [expr $r1 && [file isdir tfa] && [file isdir tfad/tfa/file]]
  1631.     file delete -force tfa tfad
  1632.     set result
  1633. } {1}
  1634. test fCmd-18.11 {TclFileRenameCmd: rename a non-existant file} {notRoot} {
  1635.     catch {file delete -force -- tfa1}
  1636.     set r1 [catch {file rename tfa1 tfa2}]
  1637.     set result [expr $r1 && ![file exists tfa1] && ![file exists tfa2]]
  1638. } {1}
  1639. test fCmd-18.12 {TclFileRenameCmd : rename a symbolic link to file} 
  1640. {unixOnly notRoot} {
  1641.     catch {file delete -force -- tfa1 tfa2 tfa3}
  1642.     set s [createfile tfa1]
  1643.     file link -symbolic tfa2 tfa1
  1644.     file rename tfa2 tfa3
  1645.     set t [file type tfa3]
  1646.     set result [expr {$t eq "link"}]
  1647.     file delete tfa1 tfa3
  1648.     set result
  1649. } {1}
  1650. test fCmd-18.13 {TclFileRenameCmd : rename a symbolic link to dir} 
  1651. {unixOnly notRoot} {
  1652.     catch {file delete -force -- tfa1 tfa2 tfa3}
  1653.     file mkdir tfa1
  1654.     file link -symbolic tfa2 tfa1
  1655.     file rename tfa2 tfa3
  1656.     set t [file type tfa3]
  1657.     set result [expr {$t eq "link"}]
  1658.     file delete tfa1 tfa3
  1659.     set result
  1660. } {1}
  1661. test fCmd-18.14 {TclFileRenameCmd : rename a path with sym link} 
  1662. {unixOnly notRoot} {
  1663.     catch {file delete -force -- tfa1 tfa2 tfa3}
  1664.     file mkdir tfa1/a/b/c/d
  1665.     file mkdir tfa2
  1666.     set f [file join [pwd] tfa1/a/b] 
  1667.     set f2 [file join [pwd] {tfa2/b alias}]
  1668.     file link -symbolic $f2 $f
  1669.     file rename {tfa2/b alias/c} tfa3
  1670.     set r1 [file isdir tfa3]
  1671.     set r2 [file exists tfa1/a/b/c]
  1672.     set result [expr $r1 && !$r2]
  1673.     file delete -force tfa1 tfa2 tfa3
  1674.     set result
  1675. } {1}
  1676. test fCmd-18.15 {TclFileRenameCmd : rename a file to a symlink dir} 
  1677. {unixOnly notRoot} {
  1678.     catch {file delete -force -- tfa1 tfa2 tfalink}
  1679.     file mkdir tfa1
  1680.     set s [createfile tfa2]
  1681.     file link -symbolic tfalink tfa1
  1682.     file rename tfa2 tfalink
  1683.     set result [checkcontent tfa1/tfa2 $s ]
  1684.     file delete -force tfa1 tfalink
  1685.     set result
  1686. } {1}
  1687. test fCmd-18.16 {TclFileRenameCmd: rename a dangling symlink} {unixOnly notRoot} {
  1688.     catch {file delete -force -- tfa1 tfalink}
  1689.     file mkdir tfa1
  1690.     file link -symbolic tfalink tfa1
  1691.     file delete tfa1 
  1692.     file rename tfalink tfa2
  1693.     set result [expr [string compare [file type tfa2] "link"] == 0]
  1694.     file delete tfa2
  1695.     set result
  1696. } {1}
  1697. #
  1698. # Coverage tests for TclUnixRmdir
  1699. #
  1700. test fCmd-19.1 {remove empty directory} {notRoot} {
  1701.     catch {file delete -force -- tfa}
  1702.     file mkdir tfa
  1703.     file delete tfa
  1704.     file exists tfa
  1705. } {0}
  1706. test fCmd-19.2 {rmdir error besides EEXIST} {unixOnly notRoot} {
  1707.     catch {file delete -force -- tfa}
  1708.     file mkdir tfa
  1709.     file mkdir tfa/a
  1710.     file attributes tfa -permissions 0555
  1711.     set result [catch {file delete tfa/a}]
  1712.     file attributes tfa -permissions 0777
  1713.     file delete -force tfa
  1714.     set result
  1715. } {1}
  1716. test fCmd-19.3 {recursive remove} {notRoot} {
  1717.     catch {file delete -force -- tfa}
  1718.     file mkdir tfa
  1719.     file mkdir tfa/a
  1720.     file delete -force tfa
  1721.     file exists tfa
  1722. } {0}
  1723. #
  1724. # TclUnixDeleteFile and TraversalDelete are covered by tests from the 
  1725. # TclDeleteFilesCmd suite
  1726. #
  1727. #
  1728. #
  1729. # Coverage tests for TraverseUnixTree(), called from TclDeleteFilesCmd
  1730. #
  1731. test fCmd-20.1 {TraverseUnixTree : failure opening a subdirectory directory } 
  1732. {unixOnly notRoot} {
  1733.     catch {file delete -force -- tfa}
  1734.     file mkdir tfa
  1735.     file mkdir tfa/a
  1736.     file attributes tfa/a -permissions 0000
  1737.     set result [catch {file delete -force tfa}]
  1738.     file attributes tfa/a -permissions 0777
  1739.     file delete -force tfa
  1740.     set result
  1741. } {1}
  1742. test fCmd-20.2 {TraverseUnixTree : recursive delete of large directory: Bug 1034337} 
  1743. {unix notRoot} {
  1744.     catch {file delete -force -- tfa}
  1745.     file mkdir tfa
  1746.     for {set i 1} {$i <= 300} {incr i} {createfile tfa/testfile_$i}
  1747.     set result [catch {file delete -force tfa} msg]
  1748.     while {[catch {file delete -force tfa}]} {}
  1749.     list $result $msg
  1750. } {0 {}}
  1751. #
  1752. # Feature testing for TclCopyFilesCmd
  1753. test fCmd-21.1 {copy : single file to nonexistant } {notRoot} {
  1754.     catch {file delete -force -- tfa1 tfa2}
  1755.     set s [createfile tfa1]
  1756.     file copy tfa1 tfa2
  1757.     set result [expr [checkcontent tfa2 $s] && [checkcontent tfa1 $s]]
  1758.     file delete tfa1 tfa2
  1759.     set result
  1760. } {1}
  1761. test fCmd-21.2 {copy : single dir to nonexistant } {notRoot} {
  1762.     catch {file delete -force -- tfa1 tfa2}
  1763.     file mkdir tfa1
  1764.     file copy tfa1 tfa2
  1765.     set result [expr [file isdir tfa2] && [file isdir tfa1]]
  1766.     file delete tfa1 tfa2
  1767.     set result
  1768. } {1}
  1769. test fCmd-21.3 {copy : single file into directory  } {notRoot} {
  1770.     catch {file delete -force -- tfa1 tfad}
  1771.     set s [createfile tfa1]
  1772.     file mkdir tfad
  1773.     file copy tfa1 tfad
  1774.     set result [expr [checkcontent tfad/tfa1 $s] && [checkcontent tfa1 $s]]
  1775.     file delete -force tfa1 tfad
  1776.     set result
  1777. } {1}
  1778. test fCmd-21.4 {copy : more than one source and target is not a directory} 
  1779. {notRoot} {
  1780.     catch {file delete -force -- tfa1 tfa2 tfa3}
  1781.     createfile tfa1 
  1782.     createfile tfa2 
  1783.     createfile tfa3 
  1784.     set result [catch {file copy tfa1 tfa2 tfa3}]
  1785.     file delete tfa1 tfa2 tfa3
  1786.     set result
  1787. } {1}
  1788. test fCmd-21.5 {copy : multiple files into directory  } {notRoot} {
  1789.     catch {file delete -force -- tfa1 tfa2 tfad}
  1790.     set s1 [createfile tfa1 ]
  1791.     set s2 [createfile tfa2 ]
  1792.     file mkdir tfad
  1793.     file copy tfa1 tfa2 tfad
  1794.     set r1 [checkcontent tfad/tfa1 $s1]
  1795.     set r2 [checkcontent tfad/tfa2 $s2]
  1796.     set r3 [checkcontent tfa1 $s1]
  1797.     set r4 [checkcontent tfa2 $s2]
  1798.     set result [expr $r1 && $r2 && $r3 && $r4]
  1799.     file delete -force tfa1 tfa2 tfad
  1800.     set result
  1801. } {1}
  1802. test fCmd-21.6 {copy: mixed dirs and files into directory} 
  1803. {notRoot notFileSharing} {
  1804.     catch {file delete -force -- tfa1 tfad1 tfad2}
  1805.     set s [createfile tfa1 ]
  1806.     file mkdir tfad1 tfad2
  1807.     file copy tfa1 tfad1 tfad2
  1808.     set r1 [checkcontent [file join tfad2 tfa1] $s]
  1809.     set r2 [file isdir [file join tfad2 tfad1]]
  1810.     set r3 [checkcontent tfa1 $s]
  1811.     set result [expr $r1 && $r2 && $r3 && [file isdir tfad1]]
  1812.     file delete -force tfa1 tfad1 tfad2
  1813.     set result
  1814. } {1}
  1815. test fCmd-21.7.1 {TclCopyFilesCmd: copy a dangling link} {unixOnly notRoot dontCopyLinks} {
  1816.     file mkdir tfad1
  1817.     file link -symbolic tfalink tfad1
  1818.     file delete tfad1
  1819.     set result [list [catch {file copy tfalink tfalink2} msg] $msg]
  1820.     file delete -force tfalink tfalink2 
  1821.     set result
  1822. } {1 {error copying "tfalink": the target of this link doesn't exist}}
  1823. test fCmd-21.7.2 {TclCopyFilesCmd: copy a dangling link} {unixOnly notRoot} {
  1824.     file mkdir tfad1
  1825.     file link -symbolic tfalink tfad1
  1826.     file delete tfad1
  1827.     file copy tfalink tfalink2
  1828.     set result [string match [file type tfalink2] link]
  1829.     file delete tfalink tfalink2 
  1830.     set result
  1831. } {1}
  1832. test fCmd-21.8.1 {TclCopyFilesCmd: copy a link } {unixOnly notRoot dontCopyLinks} {
  1833.     file mkdir tfad1
  1834.     file link -symbolic tfalink tfad1
  1835.     file copy tfalink tfalink2
  1836.     set r1 [file type tfalink]; # link
  1837.     set r2 [file type tfalink2]; # directory
  1838.     set r3 [file isdir tfad1]; # 1
  1839.     set result [expr {("$r1" == "link") && ("$r2" == "directory") && $r3}]
  1840.     file delete -force tfad1 tfalink tfalink2
  1841.     set result
  1842. } {1}
  1843. test fCmd-21.8.2 {TclCopyFilesCmd: copy a link } {unixOnly notRoot} {
  1844.     file mkdir tfad1
  1845.     file link -symbolic tfalink tfad1
  1846.     file copy tfalink tfalink2
  1847.     set r1 [file type tfalink]; # link
  1848.     set r2 [file type tfalink2]; # link
  1849.     set r3 [file isdir tfad1]; # 1
  1850.     set result [expr {("$r1" == "link") && ("$r2" == "link") && $r3}]
  1851.     file delete -force tfad1 tfalink tfalink2
  1852.     set result
  1853. } {1}
  1854. test fCmd-21.9 {TclCopyFilesCmd: copy dir with a link in it} {unixOnly notRoot} {
  1855.     file mkdir tfad1
  1856.     file link -symbolic tfad1/tfalink "[pwd]/tfad1"
  1857.     file copy tfad1 tfad2
  1858.     set result [string match [file type tfad2/tfalink] link]
  1859.     file delete -force tfad1 tfad2
  1860.     set result
  1861. } {1}
  1862. test fCmd-21.10 {TclFileCopyCmd: copy dir on top of another empty dir w/o -force} 
  1863. {notRoot} {
  1864.     catch {file delete -force -- tfa tfad}
  1865.     file mkdir tfa [file join tfad tfa]
  1866.     set r1 [catch {file copy tfa tfad}]
  1867.     set result [expr $r1 && [file isdir tfa]]
  1868.     file delete -force tfa tfad
  1869.     set result
  1870. } {1}
  1871. test fCmd-21.11 {TclFileCopyCmd: copy dir on top of a dir w/o -force} {notRoot} {
  1872.     catch {file delete -force -- tfa tfad}
  1873.     file mkdir tfa [file join tfad tfa file]
  1874.     set r1 [catch {file copy tfa tfad}]
  1875.     set result [expr $r1 && [file isdir tfa] && [file isdir [file join tfad tfa file]]]
  1876.     file delete -force tfa tfad
  1877.     set result
  1878. } {1}
  1879. test fCmd-21.12 {TclFileCopyCmd: copy dir on top of a non-empty dir w/ -force} 
  1880. {notRoot} {
  1881.     catch {file delete -force -- tfa tfad}
  1882.     file mkdir tfa [file join tfad tfa file]
  1883.     set r1 [catch {file copy -force tfa tfad}]
  1884.     set result [expr $r1 && [file isdir tfa] && [file isdir [file join tfad tfa file]]]
  1885.     file delete -force tfa tfad
  1886.     set result
  1887. } {1}
  1888. #
  1889. # Coverage testing for TclpRenameFile
  1890. #
  1891. test fCmd-22.1 {TclpRenameFile: rename and overwrite in a single dir} {notRoot} {
  1892.     catch {file delete -force -- tfa1 tfa2}
  1893.     set s [createfile tfa1]
  1894.     set s2 [createfile tfa2 q]
  1895.     set r1 [catch {rename tfa1 tfa2}]
  1896.     file rename -force tfa1 tfa2
  1897.     set result [expr $r1 && [checkcontent tfa2 $s]]
  1898.     file delete [glob tfa1 tfa2]
  1899.     set result
  1900. } {1}
  1901. test fCmd-22.2 {TclpRenameFile: attempt to overwrite itself} {macOrUnix notRoot} {
  1902.     catch {file delete -force -- tfa1}
  1903.     set s [createfile tfa1]
  1904.     file rename -force tfa1 tfa1
  1905.     set result [checkcontent tfa1 $s]
  1906.     file delete tfa1 
  1907.     set result
  1908. } {1}
  1909. test fCmd-22.3 {TclpRenameFile: rename dir to existing dir} {notRoot} {
  1910.     catch {file delete -force -- d1 tfad}
  1911.     file mkdir d1 [file join tfad d1]
  1912.     set r1 [catch {file rename d1 tfad}]
  1913.     set result [expr $r1 && [file isdir d1] && [file isdir [file join tfad d1]]]
  1914.     file delete -force d1 tfad
  1915.     set result
  1916. } {1}
  1917. test fCmd-22.4 {TclpRenameFile: rename dir to dir several levels deep} {notRoot} {
  1918.     catch {file delete -force -- d1 tfad}
  1919.     file mkdir d1 [file join tfad a b c]
  1920.     file rename d1 [file join tfad a b c d1]
  1921.     set result [expr ![file isdir d1] && [file isdir [file join tfad a b c d1]]]
  1922.     file delete -force [glob d1 tfad]
  1923.     set result
  1924. } {1}
  1925. #
  1926. # TclMacCopyFile needs to be redone.
  1927. #
  1928. test fCmd-22.5 {TclMacCopyFile: copy and overwrite in a single dir} {notRoot} {
  1929.     catch {file delete -force -- tfa1 tfa2}
  1930.     set s [createfile tfa1]
  1931.     set s2 [createfile tfa2 q]
  1932.     set r1 [catch {file copy tfa1 tfa2}]
  1933.     file copy -force tfa1 tfa2
  1934.     set result [expr $r1 && [checkcontent tfa2 $s] && [checkcontent tfa1 $s]]
  1935.     file delete tfa1 tfa2
  1936.     set result
  1937. } {1}
  1938. #
  1939. # TclMacMkdir - basic cases are covered elsewhere.
  1940. # Error cases are not covered.
  1941. #
  1942. #
  1943. # TclMacRmdir
  1944. # Error cases are not covered.
  1945. #
  1946. test fCmd-23.1 {TclMacRmdir: trying to remove a nonempty directory} {notRoot} {
  1947.     catch {file delete -force -- tfad}
  1948.     file mkdir [file join tfad dir]
  1949.     set result [catch {file delete tfad}]
  1950.     file delete -force tfad 
  1951.     set result
  1952. } {1}
  1953. #
  1954. # TclMacDeleteFile
  1955. # Error cases are not covered.
  1956. #
  1957. test fCmd-24.1 {TclMacDeleteFile: deleting a normal file} {notRoot} {
  1958.     catch {file delete -force -- tfa1}
  1959.     createfile tfa1
  1960.     file delete tfa1
  1961.     file exists tfa1
  1962. } {0}
  1963. #
  1964. # TclMacCopyDirectory
  1965. # Error cases are not covered.
  1966. #
  1967. test fCmd-25.1 {TclMacCopyDirectory: copying a normal directory} {notRoot notFileSharing} {
  1968.     catch {file delete -force -- tfad1 tfad2}
  1969.     file mkdir [file join tfad1 a b c]
  1970.     file copy tfad1 tfad2
  1971.     set result [expr [file isdir [file join tfad1 a b c]] && [file isdir [file join tfad2 a b c]]]
  1972.     file delete -force tfad1 tfad2
  1973.     set result
  1974. } {1}
  1975. test fCmd-25.2 {TclMacCopyDirectory: copying a short path normal directory} {notRoot notFileSharing} {
  1976.     catch {file delete -force -- tfad1 tfad2}
  1977.     file mkdir tfad1
  1978.     file copy tfad1 tfad2
  1979.     set result [expr [file isdir tfad1] && [file isdir tfad2]]
  1980.     file delete tfad1 tfad2
  1981.     set result
  1982. } {1}
  1983. test fCmd-25.3 {TclMacCopyDirectory: copying dirs between different dirs} {notRoot notFileSharing} {
  1984.     catch {file delete -force -- tfad1 tfad2}
  1985.     file mkdir [file join tfad1 x y z]
  1986.     file mkdir [file join tfad2 dir]
  1987.     file copy tfad1 [file join tfad2 dir]
  1988.     set result [expr [file isdir [file join tfad1 x y z]] && [file isdir [file join tfad2 dir tfad1 x y z]]]
  1989.     file delete -force tfad1 tfad2
  1990.     set result
  1991. } {1}
  1992. #
  1993. # Functionality tests for TclDeleteFilesCmd
  1994. #
  1995. test fCmd-26.1 {TclDeleteFilesCmd: delete symlink} {unixOnly notRoot} {
  1996.     catch {file delete -force -- tfad1 tfad2}
  1997.     file mkdir tfad1
  1998.     file link -symbolic tfalink tfad1
  1999.     file delete tfalink
  2000.     set r1 [file isdir tfad1]
  2001.     set r2 [file exists tfalink]
  2002.     
  2003.     set result [expr $r1 && !$r2]
  2004.     file delete tfad1
  2005.     set result
  2006. } {1}
  2007. test fCmd-26.2 {TclDeleteFilesCmd: delete dir with symlink} {unixOnly notRoot} {
  2008.     catch {file delete -force -- tfad1 tfad2}
  2009.     file mkdir tfad1
  2010.     file mkdir tfad2
  2011.     file link -symbolic [file join tfad2 link] tfad1
  2012.     file delete -force tfad2
  2013.     set r1 [file isdir tfad1]
  2014.     set r2 [file exists tfad2]
  2015.     
  2016.     set result [expr $r1 && !$r2]
  2017.     file delete tfad1
  2018.     set result
  2019. } {1}
  2020. test fCmd-26.3 {TclDeleteFilesCmd: delete dangling symlink} {unixOnly notRoot} {
  2021.     catch {file delete -force -- tfad1 tfad2}
  2022.     file mkdir tfad1
  2023.     file link -symbolic tfad2 tfad1
  2024.     file delete tfad1
  2025.     file delete tfad2
  2026.     set r1 [file exists tfad1]
  2027.     set r2 [file exists tfad2]
  2028.     
  2029.     set result [expr !$r1 && !$r2]
  2030.     set result
  2031. } {1}
  2032. test fCmd-27.2 {TclFileAttrsCmd - Tcl_TranslateFileName fails} {testsetplatform} {
  2033.     set platform [testgetplatform]
  2034.     testsetplatform unix
  2035.     list [catch {file attributes ~_totally_bogus_user} msg] $msg [testsetplatform $platform]
  2036. } {1 {user "_totally_bogus_user" doesn't exist} {}}
  2037. test fCmd-27.3 {TclFileAttrsCmd - all attributes} {
  2038.     catch {file delete -force -- foo.tmp}
  2039.     createfile foo.tmp
  2040.     list [catch {file attributes foo.tmp} msg] [expr {[llength $msg] > 0}] [file delete -force -- foo.tmp]
  2041. } {0 1 {}}
  2042. test fCmd-27.4 {TclFileAttrsCmd - getting one option} {
  2043.     catch {file delete -force -- foo.tmp}
  2044.     createfile foo.tmp
  2045.     set attrs [file attributes foo.tmp]
  2046.     list [catch {eval file attributes foo.tmp [lindex $attrs 0]}] [file delete -force -- foo.tmp]
  2047. } {0 {}}
  2048. # Find a group that exists on this Unix system, or else skip tests that
  2049. # require Unix groups.
  2050. if {$tcl_platform(platform) == "unix"} {
  2051.     ::tcltest::testConstraint foundGroup 0
  2052.     catch {
  2053. set groupList [exec groups]
  2054. set group [lindex $groupList 0]
  2055. ::tcltest::testConstraint foundGroup 1
  2056.     }
  2057. } else {
  2058.     ::tcltest::testConstraint foundGroup 1
  2059. }
  2060. test fCmd-27.5 {TclFileAttrsCmd - setting one option} {foundGroup} {
  2061.     catch {file delete -force -- foo.tmp}
  2062.     createfile foo.tmp
  2063.     set attrs [file attributes foo.tmp]
  2064.     list [catch {eval file attributes foo.tmp [lrange $attrs 0 1]} msg] $msg [file delete -force -- foo.tmp]
  2065. } {0 {} {}}
  2066. test fCmd-27.6 {TclFileAttrsCmd - setting more than one option} {foundGroup} {
  2067.     catch {file delete -force -- foo.tmp}
  2068.     createfile foo.tmp
  2069.     set attrs [file attributes foo.tmp]
  2070.     list [catch {eval file attributes foo.tmp [lrange $attrs 0 3]} msg] $msg [file delete -force -- foo.tmp]
  2071. } {0 {} {}}
  2072. if {[string equal $tcl_platform(platform) "windows"]} {
  2073.     if {[string index $tcl_platform(osVersion) 0] >= 5 
  2074.       && ([lindex [file system [temporaryDirectory]] 1] == "NTFS")} {
  2075. tcltest::testConstraint linkDirectory 1
  2076. tcltest::testConstraint linkFile 1
  2077.     } else {
  2078. tcltest::testConstraint linkDirectory 0
  2079. tcltest::testConstraint linkFile 0
  2080.     }
  2081. } else {
  2082.     tcltest::testConstraint linkFile 1
  2083.     tcltest::testConstraint linkDirectory 1
  2084. }
  2085. test fCmd-28.1 {file link} {
  2086.     list [catch {file link} msg] $msg
  2087. } {1 {wrong # args: should be "file link ?-linktype? linkname ?target?"}}
  2088. test fCmd-28.2 {file link} {
  2089.     list [catch {file link a b c d} msg] $msg
  2090. } {1 {wrong # args: should be "file link ?-linktype? linkname ?target?"}}
  2091. test fCmd-28.3 {file link} {
  2092.     list [catch {file link abc b c} msg] $msg
  2093. } {1 {bad switch "abc": must be -symbolic or -hard}}
  2094. test fCmd-28.4 {file link} {
  2095.     list [catch {file link -abc b c} msg] $msg
  2096. } {1 {bad switch "-abc": must be -symbolic or -hard}}
  2097. cd [workingDirectory]
  2098. makeDirectory abc.dir
  2099. makeDirectory abc2.dir
  2100. makeFile contents abc.file
  2101. makeFile contents abc2.file
  2102. cd [temporaryDirectory]
  2103. test fCmd-28.5 {file link: source already exists} {linkDirectory} {
  2104.     cd [temporaryDirectory]
  2105.     set res [list [catch {file link abc.dir abc2.dir} msg] $msg]
  2106.     cd [workingDirectory]
  2107.     set res
  2108. } {1 {could not create new link "abc.dir": that path already exists}}
  2109. test fCmd-28.6 {file link: unsupported operation} {linkDirectory macOrWin} {
  2110.     cd [temporaryDirectory]
  2111.     set res [list [catch {file link -hard abc.link abc.dir} msg] $msg]
  2112.     cd [workingDirectory]
  2113.     set res
  2114. } {1 {could not create new link "abc.link" pointing to "abc.dir": illegal operation on a directory}}
  2115. test fCmd-28.7 {file link: source already exists} {linkFile} {
  2116.     cd [temporaryDirectory]
  2117.     set res [list [catch {file link abc.file abc2.file} msg] $msg]
  2118.     cd [workingDirectory]
  2119.     set res
  2120. } {1 {could not create new link "abc.file": that path already exists}}
  2121. test fCmd-28.8 {file link} {linkFile winOnly} {
  2122.     cd [temporaryDirectory]
  2123.     set res [list [catch {file link -symbolic abc.link abc.file} msg] $msg]
  2124.     cd [workingDirectory]
  2125.     set res
  2126. } {1 {could not create new link "abc.link" pointing to "abc.file": not a directory}}
  2127. test fCmd-28.9 {file link: success with file} {linkFile} {
  2128.     cd [temporaryDirectory]
  2129.     file delete -force abc.link
  2130.     set res [list [catch {file link abc.link abc.file} msg] $msg]
  2131.     cd [workingDirectory]
  2132.     set res
  2133. } {0 abc.file}
  2134. cd [temporaryDirectory]
  2135. catch {file delete -force abc.link}
  2136. cd [workingDirectory]
  2137. test fCmd-28.10 {file link: linking to nonexistent path} {linkDirectory} {
  2138.     cd [temporaryDirectory]
  2139.     file delete -force abc.link
  2140.     set res [list [catch {file link abc.link abc2.doesnt} msg] $msg]
  2141.     cd [workingDirectory]
  2142.     set res
  2143. } {1 {could not create new link "abc.link" since target "abc2.doesnt" doesn't exist}}
  2144. test fCmd-28.11 {file link: success with directory} {linkDirectory} {
  2145.     cd [temporaryDirectory]
  2146.     file delete -force abc.link
  2147.     set res [list [catch {file link abc.link abc.dir} msg] $msg]
  2148.     cd [workingDirectory]
  2149.     set res
  2150. } {0 abc.dir}
  2151. test fCmd-28.12 {file link: cd into a link} {linkDirectory} {
  2152.     cd [temporaryDirectory]
  2153.     file delete -force abc.link
  2154.     file link abc.link abc.dir
  2155.     set orig [pwd]
  2156.     cd abc.link
  2157.     set dir [pwd]
  2158.     cd ..
  2159.     set up [pwd]
  2160.     cd $orig
  2161.     # now '$up' should be either $orig or [file dirname abc.dir],
  2162.     # depending on whether 'cd' actually moves to the destination
  2163.     # of a link, or simply treats the link as a directory.
  2164.     # (on windows the former, on unix the latter, I believe)
  2165.     if {([file normalize $up] != [file normalize $orig]) 
  2166.       && ([file normalize $up] != [file normalize [file dirname abc.dir]])} {
  2167. set res "wrong directory with 'cd $link ; cd ..'"
  2168.     } else {
  2169. set res "ok"
  2170.     }
  2171.     cd [workingDirectory]
  2172.     set res
  2173. } {ok}
  2174. test fCmd-28.13 {file link} {linkDirectory} {
  2175.     # duplicate link throws error
  2176.     cd [temporaryDirectory]
  2177.     set res [list [catch {file link abc.link abc.dir} msg] $msg]
  2178.     cd [workingDirectory]
  2179.     set res
  2180. } {1 {could not create new link "abc.link": that path already exists}}
  2181. test fCmd-28.14 {file link: deletes link not dir} {linkDirectory} {
  2182.     cd [temporaryDirectory]
  2183.     file delete -force abc.link
  2184.     set res [list [file exists abc.link] [file exists abc.dir]]
  2185.     cd [workingDirectory]
  2186.     set res
  2187. } {0 1}
  2188. test fCmd-28.15.1 {file link: copies link not dir} {linkDirectory dontCopyLinks} {
  2189.     cd [temporaryDirectory]
  2190.     file delete -force abc.link
  2191.     file link abc.link abc.dir
  2192.     file copy abc.link abc2.link
  2193.     # abc2.linkdir was a copy of a link to a dir, so it should end up as
  2194.     # a directory, not a link (links trace to endpoint).
  2195.     set res [list [file type abc2.link] [file tail [file link abc.link]]]
  2196.     cd [workingDirectory]
  2197.     set res
  2198. } {directory abc.dir}
  2199. test fCmd-28.15.2 {file link: copies link not dir} {linkDirectory} {
  2200.     cd [temporaryDirectory]
  2201.     file delete -force abc.link
  2202.     file link abc.link abc.dir
  2203.     file copy abc.link abc2.link
  2204.     set res [list [file type abc2.link] [file tail [file link abc2.link]]]
  2205.     cd [workingDirectory]
  2206.     set res
  2207. } {link abc.dir}
  2208. cd [temporaryDirectory]
  2209. file delete -force abc.link
  2210. file delete -force abc2.link
  2211. file copy abc.file abc.dir
  2212. file copy abc2.file abc.dir
  2213. cd [workingDirectory]
  2214. test fCmd-28.16 {file link: glob inside link} {linkDirectory} {
  2215.     cd [temporaryDirectory]
  2216.     file delete -force abc.link
  2217.     file link abc.link abc.dir
  2218.     set res [lsort [glob -dir abc.link -tails *]]
  2219.     cd [workingDirectory]
  2220.     set res
  2221. } [lsort [list abc.file abc2.file]]
  2222. test fCmd-28.17 {file link: glob -type l} {linkDirectory} {
  2223.     cd [temporaryDirectory]
  2224.     set res [glob -dir [pwd] -type l -tails abc*]
  2225.     cd [workingDirectory]
  2226.     set res
  2227. } {abc.link}
  2228. test fCmd-28.18 {file link: glob -type d} {linkDirectory} {
  2229.     cd [temporaryDirectory]
  2230.     set res [lsort [glob -dir [pwd] -type d -tails abc*]]
  2231.     cd [workingDirectory]
  2232.     set res
  2233. } [lsort [list abc.link abc.dir abc2.dir]]
  2234. test fCmd-29.1 {weird memory corruption fault} {
  2235.     catch {set res [open [file join ~a_totally_bogus_user_id/foo bar]]}
  2236. } 1
  2237. cd [temporaryDirectory]
  2238. file delete -force abc.link
  2239. cd [workingDirectory]
  2240. removeFile abc2.file
  2241. removeFile abc.file
  2242. removeDirectory abc2.dir
  2243. removeDirectory abc.dir
  2244. # cleanup
  2245. cleanup
  2246. ::tcltest::cleanupTests
  2247. return