blob: 49626d860dae44b53a9aec7c101a74d5096379cb [file] [log] [blame]
@safe unittest
{
import std.file;
import std.exception : assertThrown;
assertThrown!FileException("non.existing.file.".readText);
}
@safe unittest
{
import std.file;
import std.utf : byChar;
scope(exit)
{
assert(exists(deleteme));
remove(deleteme);
}
std.file.write(deleteme, "1234"); // deleteme is the name of a temporary file
assert(read(deleteme, 2) == "12");
assert(read(deleteme.byChar) == "1234");
assert((cast(const(ubyte)[])read(deleteme)).length == 4);
}
@safe unittest
{
import std.file;
write(deleteme, "abc"); // deleteme is the name of a temporary file
scope(exit) remove(deleteme);
string content = readText(deleteme);
assert(content == "abc");
}
@safe unittest
{
import std.file;
scope(exit)
{
assert(exists(deleteme));
remove(deleteme);
}
int[] a = [ 0, 1, 1, 2, 3, 5, 8 ];
write(deleteme, a); // deleteme is the name of a temporary file
const bytes = read(deleteme);
const fileInts = () @trusted { return cast(int[]) bytes; }();
assert(fileInts == a);
}
@safe unittest
{
import std.file;
scope(exit)
{
assert(exists(deleteme));
remove(deleteme);
}
int[] a = [ 0, 1, 1, 2, 3, 5, 8 ];
write(deleteme, a); // deleteme is the name of a temporary file
int[] b = [ 13, 21 ];
append(deleteme, b);
const bytes = read(deleteme);
const fileInts = () @trusted { return cast(int[]) bytes; }();
assert(fileInts == a ~ b);
}
@safe unittest
{
import std.file;
auto t1 = deleteme, t2 = deleteme~"2";
scope(exit) foreach (t; [t1, t2]) if (t.exists) t.remove();
t1.write("1");
t1.rename(t2);
assert(t2.readText == "1");
t1.write("2");
t1.rename(t2);
assert(t2.readText == "2");
}
@safe unittest
{
import std.file;
import std.exception : assertThrown;
deleteme.write("Hello");
assert(deleteme.readText == "Hello");
deleteme.remove;
assertThrown!FileException(deleteme.readText);
}
@safe unittest
{
import std.file;
scope(exit) deleteme.remove;
// create a file of size 1
write(deleteme, "a");
assert(getSize(deleteme) == 1);
// create a file of size 3
write(deleteme, "abc");
assert(getSize(deleteme) == 3);
}
@safe unittest
{
import std.file;
import std.datetime : abs, SysTime;
scope(exit) deleteme.remove;
write(deleteme, "a");
SysTime accessTime, modificationTime;
getTimes(deleteme, accessTime, modificationTime);
import std.datetime : Clock, seconds;
auto currTime = Clock.currTime();
enum leeway = 5.seconds;
auto diffAccess = accessTime - currTime;
auto diffModification = modificationTime - currTime;
assert(abs(diffAccess) <= leeway);
assert(abs(diffModification) <= leeway);
}
@safe unittest
{
import std.file;
import std.datetime : DateTime, hnsecs, SysTime;
scope(exit) deleteme.remove;
write(deleteme, "a");
SysTime accessTime = SysTime(DateTime(2010, 10, 4, 0, 0, 30));
SysTime modificationTime = SysTime(DateTime(2018, 10, 4, 0, 0, 30));
setTimes(deleteme, accessTime, modificationTime);
SysTime accessTimeResolved, modificationTimeResolved;
getTimes(deleteme, accessTimeResolved, modificationTimeResolved);
assert(accessTime == accessTimeResolved);
assert(modificationTime == modificationTimeResolved);
}
@safe unittest
{
import std.file;
import std.datetime : abs, DateTime, hnsecs, SysTime;
scope(exit) deleteme.remove;
import std.datetime : Clock, seconds;
auto currTime = Clock.currTime();
enum leeway = 5.seconds;
deleteme.write("bb");
assert(abs(deleteme.timeLastModified - currTime) <= leeway);
}
@safe unittest
{
import std.file;
import std.datetime : SysTime;
assert("file.does.not.exist".timeLastModified(SysTime.min) == SysTime.min);
auto source = deleteme ~ "source";
auto target = deleteme ~ "target";
scope(exit) source.remove, target.remove;
source.write(".");
assert(target.timeLastModified(SysTime.min) < source.timeLastModified);
target.write(".");
assert(target.timeLastModified(SysTime.min) >= source.timeLastModified);
}
@safe unittest
{
import std.file;
auto f = deleteme ~ "does.not.exist";
assert(!f.exists);
f.write("hello");
assert(f.exists);
f.remove;
assert(!f.exists);
}
@safe unittest
{
import std.file;
assert(".".exists);
assert(!"this file does not exist".exists);
deleteme.write("a\n");
scope(exit) deleteme.remove;
assert(deleteme.exists);
}
@safe unittest
{
import std.file;
import std.exception : assertThrown;
auto f = deleteme ~ "file";
scope(exit) f.remove;
assert(!f.exists);
assertThrown!FileException(f.getAttributes);
f.write(".");
auto attributes = f.getAttributes;
assert(!attributes.attrIsDir);
assert(attributes.attrIsFile);
}
@safe unittest
{
import std.file;
import std.exception : assertThrown;
auto dir = deleteme ~ "dir";
scope(exit) dir.rmdir;
assert(!dir.exists);
assertThrown!FileException(dir.getAttributes);
dir.mkdir;
auto attributes = dir.getAttributes;
assert(attributes.attrIsDir);
assert(!attributes.attrIsFile);
}
@safe unittest
{
import std.file;
import std.exception : assertThrown;
auto source = deleteme ~ "source";
auto target = deleteme ~ "target";
assert(!source.exists);
assertThrown!FileException(source.getLinkAttributes);
// symlinking isn't available on Windows
version (Posix)
{
scope(exit) source.remove, target.remove;
target.write("target");
target.symlink(source);
assert(source.readText == "target");
assert(source.isSymlink);
assert(source.getLinkAttributes.attrIsSymlink);
}
}
@safe unittest
{
import std.file;
import std.exception : assertThrown;
auto f = deleteme ~ "file";
scope(exit) f.remove;
assert(!f.exists);
assertThrown!FileException(f.getLinkAttributes);
f.write(".");
auto attributes = f.getLinkAttributes;
assert(!attributes.attrIsDir);
assert(attributes.attrIsFile);
}
@safe unittest
{
import std.file;
import std.exception : assertThrown;
auto dir = deleteme ~ "dir";
scope(exit) dir.rmdir;
assert(!dir.exists);
assertThrown!FileException(dir.getLinkAttributes);
dir.mkdir;
auto attributes = dir.getLinkAttributes;
assert(attributes.attrIsDir);
assert(!attributes.attrIsFile);
}
@safe unittest
{
import std.file;
import std.exception : assertThrown;
import std.conv : octal;
auto f = deleteme ~ "file";
version (Posix)
{
scope(exit) f.remove;
assert(!f.exists);
assertThrown!FileException(f.setAttributes(octal!777));
f.write(".");
auto attributes = f.getAttributes;
assert(!attributes.attrIsDir);
assert(attributes.attrIsFile);
f.setAttributes(octal!777);
attributes = f.getAttributes;
assert((attributes & 1023) == octal!777);
}
}
@safe unittest
{
import std.file;
import std.exception : assertThrown;
import std.conv : octal;
auto dir = deleteme ~ "dir";
version (Posix)
{
scope(exit) dir.rmdir;
assert(!dir.exists);
assertThrown!FileException(dir.setAttributes(octal!777));
dir.mkdir;
auto attributes = dir.getAttributes;
assert(attributes.attrIsDir);
assert(!attributes.attrIsFile);
dir.setAttributes(octal!777);
attributes = dir.getAttributes;
assert((attributes & 1023) == octal!777);
}
}
@safe unittest
{
import std.file;
import std.exception : assertThrown;
auto dir = deleteme ~ "dir";
auto f = deleteme ~ "f";
scope(exit) dir.rmdir, f.remove;
assert(!dir.exists);
assertThrown!FileException(dir.isDir);
dir.mkdir;
assert(dir.isDir);
f.write(".");
assert(!f.isDir);
}
@safe unittest
{
import std.file;
import std.exception : assertThrown;
auto dir = deleteme ~ "dir";
auto f = deleteme ~ "f";
scope(exit) dir.rmdir, f.remove;
assert(!dir.exists);
assertThrown!FileException(dir.getAttributes.attrIsDir);
dir.mkdir;
assert(dir.isDir);
assert(dir.getAttributes.attrIsDir);
f.write(".");
assert(!f.isDir);
assert(!f.getAttributes.attrIsDir);
}
@safe unittest
{
import std.file;
import std.exception : assertThrown;
auto dir = deleteme ~ "dir";
auto f = deleteme ~ "f";
scope(exit) dir.rmdir, f.remove;
dir.mkdir;
assert(!dir.isFile);
assert(!f.exists);
assertThrown!FileException(f.isFile);
f.write(".");
assert(f.isFile);
}
@safe unittest
{
import std.file;
import std.exception : assertThrown;
auto dir = deleteme ~ "dir";
auto f = deleteme ~ "f";
scope(exit) dir.rmdir, f.remove;
dir.mkdir;
assert(!dir.isFile);
assert(!dir.getAttributes.attrIsFile);
assert(!f.exists);
assertThrown!FileException(f.getAttributes.attrIsFile);
f.write(".");
assert(f.isFile);
assert(f.getAttributes.attrIsFile);
}
@safe unittest
{
import std.file;
import std.exception : assertThrown;
auto source = deleteme ~ "source";
auto target = deleteme ~ "target";
assert(!source.exists);
assertThrown!FileException(source.isSymlink);
// symlinking isn't available on Windows
version (Posix)
{
scope(exit) source.remove, target.remove;
target.write("target");
target.symlink(source);
assert(source.readText == "target");
assert(source.isSymlink);
assert(source.getLinkAttributes.attrIsSymlink);
}
}
@safe unittest
{
import std.file;
import std.exception : assertThrown;
auto source = deleteme ~ "source";
auto target = deleteme ~ "target";
assert(!source.exists);
assertThrown!FileException(source.getLinkAttributes.attrIsSymlink);
// symlinking isn't available on Windows
version (Posix)
{
scope(exit) source.remove, target.remove;
target.write("target");
target.symlink(source);
assert(source.readText == "target");
assert(source.isSymlink);
assert(source.getLinkAttributes.attrIsSymlink);
}
}
@system unittest
{
import std.file;
import std.algorithm.comparison : equal;
import std.algorithm.sorting : sort;
import std.array : array;
import std.path : buildPath;
auto cwd = getcwd;
auto dir = deleteme ~ "dir";
dir.mkdir;
scope(exit) cwd.chdir, dir.rmdirRecurse;
dir.buildPath("a").write(".");
dir.chdir; // step into dir
"b".write(".");
assert(dirEntries(".", SpanMode.shallow).array.sort.equal(
[".".buildPath("a"), ".".buildPath("b")]
));
}
@safe unittest
{
import std.file;
import std.file : mkdir;
auto dir = deleteme ~ "dir";
scope(exit) dir.rmdir;
dir.mkdir;
assert(dir.exists);
}
@safe unittest
{
import std.file;
import std.exception : assertThrown;
assertThrown("a/b/c/d/e".mkdir);
}
@safe unittest
{
import std.file;
import std.path : buildPath;
auto dir = deleteme ~ "dir";
scope(exit) dir.rmdirRecurse;
dir.mkdir;
assert(dir.exists);
dir.mkdirRecurse; // does nothing
// creates all parent directories as needed
auto nested = dir.buildPath("a", "b", "c");
nested.mkdirRecurse;
assert(nested.exists);
}
@safe unittest
{
import std.file;
import std.exception : assertThrown;
scope(exit) deleteme.remove;
deleteme.write("a");
// cannot make directory as it's already a file
assertThrown!FileException(deleteme.mkdirRecurse);
}
@safe unittest
{
import std.file;
auto dir = deleteme ~ "dir";
dir.mkdir;
assert(dir.exists);
dir.rmdir;
assert(!dir.exists);
}
@safe unittest
{
import std.file;
auto s = getcwd();
assert(s.length);
}
@safe unittest
{
import std.file;
import std.path : isAbsolute;
auto path = thisExePath();
assert(path.exists);
assert(path.isAbsolute);
assert(path.isFile);
}
@safe unittest
{
import std.file;
auto source = deleteme ~ "source";
auto target = deleteme ~ "target";
auto targetNonExistent = deleteme ~ "target2";
scope(exit) source.remove, target.remove, targetNonExistent.remove;
source.write("source");
target.write("target");
assert(target.readText == "target");
source.copy(target);
assert(target.readText == "source");
source.copy(targetNonExistent);
assert(targetNonExistent.readText == "source");
}
@system unittest
{
import std.file;
import std.path : buildPath;
auto dir = deleteme.buildPath("a", "b", "c");
dir.mkdirRecurse;
assert(dir.exists);
deleteme.rmdirRecurse;
assert(!dir.exists);
assert(!deleteme.exists);
}
@system unittest
{
import std.file;
import std.algorithm.comparison : equal;
import std.algorithm.iteration : map;
import std.algorithm.sorting : sort;
import std.array : array;
import std.path : buildPath, relativePath;
auto root = deleteme ~ "root";
scope(exit) root.rmdirRecurse;
root.mkdir;
root.buildPath("animals").mkdir;
root.buildPath("animals", "cat").mkdir;
alias removeRoot = (return scope e) => e.relativePath(root);
assert(root.dirEntries(SpanMode.depth).map!removeRoot.equal(
[buildPath("animals", "cat"), "animals"]));
assert(root.dirEntries(SpanMode.breadth).map!removeRoot.equal(
["animals", buildPath("animals", "cat")]));
root.buildPath("plants").mkdir;
assert(root.dirEntries(SpanMode.shallow).array.sort.map!removeRoot.equal(
["animals", "plants"]));
}
@safe unittest
{
import std.file;
string[] listdir(string pathname)
{
import std.algorithm.iteration : map, filter;
import std.array : array;
import std.path : baseName;
return dirEntries(pathname, SpanMode.shallow)
.filter!(a => a.isFile)
.map!((return a) => baseName(a.name))
.array;
}
// Can be safe only with -preview=dip1000
@safe void main(string[] args)
{
import std.stdio : writefln;
string[] files = listdir(args[1]);
writefln("%s", files);
}
}
@system unittest
{
import std.file;
import std.typecons : tuple;
scope(exit)
{
assert(exists(deleteme));
remove(deleteme);
}
write(deleteme, "12 12.25\n345 1.125"); // deleteme is the name of a temporary file
// Load file; each line is an int followed by comma, whitespace and a
// double.
auto a = slurp!(int, double)(deleteme, "%s %s");
assert(a.length == 2);
assert(a[0] == tuple(12, 12.25));
assert(a[1] == tuple(345, 1.125));
}
@safe unittest
{
import std.file;
import std.ascii : letters;
import std.conv : to;
import std.path : buildPath;
import std.random : randomSample;
import std.utf : byCodeUnit;
// random id with 20 letters
auto id = letters.byCodeUnit.randomSample(20).to!string;
auto myFile = tempDir.buildPath(id ~ "my_tmp_file");
scope(exit) myFile.remove;
myFile.write("hello");
assert(myFile.readText == "hello");
}
@safe unittest
{
import std.file;
import std.exception : assertThrown;
auto space = getAvailableDiskSpace(".");
assert(space > 0);
assertThrown!FileException(getAvailableDiskSpace("ThisFileDoesNotExist123123"));
}