Updated grammar. Removal of elif. Removal of ':' ';' in some ct statements. Empty faults is now an error. Remove "define" for types. Remove "private". Better errors on incorrect bitstruct syntax. Introduction of wildcard type rather than optional wildcard. Removal of scaled vector type. mkdir and rmdir. Disallow define @Foo() = { @inline }. Add handling for @optreturn and change it to @return!. Restrict interface style functions. Updated x64 ABI. stdlib updates to string. Removed deprecated functions. Update how variadics are implemented. Extended error messages. x86 ABI fixes. Shift check fixes. '!' and '?' are flipped. No trailing ',' allowed in functions. Fix to string parsing. Allow l suffix. Simplifying flatpath. any replaces variant, anyfault replaces anyerr. Allow getting the underlying type of anyfault. De-duplicate string constants. Fix of readme. Extended list. Fix of "(MyEnum)x + 1". Clock and DateTime types. Fixes to array concat.

This commit is contained in:
Christoffer Lerno
2023-03-23 14:49:51 +01:00
committed by Christoffer Lerno
parent d14e778232
commit 809321e20c
270 changed files with 8777 additions and 7237 deletions

View File

@@ -5,21 +5,21 @@ fn void! bytestream()
ByteReader r;
r.init("abc");
Stream s = r.as_stream();
assert(s.len()? == 3);
assert(s.len()! == 3);
char[5] buffer;
assert('a' == s.read_byte()?);
s.pushback_byte()?;
usz len = s.read(&buffer)?;
assert('a' == s.read_byte()!);
s.pushback_byte()!;
usz len = s.read(&buffer)!;
assert((String)buffer[:len] == "abc");
ByteWriter w;
w.init();
Stream ws = w.as_stream();
ws.write("helloworld")?;
ws.write("helloworld")!;
assert(w.as_str() == "helloworld");
s.seek(0, SET)?;
ws.read_from(&s)?;
s.seek(1, SET)?;
s.write_to(&ws)?;
s.seek(0, SET)!;
ws.read_from(&s)!;
s.seek(1, SET)!;
s.write_to(&ws)!;
assert(w.as_str() == "helloworldabcbc");
}
@@ -33,5 +33,5 @@ fn void! bytewriter_buffer()
s.write_byte(0)!!;
String o = ((ZString)&z).as_str();
assert(o == "hello");
assert(catch? s.write("xxxx"));
assert(@catchof(s.write("xxxx")));
}

View File

@@ -11,7 +11,7 @@ fn void! test_writing()
ByteReader r;
String test_str = "2134";
r.init(test_str);
s.read_from(&&r.as_stream())?;
s.read_from(&&r.as_stream())!;
String o = foo.str();
assert(o == "hello-what?2134");
}

View File

