tos.nim 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. discard """
  2. output: '''true
  3. true
  4. true
  5. true
  6. true
  7. true
  8. true
  9. true
  10. true
  11. All:
  12. __really_obscure_dir_name/are.x
  13. __really_obscure_dir_name/created
  14. __really_obscure_dir_name/dirs
  15. __really_obscure_dir_name/files.q
  16. __really_obscure_dir_name/some
  17. __really_obscure_dir_name/test
  18. __really_obscure_dir_name/testing.r
  19. __really_obscure_dir_name/these.txt
  20. Files:
  21. __really_obscure_dir_name/are.x
  22. __really_obscure_dir_name/files.q
  23. __really_obscure_dir_name/testing.r
  24. __really_obscure_dir_name/these.txt
  25. Dirs:
  26. __really_obscure_dir_name/created
  27. __really_obscure_dir_name/dirs
  28. __really_obscure_dir_name/some
  29. __really_obscure_dir_name/test
  30. false
  31. false
  32. false
  33. false
  34. false
  35. false
  36. false
  37. false
  38. false
  39. true
  40. true
  41. Raises
  42. Raises
  43. true
  44. true
  45. true
  46. true
  47. true
  48. true
  49. '''
  50. """
  51. # test os path creation, iteration, and deletion
  52. import os, strutils
  53. block fileOperations:
  54. let files = @["these.txt", "are.x", "testing.r", "files.q"]
  55. let dirs = @["some", "created", "test", "dirs"]
  56. let dname = "__really_obscure_dir_name"
  57. createDir(dname)
  58. echo dirExists(dname)
  59. # Test creating files and dirs
  60. for dir in dirs:
  61. createDir(dname/dir)
  62. echo dirExists(dname/dir)
  63. for file in files:
  64. let fh = open(dname/file, fmReadWrite)
  65. fh.close()
  66. echo fileExists(dname/file)
  67. echo "All:"
  68. template norm(x): untyped =
  69. (when defined(windows): x.replace('\\', '/') else: x)
  70. for path in walkPattern(dname/"*"):
  71. echo path.norm
  72. echo "Files:"
  73. for path in walkFiles(dname/"*"):
  74. echo path.norm
  75. echo "Dirs:"
  76. for path in walkDirs(dname/"*"):
  77. echo path.norm
  78. # Test removal of files dirs
  79. for dir in dirs:
  80. removeDir(dname/dir)
  81. echo dirExists(dname/dir)
  82. for file in files:
  83. removeFile(dname/file)
  84. echo fileExists(dname/file)
  85. removeDir(dname)
  86. echo dirExists(dname)
  87. # createDir should create recursive directories
  88. createDir(dirs[0] / dirs[1])
  89. echo dirExists(dirs[0] / dirs[1]) # true
  90. removeDir(dirs[0])
  91. # createDir should properly handle trailing separator
  92. createDir(dname / "")
  93. echo dirExists(dname) # true
  94. removeDir(dname)
  95. # createDir should raise IOError if the path exists
  96. # and is not a directory
  97. open(dname, fmWrite).close
  98. try:
  99. createDir(dname)
  100. except IOError:
  101. echo "Raises"
  102. removeFile(dname)
  103. # removeFile should not remove directory
  104. createDir(dname)
  105. try:
  106. removeFile(dname)
  107. except OSError:
  108. echo "Raises"
  109. removeDir(dname)
  110. # test copyDir:
  111. createDir("a/b")
  112. open("a/b/file.txt", fmWrite).close
  113. createDir("a/b/c")
  114. open("a/b/c/fileC.txt", fmWrite).close
  115. copyDir("a", "../dest/a")
  116. removeDir("a")
  117. echo dirExists("../dest/a/b")
  118. echo fileExists("../dest/a/b/file.txt")
  119. echo fileExists("../dest/a/b/c/fileC.txt")
  120. removeDir("../dest")
  121. # test copyDir:
  122. # if separator at the end of a path
  123. createDir("a/b")
  124. open("a/file.txt", fmWrite).close
  125. copyDir("a/", "../dest/a/")
  126. removeDir("a")
  127. echo dirExists("../dest/a/b")
  128. echo fileExists("../dest/a/file.txt")
  129. removeDir("../dest")
  130. import times
  131. block modificationTime:
  132. # Test get/set modification times
  133. # Should support at least microsecond resolution
  134. let tm = fromUnix(0) + 100.microseconds
  135. writeFile("a", "")
  136. setLastModificationTime("a", tm)
  137. when defined(macosx):
  138. echo "true"
  139. else:
  140. echo getLastModificationTime("a") == tm
  141. removeFile("a")
  142. block walkDirRec:
  143. createDir("walkdir_test/a/b")
  144. open("walkdir_test/a/b/file_1", fmWrite).close()
  145. open("walkdir_test/a/file_2", fmWrite).close()
  146. for p in walkDirRec("walkdir_test"):
  147. doAssert p.fileExists
  148. doAssert p.startsWith("walkdir_test")
  149. var s: seq[string]
  150. for p in walkDirRec("walkdir_test", {pcFile}, {pcDir}, relative=true):
  151. s.add(p)
  152. doAssert s.len == 2
  153. doAssert "a" / "b" / "file_1" in s
  154. doAssert "a" / "file_2" in s
  155. removeDir("walkdir_test")
  156. when not defined(windows):
  157. block walkDirRelative:
  158. createDir("walkdir_test")
  159. createSymlink(".", "walkdir_test/c")
  160. for k, p in walkDir("walkdir_test", true):
  161. doAssert k == pcLinkToDir
  162. removeDir("walkdir_test")
  163. block normalizedPath:
  164. doAssert normalizedPath("") == ""
  165. block relative:
  166. doAssert normalizedPath(".") == "."
  167. doAssert normalizedPath("foo/..") == "."
  168. doAssert normalizedPath("foo//../bar/.") == "bar"
  169. doAssert normalizedPath("..") == ".."
  170. doAssert normalizedPath("../") == ".."
  171. doAssert normalizedPath("../..") == unixToNativePath"../.."
  172. doAssert normalizedPath("../a/..") == ".."
  173. doAssert normalizedPath("../a/../") == ".."
  174. doAssert normalizedPath("./") == "."
  175. block absolute:
  176. doAssert normalizedPath("/") == unixToNativePath"/"
  177. doAssert normalizedPath("/.") == unixToNativePath"/"
  178. doAssert normalizedPath("/..") == unixToNativePath"/.."
  179. doAssert normalizedPath("/../") == unixToNativePath"/.."
  180. doAssert normalizedPath("/../..") == unixToNativePath"/../.."
  181. doAssert normalizedPath("/../../") == unixToNativePath"/../.."
  182. doAssert normalizedPath("/../../../") == unixToNativePath"/../../.."
  183. doAssert normalizedPath("/a/b/../../foo") == unixToNativePath"/foo"
  184. doAssert normalizedPath("/a/b/../../../foo") == unixToNativePath"/../foo"
  185. doAssert normalizedPath("/./") == unixToNativePath"/"
  186. doAssert normalizedPath("//") == unixToNativePath"/"
  187. doAssert normalizedPath("///") == unixToNativePath"/"
  188. doAssert normalizedPath("/a//b") == unixToNativePath"/a/b"
  189. doAssert normalizedPath("/a///b") == unixToNativePath"/a/b"
  190. doAssert normalizedPath("/a/b/c/..") == unixToNativePath"/a/b"
  191. doAssert normalizedPath("/a/b/c/../") == unixToNativePath"/a/b"
  192. block isHidden:
  193. when defined(posix):
  194. doAssert ".foo.txt".isHidden
  195. doAssert "bar/.foo.ext".isHidden
  196. doAssert: not "bar".isHidden
  197. doAssert: not "foo/".isHidden
  198. # Corner cases: paths are not normalized when determining `isHidden`
  199. doAssert: not ".foo/.".isHidden
  200. doAssert: not ".foo/..".isHidden
  201. block absolutePath:
  202. doAssertRaises(ValueError): discard absolutePath("a", "b")
  203. doAssert absolutePath("a") == getCurrentDir() / "a"
  204. doAssert absolutePath("a", "/b") == "/b" / "a"
  205. when defined(Posix):
  206. doAssert absolutePath("a", "/b/") == "/b" / "a"
  207. doAssert absolutePath("a", "/b/c") == "/b/c" / "a"
  208. doAssert absolutePath("/a", "b/") == "/a"
  209. block splitFile:
  210. doAssert splitFile("") == ("", "", "")
  211. doAssert splitFile("abc/") == ("abc", "", "")
  212. doAssert splitFile("/") == ("/", "", "")
  213. doAssert splitFile("./abc") == (".", "abc", "")
  214. doAssert splitFile(".txt") == ("", ".txt", "")
  215. doAssert splitFile("abc/.txt") == ("abc", ".txt", "")
  216. doAssert splitFile("abc") == ("", "abc", "")
  217. doAssert splitFile("abc.txt") == ("", "abc", ".txt")
  218. doAssert splitFile("/abc.txt") == ("/", "abc", ".txt")
  219. doAssert splitFile("/foo/abc.txt") == ("/foo", "abc", ".txt")
  220. doAssert splitFile("/foo/abc.txt.gz") == ("/foo", "abc.txt", ".gz")
  221. doAssert splitFile(".") == ("", ".", "")
  222. doAssert splitFile("abc/.") == ("abc", ".", "")
  223. doAssert splitFile("..") == ("", "..", "")
  224. doAssert splitFile("a/..") == ("a", "..", "")