mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-02 11:12:37 +00:00
266 lines
6.9 KiB
Nim
266 lines
6.9 KiB
Nim
discard """
|
|
output: '''true
|
|
true
|
|
true
|
|
true
|
|
true
|
|
true
|
|
true
|
|
true
|
|
true
|
|
All:
|
|
__really_obscure_dir_name/are.x
|
|
__really_obscure_dir_name/created
|
|
__really_obscure_dir_name/dirs
|
|
__really_obscure_dir_name/files.q
|
|
__really_obscure_dir_name/some
|
|
__really_obscure_dir_name/test
|
|
__really_obscure_dir_name/testing.r
|
|
__really_obscure_dir_name/these.txt
|
|
Files:
|
|
__really_obscure_dir_name/are.x
|
|
__really_obscure_dir_name/files.q
|
|
__really_obscure_dir_name/testing.r
|
|
__really_obscure_dir_name/these.txt
|
|
Dirs:
|
|
__really_obscure_dir_name/created
|
|
__really_obscure_dir_name/dirs
|
|
__really_obscure_dir_name/some
|
|
__really_obscure_dir_name/test
|
|
false
|
|
false
|
|
false
|
|
false
|
|
false
|
|
false
|
|
false
|
|
false
|
|
false
|
|
true
|
|
true
|
|
Raises
|
|
Raises
|
|
true
|
|
true
|
|
true
|
|
true
|
|
true
|
|
true
|
|
|
|
'''
|
|
"""
|
|
# test os path creation, iteration, and deletion
|
|
|
|
import os, strutils
|
|
|
|
block fileOperations:
|
|
let files = @["these.txt", "are.x", "testing.r", "files.q"]
|
|
let dirs = @["some", "created", "test", "dirs"]
|
|
|
|
let dname = "__really_obscure_dir_name"
|
|
|
|
createDir(dname)
|
|
echo dirExists(dname)
|
|
|
|
# Test creating files and dirs
|
|
for dir in dirs:
|
|
createDir(dname/dir)
|
|
echo dirExists(dname/dir)
|
|
|
|
for file in files:
|
|
let fh = open(dname/file, fmReadWrite)
|
|
fh.close()
|
|
echo fileExists(dname/file)
|
|
|
|
echo "All:"
|
|
|
|
template norm(x): untyped =
|
|
(when defined(windows): x.replace('\\', '/') else: x)
|
|
|
|
for path in walkPattern(dname/"*"):
|
|
echo path.norm
|
|
|
|
echo "Files:"
|
|
|
|
for path in walkFiles(dname/"*"):
|
|
echo path.norm
|
|
|
|
echo "Dirs:"
|
|
|
|
for path in walkDirs(dname/"*"):
|
|
echo path.norm
|
|
|
|
# Test removal of files dirs
|
|
for dir in dirs:
|
|
removeDir(dname/dir)
|
|
echo dirExists(dname/dir)
|
|
|
|
for file in files:
|
|
removeFile(dname/file)
|
|
echo fileExists(dname/file)
|
|
|
|
removeDir(dname)
|
|
echo dirExists(dname)
|
|
|
|
# createDir should create recursive directories
|
|
createDir(dirs[0] / dirs[1])
|
|
echo dirExists(dirs[0] / dirs[1]) # true
|
|
removeDir(dirs[0])
|
|
|
|
# createDir should properly handle trailing separator
|
|
createDir(dname / "")
|
|
echo dirExists(dname) # true
|
|
removeDir(dname)
|
|
|
|
# createDir should raise IOError if the path exists
|
|
# and is not a directory
|
|
open(dname, fmWrite).close
|
|
try:
|
|
createDir(dname)
|
|
except IOError:
|
|
echo "Raises"
|
|
removeFile(dname)
|
|
|
|
# removeFile should not remove directory
|
|
createDir(dname)
|
|
try:
|
|
removeFile(dname)
|
|
except OSError:
|
|
echo "Raises"
|
|
removeDir(dname)
|
|
|
|
# test copyDir:
|
|
createDir("a/b")
|
|
open("a/b/file.txt", fmWrite).close
|
|
createDir("a/b/c")
|
|
open("a/b/c/fileC.txt", fmWrite).close
|
|
|
|
copyDir("a", "../dest/a")
|
|
removeDir("a")
|
|
|
|
echo dirExists("../dest/a/b")
|
|
echo fileExists("../dest/a/b/file.txt")
|
|
|
|
echo fileExists("../dest/a/b/c/fileC.txt")
|
|
removeDir("../dest")
|
|
|
|
# test copyDir:
|
|
# if separator at the end of a path
|
|
createDir("a/b")
|
|
open("a/file.txt", fmWrite).close
|
|
|
|
copyDir("a/", "../dest/a/")
|
|
removeDir("a")
|
|
|
|
echo dirExists("../dest/a/b")
|
|
echo fileExists("../dest/a/file.txt")
|
|
removeDir("../dest")
|
|
|
|
import times
|
|
block modificationTime:
|
|
# Test get/set modification times
|
|
# Should support at least microsecond resolution
|
|
let tm = fromUnix(0) + 100.microseconds
|
|
writeFile("a", "")
|
|
setLastModificationTime("a", tm)
|
|
|
|
when defined(macosx):
|
|
echo "true"
|
|
else:
|
|
echo getLastModificationTime("a") == tm
|
|
removeFile("a")
|
|
|
|
block walkDirRec:
|
|
createDir("walkdir_test/a/b")
|
|
open("walkdir_test/a/b/file_1", fmWrite).close()
|
|
open("walkdir_test/a/file_2", fmWrite).close()
|
|
|
|
for p in walkDirRec("walkdir_test"):
|
|
doAssert p.fileExists
|
|
doAssert p.startsWith("walkdir_test")
|
|
|
|
var s: seq[string]
|
|
for p in walkDirRec("walkdir_test", {pcFile}, {pcDir}, relative=true):
|
|
s.add(p)
|
|
|
|
doAssert s.len == 2
|
|
doAssert "a" / "b" / "file_1" in s
|
|
doAssert "a" / "file_2" in s
|
|
|
|
removeDir("walkdir_test")
|
|
|
|
when not defined(windows):
|
|
block walkDirRelative:
|
|
createDir("walkdir_test")
|
|
createSymlink(".", "walkdir_test/c")
|
|
for k, p in walkDir("walkdir_test", true):
|
|
doAssert k == pcLinkToDir
|
|
removeDir("walkdir_test")
|
|
|
|
block normalizedPath:
|
|
doAssert normalizedPath("") == ""
|
|
block relative:
|
|
doAssert normalizedPath(".") == "."
|
|
doAssert normalizedPath("foo/..") == "."
|
|
doAssert normalizedPath("foo//../bar/.") == "bar"
|
|
doAssert normalizedPath("..") == ".."
|
|
doAssert normalizedPath("../") == ".."
|
|
doAssert normalizedPath("../..") == unixToNativePath"../.."
|
|
doAssert normalizedPath("../a/..") == ".."
|
|
doAssert normalizedPath("../a/../") == ".."
|
|
doAssert normalizedPath("./") == "."
|
|
|
|
block absolute:
|
|
doAssert normalizedPath("/") == unixToNativePath"/"
|
|
doAssert normalizedPath("/.") == unixToNativePath"/"
|
|
doAssert normalizedPath("/..") == unixToNativePath"/.."
|
|
doAssert normalizedPath("/../") == unixToNativePath"/.."
|
|
doAssert normalizedPath("/../..") == unixToNativePath"/../.."
|
|
doAssert normalizedPath("/../../") == unixToNativePath"/../.."
|
|
doAssert normalizedPath("/../../../") == unixToNativePath"/../../.."
|
|
doAssert normalizedPath("/a/b/../../foo") == unixToNativePath"/foo"
|
|
doAssert normalizedPath("/a/b/../../../foo") == unixToNativePath"/../foo"
|
|
doAssert normalizedPath("/./") == unixToNativePath"/"
|
|
doAssert normalizedPath("//") == unixToNativePath"/"
|
|
doAssert normalizedPath("///") == unixToNativePath"/"
|
|
doAssert normalizedPath("/a//b") == unixToNativePath"/a/b"
|
|
doAssert normalizedPath("/a///b") == unixToNativePath"/a/b"
|
|
doAssert normalizedPath("/a/b/c/..") == unixToNativePath"/a/b"
|
|
doAssert normalizedPath("/a/b/c/../") == unixToNativePath"/a/b"
|
|
|
|
block isHidden:
|
|
when defined(posix):
|
|
doAssert ".foo.txt".isHidden
|
|
doAssert "bar/.foo.ext".isHidden
|
|
doAssert: not "bar".isHidden
|
|
doAssert: not "foo/".isHidden
|
|
# Corner cases: paths are not normalized when determining `isHidden`
|
|
doAssert: not ".foo/.".isHidden
|
|
doAssert: not ".foo/..".isHidden
|
|
|
|
block absolutePath:
|
|
doAssertRaises(ValueError): discard absolutePath("a", "b")
|
|
doAssert absolutePath("a") == getCurrentDir() / "a"
|
|
doAssert absolutePath("a", "/b") == "/b" / "a"
|
|
when defined(Posix):
|
|
doAssert absolutePath("a", "/b/") == "/b" / "a"
|
|
doAssert absolutePath("a", "/b/c") == "/b/c" / "a"
|
|
doAssert absolutePath("/a", "b/") == "/a"
|
|
|
|
block splitFile:
|
|
doAssert splitFile("") == ("", "", "")
|
|
doAssert splitFile("abc/") == ("abc", "", "")
|
|
doAssert splitFile("/") == ("/", "", "")
|
|
doAssert splitFile("./abc") == (".", "abc", "")
|
|
doAssert splitFile(".txt") == ("", ".txt", "")
|
|
doAssert splitFile("abc/.txt") == ("abc", ".txt", "")
|
|
doAssert splitFile("abc") == ("", "abc", "")
|
|
doAssert splitFile("abc.txt") == ("", "abc", ".txt")
|
|
doAssert splitFile("/abc.txt") == ("/", "abc", ".txt")
|
|
doAssert splitFile("/foo/abc.txt") == ("/foo", "abc", ".txt")
|
|
doAssert splitFile("/foo/abc.txt.gz") == ("/foo", "abc.txt", ".gz")
|
|
doAssert splitFile(".") == ("", ".", "")
|
|
doAssert splitFile("abc/.") == ("abc", ".", "")
|
|
doAssert splitFile("..") == ("", "..", "")
|
|
doAssert splitFile("a/..") == ("a", "..", "")
|