@@ -3,289 +3,289 @@ module std::io::path @test;
fn void! test_parent()
{
Path p = path::new("")?;
assert(catch? p.parent());
p = path::new("/", .path_env = PathEnv.POSIX)?;
assert(catch? p.parent());
p = path::new("/a/b/c", .path_env = PathEnv.POSIX)?;
assert(p.parent().as_str()? == "/a/b");
p = path::new("/a/b/c", .path_env = PathEnv.WIN32)?;
assert(p.parent().as_str()? == `\a\b`);
Path p = path::new("")!;
assert(@catchof(p.parent()));
p = path::new("/", .path_env = PathEnv.POSIX)!;
assert(@catchof(p.parent()));
p = path::new("/a/b/c", .path_env = PathEnv.POSIX)!;
assert(p.parent().as_str()! == "/a/b");
p = path::new("/a/b/c", .path_env = PathEnv.WIN32)!;
assert(p.parent().as_str()! == `\a\b`);
}
fn void! test_path_normalized()
{
assert(path::new("", .path_env = PathEnv.WIN32).as_str()? == "");
assert(catch? path::new("1:\\a\\b\\c.txt", .path_env = PathEnv.WIN32));
assert(catch? path::new(":", .path_env = PathEnv.WIN32));
assert(catch? path::new("1:", .path_env = PathEnv.WIN32));
assert(catch? path::new("1:a", .path_env = PathEnv.WIN32));
// assert(catch? path::new(`\\\a\b\c.txt`, .path_env = PathEnv.WIN32));
assert(catch? path::new(`\\server\a\b\..\..\..\c`, .path_env = PathEnv.WIN32));
assert(path::new("", .path_env = PathEnv.WIN32).as_str()! == "");
assert(@catchof(path::new("1:\\a\\b\\c.txt", .path_env = PathEnv.WIN32)));
assert(@catchof(path::new(":", .path_env = PathEnv.WIN32)));
assert(@catchof(path::new("1:", .path_env = PathEnv.WIN32)));
assert(@catchof(path::new("1:a", .path_env = PathEnv.WIN32)));
// assert(@catchof(path::new(`\\\a\b\c.txt`, .path_env = PathEnv.WIN32)));
assert(@catchof(path::new(`\\server\a\b\..\..\..\c`, .path_env = PathEnv.WIN32)));
assert(catch? path::new(`\\a`, .path_env = PathEnv.WIN32));
assert(catch? path::new(`/a/b/../../../c`, .path_env = PathEnv.WIN32));
assert(catch? path::new(`/a/b/../../../c`, .path_env = PathEnv.POSIX));
assert(catch? path::new(`/a/b/../../..`, .path_env = PathEnv.WIN32));
assert(catch? path::new(`/a/b/../../..`, .path_env = PathEnv.POSIX));
assert(catch? path::new(`/../a`, .path_env = PathEnv.WIN32));
assert(catch? path::new(`/../a`, .path_env = PathEnv.POSIX));
assert(catch? path::new(`/..`, .path_env = PathEnv.WIN32));
assert(catch? path::new(`/..`, .path_env = PathEnv.POSIX));
assert(catch? path::new(`C:/a/b/../../../c`, .path_env = PathEnv.WIN32));
assert(catch? path::new(`C:/../a`, .path_env = PathEnv.WIN32));
assert(catch? path::new(`C:/..`, .path_env = PathEnv.WIN32));
assert(@catchof(path::new(`\\a`, .path_env = PathEnv.WIN32)));
assert(@catchof(path::new(`/a/b/../../../c`, .path_env = PathEnv.WIN32)));
assert(@catchof(path::new(`/a/b/../../../c`, .path_env = PathEnv.POSIX)));
assert(@catchof(path::new(`/a/b/../../..`, .path_env = PathEnv.WIN32)));
assert(@catchof(path::new(`/a/b/../../..`, .path_env = PathEnv.POSIX)));
assert(@catchof(path::new(`/../a`, .path_env = PathEnv.WIN32)));
assert(@catchof(path::new(`/../a`, .path_env = PathEnv.POSIX)));
assert(@catchof(path::new(`/..`, .path_env = PathEnv.WIN32)));
assert(@catchof(path::new(`/..`, .path_env = PathEnv.POSIX)));
assert(@catchof(path::new(`C:/a/b/../../../c`, .path_env = PathEnv.WIN32)));
assert(@catchof(path::new(`C:/../a`, .path_env = PathEnv.WIN32)));
assert(@catchof(path::new(`C:/..`, .path_env = PathEnv.WIN32)));
assert(path::new("/", .path_env = PathEnv.POSIX).as_str()? == "/");
assert(path::new("/./", .path_env = PathEnv.POSIX).as_str()? == "/");
assert(path::new("/foo/../", .path_env = PathEnv.POSIX).as_str()? == "/");
assert(path::new("/foo/bar/../", .path_env = PathEnv.POSIX).as_str()? == "/foo");
assert(path::new("/foo//bar", .path_env = PathEnv.POSIX).as_str()? == "/foo/bar");
assert(path::new("/foo//bar/../", .path_env = PathEnv.POSIX).as_str()? == "/foo");
assert(path::new("a\\b/c.txt", .path_env = PathEnv.WIN32).as_str()? == `a\b\c.txt`);
assert(path::new("a\\b/c.txt", .path_env = PathEnv.POSIX).as_str()? == "a\\b/c.txt");
assert(path::new("C:\\a\\b/c.txt", .path_env = PathEnv.WIN32).as_str()? == `C:\a\b\c.txt`);
assert(path::new("C:\\a\\b/c.txt", .path_env = PathEnv.POSIX).as_str()? == "C:\\a\\b/c.txt");
assert(path::new(`\\server\a\b/c.txt`, .path_env = PathEnv.WIN32).as_str()? == `\\server\a\b\c.txt`);
assert(path::new(`\\server\a\b/c.txt`, .path_env = PathEnv.POSIX).as_str()? == `\\server\a\b/c.txt`);
assert(path::new(`c:\hello//bar\\\\foo.txt`, .path_env = PathEnv.WIN32).as_str()? == `c:\hello\bar\foo.txt`);
assert(path::new("/", .path_env = PathEnv.POSIX).as_str()! == "/");
assert(path::new("/./", .path_env = PathEnv.POSIX).as_str()! == "/");
assert(path::new("/foo/../", .path_env = PathEnv.POSIX).as_str()! == "/");
assert(path::new("/foo/bar/../", .path_env = PathEnv.POSIX).as_str()! == "/foo");
assert(path::new("/foo//bar", .path_env = PathEnv.POSIX).as_str()! == "/foo/bar");
assert(path::new("/foo//bar/../", .path_env = PathEnv.POSIX).as_str()! == "/foo");
assert(path::new("a\\b/c.txt", .path_env = PathEnv.WIN32).as_str()! == `a\b\c.txt`);
assert(path::new("a\\b/c.txt", .path_env = PathEnv.POSIX).as_str()! == "a\\b/c.txt");
assert(path::new("C:\\a\\b/c.txt", .path_env = PathEnv.WIN32).as_str()! == `C:\a\b\c.txt`);
assert(path::new("C:\\a\\b/c.txt", .path_env = PathEnv.POSIX).as_str()! == "C:\\a\\b/c.txt");
assert(path::new(`\\server\a\b/c.txt`, .path_env = PathEnv.WIN32).as_str()! == `\\server\a\b\c.txt`);
assert(path::new(`\\server\a\b/c.txt`, .path_env = PathEnv.POSIX).as_str()! == `\\server\a\b/c.txt`);
assert(path::new(`c:\hello//bar\\\\foo.txt`, .path_env = PathEnv.WIN32).as_str()! == `c:\hello\bar\foo.txt`);
assert(path::new(`~\a\b/c.txt`, .path_env = PathEnv.WIN32).as_str()? == `~\a\b\c.txt`);
assert(path::new(`~\a\b/c.txt`, .path_env = PathEnv.POSIX).as_str()? == `~\a\b/c.txt`);
assert(path::new(`~\a\b/c.txt`, .path_env = PathEnv.WIN32).as_str()! == `~\a\b\c.txt`);
assert(path::new(`~\a\b/c.txt`, .path_env = PathEnv.POSIX).as_str()! == `~\a\b/c.txt`);
assert(path::new(`a/b/../../../c`, .path_env = PathEnv.WIN32).as_str()? == `..\c`);
assert(path::new(`a/b/../../../c`, .path_env = PathEnv.POSIX).as_str()? == `../c`);
assert(path::new(`a/b/../../..`, .path_env = PathEnv.WIN32).as_str()? == `..`);
assert(path::new(`a/b/../../..`, .path_env = PathEnv.POSIX).as_str()? == `..`);
assert(path::new(`../a`, .path_env = PathEnv.WIN32).as_str()? == `..\a`);
assert(path::new(`../a`, .path_env = PathEnv.POSIX).as_str()? == `../a`);
assert(path::new(`..`, .path_env = PathEnv.WIN32).as_str()? == `..`);
assert(path::new(`..`, .path_env = PathEnv.POSIX).as_str()? == `..`);
assert(path::new(`a/b/../c`, .path_env = PathEnv.WIN32).as_str()? == `a\c`);
assert(path::new(`a/b/../c`, .path_env = PathEnv.POSIX).as_str()? == `a/c`);
assert(path::new(`a/b/../../c`, .path_env = PathEnv.WIN32).as_str()? == `c`);
assert(path::new(`a/b/../../c`, .path_env = PathEnv.POSIX).as_str()? == `c`);
assert(path::new(`a/b/..`, .path_env = PathEnv.WIN32).as_str()? == `a`);
assert(path::new(`a/b/..`, .path_env = PathEnv.POSIX).as_str()? == `a`);
assert(path::new(`a/b/../`, .path_env = PathEnv.WIN32).as_str()? == `a`);
assert(path::new(`a/b/../`, .path_env = PathEnv.POSIX).as_str()? == `a`);
assert(path::new(`a/b/../..`, .path_env = PathEnv.WIN32).as_str()? == "");
assert(path::new(`a/b/../..`, .path_env = PathEnv.POSIX).as_str()? == "");
assert(path::new(`a/b/../../`, .path_env = PathEnv.WIN32).as_str()? == "");
assert(path::new(`a/b/../../`, .path_env = PathEnv.POSIX).as_str()? == "");
assert(path::new(`a/b/../c/../d`, .path_env = PathEnv.WIN32).as_str()? == `a\d`);
assert(path::new(`a/b/../c/../d`, .path_env = PathEnv.POSIX).as_str()? == `a/d`);
assert(path::new(`a/b/../c/../d/`, .path_env = PathEnv.WIN32).as_str()? == `a\d`);
assert(path::new(`a/b/../c/../d/`, .path_env = PathEnv.POSIX).as_str()? == `a/d`);
assert(path::new(`a/b//d`, .path_env = PathEnv.WIN32).as_str()? == `a\b\d`);
assert(path::new(`a/b//d`, .path_env = PathEnv.POSIX).as_str()? == `a/b/d`);
assert(path::new(`a/b/././.`, .path_env = PathEnv.WIN32).as_str()? == `a\b`);
assert(path::new(`a/b/././.`, .path_env = PathEnv.POSIX).as_str()? == `a/b`);
assert(path::new(`a/b/./././`, .path_env = PathEnv.WIN32).as_str()? == `a\b`);
assert(path::new(`a/b/./././`, .path_env = PathEnv.POSIX).as_str()? == `a/b`);
assert(path::new(`./a/`, .path_env = PathEnv.WIN32).as_str()? == `a`);
assert(path::new(`./a/`, .path_env = PathEnv.POSIX).as_str()? == `a`);
assert(path::new(`./`, .path_env = PathEnv.WIN32).as_str()? == ``);
assert(path::new(`./`, .path_env = PathEnv.POSIX).as_str()? == ``);
assert(path::new(`.`, .path_env = PathEnv.WIN32).as_str()? == ``);
assert(path::new(`.`, .path_env = PathEnv.POSIX).as_str()? == ``);
assert(path::new(``, .path_env = PathEnv.WIN32).as_str()? == ``);
assert(path::new(``, .path_env = PathEnv.POSIX).as_str()? == ``);
assert(path::new(`/a`, .path_env = PathEnv.WIN32).as_str()? == `\a`);
assert(path::new(`/a`, .path_env = PathEnv.POSIX).as_str()? == `/a`);
assert(path::new(`/a/`, .path_env = PathEnv.WIN32).as_str()? == `\a`);
assert(path::new(`/a/`, .path_env = PathEnv.POSIX).as_str()? == `/a`);
assert(path::new(`/a/b/../c`, .path_env = PathEnv.WIN32).as_str()? == `\a\c`);
assert(path::new(`/a/b/../c`, .path_env = PathEnv.POSIX).as_str()? == `/a/c`);
assert(path::new(`/a/b/../../c`, .path_env = PathEnv.WIN32).as_str()? == `\c`);
assert(path::new(`/a/b/../../c`, .path_env = PathEnv.POSIX).as_str()? == `/c`);
assert(path::new(`/a/b/..`, .path_env = PathEnv.WIN32).as_str()? == `\a`);
assert(path::new(`/a/b/..`, .path_env = PathEnv.POSIX).as_str()? == `/a`);
assert(path::new(`/a/b/../..`, .path_env = PathEnv.WIN32).as_str()? == `\`);
assert(path::new(`/a/b/../..`, .path_env = PathEnv.POSIX).as_str()? == `/`);
assert(path::new(`/a/b/../c/../d`, .path_env = PathEnv.WIN32).as_str()? == `\a\d`);
assert(path::new(`/a/b/../c/../d`, .path_env = PathEnv.POSIX).as_str()? == `/a/d`);
assert(path::new(`/a/b//d`, .path_env = PathEnv.WIN32).as_str()? == `\a\b\d`);
assert(path::new(`/a/b//d`, .path_env = PathEnv.POSIX).as_str()? == `/a/b/d`);
assert(path::new(`/./a/`, .path_env = PathEnv.WIN32).as_str()? == `\a`);
assert(path::new(`/./a/`, .path_env = PathEnv.POSIX).as_str()? == `/a`);
assert(path::new(`/./`, .path_env = PathEnv.WIN32).as_str()? == `\`);
assert(path::new(`/./`, .path_env = PathEnv.POSIX).as_str()? == `/`);
assert(path::new(`/.`, .path_env = PathEnv.WIN32).as_str()? == `\`);
assert(path::new(`/.`, .path_env = PathEnv.POSIX).as_str()? == `/`);
assert(path::new(`/`, .path_env = PathEnv.WIN32).as_str()? == `\`);
assert(path::new(`/`, .path_env = PathEnv.POSIX).as_str()? == `/`);
assert(path::new(`C:/a`, .path_env = PathEnv.WIN32).as_str()? == `C:\a`);
assert(path::new(`C:/a`, .path_env = PathEnv.POSIX).as_str()? == `C:/a`);
assert(path::new(`C:/a/b/../c`, .path_env = PathEnv.WIN32).as_str()? == `C:\a\c`);
assert(path::new(`C:/a/b/../c`, .path_env = PathEnv.POSIX).as_str()? == `C:/a/c`);
assert(path::new(`C:/a/b/../../c`, .path_env = PathEnv.WIN32).as_str()? == `C:\c`);
assert(path::new(`C:/a/b/../../c`, .path_env = PathEnv.POSIX).as_str()? == `C:/c`);
assert(path::new(`C:/a/b/../../../c`, .path_env = PathEnv.POSIX).as_str()? == `c`);
assert(path::new(`C:/a/b/..`, .path_env = PathEnv.WIN32).as_str()? == `C:\a`);
assert(path::new(`C:/a/b/..`, .path_env = PathEnv.POSIX).as_str()? == `C:/a`);
assert(path::new(`C:/a/b/../..`, .path_env = PathEnv.WIN32).as_str()? == `C:\`);
assert(path::new(`C:/a/b/../..`, .path_env = PathEnv.POSIX).as_str()? == `C:`);
assert(path::new(`C:/a/b/../c/../d`, .path_env = PathEnv.WIN32).as_str()? == `C:\a\d`);
assert(path::new(`C:/a/b/../c/../d`, .path_env = PathEnv.POSIX).as_str()? == `C:/a/d`);
assert(path::new(`C:/a/b//d`, .path_env = PathEnv.WIN32).as_str()? == `C:\a\b\d`);
assert(path::new(`C:/a/b//d`, .path_env = PathEnv.POSIX).as_str()? == `C:/a/b/d`);
assert(path::new(`C:/a/b/././.`, .path_env = PathEnv.WIN32).as_str()? == `C:\a\b`);
assert(path::new(`C:/a/b/././.`, .path_env = PathEnv.POSIX).as_str()? == `C:/a/b`);
assert(path::new(`C:/./a`, .path_env = PathEnv.WIN32).as_str()? == `C:\a`);
assert(path::new(`C:/./a`, .path_env = PathEnv.POSIX).as_str()? == `C:/a`);
assert(path::new(`C:/./`, .path_env = PathEnv.WIN32).as_str()? == `C:\`);
assert(path::new(`C:/./`, .path_env = PathEnv.POSIX).as_str()? == `C:`);
assert(path::new(`C:/../a`, .path_env = PathEnv.POSIX).as_str()? == `a`);
assert(path::new(`C:/..`, .path_env = PathEnv.POSIX).as_str()? == ``);
assert(path::new(`C:/`, .path_env = PathEnv.WIN32).as_str()? == `C:\`);
assert(path::new(`C:/`, .path_env = PathEnv.POSIX).as_str()? == `C:`);
assert(path::new(`C:a`, .path_env = PathEnv.WIN32).as_str()? == `C:a`);
assert(path::new(`C:a`, .path_env = PathEnv.POSIX).as_str()? == `C:a`);
assert(path::new(`C:a/`, .path_env = PathEnv.WIN32).as_str()? == `C:a`);
assert(path::new(`C:a/`, .path_env = PathEnv.POSIX).as_str()? == `C:a`);
assert(path::new(`a/b/../../../c`, .path_env = PathEnv.WIN32).as_str()! == `..\c`);
assert(path::new(`a/b/../../../c`, .path_env = PathEnv.POSIX).as_str()! == `../c`);
assert(path::new(`a/b/../../..`, .path_env = PathEnv.WIN32).as_str()! == `..`);
assert(path::new(`a/b/../../..`, .path_env = PathEnv.POSIX).as_str()! == `..`);
assert(path::new(`../a`, .path_env = PathEnv.WIN32).as_str()! == `..\a`);
assert(path::new(`../a`, .path_env = PathEnv.POSIX).as_str()! == `../a`);
assert(path::new(`..`, .path_env = PathEnv.WIN32).as_str()! == `..`);
assert(path::new(`..`, .path_env = PathEnv.POSIX).as_str()! == `..`);
assert(path::new(`a/b/../c`, .path_env = PathEnv.WIN32).as_str()! == `a\c`);
assert(path::new(`a/b/../c`, .path_env = PathEnv.POSIX).as_str()! == `a/c`);
assert(path::new(`a/b/../../c`, .path_env = PathEnv.WIN32).as_str()! == `c`);
assert(path::new(`a/b/../../c`, .path_env = PathEnv.POSIX).as_str()! == `c`);
assert(path::new(`a/b/..`, .path_env = PathEnv.WIN32).as_str()! == `a`);
assert(path::new(`a/b/..`, .path_env = PathEnv.POSIX).as_str()! == `a`);
assert(path::new(`a/b/../`, .path_env = PathEnv.WIN32).as_str()! == `a`);
assert(path::new(`a/b/../`, .path_env = PathEnv.POSIX).as_str()! == `a`);
assert(path::new(`a/b/../..`, .path_env = PathEnv.WIN32).as_str()! == "");
assert(path::new(`a/b/../..`, .path_env = PathEnv.POSIX).as_str()! == "");
assert(path::new(`a/b/../../`, .path_env = PathEnv.WIN32).as_str()! == "");
assert(path::new(`a/b/../../`, .path_env = PathEnv.POSIX).as_str()! == "");
assert(path::new(`a/b/../c/../d`, .path_env = PathEnv.WIN32).as_str()! == `a\d`);
assert(path::new(`a/b/../c/../d`, .path_env = PathEnv.POSIX).as_str()! == `a/d`);
assert(path::new(`a/b/../c/../d/`, .path_env = PathEnv.WIN32).as_str()! == `a\d`);
assert(path::new(`a/b/../c/../d/`, .path_env = PathEnv.POSIX).as_str()! == `a/d`);
assert(path::new(`a/b//d`, .path_env = PathEnv.WIN32).as_str()! == `a\b\d`);
assert(path::new(`a/b//d`, .path_env = PathEnv.POSIX).as_str()! == `a/b/d`);
assert(path::new(`a/b/././.`, .path_env = PathEnv.WIN32).as_str()! == `a\b`);
assert(path::new(`a/b/././.`, .path_env = PathEnv.POSIX).as_str()! == `a/b`);
assert(path::new(`a/b/./././`, .path_env = PathEnv.WIN32).as_str()! == `a\b`);
assert(path::new(`a/b/./././`, .path_env = PathEnv.POSIX).as_str()! == `a/b`);
assert(path::new(`./a/`, .path_env = PathEnv.WIN32).as_str()! == `a`);
assert(path::new(`./a/`, .path_env = PathEnv.POSIX).as_str()! == `a`);
assert(path::new(`./`, .path_env = PathEnv.WIN32).as_str()! == ``);
assert(path::new(`./`, .path_env = PathEnv.POSIX).as_str()! == ``);
assert(path::new(`.`, .path_env = PathEnv.WIN32).as_str()! == ``);
assert(path::new(`.`, .path_env = PathEnv.POSIX).as_str()! == ``);
assert(path::new(``, .path_env = PathEnv.WIN32).as_str()! == ``);
assert(path::new(``, .path_env = PathEnv.POSIX).as_str()! == ``);
assert(path::new(`/a`, .path_env = PathEnv.WIN32).as_str()! == `\a`);
assert(path::new(`/a`, .path_env = PathEnv.POSIX).as_str()! == `/a`);
assert(path::new(`/a/`, .path_env = PathEnv.WIN32).as_str()! == `\a`);
assert(path::new(`/a/`, .path_env = PathEnv.POSIX).as_str()! == `/a`);
assert(path::new(`/a/b/../c`, .path_env = PathEnv.WIN32).as_str()! == `\a\c`);
assert(path::new(`/a/b/../c`, .path_env = PathEnv.POSIX).as_str()! == `/a/c`);
assert(path::new(`/a/b/../../c`, .path_env = PathEnv.WIN32).as_str()! == `\c`);
assert(path::new(`/a/b/../../c`, .path_env = PathEnv.POSIX).as_str()! == `/c`);
assert(path::new(`/a/b/..`, .path_env = PathEnv.WIN32).as_str()! == `\a`);
assert(path::new(`/a/b/..`, .path_env = PathEnv.POSIX).as_str()! == `/a`);
assert(path::new(`/a/b/../..`, .path_env = PathEnv.WIN32).as_str()! == `\`);
assert(path::new(`/a/b/../..`, .path_env = PathEnv.POSIX).as_str()! == `/`);
assert(path::new(`/a/b/../c/../d`, .path_env = PathEnv.WIN32).as_str()! == `\a\d`);
assert(path::new(`/a/b/../c/../d`, .path_env = PathEnv.POSIX).as_str()! == `/a/d`);
assert(path::new(`/a/b//d`, .path_env = PathEnv.WIN32).as_str()! == `\a\b\d`);
assert(path::new(`/a/b//d`, .path_env = PathEnv.POSIX).as_str()! == `/a/b/d`);
assert(path::new(`/./a/`, .path_env = PathEnv.WIN32).as_str()! == `\a`);
assert(path::new(`/./a/`, .path_env = PathEnv.POSIX).as_str()! == `/a`);
assert(path::new(`/./`, .path_env = PathEnv.WIN32).as_str()! == `\`);
assert(path::new(`/./`, .path_env = PathEnv.POSIX).as_str()! == `/`);
assert(path::new(`/.`, .path_env = PathEnv.WIN32).as_str()! == `\`);
assert(path::new(`/.`, .path_env = PathEnv.POSIX).as_str()! == `/`);
assert(path::new(`/`, .path_env = PathEnv.WIN32).as_str()! == `\`);
assert(path::new(`/`, .path_env = PathEnv.POSIX).as_str()! == `/`);
assert(path::new(`C:/a`, .path_env = PathEnv.WIN32).as_str()! == `C:\a`);
assert(path::new(`C:/a`, .path_env = PathEnv.POSIX).as_str()! == `C:/a`);
assert(path::new(`C:/a/b/../c`, .path_env = PathEnv.WIN32).as_str()! == `C:\a\c`);
assert(path::new(`C:/a/b/../c`, .path_env = PathEnv.POSIX).as_str()! == `C:/a/c`);
assert(path::new(`C:/a/b/../../c`, .path_env = PathEnv.WIN32).as_str()! == `C:\c`);
assert(path::new(`C:/a/b/../../c`, .path_env = PathEnv.POSIX).as_str()! == `C:/c`);
assert(path::new(`C:/a/b/../../../c`, .path_env = PathEnv.POSIX).as_str()! == `c`);
assert(path::new(`C:/a/b/..`, .path_env = PathEnv.WIN32).as_str()! == `C:\a`);
assert(path::new(`C:/a/b/..`, .path_env = PathEnv.POSIX).as_str()! == `C:/a`);
assert(path::new(`C:/a/b/../..`, .path_env = PathEnv.WIN32).as_str()! == `C:\`);
assert(path::new(`C:/a/b/../..`, .path_env = PathEnv.POSIX).as_str()! == `C:`);
assert(path::new(`C:/a/b/../c/../d`, .path_env = PathEnv.WIN32).as_str()! == `C:\a\d`);
assert(path::new(`C:/a/b/../c/../d`, .path_env = PathEnv.POSIX).as_str()! == `C:/a/d`);
assert(path::new(`C:/a/b//d`, .path_env = PathEnv.WIN32).as_str()! == `C:\a\b\d`);
assert(path::new(`C:/a/b//d`, .path_env = PathEnv.POSIX).as_str()! == `C:/a/b/d`);
assert(path::new(`C:/a/b/././.`, .path_env = PathEnv.WIN32).as_str()! == `C:\a\b`);
assert(path::new(`C:/a/b/././.`, .path_env = PathEnv.POSIX).as_str()! == `C:/a/b`);
assert(path::new(`C:/./a`, .path_env = PathEnv.WIN32).as_str()! == `C:\a`);
assert(path::new(`C:/./a`, .path_env = PathEnv.POSIX).as_str()! == `C:/a`);
assert(path::new(`C:/./`, .path_env = PathEnv.WIN32).as_str()! == `C:\`);
assert(path::new(`C:/./`, .path_env = PathEnv.POSIX).as_str()! == `C:`);
assert(path::new(`C:/../a`, .path_env = PathEnv.POSIX).as_str()! == `a`);
assert(path::new(`C:/..`, .path_env = PathEnv.POSIX).as_str()! == ``);
assert(path::new(`C:/`, .path_env = PathEnv.WIN32).as_str()! == `C:\`);
assert(path::new(`C:/`, .path_env = PathEnv.POSIX).as_str()! == `C:`);
assert(path::new(`C:a`, .path_env = PathEnv.WIN32).as_str()! == `C:a`);
assert(path::new(`C:a`, .path_env = PathEnv.POSIX).as_str()! == `C:a`);
assert(path::new(`C:a/`, .path_env = PathEnv.WIN32).as_str()! == `C:a`);
assert(path::new(`C:a/`, .path_env = PathEnv.POSIX).as_str()! == `C:a`);
assert(path::new(`C:a/b/../c`, .path_env = PathEnv.WIN32).as_str()? == `C:a\c`);
assert(path::new(`C:a/b/../c`, .path_env = PathEnv.POSIX).as_str()? == `C:a/c`);
assert(path::new(`C:a/b/../../c`, .path_env = PathEnv.WIN32).as_str()? == `C:c`);
assert(path::new(`C:a/b/../../c`, .path_env = PathEnv.POSIX).as_str()? == `c`);
assert(path::new(`C:a/b/..`, .path_env = PathEnv.WIN32).as_str()? == `C:a`);
assert(path::new(`C:a/b/..`, .path_env = PathEnv.POSIX).as_str()? == `C:a`);
assert(path::new(`C:a/b/../..`, .path_env = PathEnv.WIN32).as_str()? == `C:`);
assert(path::new(`C:a/b/../..`, .path_env = PathEnv.POSIX).as_str()? == ``);
assert(path::new(`C:a/b/../c/../d`, .path_env = PathEnv.WIN32).as_str()? == `C:a\d`);
assert(path::new(`C:a/b/../c/../d`, .path_env = PathEnv.POSIX).as_str()? == `C:a/d`);
assert(path::new(`C:a/b//d`, .path_env = PathEnv.WIN32).as_str()? == `C:a\b\d`);
assert(path::new(`C:a/b//d`, .path_env = PathEnv.POSIX).as_str()? == `C:a/b/d`);
assert(path::new(`C:a/b/././.`, .path_env = PathEnv.WIN32).as_str()? == `C:a\b`);
assert(path::new(`C:a/b/././.`, .path_env = PathEnv.POSIX).as_str()? == `C:a/b`);
assert(path::new(`C:a/b/../../../c`, .path_env = PathEnv.WIN32).as_str()? == `C:..\c`);
assert(path::new(`C:./a`, .path_env = PathEnv.WIN32).as_str()? == `C:a`);
assert(path::new(`C:./a`, .path_env = PathEnv.POSIX).as_str()? == `C:./a`);
assert(path::new(`C:./`, .path_env = PathEnv.WIN32).as_str()? == `C:`);
assert(path::new(`C:./`, .path_env = PathEnv.POSIX).as_str()? == `C:.`);
assert(path::new(`C:../a`, .path_env = PathEnv.POSIX).as_str()? == `C:../a`);
assert(path::new(`C:../a`, .path_env = PathEnv.WIN32).as_str()? == `C:..\a`);
assert(path::new(`C:..`, .path_env = PathEnv.POSIX).as_str()? == `C:..`);
assert(path::new(`C:..`, .path_env = PathEnv.WIN32).as_str()? == `C:..`);
assert(path::new(`C:`, .path_env = PathEnv.WIN32).as_str()? == `C:`);
assert(path::new(`C:`, .path_env = PathEnv.POSIX).as_str()? == `C:`);
assert(path::new(`C:a/b/../c`, .path_env = PathEnv.WIN32).as_str()! == `C:a\c`);
assert(path::new(`C:a/b/../c`, .path_env = PathEnv.POSIX).as_str()! == `C:a/c`);
assert(path::new(`C:a/b/../../c`, .path_env = PathEnv.WIN32).as_str()! == `C:c`);
assert(path::new(`C:a/b/../../c`, .path_env = PathEnv.POSIX).as_str()! == `c`);
assert(path::new(`C:a/b/..`, .path_env = PathEnv.WIN32).as_str()! == `C:a`);
assert(path::new(`C:a/b/..`, .path_env = PathEnv.POSIX).as_str()! == `C:a`);
assert(path::new(`C:a/b/../..`, .path_env = PathEnv.WIN32).as_str()! == `C:`);
assert(path::new(`C:a/b/../..`, .path_env = PathEnv.POSIX).as_str()! == ``);
assert(path::new(`C:a/b/../c/../d`, .path_env = PathEnv.WIN32).as_str()! == `C:a\d`);
assert(path::new(`C:a/b/../c/../d`, .path_env = PathEnv.POSIX).as_str()! == `C:a/d`);
assert(path::new(`C:a/b//d`, .path_env = PathEnv.WIN32).as_str()! == `C:a\b\d`);
assert(path::new(`C:a/b//d`, .path_env = PathEnv.POSIX).as_str()! == `C:a/b/d`);
assert(path::new(`C:a/b/././.`, .path_env = PathEnv.WIN32).as_str()! == `C:a\b`);
assert(path::new(`C:a/b/././.`, .path_env = PathEnv.POSIX).as_str()! == `C:a/b`);
assert(path::new(`C:a/b/../../../c`, .path_env = PathEnv.WIN32).as_str()! == `C:..\c`);
assert(path::new(`C:./a`, .path_env = PathEnv.WIN32).as_str()! == `C:a`);
assert(path::new(`C:./a`, .path_env = PathEnv.POSIX).as_str()! == `C:./a`);
assert(path::new(`C:./`, .path_env = PathEnv.WIN32).as_str()! == `C:`);
assert(path::new(`C:./`, .path_env = PathEnv.POSIX).as_str()! == `C:.`);
assert(path::new(`C:../a`, .path_env = PathEnv.POSIX).as_str()! == `C:../a`);
assert(path::new(`C:../a`, .path_env = PathEnv.WIN32).as_str()! == `C:..\a`);
assert(path::new(`C:..`, .path_env = PathEnv.POSIX).as_str()! == `C:..`);
assert(path::new(`C:..`, .path_env = PathEnv.WIN32).as_str()! == `C:..`);
assert(path::new(`C:`, .path_env = PathEnv.WIN32).as_str()! == `C:`);
assert(path::new(`C:`, .path_env = PathEnv.POSIX).as_str()! == `C:`);
assert(path::new(`\\server/a`, .path_env = PathEnv.WIN32).as_str()? == `\\server\a`);
assert(path::new(`\\server/a`, .path_env = PathEnv.POSIX).as_str()? == `\\server/a`);
assert(path::new(`\\server\a\b\..\c`, .path_env = PathEnv.WIN32).as_str()? == `\\server\a\c`);
assert(path::new(`\\server\a\b\..\..\c`, .path_env = PathEnv.WIN32).as_str()? == `\\server\c`);
assert(path::new(`\\server\a\b\..`, .path_env = PathEnv.WIN32).as_str()? == `\\server\a`);
assert(path::new(`\\server\a\..`, .path_env = PathEnv.WIN32).as_str()? == `\\server\`);
assert(path::new(`\\server\a\b\..\c\..\d`, .path_env = PathEnv.WIN32).as_str()? == `\\server\a\d`);
assert(path::new(`\\server\a\b\\d`, .path_env = PathEnv.WIN32).as_str()? == `\\server\a\b\d`);
assert(path::new(`\\server\a\b\.\.\.`, .path_env = PathEnv.WIN32).as_str()? == `\\server\a\b`);
assert(path::new(`\\server\.\a`, .path_env = PathEnv.WIN32).as_str()? == `\\server\a`);
assert(path::new(`\\server\.`, .path_env = PathEnv.WIN32).as_str()? == `\\server\`);
assert(path::new(`\\server\`, .path_env = PathEnv.WIN32).as_str()? == `\\server\`);
assert(path::new(`\\server/a`, .path_env = PathEnv.WIN32).as_str()! == `\\server\a`);
assert(path::new(`\\server/a`, .path_env = PathEnv.POSIX).as_str()! == `\\server/a`);
assert(path::new(`\\server\a\b\..\c`, .path_env = PathEnv.WIN32).as_str()! == `\\server\a\c`);
assert(path::new(`\\server\a\b\..\..\c`, .path_env = PathEnv.WIN32).as_str()! == `\\server\c`);
assert(path::new(`\\server\a\b\..`, .path_env = PathEnv.WIN32).as_str()! == `\\server\a`);
assert(path::new(`\\server\a\..`, .path_env = PathEnv.WIN32).as_str()! == `\\server\`);
assert(path::new(`\\server\a\b\..\c\..\d`, .path_env = PathEnv.WIN32).as_str()! == `\\server\a\d`);
assert(path::new(`\\server\a\b\\d`, .path_env = PathEnv.WIN32).as_str()! == `\\server\a\b\d`);
assert(path::new(`\\server\a\b\.\.\.`, .path_env = PathEnv.WIN32).as_str()! == `\\server\a\b`);
assert(path::new(`\\server\.\a`, .path_env = PathEnv.WIN32).as_str()! == `\\server\a`);
assert(path::new(`\\server\.`, .path_env = PathEnv.WIN32).as_str()! == `\\server\`);
assert(path::new(`\\server\`, .path_env = PathEnv.WIN32).as_str()! == `\\server\`);
}
fn void! test_extension()
{
assert(catch? path::new(`C:`, .path_env = PathEnv.WIN32).extension());
assert(catch? path::new(`C:`, .path_env = PathEnv.POSIX).extension());
assert(catch? path::new(`file`, .path_env = PathEnv.WIN32).extension());
assert(catch? path::new(`file`, .path_env = PathEnv.POSIX).extension());
assert(catch? path::new(`C:\temp\foo.bar\README`, .path_env = PathEnv.WIN32).extension());
assert(@catchof(path::new(`C:`, .path_env = PathEnv.WIN32).extension()));
assert(@catchof(path::new(`C:`, .path_env = PathEnv.POSIX).extension()));
assert(@catchof(path::new(`file`, .path_env = PathEnv.WIN32).extension()));
assert(@catchof(path::new(`file`, .path_env = PathEnv.POSIX).extension()));
assert(@catchof(path::new(`C:\temp\foo.bar\README`, .path_env = PathEnv.WIN32).extension()));
assert(path::new_windows("file.txt").extension()? == "txt");
assert(path::new_posix("file.txt").extension()? == "txt");
assert(path::new_windows("file.txt").extension()! == "txt");
assert(path::new_posix("file.txt").extension()! == "txt");
assert(path::new_windows("a/b/file.txt").extension()? == "txt");
assert(path::new_posix("a/b/file.txt").extension()? == "txt");
assert(path::new_windows("a/b/file.txt").extension()! == "txt");
assert(path::new_posix("a/b/file.txt").extension()! == "txt");
assert(path::new_windows("a\\b\\file.txt").extension()? == "txt");
assert(path::new_windows("a\\b\\file.txt").extension()! == "txt");
assert(path::new_windows("a.b/file.txt").extension()? == "txt");
assert(path::new_posix("a.b/file.txt").extension()? == "txt");
assert(path::new_windows("a.b/file.txt").extension()? == "txt");
assert(path::new_posix("a.b/file.txt").extension()? == "txt");
assert(path::new_windows("a.b/file.txt").extension()! == "txt");
assert(path::new_posix("a.b/file.txt").extension()! == "txt");
assert(path::new_windows("a.b/file.txt").extension()! == "txt");
assert(path::new_posix("a.b/file.txt").extension()! == "txt");
assert(path::new_windows("a.b\\file.txt").extension()? == "txt");
assert(path::new_windows("a.b\\file.txt").extension()! == "txt");
assert(path::new_windows("domain.dot.com").extension()? == "com");
assert(path::new_posix("domain.dot.com").extension()? == "com");
assert(path::new_windows("domain.dot.com").extension()! == "com");
assert(path::new_posix("domain.dot.com").extension()! == "com");
assert(path::new_windows("image.jpeg").extension()? == "jpeg");
assert(path::new_posix("image.jpeg").extension()? == "jpeg");
assert(path::new_windows("image.jpeg").extension()! == "jpeg");
assert(path::new_posix("image.jpeg").extension()! == "jpeg");
assert(path::new_windows("../filename.ext").extension()? == "ext");
assert(path::new_posix("../filename.ext").extension()? == "ext");
assert(path::new_windows("../filename.ext").extension()! == "ext");
assert(path::new_posix("../filename.ext").extension()! == "ext");
}
fn void! test_basename()
{
assert(path::new_windows("file.txt").basename()? == "file.txt");
assert(path::new_posix("file.txt").basename()? == "file.txt");
assert(path::new_windows("file.txt").basename()! == "file.txt");
assert(path::new_posix("file.txt").basename()! == "file.txt");
assert(path::new_windows("a/b/file.txt").basename()? == "file.txt");
assert(path::new_posix("a/b/file.txt").basename()? == "file.txt");
assert(path::new_windows("a/b/file.txt").basename()! == "file.txt");
assert(path::new_posix("a/b/file.txt").basename()! == "file.txt");
assert(path::new_windows("a.b/file.txt").basename()? == "file.txt");
assert(path::new_posix("a.b/file.txt").basename()? == "file.txt");
assert(path::new_windows("a.b/file.txt").basename()! == "file.txt");
assert(path::new_posix("a.b/file.txt").basename()! == "file.txt");
assert(path::new_windows("a.b/file.txt").basename()? == "file.txt");
assert(path::new_posix("a.b/file.txt").basename()? == "file.txt");
assert(path::new_windows("a.b/file.txt").basename()! == "file.txt");
assert(path::new_posix("a.b/file.txt").basename()! == "file.txt");
assert(path::new_windows("../filename.ext").basename()? == "filename.ext");
assert(path::new_posix("../filename.ext").basename()? == "filename.ext");
assert(path::new_windows("../filename.ext").basename()! == "filename.ext");
assert(path::new_posix("../filename.ext").basename()! == "filename.ext");
assert(path::new_windows("C:").basename()? == "");
assert(path::new_posix("C:").basename()? == "C:");
assert(path::new_windows("C:").basename()! == "");
assert(path::new_posix("C:").basename()! == "C:");
assert(path::new_windows("../..").basename()? == "..");
assert(path::new_posix("../..").basename()? == "..");
assert(path::new_windows("../..").basename()! == "..");
assert(path::new_posix("../..").basename()! == "..");
assert(path::new_windows(`\\server\`).basename()? == "");
assert(path::new_posix(`\\server\`).basename()? == `\\server\`);
assert(path::new_windows(`\\server\`).basename()! == "");
assert(path::new_posix(`\\server\`).basename()! == `\\server\`);
}
fn void! test_dirname()
{
assert(path::new_windows("file.txt").dirname()? == "");
assert(path::new_posix("file.txt").dirname()? == "");
assert(path::new_windows("file.txt").dirname()! == "");
assert(path::new_posix("file.txt").dirname()! == "");
assert(path::new_windows("a/b/file.txt").dirname()? == `a\b`);
assert(path::new_posix("a/b/file.txt").dirname()? == "a/b");
assert(path::new_windows("a/b/file.txt").dirname()! == `a\b`);
assert(path::new_posix("a/b/file.txt").dirname()! == "a/b");
assert(path::new_windows("a.b/file.txt").dirname()? == "a.b");
assert(path::new_posix("a.b/file.txt").dirname()? == "a.b");
assert(path::new_windows("a.b/file.txt").dirname()! == "a.b");
assert(path::new_posix("a.b/file.txt").dirname()! == "a.b");
assert(path::new_windows("../filename.ext").dirname()? == "..");
assert(path::new_posix("../filename.ext").dirname()? == "..");
assert(path::new_windows("../filename.ext").dirname()! == "..");
assert(path::new_posix("../filename.ext").dirname()! == "..");
assert(path::new_windows("C:").dirname()? == "C:");
assert(path::new_posix("C:").dirname()? == "");
assert(path::new_windows("C:").dirname()! == "C:");
assert(path::new_posix("C:").dirname()! == "");
assert(path::new_windows("C:/").dirname()? == "C:\\");
assert(path::new_posix("C:/").dirname()? == "");
assert(path::new_windows("C:/").dirname()! == "C:\\");
assert(path::new_posix("C:/").dirname()! == "");
assert(path::new_windows("C:/a").dirname()? == "C:\\");
assert(path::new_posix("C:/a").dirname()? == "C:");
assert(path::new_windows("C:/a").dirname()! == "C:\\");
assert(path::new_posix("C:/a").dirname()! == "C:");
assert(path::new_windows("../..").dirname()? == "..");
assert(path::new_posix("../..").dirname()? == "..");
assert(path::new_windows("../..").dirname()! == "..");
assert(path::new_posix("../..").dirname()! == "..");
assert(path::new_windows(`\\server\`).dirname()? == `\\server\`);
assert(path::new_posix(`\\server\`).dirname()? == ``);
assert(path::new_windows(`\\server\`).dirname()! == `\\server\`);
assert(path::new_posix(`\\server\`).dirname()! == ``);
}
fn void! test_path_volume()
{
assert(path::new_windows(`C:\abs`).volume_name()? == `C:`);
assert(path::new_windows(`C:abs`).volume_name()? == `C:`);
assert(path::new_posix(`C:/abs`).volume_name()? == ``);
assert(path::new_posix(`C:abs`).volume_name()? == ``);
assert(path::new_windows(`\\server\`).volume_name()? == `\\server`);
assert(path::new_windows(`\\server\abc`).volume_name()? == `\\server`);
assert(path::new_windows(`C:\abs`).volume_name()! == `C:`);
assert(path::new_windows(`C:abs`).volume_name()! == `C:`);
assert(path::new_posix(`C:/abs`).volume_name()! == ``);
assert(path::new_posix(`C:abs`).volume_name()! == ``);
assert(path::new_windows(`\\server\`).volume_name()! == `\\server`);
assert(path::new_windows(`\\server\abc`).volume_name()! == `\\server`);
}