products/sources/formale Sprachen/Java/openjdk-20-36_src/test/jdk/java/nio/file/Path image not shown  

Quellcode-Bibliothek

© Kompilation durch diese Firma

[Weder Korrektheit noch Funktionsfähigkeit der Software werden zugesichert.]

Datei:   Sprache: JAVA

/*
 * Copyright (c) 2008, 2020, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */


/* @test
 * @bug 4313887 6838333 6925932 7006126 8037945 8072495 8140449 8254876
 * @summary Unit test for java.nio.file.Path path operations
 */


import java.nio.file.FileSystems;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.nio.file.Paths;

public class PathOps {

    static final java.io.PrintStream out = System.out;

    private Path path;
    private Exception exc;

    private PathOps(String first, String... more) {
        out.println();
        try {
            path = FileSystems.getDefault().getPath(first, more);
            out.format("%s -> %s", first, path);
        } catch (Exception x) {
            exc = x;
            out.format("%s -> %s", first, x);
        }
        out.println();
    }

    Path path() {
        return path;
    }

    void fail() {
        throw new RuntimeException("PathOps failed");
    }

    void checkPath() {
        if (path == null) {
            throw new InternalError("path is null");
        }
    }

    void check(Object result, String expected) {
        out.format("\tExpected: %s\n", expected);
        out.format("\tActual: %s\n",  result);
        if (result == null) {
            if (expected == nullreturn;
        } else {
            // compare string representations
            if (expected != null && result.toString().equals(expected.toString()))
                return;
        }
        fail();
    }

    void check(Object result, boolean expected) {
        check(result, Boolean.toString(expected));
    }

    PathOps root(String expected) {
        out.println("check root");
        checkPath();
        check(path.getRoot(), expected);
        return this;
    }

    PathOps hasRoot() {
        out.println("check has root");
        checkPath();
        if (path.getRoot() == null)
            fail();
        return this;
    }

    PathOps parent(String expected) {
        out.println("check parent");
        checkPath();
        check(path.getParent(), expected);
        return this;
    }

    PathOps name(String expected) {
        out.println("check name");
        checkPath();
        check(path.getFileName(), expected);
        return this;
    }

    PathOps element(int index, String expected) {
        out.format("check element %d\n", index);
        checkPath();
        check(path.getName(index), expected);
        return this;
    }

    PathOps subpath(int startIndex, int endIndex, String expected) {
        out.format("test subpath(%d,%d)\n", startIndex, endIndex);
        checkPath();
        check(path.subpath(startIndex, endIndex), expected);
        return this;
    }

    PathOps starts(String prefix) {
        out.format("test startsWith with %s\n", prefix);
        checkPath();
        Path s = FileSystems.getDefault().getPath(prefix);
        check(path.startsWith(s), true);
        return this;
    }

    PathOps notStarts(String prefix) {
        out.format("test not startsWith with %s\n", prefix);
        checkPath();
        Path s = FileSystems.getDefault().getPath(prefix);
        check(path.startsWith(s), false);
        return this;
    }

    PathOps ends(String suffix) {
        out.format("test endsWith %s\n", suffix);
        checkPath();
        Path s = FileSystems.getDefault().getPath(suffix);
        check(path.endsWith(s), true);
        return this;
    }

    PathOps notEnds(String suffix) {
        out.format("test not endsWith %s\n", suffix);
        checkPath();
        Path s = FileSystems.getDefault().getPath(suffix);
        check(path.endsWith(s), false);
        return this;
    }

    PathOps makeAbsolute() {
        this.path = path.toAbsolutePath();
        return this;
    }

    PathOps absolute() {
        out.println("check path is absolute");
        checkPath();
        check(path.isAbsolute(), true);
        return this;
    }

    PathOps notAbsolute() {
        out.println("check path is not absolute");
        checkPath();
        check(path.isAbsolute(), false);
        return this;
    }

    PathOps resolve(String other, String expected) {
        out.format("test resolve %s\n", other);
        checkPath();
        check(path.resolve(other), expected);
        return this;
    }

    PathOps resolveSibling(String other, String expected) {
        out.format("test resolveSibling %s\n", other);
        checkPath();
        check(path.resolveSibling(other), expected);
        return this;
    }

    PathOps relativize(String other, String expected) {
        out.format("test relativize %s\n", other);
        checkPath();
        Path that = FileSystems.getDefault().getPath(other);
        check(path.relativize(that), expected);
        return this;
    }

    PathOps relativizeFail(String other) {
        out.format("test relativize %s\n", other);
        checkPath();
        Path that = FileSystems.getDefault().getPath(other);
        try {
            Path result = path.relativize(that);
            out.format("\tExpected: IllegalArgumentException");
            out.format("\tActual: %s\n",  result);
            fail();
        } catch (IllegalArgumentException expected) { }
        return this;
    }

    PathOps normalize(String expected) {
        out.println("check normalized path");
        checkPath();
        check(path.normalize(), expected);
        return this;
    }

    PathOps string(String expected) {
        out.println("check string representation");
        checkPath();
        check(path, expected);
        return this;
    }

    PathOps invalid() {
        if (!(exc instanceof InvalidPathException)) {
            out.println("InvalidPathException not thrown as expected");
            fail();
        }
        return this;
    }

    static PathOps test(String first, String... more) {
        return new PathOps(first, more);
    }

    static PathOps test(Path path) {
        return new PathOps(path.toString());
    }


    // -- PathOpss --

    static void header(String s) {
        out.println();
        out.println();
        out.println("-- " + s + " --");
    }

    static void doWindowsTests() {
        header("Windows specific tests");
        Path cwd = Paths.get("").toAbsolutePath();

        // construction
        test("C:\\")
            .string("C:\\");
        test("C:\\""")
            .string("C:\\");
        test("C:\\""foo")
            .string("C:\\foo");
        test("C:\\""\\foo")
            .string("C:\\foo");
        test("C:\\""foo\\")
            .string("C:\\foo");
        test("foo""bar""gus")
            .string("foo\\bar\\gus");
        test("")
            .string("");
        test("""C:\\")
            .string("C:\\");
        test("""foo""""bar""""\\gus")
            .string("foo\\bar\\gus");

        // all components present
        test("C:\\a\\b\\c")
            .root("C:\\")
            .parent("C:\\a\\b")
            .name("c");
        test("C:a\\b\\c")
            .root("C:")
            .parent("C:a\\b")
            .name("c");
        test("\\\\server\\share\\a")
            .root("\\\\server\\share\\")
            .parent("\\\\server\\share\\")
            .name("a");

        // root component only
        test("C:\\")
            .root("C:\\")
            .parent(null)
            .name(null);
        test("C:")
            .root("C:")
            .parent(null)
            .name(null);
        test("\\\\server\\share\\")
            .root("\\\\server\\share\\")
            .parent(null)
            .name(null);

        // no root component
        test("a\\b")
            .root(null)
            .parent("a")
            .name("b");

        // name component only
        test("foo")
            .root(null)
            .parent(null)
            .name("foo");
        test("")
            .root(null)
            .parent(null)
            .name("");

        // startsWith
        test("C:\\")
            .starts("C:\\")
            .starts("c:\\")
            .notStarts("C")
            .notStarts("C:")
            .notStarts("");
        test("C:")
            .starts("C:")
            .starts("c:")
            .notStarts("C")
            .notStarts("");
        test("\\")
            .starts("\\");
        test("C:\\foo\\bar")
            .starts("C:\\")
            .starts("C:\\foo")
            .starts("C:\\FOO")
            .starts("C:\\foo\\bar")
            .starts("C:\\Foo\\Bar")
            .notStarts("C:")
            .notStarts("C")
            .notStarts("C:foo")
            .notStarts("");
        test("\\foo\\bar")
            .starts("\\")
            .starts("\\foo")
            .starts("\\foO")
            .starts("\\foo\\bar")
            .starts("\\fOo\\BaR")
            .notStarts("foo")
            .notStarts("foo\\bar")
            .notStarts("");
        test("foo\\bar")
            .starts("foo")
            .starts("foo\\bar")
            .notStarts("\\")
            .notStarts("");
        test("\\\\server\\share")
            .starts("\\\\server\\share")
            .starts("\\\\server\\share\\")
            .notStarts("\\")
            .notStarts("");
        test("")
            .starts("")
            .notStarts("\\");

        // endsWith
        test("C:\\")
            .ends("C:\\")
            .ends("c:\\")
            .notEnds("\\")
            .notEnds("");
        test("C:")
            .ends("C:")
            .ends("c:")
            .notEnds("");
        test("\\")
            .ends("\\")
            .notEnds("");
        test("C:\\foo\\bar")
            .ends("bar")
            .ends("BAR")
            .ends("foo\\bar")
            .ends("Foo\\Bar")
            .ends("C:\\foo\\bar")
            .ends("c:\\foO\\baR")
            .notEnds("r")
            .notEnds("\\foo\\bar")
            .notEnds("");
        test("\\foo\\bar")
            .ends("bar")
            .ends("BaR")
            .ends("foo\\bar")
            .ends("foO\\baR")
            .ends("\\foo\\bar")
            .ends("\\Foo\\Bar")
            .notEnds("oo\\bar")
            .notEnds("");
        test("foo\\bar")
            .ends("bar")
            .ends("BAR")
            .ends("foo\\bar")
            .ends("Foo\\Bar")
            .notEnds("ar")
            .notEnds("");
        test("\\\\server\\share")
            .ends("\\\\server\\share")
            .ends("\\\\server\\share\\")
            .notEnds("shared")
            .notEnds("\\")
            .notEnds("");
        test("")
            .ends("")
            .notEnds("\\");

        // elements
        test("C:\\a\\b\\c")
            .element(0, "a")
            .element(1, "b")
            .element(2, "c");
        test("foo.bar\\gus.alice")
            .element(0, "foo.bar")
            .element(1, "gus.alice");
        test("")
            .element(0, "");

        // subpath
        test("C:\\foo")
            .subpath(0, 1, "foo");
        test("C:foo")
            .subpath(0, 1, "foo");
        test("foo")
            .subpath(0, 1, "foo");
        test("C:\\foo\\bar\\gus")
            .subpath(0, 1, "foo")
            .subpath(0, 2, "foo\\bar")
            .subpath(0, 3, "foo\\bar\\gus")
            .subpath(1, 2, "bar")
            .subpath(1, 3, "bar\\gus")
            .subpath(2, 3, "gus");
        test("\\\\server\\share\\foo")
            .subpath(0, 1, "foo");
        test("")
            .subpath(0, 1, "");

        // isAbsolute
        test("foo").notAbsolute();
        test("C:").notAbsolute();
        test("C:\\").absolute();
        test("C:\\abc").absolute();
        test("\\\\server\\share\\").absolute();
        test("").notAbsolute();
        test(cwd).absolute();

        // toAbsolutePath
        test("")
            .makeAbsolute()
            .absolute()
            .hasRoot()
            .string(cwd.toString());
        test(".")
            .makeAbsolute()
            .absolute()
            .hasRoot()
            .string(cwd.toString() + "\\.");
        test("foo")
            .makeAbsolute()
            .absolute()
            .hasRoot()
            .string(cwd.toString() + "\\foo");

        String rootAsString = cwd.getRoot().toString();
        if (rootAsString.length() == 3
                && rootAsString.charAt(1) == ':'
                && rootAsString.charAt(2) == '\\') {
            Path root = Paths.get(rootAsString.substring(0, 2));

            // C:
            test(root)
                .makeAbsolute()
                .absolute()
                .hasRoot()
                .string(cwd.toString());

            // C:.
            test(root + ".")
                .makeAbsolute()
                .absolute()
                .hasRoot()
                .string(cwd.toString() + "\\.");

            // C:foo
            test(root + "foo")
                .makeAbsolute()
                .absolute()
                .hasRoot()
                .string(cwd.toString() + "\\foo");
        }

        // resolve
        test("C:\\")
            .resolve("foo""C:\\foo")
            .resolve("D:\\bar""D:\\bar")
            .resolve("\\\\server\\share\\bar""\\\\server\\share\\bar")
            .resolve("C:foo""C:\\foo")
            .resolve("D:foo""D:foo")
            .resolve("""C:\\");
        test("\\")
            .resolve("foo""\\foo")
            .resolve("D:bar""D:bar")
            .resolve("C:\\bar""C:\\bar")
            .resolve("\\\\server\\share\\bar""\\\\server\\share\\bar")
            .resolve("\\foo""\\foo")
            .resolve("""\\");
        test("\\foo")
            .resolve("bar""\\foo\\bar")
            .resolve("D:bar""D:bar")
            .resolve("C:\\bar""C:\\bar")
            .resolve("\\\\server\\share\\bar""\\\\server\\share\\bar")
            .resolve("\\bar""\\bar")
            .resolve("""\\foo");
        test("foo")
            .resolve("bar""foo\\bar")
            .resolve("D:\\bar""D:\\bar")
            .resolve("\\\\server\\share\\bar""\\\\server\\share\\bar")
            .resolve("C:bar""C:bar")
            .resolve("D:foo""D:foo")
            .resolve("""foo");
        test("C:")
            .resolve("foo""C:foo")
            .resolve("""C:");
        test("\\\\server\\share\\foo")
            .resolve("bar""\\\\server\\share\\foo\\bar")
            .resolve("\\bar""\\\\server\\share\\bar")
            .resolve("D:\\bar""D:\\bar")
            .resolve("\\\\other\\share\\bar""\\\\other\\share\\bar")
            .resolve("D:bar""D:bar")
            .resolve("""\\\\server\\share\\foo");
        test("")
            .resolve("""")
            .resolve("foo""foo")
            .resolve("C:\\""C:\\")
            .resolve("C:foo""C:foo")
            .resolve("\\\\server\\share\\bar""\\\\server\\share\\bar");

        // resolveSibling
        test("foo")
            .resolveSibling("bar""bar")
            .resolveSibling("D:\\bar""D:\\bar")
            .resolveSibling("\\\\server\\share\\bar""\\\\server\\share\\bar")
            .resolveSibling("C:bar""C:bar")
            .resolveSibling("D:foo""D:foo")
            .resolveSibling("""");
        test("foo\\bar")
            .resolveSibling("gus""foo\\gus")
            .resolveSibling("D:\\bar""D:\\bar")
            .resolveSibling("\\\\server\\share\\bar""\\\\server\\share\\bar")
            .resolveSibling("C:bar""C:bar")
            .resolveSibling("D:foo""D:foo")
            .resolveSibling("""foo");
        test("C:\\foo")
            .resolveSibling("gus""C:\\gus")
            .resolveSibling("D:\\bar""D:\\bar")
            .resolveSibling("\\\\server\\share\\bar""\\\\server\\share\\bar")
            .resolveSibling("C:bar""C:\\bar")
            .resolveSibling("D:foo""D:foo")
            .resolveSibling("""C:\\");
        test("C:\\foo\\bar")
            .resolveSibling("gus""C:\\foo\\gus")
            .resolveSibling("D:\\bar""D:\\bar")
            .resolveSibling("\\\\server\\share\\bar""\\\\server\\share\\bar")
            .resolveSibling("C:bar""C:\\foo\\bar")
            .resolveSibling("D:foo""D:foo")
            .resolveSibling("""C:\\foo");
        test("\\\\server\\share\\foo")
            .resolveSibling("bar""\\\\server\\share\\bar")
            .resolveSibling("\\bar""\\\\server\\share\\bar")
            .resolveSibling("D:\\bar""D:\\bar")
            .resolveSibling("\\\\other\\share\\bar""\\\\other\\share\\bar")
            .resolveSibling("D:bar""D:bar")
            .resolveSibling("""\\\\server\\share\\");
        test("")
            .resolveSibling("""")
            .resolveSibling("foo""foo")
            .resolveSibling("C:\\""C:\\");

        // relativize
        test("C:\\a")
            .relativize("C:\\a""")
            .relativize("C:\\""..")
            .relativize("C:\\.""..")
            .relativize("C:\\..""..")
            .relativize("C:\\..\\..""..")
            .relativize("C:\\a\\b""b")
            .relativize("C:\\a\\b\\c""b\\c")
            .relativize("C:\\a\\.""")        // "." also valid
            .relativize("C:\\a\\..""..")
            .relativize("C:\\x""..\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("\\")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("C:\\a\\b")
            .relativize("C:\\a\\b""")
            .relativize("C:\\a""..")
            .relativize("C:\\""..\\..")
            .relativize("C:\\.""..\\..")
            .relativize("C:\\..""..\\..")
            .relativize("C:\\..\\..""..\\..")
            .relativize("C:\\a\\b\\c""c")
            .relativize("C:\\a\\.""..")
            .relativize("C:\\a\\..""..\\..")
            .relativize("C:\\x""..\\..\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("\\")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("C:\\a\\b\\c")
            .relativize("C:\\a\\b\\c""")
            .relativize("C:\\a\\b""..")
            .relativize("C:\\a""..\\..")
            .relativize("C:\\""..\\..\\..")
            .relativize("C:\\.""..\\..\\..")
            .relativize("C:\\..""..\\..\\..")
            .relativize("C:\\..\\..""..\\..\\..")
            .relativize("C:\\..\\..\\..""..\\..\\..")
            .relativize("C:\\..\\..\\..\\..""..\\..\\..")
            .relativize("C:\\a\\b\\c\\d""d")
            .relativize("C:\\a\\b\\c\\d\\e""d\\e")
            .relativize("C:\\a\\b\\c\\.""")        // "." also valid
            .relativize("C:\\a\\b\\c\\..""..")
            .relativize("C:\\a\\x""..\\..\\x")
            .relativize("C:\\x""..\\..\\..\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("\\")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("C:\\..\\a")
            .relativize("C:\\a""")
            .relativize("C:\\""..")
            .relativize("C:\\.""..")
            .relativize("C:\\..""..")
            .relativize("C:\\..\\..""..")
            .relativize("C:\\a\\b""b")
            .relativize("C:\\a\\b\\c""b\\c")
            .relativize("C:\\a\\.""")        // "." also valid
            .relativize("C:\\a\\..""..")
            .relativize("C:\\x""..\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("\\")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("C:\\..\\a\\b")
            .relativize("C:\\a\\b""")
            .relativize("C:\\a""..")
            .relativize("C:\\""..\\..")
            .relativize("C:\\.""..\\..")
            .relativize("C:\\..""..\\..")
            .relativize("C:\\..\\..""..\\..")
            .relativize("C:\\..\\..\\..""..\\..")
            .relativize("C:\\..\\..\\..\\..""..\\..")
            .relativize("C:\\a\\b\\c""c")
            .relativize("C:\\a\\b\\.""")        // "." also valid
            .relativize("C:\\a\\b\\..""..")
            .relativize("C:\\a\\x""..\\x")
            .relativize("C:\\x""..\\..\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("\\")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("C:\\..\\..\\a\\b")
            .relativize("C:\\a\\b""")
            .relativize("C:\\a""..")
            .relativize("C:\\""..\\..")
            .relativize("C:\\.""..\\..")
            .relativize("C:\\..""..\\..")
            .relativize("C:\\..\\..""..\\..")
            .relativize("C:\\..\\..\\..""..\\..")
            .relativize("C:\\..\\..\\..\\..""..\\..")
            .relativize("C:\\a\\b\\c""c")
            .relativize("C:\\a\\b\\.""")        // "." also valid
            .relativize("C:\\a\\b\\..""..")
            .relativize("C:\\a\\x""..\\x")
            .relativize("C:\\x""..\\..\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("\\")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("C:\\..\\a\\b\\c")
            .relativize("C:\\a\\b\\c""")
            .relativize("C:\\a\\b""..")
            .relativize("C:\\a""..\\..")
            .relativize("C:\\""..\\..\\..")
            .relativize("C:\\.""..\\..\\..")
            .relativize("C:\\..""..\\..\\..")
            .relativize("C:\\..\\..""..\\..\\..")
            .relativize("C:\\..\\..\\..""..\\..\\..")
            .relativize("C:\\..\\..\\..\\..""..\\..\\..")
            .relativize("C:\\a\\b\\c\\d""d")
            .relativize("C:\\a\\b\\c\\d\\e""d\\e")
            .relativize("C:\\a\\b\\c\\.""")        // "." also valid
            .relativize("C:\\a\\b\\c\\..""..")
            .relativize("C:\\a\\x""..\\..\\x")
            .relativize("C:\\x""..\\..\\..\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("\\")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("C:\\..\\..\\a\\b\\c")
            .relativize("C:\\a\\b\\c""")
            .relativize("C:\\a\\b""..")
            .relativize("C:\\a""..\\..")
            .relativize("C:\\""..\\..\\..")
            .relativize("C:\\.""..\\..\\..")
            .relativize("C:\\..""..\\..\\..")
            .relativize("C:\\..\\..""..\\..\\..")
            .relativize("C:\\..\\..\\..""..\\..\\..")
            .relativize("C:\\..\\..\\..\\..""..\\..\\..")
            .relativize("C:\\a\\b\\c\\d""d")
            .relativize("C:\\a\\b\\c\\d\\e""d\\e")
            .relativize("C:\\a\\b\\c\\.""")        // "." also valid
            .relativize("C:\\a\\b\\c\\..""..")
            .relativize("C:\\a\\x""..\\..\\x")
            .relativize("C:\\x""..\\..\\..\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("\\")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("C:\\..\\..\\..\\a\\b\\c")
            .relativize("C:\\a\\b\\c""")
            .relativize("C:\\a\\b""..")
            .relativize("C:\\a""..\\..")
            .relativize("C:\\""..\\..\\..")
            .relativize("C:\\.""..\\..\\..")
            .relativize("C:\\..""..\\..\\..")
            .relativize("C:\\..\\..""..\\..\\..")
            .relativize("C:\\..\\..\\..""..\\..\\..")
            .relativize("C:\\..\\..\\..\\..""..\\..\\..")
            .relativize("C:\\a\\b\\c\\d""d")
            .relativize("C:\\a\\b\\c\\d\\e""d\\e")
            .relativize("C:\\a\\b\\c\\.""")        // "." also valid
            .relativize("C:\\a\\b\\c\\..""..")
            .relativize("C:\\a\\x""..\\..\\x")
            .relativize("C:\\x""..\\..\\..\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("\\")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("C:\\.\\a")
            .relativize("C:\\a""")
            .relativize("C:\\""..")
            .relativize("C:\\.""..")
            .relativize("C:\\..""..")
            .relativize("C:\\..\\..""..")
            .relativize("C:\\a\\b""b")
            .relativize("C:\\a\\b\\c""b\\c")
            .relativize("C:\\a\\.""")        // "." also valid
            .relativize("C:\\a\\..""..")
            .relativize("C:\\x""..\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("\\")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("C:\\..\\a")
            .relativize("C:\\a""")
            .relativize("C:\\""..")
            .relativize("C:\\.""..")
            .relativize("C:\\..""..")
            .relativize("C:\\..\\..""..")
            .relativize("C:\\a\\b""b")
            .relativize("C:\\a\\b\\c""b\\c")
            .relativize("C:\\a\\.""")        // "." also valid
            .relativize("C:\\a\\..""..")
            .relativize("C:\\x""..\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("\\")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("C:\\a\\..")
            .relativize("C:\\a""a")
            .relativize("C:\\""")          // "." is also valid
            .relativize("C:\\.""")
            .relativize("C:\\..""")
            .relativize("C:\\..\\..""")
            .relativize("C:\\a\\.""a")
            .relativize("C:\\a\\..""")
            .relativize("C:\\x""x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("\\")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("C:a")
            .relativize("C:a""")
            .relativize("C:""..")
            .relativize("C:.""..")
            .relativize("C:..""..\\..")
            .relativize("C:..\\..""..\\..\\..")
            .relativize("C:.\\..""..\\..")
            .relativize("C:a\\b""b")
            .relativize("C:a\\b\\c""b\\c")
            .relativize("C:..\\x""..\\..\\x")
            .relativizeFail("C:\\x")
            .relativizeFail("x")
            .relativizeFail("\\")
            .relativizeFail("\\x");
        test("C:a\\b")
            .relativize("C:a\\b""")
            .relativize("C:a""..")
            .relativize("C:""..\\..")
            .relativize("C:.""..\\..")
            .relativize("C:..""..\\..\\..")
            .relativize("C:..\\..""..\\..\\..\\..")
            .relativize("C:.\\..""..\\..\\..")
            .relativize("C:a\\b\\c""c")
            .relativize("C:..\\x""..\\..\\..\\x")
            .relativizeFail("C:\\x")
            .relativizeFail("x")
            .relativizeFail("\\")
            .relativizeFail("\\x");
        test("C:a\\b\\c")
            .relativize("C:a\\b\\c""")
            .relativize("C:a\\b""..")
            .relativize("C:a""..\\..")
            .relativize("C:""..\\..\\..")
            .relativize("C:.""..\\..\\..")
            .relativize("C:..""..\\..\\..\\..")
            .relativize("C:..\\..""..\\..\\..\\..\\..")
            .relativize("C:.\\..""..\\..\\..\\..")
            .relativize("C:a\\b\\c\\d""d")
            .relativize("C:a\\b\\c\\d\\e""d\\e")
            .relativize("C:a\\x""..\\..\\x")
            .relativize("C:..\\x""..\\..\\..\\..\\x")
            .relativizeFail("C:\\x")
            .relativizeFail("x")
            .relativizeFail("\\")
            .relativizeFail("\\x");
        test("C:")
            .relativize("C:a""a")
            .relativize("C:a\\b\\c""a\\b\\c")
            .relativize("C:""")
            .relativize("C:.""")              // "" also valid
            .relativize("C:..""..")
            .relativize("C:..\\..""..\\..")
            .relativize("C:.\\..""..")
            .relativizeFail("C:\\x")
            .relativizeFail("\\")
            .relativizeFail("\\x");
        test("C:..")
            .relativize("C:..\\a""a")
            .relativize("C:..""")
            .relativize("C:.\\..""")
            .relativizeFail("C:\\x")
            .relativizeFail("\\")
            .relativizeFail("\\x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("x");
        test("C:..\\a")
            .relativize("C:..\\a\\b""b")
            .relativize("C:..\\a""")
            .relativize("C:..""..")
            .relativize("C:.\\..""..")
            .relativizeFail("C:\\x")
            .relativizeFail("\\")
            .relativizeFail("\\x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("x");
        test("C:..\\a\\b")
            .relativize("C:..\\a\\b\\c""c")
            .relativize("C:..\\a\\b""")
            .relativize("C:..\\a""..")
            .relativize("C:..""..\\..")
            .relativize("C:.\\..""..\\..")
            .relativizeFail("C:\\x")
            .relativizeFail("\\")
            .relativizeFail("\\x")
            .relativizeFail("")
            .relativizeFail("x");
        test("C:a\\..")
            .relativize("C:b""b")
            .relativize("C:""")
            .relativize("C:.""")       // "." also valid
            .relativize("C:..""..")
            .relativize("C:a\\..\\b""b")
            .relativize("C:a\\..""")
            .relativize("C:..\\b""..\\b")
            .relativize("C:b\\..""")
            .relativizeFail("C:\\x")
            .relativizeFail("\\")
            .relativizeFail("\\x")
            .relativizeFail("x");
        test("C:a\\..\\b")
            .relativize("C:a\\..\\b""")
            .relativize("C:a\\..""..")
            .relativize("C:""..")
            .relativize("C:.""..")
            .relativize("C:..""..\\..")
            .relativize("C:b""")
            .relativize("C:c""..\\c")
            .relativize("C:..\\c""..\\..\\c")
            .relativize("C:a\\..\\b\\c""c")
            .relativizeFail("C:\\x")
            .relativizeFail("\\")
            .relativizeFail("\\x")
            .relativizeFail("x");
        test("\\a")
            .relativize("\\a""")
            .relativize("\\""..")
            .relativize("\\.""..")
            .relativize("\\..""..")
            .relativize("\\..\\..""..")
            .relativize("\\a\\b""b")
            .relativize("\\a\\b\\c""b\\c")
            .relativize("\\a\\.""")        // "." also valid
            .relativize("\\a\\..""..")
            .relativize("\\x""..\\x")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("\\a\\b")
            .relativize("\\a\\b""")
            .relativize("\\a""..")
            .relativize("\\""..\\..")
            .relativize("\\.""..\\..")
            .relativize("\\..""..\\..")
            .relativize("\\..\\..""..\\..")
            .relativize("\\a\\b\\c""c")
            .relativize("\\a\\.""..")
            .relativize("\\a\\..""..\\..")
            .relativize("\\x""..\\..\\x")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("\\a\\b\\c")
            .relativize("\\a\\b\\c""")
            .relativize("\\a\\b""..")
            .relativize("\\a""..\\..")
            .relativize("\\""..\\..\\..")
            .relativize("\\.""..\\..\\..")
            .relativize("\\..""..\\..\\..")
            .relativize("\\..\\..""..\\..\\..")
            .relativize("\\..\\..\\..""..\\..\\..")
            .relativize("\\..\\..\\..\\..""..\\..\\..")
            .relativize("\\a\\b\\c\\d""d")
            .relativize("\\a\\b\\c\\d\\e""d\\e")
            .relativize("\\a\\b\\c\\.""")        // "." also valid
            .relativize("\\a\\b\\c\\..""..")
            .relativize("\\a\\x""..\\..\\x")
            .relativize("\\x""..\\..\\..\\x")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("\\..\\a")
            .relativize("\\a""")
            .relativize("\\""..")
            .relativize("\\.""..")
            .relativize("\\..""..")
            .relativize("\\..\\..""..")
            .relativize("\\a\\b""b")
            .relativize("\\a\\b\\c""b\\c")
            .relativize("\\a\\.""")        // "." also valid
            .relativize("\\a\\..""..")
            .relativize("\\x""..\\x")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("\\..\\a\\b")
            .relativize("\\a\\b""")
            .relativize("\\a""..")
            .relativize("\\""..\\..")
            .relativize("\\.""..\\..")
            .relativize("\\..""..\\..")
            .relativize("\\..\\..""..\\..")
            .relativize("\\..\\..\\..""..\\..")
            .relativize("\\..\\..\\..\\..""..\\..")
            .relativize("\\a\\b\\c""c")
            .relativize("\\a\\b\\.""")        // "." also valid
            .relativize("\\a\\b\\..""..")
            .relativize("\\a\\x""..\\x")
            .relativize("\\x""..\\..\\x")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("\\..\\..\\a\\b")
            .relativize("\\a\\b""")
            .relativize("\\a""..")
            .relativize("\\""..\\..")
            .relativize("\\.""..\\..")
            .relativize("\\..""..\\..")
            .relativize("\\..\\..""..\\..")
            .relativize("\\..\\..\\..""..\\..")
            .relativize("\\..\\..\\..\\..""..\\..")
            .relativize("\\a\\b\\c""c")
            .relativize("\\a\\b\\.""")        // "." also valid
            .relativize("\\a\\b\\..""..")
            .relativize("\\a\\x""..\\x")
            .relativize("\\x""..\\..\\x")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("\\..\\a\\b\\c")
            .relativize("\\a\\b\\c""")
            .relativize("\\a\\b""..")
            .relativize("\\a""..\\..")
            .relativize("\\""..\\..\\..")
            .relativize("\\.""..\\..\\..")
            .relativize("\\..""..\\..\\..")
            .relativize("\\..\\..""..\\..\\..")
            .relativize("\\..\\..\\..""..\\..\\..")
            .relativize("\\..\\..\\..\\..""..\\..\\..")
            .relativize("\\a\\b\\c\\d""d")
            .relativize("\\a\\b\\c\\d\\e""d\\e")
            .relativize("\\a\\b\\c\\.""")        // "." also valid
            .relativize("\\a\\b\\c\\..""..")
            .relativize("\\a\\x""..\\..\\x")
            .relativize("\\x""..\\..\\..\\x")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("\\..\\..\\a\\b\\c")
            .relativize("\\a\\b\\c""")
            .relativize("\\a\\b""..")
            .relativize("\\a""..\\..")
            .relativize("\\""..\\..\\..")
            .relativize("\\.""..\\..\\..")
            .relativize("\\..""..\\..\\..")
            .relativize("\\..\\..""..\\..\\..")
            .relativize("\\..\\..\\..""..\\..\\..")
            .relativize("\\..\\..\\..\\..""..\\..\\..")
            .relativize("\\a\\b\\c\\d""d")
            .relativize("\\a\\b\\c\\d\\e""d\\e")
            .relativize("\\a\\b\\c\\.""")        // "." also valid
            .relativize("\\a\\b\\c\\..""..")
            .relativize("\\a\\x""..\\..\\x")
            .relativize("\\x""..\\..\\..\\x")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("\\..\\..\\..\\a\\b\\c")
            .relativize("\\a\\b\\c""")
            .relativize("\\a\\b""..")
            .relativize("\\a""..\\..")
            .relativize("\\""..\\..\\..")
            .relativize("\\.""..\\..\\..")
            .relativize("\\..""..\\..\\..")
            .relativize("\\..\\..""..\\..\\..")
            .relativize("\\..\\..\\..""..\\..\\..")
            .relativize("\\..\\..\\..\\..""..\\..\\..")
            .relativize("\\a\\b\\c\\d""d")
            .relativize("\\a\\b\\c\\d\\e""d\\e")
            .relativize("\\a\\b\\c\\.""")        // "." also valid
            .relativize("\\a\\b\\c\\..""..")
            .relativize("\\a\\x""..\\..\\x")
            .relativize("\\x""..\\..\\..\\x")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("\\.\\a")
            .relativize("\\a""")
            .relativize("\\""..")
            .relativize("\\.""..")
            .relativize("\\..""..")
            .relativize("\\..\\..""..")
            .relativize("\\a\\b""b")
            .relativize("\\a\\b\\c""b\\c")
            .relativize("\\a\\.""")        // "." also valid
            .relativize("\\a\\..""..")
            .relativize("\\x""..\\x")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("\\..\\a")
            .relativize("\\a""")
            .relativize("\\""..")
            .relativize("\\.""..")
            .relativize("\\..""..")
            .relativize("\\..\\..""..")
            .relativize("\\a\\b""b")
            .relativize("\\a\\b\\c""b\\c")
            .relativize("\\a\\.""")        // "." also valid
            .relativize("\\a\\..""..")
            .relativize("\\x""..\\x")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("\\a\\..")
            .relativize("\\a""a")
            .relativize("\\""")          // "." is also valid
            .relativize("\\.""")
            .relativize("\\..""")
            .relativize("\\..\\..""")
            .relativize("\\a\\.""a")
            .relativize("\\a\\..""")
            .relativize("\\x""x")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("\\")
            .relativize("\\a""a")
            .relativize("\\""")          // "." is also valid
            .relativize("\\.""")
            .relativize("\\..""")
            .relativize("\\..\\..""")
            .relativize("\\a\\.""a")
            .relativize("\\a\\..""")
            .relativize("\\x""x")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("a")
            .relativize("a""")
            .relativize("""..")
            .relativize(".""..")
            .relativize("..""..\\..")
            .relativize("..\\..""..\\..\\..")
            .relativize(".\\..""..\\..")
            .relativize("a\\b""b")
            .relativize("a\\b\\c""b\\c")
            .relativize("..\\x""..\\..\\x")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("\\")
            .relativizeFail("\\x");
        test("a\\b")
            .relativize("a\\b""")
            .relativize("a""..")
            .relativize("""..\\..")
            .relativize(".""..\\..")
            .relativize("..""..\\..\\..")
            .relativize("..\\..""..\\..\\..\\..")
            .relativize(".\\..""..\\..\\..")
            .relativize("a\\b\\c""c")
            .relativize("..\\x""..\\..\\..\\x")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("\\")
            .relativizeFail("\\x");
        test("a\\b\\c")
            .relativize("a\\b\\c""")
            .relativize("a\\b""..")
            .relativize("a""..\\..")
            .relativize("""..\\..\\..")
            .relativize(".""..\\..\\..")
            .relativize("..""..\\..\\..\\..")
            .relativize("..\\..""..\\..\\..\\..\\..")
            .relativize(".\\..""..\\..\\..\\..")
            .relativize("a\\b\\c\\d""d")
            .relativize("a\\b\\c\\d\\e""d\\e")
            .relativize("a\\x""..\\..\\x")
            .relativize("..\\x""..\\..\\..\\..\\x")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("\\")
            .relativizeFail("\\x");
        test("")
            .relativize("a""a")
            .relativize("a\\b\\c""a\\b\\c")
            .relativize("""")
            .relativize("."".")
            .relativize("..""..")
            .relativize("..\\..""..\\..")
            .relativize(".\\.."".\\..")     // ".." also valid
            .relativizeFail("\\")
            .relativizeFail("\\x");
        test("..")
            .relativize("..\\a""a")
            .relativize("..""")
            .relativize(".\\..""")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("\\")
            .relativizeFail("\\x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("x");
        test("..\\a")
            .relativize("..\\a\\b""b")
            .relativize("..\\a""")
            .relativize("..""..")
            .relativize(".\\..""..")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("\\")
            .relativizeFail("\\x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("x");
        test("..\\a\\b")
            .relativize("..\\a\\b\\c""c")
            .relativize("..\\a\\b""")
            .relativize("..\\a""..")
            .relativize("..""..\\..")
            .relativize(".\\..""..\\..")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("\\")
            .relativizeFail("\\x")
            .relativizeFail("")
            .relativizeFail("x");
        test("a\\..")
            .relativize("b""b")
            .relativize("""")
            .relativize(".""")       // "." also valid
            .relativize("..""..")
            .relativize("a\\..\\b""b")
            .relativize("a\\..""")
            .relativize("..\\b""..\\b")
            .relativize("b\\..""")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("\\")
            .relativizeFail("\\x");
        test("a\\..\\b")
            .relativize("a\\..\\b""")
            .relativize("a\\..""..")
            .relativize("""..")
            .relativize(".""..")
            .relativize("..""..\\..")
            .relativize("b""")
            .relativize("c""..\\c")
            .relativize("..\\c""..\\..\\c")
            .relativize("a\\..\\b\\c""c")
            .relativizeFail("C:\\x")
            .relativizeFail("C:x")
            .relativizeFail("\\")
            .relativizeFail("\\x");

        // normalize
        test("C:\\")
            .normalize("C:\\");
        test("C:\\.")
            .normalize("C:\\");
        test("C:\\..")
            .normalize("C:\\");
        test("\\\\server\\share")
            .normalize("\\\\server\\share\\");
        test("\\\\server\\share\\.")
            .normalize("\\\\server\\share\\");
        test("\\\\server\\share\\..")
            .normalize("\\\\server\\share\\");
        test("C:")
            .normalize("C:");
        test("C:.")
            .normalize("C:");
        test("C:..")
            .normalize("C:..");
        test("\\")
            .normalize("\\");
        test("\\.")
            .normalize("\\");
        test("\\..")
            .normalize("\\");
        test("foo")
            .normalize("foo");
        test("foo\\.")
            .normalize("foo");
        test("foo\\..")
            .normalize("");
        test("C:\\foo")
            .normalize("C:\\foo");
        test("C:\\foo\\.")
            .normalize("C:\\foo");
        test("C:\\.\\foo")
            .normalize("C:\\foo");
        test("C:\\foo\\..")
            .normalize("C:\\");
        test("C:\\..\\foo")
            .normalize("C:\\foo");
        test("\\\\server\\share\\foo")
            .normalize("\\\\server\\share\\foo");
        test("\\\\server\\share\\foo\\.")
            .normalize("\\\\server\\share\\foo");
        test("\\\\server\\share\\.\\foo")
            .normalize("\\\\server\\share\\foo");
        test("\\\\server\\share\\foo\\..")
            .normalize("\\\\server\\share\\");
        test("\\\\server\\share\\..\\foo")
            .normalize("\\\\server\\share\\foo");
        test("C:foo")
            .normalize("C:foo");
        test("C:foo\\.")
            .normalize("C:foo");
        test("C:.\\foo")
            .normalize("C:foo");
        test("C:foo\\..")
            .normalize("C:");
        test("C:..\\foo")
            .normalize("C:..\\foo");
        test("\\foo")
            .normalize("\\foo");
        test("\\foo\\.")
            .normalize("\\foo");
        test("\\.\\foo")
            .normalize("\\foo");
        test("\\foo\\..")
            .normalize("\\");
        test("\\..\\foo")
            .normalize("\\foo");
        test(".")
            .normalize("");
        test("..")
            .normalize("..");
        test("\\..\\..")
            .normalize("\\");
        test("..\\..\\foo")
            .normalize("..\\..\\foo");
        test("foo\\bar\\..")
            .normalize("foo");
        test("foo\\bar\\.\\..")
            .normalize("foo");
        test("foo\\bar\\gus\\..\\..")
            .normalize("foo");
        test(".\\foo\\.\\bar\\.\\gus\\..\\.\\..")
            .normalize("foo");
        test("")
            .normalize("");

        // UNC corner cases
        test("\\\\server\\share\\")
            .root("\\\\server\\share\\")
            .parent(null)
            .name(null);
        test("\\\\server")
            .invalid();
        test("\\\\server\\")
            .invalid();
        test("\\\\server\\share")
            .root("\\\\server\\share\\")
            .parent(null)
            .name(null);

        // invalid
        test(":\\foo")
            .invalid();
        test("C::")
            .invalid();
        test("C:\\?")           // invalid character
            .invalid();
        test("C:\\*")           // invalid character
            .invalid();
        test("C:\\abc\u0001\\foo")
            .invalid();
        test("C:\\\u0019\\foo")
            .invalid();
        test("\\\\server\u0019\\share")
            .invalid();
        test("\\\\server\\share\u0019")
            .invalid();
        test("foo\u0000\bar")
            .invalid();
        test("C:\\foo ")                // trailing space
             .invalid();
        test("C:\\foo \\bar")
            .invalid();
        //test("C:\\foo.")              // trailing dot
            //.invalid();
        //test("C:\\foo...\\bar")
            //.invalid();

        // normalization at construction time (remove redundant and replace slashes)
        test("C:/a/b/c")
            .string("C:\\a\\b\\c")
            .root("C:\\")
            .parent("C:\\a\\b");
        test("C://a//b//c")
            .string("C:\\a\\b\\c")
            .root("C:\\")
            .parent("C:\\a\\b");

        // hashCode
        header("hashCode");
        int h1 = test("C:\\foo").path().hashCode();
        int h2 = test("c:\\FOO").path().hashCode();
        if (h1 != h2)
            throw new RuntimeException("PathOps failed");
    }

    static void doUnixTests() {
        header("Unix specific tests");
        Path cwd = Paths.get("").toAbsolutePath();

        // construction
        test("/")
            .string("/");
        test("/""")
            .string("/");
        test("/""foo")
            .string("/foo");
        test("/""/foo")
            .string("/foo");
        test("/""foo/")
            .string("/foo");
        test("foo""bar""gus")
            .string("foo/bar/gus");
        test("")
            .string("");
        test("""/")
            .string("/");
        test("""foo""""bar""""/gus")
            .string("foo/bar/gus");

        // all components
        test("/a/b/c")
            .root("/")
            .parent("/a/b")
            .name("c");

        // root component only
        test("/")
            .root("/")
            .parent(null)
            .name(null);

        // no root component
        test("a/b")
            .root(null)
            .parent("a")
            .name("b");

        // name component only
        test("foo")
            .root(null)
            .parent(null)
            .name("foo");
        test("")
             .root(null)
             .parent(null)
             .name("");

        // startsWith
        test("/")
            .starts("/")
            .notStarts("")
            .notStarts("/foo");
        test("/foo")
            .starts("/")
            .starts("/foo")
            .notStarts("/f");
        test("/foo/bar")
            .starts("/")
            .starts("/foo")
            .starts("/foo/bar")
            .notStarts("/f")
            .notStarts("foo")
            .notStarts("foo/bar");
        test("foo")
            .starts("foo")
            .notStarts("")
            .notStarts("f");
        test("foo/bar")
            .starts("foo")
            .starts("foo/bar")
            .notStarts("f")
            .notStarts("/foo")
            .notStarts("/foo/bar");
        test("")
             .starts("")
             .notStarts("/");

        // endsWith
        test("/")
            .ends("/")
            .notEnds("")
            .notEnds("foo")
            .notEnds("/foo");
        test("/foo")
            .ends("foo")
            .ends("/foo")
            .notEnds("fool");
        test("/foo/bar")
            .ends("bar")
            .ends("foo/bar")
            .ends("/foo/bar")
            .notEnds("ar")
            .notEnds("barack")
            .notEnds("/bar")
            .notEnds("o/bar");
        test("foo")
            .ends("foo")
            .notEnds("")
            .notEnds("oo")
            .notEnds("oola");
        test("foo/bar")
            .ends("bar")
            .ends("foo/bar")
            .notEnds("r")
            .notEnds("barmaid")
            .notEnds("/bar");
        test("foo/bar/gus")
            .ends("gus")
            .ends("bar/gus")
            .ends("foo/bar/gus")
            .notEnds("g")
            .notEnds("/gus")
            .notEnds("r/gus")
            .notEnds("barack/gus")
            .notEnds("bar/gust");
        test("")
            .ends("")
            .notEnds("/");

        // elements
        test("a/b/c")
            .element(0, "a")
            .element(1, "b")
            .element(2, "c");
        test("")
            .element(0, "");

        // subpath
        test("/foo")
            .subpath(0, 1, "foo");
        test("foo")
            .subpath(0, 1, "foo");
        test("/foo/bar")
            .subpath(0, 1, "foo")
            .subpath(1, 2, "bar")
            .subpath(0, 2, "foo/bar");
        test("foo/bar")
            .subpath(0, 1, "foo")
            .subpath(1, 2, "bar")
            .subpath(0, 2, "foo/bar");
        test("/foo/bar/gus")
            .subpath(0, 1, "foo")
            .subpath(1, 2, "bar")
            .subpath(2, 3, "gus")
            .subpath(0, 2, "foo/bar")
            .subpath(1, 3, "bar/gus")
            .subpath(0, 3, "foo/bar/gus");
        test("foo/bar/gus")
            .subpath(0, 1, "foo")
            .subpath(1, 2, "bar")
            .subpath(2, 3, "gus")
            .subpath(0, 2, "foo/bar")
            .subpath(1, 3, "bar/gus")
            .subpath(0, 3, "foo/bar/gus");
        test("")
            .subpath(0, 1, "");

        // isAbsolute
        test("/")
            .absolute();
        test("/tmp")
            .absolute();
        test("tmp")
            .notAbsolute();
        test("")
            .notAbsolute();
        test(cwd)
            .absolute();

        // toAbsolutePath
        test("/")
            .makeAbsolute()
            .absolute();
        test("/tmp")
            .makeAbsolute()
            .absolute();
        test("tmp")
            .makeAbsolute()
            .absolute();
        test("")
            .makeAbsolute()
            .absolute();

        // resolve
        test("/tmp")
            .resolve("foo""/tmp/foo")
            .resolve("/foo""/foo")
            .resolve("""/tmp");
        test("tmp")
            .resolve("foo""tmp/foo")
            .resolve("/foo""/foo")
            .resolve("""tmp");
        test("")
            .resolve("""")
            .resolve("foo""foo")
            .resolve("/foo""/foo");

        // resolveSibling
        test("foo")
            .resolveSibling("bar""bar")
            .resolveSibling("/bar""/bar")
            .resolveSibling("""");
        test("foo/bar")
            .resolveSibling("gus""foo/gus")
            .resolveSibling("/gus""/gus")
            .resolveSibling("""foo");
        test("/foo")
            .resolveSibling("gus""/gus")
            .resolveSibling("/gus""/gus")
            .resolveSibling("""/");
        test("/foo/bar")
            .resolveSibling("gus""/foo/gus")
            .resolveSibling("/gus""/gus")
            .resolveSibling("""/foo");
        test("")
            .resolveSibling("foo""foo")
            .resolveSibling("/foo""/foo")
            .resolve("""");

        // relativize
        test("/a")
            .relativize("/a""")
            .relativize("/""..")
            .relativize("/.""..")
            .relativize("/..""..")
            .relativize("/../..""..")
            .relativize("/a/b""b")
            .relativize("/a/b/c""b/c")
            .relativize("/a/.""")        // "." also valid
            .relativize("/a/..""..")
            .relativize("/x""../x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("/a/b")
            .relativize("/a/b""")
            .relativize("/a""..")
            .relativize("/""../..")
            .relativize("/.""../..")
            .relativize("/..""../..")
            .relativize("/../..""../..")
            .relativize("/a/b/c""c")
            .relativize("/a/.""..")
            .relativize("/a/..""../..")
            .relativize("/x""../../x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("/a/b/c")
            .relativize("/a/b/c""")
            .relativize("/a/b""..")
            .relativize("/a""../..")
            .relativize("/""../../..")
            .relativize("/.""../../..")
            .relativize("/..""../../..")
            .relativize("/../..""../../..")
            .relativize("/../../..""../../..")
            .relativize("/../../../..""../../..")
            .relativize("/a/b/c/d""d")
            .relativize("/a/b/c/d/e""d/e")
            .relativize("/a/b/c/.""")        // "." also valid
            .relativize("/a/b/c/..""..")
            .relativize("/a/x""../../x")
            .relativize("/x""../../../x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("/../a")
            .relativize("/a""")
            .relativize("/""..")
            .relativize("/.""..")
            .relativize("/..""..")
            .relativize("/../..""..")
            .relativize("/a/b""b")
            .relativize("/a/b/c""b/c")
            .relativize("/a/.""")        // "." also valid
            .relativize("/a/..""..")
            .relativize("/x""../x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("/../a/b")
            .relativize("/a/b""")
            .relativize("/a""..")
            .relativize("/""../..")
            .relativize("/.""../..")
            .relativize("/..""../..")
            .relativize("/../..""../..")
            .relativize("/../../..""../..")
            .relativize("/../../../..""../..")
            .relativize("/a/b/c""c")
            .relativize("/a/b/.""")        // "." also valid
            .relativize("/a/b/..""..")
            .relativize("/a/x""../x")
            .relativize("/x""../../x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("/../../a/b")
            .relativize("/a/b""")
            .relativize("/a""..")
            .relativize("/""../..")
            .relativize("/.""../..")
            .relativize("/..""../..")
            .relativize("/../..""../..")
            .relativize("/../../..""../..")
            .relativize("/../../../..""../..")
            .relativize("/a/b/c""c")
            .relativize("/a/b/.""")        // "." also valid
            .relativize("/a/b/..""..")
            .relativize("/a/x""../x")
            .relativize("/x""../../x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("/../a/b/c")
            .relativize("/a/b/c""")
            .relativize("/a/b""..")
            .relativize("/a""../..")
            .relativize("/""../../..")
            .relativize("/.""../../..")
            .relativize("/..""../../..")
            .relativize("/../..""../../..")
            .relativize("/../../..""../../..")
            .relativize("/../../../..""../../..")
            .relativize("/a/b/c/d""d")
            .relativize("/a/b/c/d/e""d/e")
            .relativize("/a/b/c/.""")        // "." also valid
            .relativize("/a/b/c/..""..")
            .relativize("/a/x""../../x")
            .relativize("/x""../../../x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("/../../a/b/c")
            .relativize("/a/b/c""")
            .relativize("/a/b""..")
            .relativize("/a""../..")
            .relativize("/""../../..")
            .relativize("/.""../../..")
            .relativize("/..""../../..")
            .relativize("/../..""../../..")
            .relativize("/../../..""../../..")
            .relativize("/../../../..""../../..")
            .relativize("/a/b/c/d""d")
            .relativize("/a/b/c/d/e""d/e")
            .relativize("/a/b/c/.""")        // "." also valid
            .relativize("/a/b/c/..""..")
            .relativize("/a/x""../../x")
            .relativize("/x""../../../x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("/../../../a/b/c")
            .relativize("/a/b/c""")
            .relativize("/a/b""..")
            .relativize("/a""../..")
            .relativize("/""../../..")
            .relativize("/.""../../..")
            .relativize("/..""../../..")
            .relativize("/../..""../../..")
            .relativize("/../../..""../../..")
            .relativize("/../../../..""../../..")
            .relativize("/a/b/c/d""d")
            .relativize("/a/b/c/d/e""d/e")
            .relativize("/a/b/c/.""")        // "." also valid
            .relativize("/a/b/c/..""..")
            .relativize("/a/x""../../x")
            .relativize("/x""../../../x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("/./a")
            .relativize("/a""")
            .relativize("/""..")
            .relativize("/.""..")
            .relativize("/..""..")
            .relativize("/../..""..")
            .relativize("/a/b""b")
            .relativize("/a/b/c""b/c")
            .relativize("/a/.""")        // "." also valid
            .relativize("/a/..""..")
            .relativize("/x""../x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("/../a")
            .relativize("/a""")
            .relativize("/""..")
            .relativize("/.""..")
            .relativize("/..""..")
            .relativize("/../..""..")
            .relativize("/a/b""b")
            .relativize("/a/b/c""b/c")
            .relativize("/a/.""")        // "." also valid
            .relativize("/a/..""..")
            .relativize("/x""../x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("/a/..")
            .relativize("/a""a")
            .relativize("/""")          // "." is also valid
            .relativize("/.""")
            .relativize("/..""")
            .relativize("/../..""")
            .relativize("/a/.""a")
            .relativize("/a/..""")
            .relativize("/x""x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("/")
            .relativize("/a""a")
            .relativize("/""")          // "." is also valid
            .relativize("/.""")
            .relativize("/..""")
            .relativize("/../..""")
            .relativize("/a/.""a")
            .relativize("/a/..""")
            .relativize("/x""x")
            .relativizeFail("x")
            .relativizeFail("")
            .relativizeFail(".")
            .relativizeFail("..");
        test("a")
            .relativize("a""")
            .relativize("""..")
            .relativize(".""..")
            .relativize("..""../..")
            .relativize("../..""../../..")
            .relativize("./..""../..")
            .relativize("a/b""b")
            .relativize("a/b/c""b/c")
            .relativize("../x""../../x")
            .relativizeFail("/")
            .relativizeFail("/x");
        test("a/b")
            .relativize("a/b""")
            .relativize("a""..")
            .relativize("""../..")
            .relativize(".""../..")
            .relativize("..""../../..")
--> --------------------

--> maximum size reached

--> --------------------

¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.86Angebot  Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können  ¤





Begriffe der Konzeptbildung
Was zu einem Entwurf gehört
Begriffe der Konzeptbildung
Hier finden Sie eine Liste der Produkte des Unternehmens

Mittel




Lebenszyklus

Die hierunter aufgelisteten Ziele sind für diese Firma wichtig


Ziele

Entwicklung einer Software für die statische Quellcodeanalyse


Bot Zugriff