Path: blob/master/test/jdk/java/nio/file/Path/PathOps.java
41153 views
/*1* Copyright (c) 2008, 2020, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/* @test24* @bug 4313887 6838333 6925932 7006126 8037945 8072495 8140449 825487625* @summary Unit test for java.nio.file.Path path operations26*/2728import java.nio.file.FileSystems;29import java.nio.file.InvalidPathException;30import java.nio.file.Path;31import java.nio.file.Paths;3233public class PathOps {3435static final java.io.PrintStream out = System.out;3637private Path path;38private Exception exc;3940private PathOps(String first, String... more) {41out.println();42try {43path = FileSystems.getDefault().getPath(first, more);44out.format("%s -> %s", first, path);45} catch (Exception x) {46exc = x;47out.format("%s -> %s", first, x);48}49out.println();50}5152Path path() {53return path;54}5556void fail() {57throw new RuntimeException("PathOps failed");58}5960void checkPath() {61if (path == null) {62throw new InternalError("path is null");63}64}6566void check(Object result, String expected) {67out.format("\tExpected: %s\n", expected);68out.format("\tActual: %s\n", result);69if (result == null) {70if (expected == null) return;71} else {72// compare string representations73if (expected != null && result.toString().equals(expected.toString()))74return;75}76fail();77}7879void check(Object result, boolean expected) {80check(result, Boolean.toString(expected));81}8283PathOps root(String expected) {84out.println("check root");85checkPath();86check(path.getRoot(), expected);87return this;88}8990PathOps hasRoot() {91out.println("check has root");92checkPath();93if (path.getRoot() == null)94fail();95return this;96}9798PathOps parent(String expected) {99out.println("check parent");100checkPath();101check(path.getParent(), expected);102return this;103}104105PathOps name(String expected) {106out.println("check name");107checkPath();108check(path.getFileName(), expected);109return this;110}111112PathOps element(int index, String expected) {113out.format("check element %d\n", index);114checkPath();115check(path.getName(index), expected);116return this;117}118119PathOps subpath(int startIndex, int endIndex, String expected) {120out.format("test subpath(%d,%d)\n", startIndex, endIndex);121checkPath();122check(path.subpath(startIndex, endIndex), expected);123return this;124}125126PathOps starts(String prefix) {127out.format("test startsWith with %s\n", prefix);128checkPath();129Path s = FileSystems.getDefault().getPath(prefix);130check(path.startsWith(s), true);131return this;132}133134PathOps notStarts(String prefix) {135out.format("test not startsWith with %s\n", prefix);136checkPath();137Path s = FileSystems.getDefault().getPath(prefix);138check(path.startsWith(s), false);139return this;140}141142PathOps ends(String suffix) {143out.format("test endsWith %s\n", suffix);144checkPath();145Path s = FileSystems.getDefault().getPath(suffix);146check(path.endsWith(s), true);147return this;148}149150PathOps notEnds(String suffix) {151out.format("test not endsWith %s\n", suffix);152checkPath();153Path s = FileSystems.getDefault().getPath(suffix);154check(path.endsWith(s), false);155return this;156}157158PathOps makeAbsolute() {159this.path = path.toAbsolutePath();160return this;161}162163PathOps absolute() {164out.println("check path is absolute");165checkPath();166check(path.isAbsolute(), true);167return this;168}169170PathOps notAbsolute() {171out.println("check path is not absolute");172checkPath();173check(path.isAbsolute(), false);174return this;175}176177PathOps resolve(String other, String expected) {178out.format("test resolve %s\n", other);179checkPath();180check(path.resolve(other), expected);181return this;182}183184PathOps resolveSibling(String other, String expected) {185out.format("test resolveSibling %s\n", other);186checkPath();187check(path.resolveSibling(other), expected);188return this;189}190191PathOps relativize(String other, String expected) {192out.format("test relativize %s\n", other);193checkPath();194Path that = FileSystems.getDefault().getPath(other);195check(path.relativize(that), expected);196return this;197}198199PathOps relativizeFail(String other) {200out.format("test relativize %s\n", other);201checkPath();202Path that = FileSystems.getDefault().getPath(other);203try {204Path result = path.relativize(that);205out.format("\tExpected: IllegalArgumentException");206out.format("\tActual: %s\n", result);207fail();208} catch (IllegalArgumentException expected) { }209return this;210}211212PathOps normalize(String expected) {213out.println("check normalized path");214checkPath();215check(path.normalize(), expected);216return this;217}218219PathOps string(String expected) {220out.println("check string representation");221checkPath();222check(path, expected);223return this;224}225226PathOps invalid() {227if (!(exc instanceof InvalidPathException)) {228out.println("InvalidPathException not thrown as expected");229fail();230}231return this;232}233234static PathOps test(String first, String... more) {235return new PathOps(first, more);236}237238static PathOps test(Path path) {239return new PathOps(path.toString());240}241242243// -- PathOpss --244245static void header(String s) {246out.println();247out.println();248out.println("-- " + s + " --");249}250251static void doWindowsTests() {252header("Windows specific tests");253Path cwd = Paths.get("").toAbsolutePath();254255// construction256test("C:\\")257.string("C:\\");258test("C:\\", "")259.string("C:\\");260test("C:\\", "foo")261.string("C:\\foo");262test("C:\\", "\\foo")263.string("C:\\foo");264test("C:\\", "foo\\")265.string("C:\\foo");266test("foo", "bar", "gus")267.string("foo\\bar\\gus");268test("")269.string("");270test("", "C:\\")271.string("C:\\");272test("", "foo", "", "bar", "", "\\gus")273.string("foo\\bar\\gus");274275// all components present276test("C:\\a\\b\\c")277.root("C:\\")278.parent("C:\\a\\b")279.name("c");280test("C:a\\b\\c")281.root("C:")282.parent("C:a\\b")283.name("c");284test("\\\\server\\share\\a")285.root("\\\\server\\share\\")286.parent("\\\\server\\share\\")287.name("a");288289// root component only290test("C:\\")291.root("C:\\")292.parent(null)293.name(null);294test("C:")295.root("C:")296.parent(null)297.name(null);298test("\\\\server\\share\\")299.root("\\\\server\\share\\")300.parent(null)301.name(null);302303// no root component304test("a\\b")305.root(null)306.parent("a")307.name("b");308309// name component only310test("foo")311.root(null)312.parent(null)313.name("foo");314test("")315.root(null)316.parent(null)317.name("");318319// startsWith320test("C:\\")321.starts("C:\\")322.starts("c:\\")323.notStarts("C")324.notStarts("C:")325.notStarts("");326test("C:")327.starts("C:")328.starts("c:")329.notStarts("C")330.notStarts("");331test("\\")332.starts("\\");333test("C:\\foo\\bar")334.starts("C:\\")335.starts("C:\\foo")336.starts("C:\\FOO")337.starts("C:\\foo\\bar")338.starts("C:\\Foo\\Bar")339.notStarts("C:")340.notStarts("C")341.notStarts("C:foo")342.notStarts("");343test("\\foo\\bar")344.starts("\\")345.starts("\\foo")346.starts("\\foO")347.starts("\\foo\\bar")348.starts("\\fOo\\BaR")349.notStarts("foo")350.notStarts("foo\\bar")351.notStarts("");352test("foo\\bar")353.starts("foo")354.starts("foo\\bar")355.notStarts("\\")356.notStarts("");357test("\\\\server\\share")358.starts("\\\\server\\share")359.starts("\\\\server\\share\\")360.notStarts("\\")361.notStarts("");362test("")363.starts("")364.notStarts("\\");365366// endsWith367test("C:\\")368.ends("C:\\")369.ends("c:\\")370.notEnds("\\")371.notEnds("");372test("C:")373.ends("C:")374.ends("c:")375.notEnds("");376test("\\")377.ends("\\")378.notEnds("");379test("C:\\foo\\bar")380.ends("bar")381.ends("BAR")382.ends("foo\\bar")383.ends("Foo\\Bar")384.ends("C:\\foo\\bar")385.ends("c:\\foO\\baR")386.notEnds("r")387.notEnds("\\foo\\bar")388.notEnds("");389test("\\foo\\bar")390.ends("bar")391.ends("BaR")392.ends("foo\\bar")393.ends("foO\\baR")394.ends("\\foo\\bar")395.ends("\\Foo\\Bar")396.notEnds("oo\\bar")397.notEnds("");398test("foo\\bar")399.ends("bar")400.ends("BAR")401.ends("foo\\bar")402.ends("Foo\\Bar")403.notEnds("ar")404.notEnds("");405test("\\\\server\\share")406.ends("\\\\server\\share")407.ends("\\\\server\\share\\")408.notEnds("shared")409.notEnds("\\")410.notEnds("");411test("")412.ends("")413.notEnds("\\");414415// elements416test("C:\\a\\b\\c")417.element(0, "a")418.element(1, "b")419.element(2, "c");420test("foo.bar\\gus.alice")421.element(0, "foo.bar")422.element(1, "gus.alice");423test("")424.element(0, "");425426// subpath427test("C:\\foo")428.subpath(0, 1, "foo");429test("C:foo")430.subpath(0, 1, "foo");431test("foo")432.subpath(0, 1, "foo");433test("C:\\foo\\bar\\gus")434.subpath(0, 1, "foo")435.subpath(0, 2, "foo\\bar")436.subpath(0, 3, "foo\\bar\\gus")437.subpath(1, 2, "bar")438.subpath(1, 3, "bar\\gus")439.subpath(2, 3, "gus");440test("\\\\server\\share\\foo")441.subpath(0, 1, "foo");442test("")443.subpath(0, 1, "");444445// isAbsolute446test("foo").notAbsolute();447test("C:").notAbsolute();448test("C:\\").absolute();449test("C:\\abc").absolute();450test("\\\\server\\share\\").absolute();451test("").notAbsolute();452test(cwd).absolute();453454// toAbsolutePath455test("")456.makeAbsolute()457.absolute()458.hasRoot()459.string(cwd.toString());460test(".")461.makeAbsolute()462.absolute()463.hasRoot()464.string(cwd.toString() + "\\.");465test("foo")466.makeAbsolute()467.absolute()468.hasRoot()469.string(cwd.toString() + "\\foo");470471String rootAsString = cwd.getRoot().toString();472if (rootAsString.length() == 3473&& rootAsString.charAt(1) == ':'474&& rootAsString.charAt(2) == '\\') {475Path root = Paths.get(rootAsString.substring(0, 2));476477// C:478test(root)479.makeAbsolute()480.absolute()481.hasRoot()482.string(cwd.toString());483484// C:.485test(root + ".")486.makeAbsolute()487.absolute()488.hasRoot()489.string(cwd.toString() + "\\.");490491// C:foo492test(root + "foo")493.makeAbsolute()494.absolute()495.hasRoot()496.string(cwd.toString() + "\\foo");497}498499// resolve500test("C:\\")501.resolve("foo", "C:\\foo")502.resolve("D:\\bar", "D:\\bar")503.resolve("\\\\server\\share\\bar", "\\\\server\\share\\bar")504.resolve("C:foo", "C:\\foo")505.resolve("D:foo", "D:foo")506.resolve("", "C:\\");507test("\\")508.resolve("foo", "\\foo")509.resolve("D:bar", "D:bar")510.resolve("C:\\bar", "C:\\bar")511.resolve("\\\\server\\share\\bar", "\\\\server\\share\\bar")512.resolve("\\foo", "\\foo")513.resolve("", "\\");514test("\\foo")515.resolve("bar", "\\foo\\bar")516.resolve("D:bar", "D:bar")517.resolve("C:\\bar", "C:\\bar")518.resolve("\\\\server\\share\\bar", "\\\\server\\share\\bar")519.resolve("\\bar", "\\bar")520.resolve("", "\\foo");521test("foo")522.resolve("bar", "foo\\bar")523.resolve("D:\\bar", "D:\\bar")524.resolve("\\\\server\\share\\bar", "\\\\server\\share\\bar")525.resolve("C:bar", "C:bar")526.resolve("D:foo", "D:foo")527.resolve("", "foo");528test("C:")529.resolve("foo", "C:foo")530.resolve("", "C:");531test("\\\\server\\share\\foo")532.resolve("bar", "\\\\server\\share\\foo\\bar")533.resolve("\\bar", "\\\\server\\share\\bar")534.resolve("D:\\bar", "D:\\bar")535.resolve("\\\\other\\share\\bar", "\\\\other\\share\\bar")536.resolve("D:bar", "D:bar")537.resolve("", "\\\\server\\share\\foo");538test("")539.resolve("", "")540.resolve("foo", "foo")541.resolve("C:\\", "C:\\")542.resolve("C:foo", "C:foo")543.resolve("\\\\server\\share\\bar", "\\\\server\\share\\bar");544545// resolveSibling546test("foo")547.resolveSibling("bar", "bar")548.resolveSibling("D:\\bar", "D:\\bar")549.resolveSibling("\\\\server\\share\\bar", "\\\\server\\share\\bar")550.resolveSibling("C:bar", "C:bar")551.resolveSibling("D:foo", "D:foo")552.resolveSibling("", "");553test("foo\\bar")554.resolveSibling("gus", "foo\\gus")555.resolveSibling("D:\\bar", "D:\\bar")556.resolveSibling("\\\\server\\share\\bar", "\\\\server\\share\\bar")557.resolveSibling("C:bar", "C:bar")558.resolveSibling("D:foo", "D:foo")559.resolveSibling("", "foo");560test("C:\\foo")561.resolveSibling("gus", "C:\\gus")562.resolveSibling("D:\\bar", "D:\\bar")563.resolveSibling("\\\\server\\share\\bar", "\\\\server\\share\\bar")564.resolveSibling("C:bar", "C:\\bar")565.resolveSibling("D:foo", "D:foo")566.resolveSibling("", "C:\\");567test("C:\\foo\\bar")568.resolveSibling("gus", "C:\\foo\\gus")569.resolveSibling("D:\\bar", "D:\\bar")570.resolveSibling("\\\\server\\share\\bar", "\\\\server\\share\\bar")571.resolveSibling("C:bar", "C:\\foo\\bar")572.resolveSibling("D:foo", "D:foo")573.resolveSibling("", "C:\\foo");574test("\\\\server\\share\\foo")575.resolveSibling("bar", "\\\\server\\share\\bar")576.resolveSibling("\\bar", "\\\\server\\share\\bar")577.resolveSibling("D:\\bar", "D:\\bar")578.resolveSibling("\\\\other\\share\\bar", "\\\\other\\share\\bar")579.resolveSibling("D:bar", "D:bar")580.resolveSibling("", "\\\\server\\share\\");581test("")582.resolveSibling("", "")583.resolveSibling("foo", "foo")584.resolveSibling("C:\\", "C:\\");585586// relativize587test("C:\\a")588.relativize("C:\\a", "")589.relativize("C:\\", "..")590.relativize("C:\\.", "..")591.relativize("C:\\..", "..")592.relativize("C:\\..\\..", "..")593.relativize("C:\\a\\b", "b")594.relativize("C:\\a\\b\\c", "b\\c")595.relativize("C:\\a\\.", "") // "." also valid596.relativize("C:\\a\\..", "..")597.relativize("C:\\x", "..\\x")598.relativizeFail("C:x")599.relativizeFail("x")600.relativizeFail("\\")601.relativizeFail("")602.relativizeFail(".")603.relativizeFail("..");604test("C:\\a\\b")605.relativize("C:\\a\\b", "")606.relativize("C:\\a", "..")607.relativize("C:\\", "..\\..")608.relativize("C:\\.", "..\\..")609.relativize("C:\\..", "..\\..")610.relativize("C:\\..\\..", "..\\..")611.relativize("C:\\a\\b\\c", "c")612.relativize("C:\\a\\.", "..")613.relativize("C:\\a\\..", "..\\..")614.relativize("C:\\x", "..\\..\\x")615.relativizeFail("C:x")616.relativizeFail("x")617.relativizeFail("\\")618.relativizeFail("")619.relativizeFail(".")620.relativizeFail("..");621test("C:\\a\\b\\c")622.relativize("C:\\a\\b\\c", "")623.relativize("C:\\a\\b", "..")624.relativize("C:\\a", "..\\..")625.relativize("C:\\", "..\\..\\..")626.relativize("C:\\.", "..\\..\\..")627.relativize("C:\\..", "..\\..\\..")628.relativize("C:\\..\\..", "..\\..\\..")629.relativize("C:\\..\\..\\..", "..\\..\\..")630.relativize("C:\\..\\..\\..\\..", "..\\..\\..")631.relativize("C:\\a\\b\\c\\d", "d")632.relativize("C:\\a\\b\\c\\d\\e", "d\\e")633.relativize("C:\\a\\b\\c\\.", "") // "." also valid634.relativize("C:\\a\\b\\c\\..", "..")635.relativize("C:\\a\\x", "..\\..\\x")636.relativize("C:\\x", "..\\..\\..\\x")637.relativizeFail("C:x")638.relativizeFail("x")639.relativizeFail("\\")640.relativizeFail("")641.relativizeFail(".")642.relativizeFail("..");643test("C:\\..\\a")644.relativize("C:\\a", "")645.relativize("C:\\", "..")646.relativize("C:\\.", "..")647.relativize("C:\\..", "..")648.relativize("C:\\..\\..", "..")649.relativize("C:\\a\\b", "b")650.relativize("C:\\a\\b\\c", "b\\c")651.relativize("C:\\a\\.", "") // "." also valid652.relativize("C:\\a\\..", "..")653.relativize("C:\\x", "..\\x")654.relativizeFail("C:x")655.relativizeFail("x")656.relativizeFail("\\")657.relativizeFail("")658.relativizeFail(".")659.relativizeFail("..");660test("C:\\..\\a\\b")661.relativize("C:\\a\\b", "")662.relativize("C:\\a", "..")663.relativize("C:\\", "..\\..")664.relativize("C:\\.", "..\\..")665.relativize("C:\\..", "..\\..")666.relativize("C:\\..\\..", "..\\..")667.relativize("C:\\..\\..\\..", "..\\..")668.relativize("C:\\..\\..\\..\\..", "..\\..")669.relativize("C:\\a\\b\\c", "c")670.relativize("C:\\a\\b\\.", "") // "." also valid671.relativize("C:\\a\\b\\..", "..")672.relativize("C:\\a\\x", "..\\x")673.relativize("C:\\x", "..\\..\\x")674.relativizeFail("C:x")675.relativizeFail("x")676.relativizeFail("\\")677.relativizeFail("")678.relativizeFail(".")679.relativizeFail("..");680test("C:\\..\\..\\a\\b")681.relativize("C:\\a\\b", "")682.relativize("C:\\a", "..")683.relativize("C:\\", "..\\..")684.relativize("C:\\.", "..\\..")685.relativize("C:\\..", "..\\..")686.relativize("C:\\..\\..", "..\\..")687.relativize("C:\\..\\..\\..", "..\\..")688.relativize("C:\\..\\..\\..\\..", "..\\..")689.relativize("C:\\a\\b\\c", "c")690.relativize("C:\\a\\b\\.", "") // "." also valid691.relativize("C:\\a\\b\\..", "..")692.relativize("C:\\a\\x", "..\\x")693.relativize("C:\\x", "..\\..\\x")694.relativizeFail("C:x")695.relativizeFail("x")696.relativizeFail("\\")697.relativizeFail("")698.relativizeFail(".")699.relativizeFail("..");700test("C:\\..\\a\\b\\c")701.relativize("C:\\a\\b\\c", "")702.relativize("C:\\a\\b", "..")703.relativize("C:\\a", "..\\..")704.relativize("C:\\", "..\\..\\..")705.relativize("C:\\.", "..\\..\\..")706.relativize("C:\\..", "..\\..\\..")707.relativize("C:\\..\\..", "..\\..\\..")708.relativize("C:\\..\\..\\..", "..\\..\\..")709.relativize("C:\\..\\..\\..\\..", "..\\..\\..")710.relativize("C:\\a\\b\\c\\d", "d")711.relativize("C:\\a\\b\\c\\d\\e", "d\\e")712.relativize("C:\\a\\b\\c\\.", "") // "." also valid713.relativize("C:\\a\\b\\c\\..", "..")714.relativize("C:\\a\\x", "..\\..\\x")715.relativize("C:\\x", "..\\..\\..\\x")716.relativizeFail("C:x")717.relativizeFail("x")718.relativizeFail("\\")719.relativizeFail("")720.relativizeFail(".")721.relativizeFail("..");722test("C:\\..\\..\\a\\b\\c")723.relativize("C:\\a\\b\\c", "")724.relativize("C:\\a\\b", "..")725.relativize("C:\\a", "..\\..")726.relativize("C:\\", "..\\..\\..")727.relativize("C:\\.", "..\\..\\..")728.relativize("C:\\..", "..\\..\\..")729.relativize("C:\\..\\..", "..\\..\\..")730.relativize("C:\\..\\..\\..", "..\\..\\..")731.relativize("C:\\..\\..\\..\\..", "..\\..\\..")732.relativize("C:\\a\\b\\c\\d", "d")733.relativize("C:\\a\\b\\c\\d\\e", "d\\e")734.relativize("C:\\a\\b\\c\\.", "") // "." also valid735.relativize("C:\\a\\b\\c\\..", "..")736.relativize("C:\\a\\x", "..\\..\\x")737.relativize("C:\\x", "..\\..\\..\\x")738.relativizeFail("C:x")739.relativizeFail("x")740.relativizeFail("\\")741.relativizeFail("")742.relativizeFail(".")743.relativizeFail("..");744test("C:\\..\\..\\..\\a\\b\\c")745.relativize("C:\\a\\b\\c", "")746.relativize("C:\\a\\b", "..")747.relativize("C:\\a", "..\\..")748.relativize("C:\\", "..\\..\\..")749.relativize("C:\\.", "..\\..\\..")750.relativize("C:\\..", "..\\..\\..")751.relativize("C:\\..\\..", "..\\..\\..")752.relativize("C:\\..\\..\\..", "..\\..\\..")753.relativize("C:\\..\\..\\..\\..", "..\\..\\..")754.relativize("C:\\a\\b\\c\\d", "d")755.relativize("C:\\a\\b\\c\\d\\e", "d\\e")756.relativize("C:\\a\\b\\c\\.", "") // "." also valid757.relativize("C:\\a\\b\\c\\..", "..")758.relativize("C:\\a\\x", "..\\..\\x")759.relativize("C:\\x", "..\\..\\..\\x")760.relativizeFail("C:x")761.relativizeFail("x")762.relativizeFail("\\")763.relativizeFail("")764.relativizeFail(".")765.relativizeFail("..");766test("C:\\.\\a")767.relativize("C:\\a", "")768.relativize("C:\\", "..")769.relativize("C:\\.", "..")770.relativize("C:\\..", "..")771.relativize("C:\\..\\..", "..")772.relativize("C:\\a\\b", "b")773.relativize("C:\\a\\b\\c", "b\\c")774.relativize("C:\\a\\.", "") // "." also valid775.relativize("C:\\a\\..", "..")776.relativize("C:\\x", "..\\x")777.relativizeFail("C:x")778.relativizeFail("x")779.relativizeFail("\\")780.relativizeFail("")781.relativizeFail(".")782.relativizeFail("..");783test("C:\\..\\a")784.relativize("C:\\a", "")785.relativize("C:\\", "..")786.relativize("C:\\.", "..")787.relativize("C:\\..", "..")788.relativize("C:\\..\\..", "..")789.relativize("C:\\a\\b", "b")790.relativize("C:\\a\\b\\c", "b\\c")791.relativize("C:\\a\\.", "") // "." also valid792.relativize("C:\\a\\..", "..")793.relativize("C:\\x", "..\\x")794.relativizeFail("C:x")795.relativizeFail("x")796.relativizeFail("\\")797.relativizeFail("")798.relativizeFail(".")799.relativizeFail("..");800test("C:\\a\\..")801.relativize("C:\\a", "a")802.relativize("C:\\", "") // "." is also valid803.relativize("C:\\.", "")804.relativize("C:\\..", "")805.relativize("C:\\..\\..", "")806.relativize("C:\\a\\.", "a")807.relativize("C:\\a\\..", "")808.relativize("C:\\x", "x")809.relativizeFail("C:x")810.relativizeFail("x")811.relativizeFail("\\")812.relativizeFail("")813.relativizeFail(".")814.relativizeFail("..");815test("C:a")816.relativize("C:a", "")817.relativize("C:", "..")818.relativize("C:.", "..")819.relativize("C:..", "..\\..")820.relativize("C:..\\..", "..\\..\\..")821.relativize("C:.\\..", "..\\..")822.relativize("C:a\\b", "b")823.relativize("C:a\\b\\c", "b\\c")824.relativize("C:..\\x", "..\\..\\x")825.relativizeFail("C:\\x")826.relativizeFail("x")827.relativizeFail("\\")828.relativizeFail("\\x");829test("C:a\\b")830.relativize("C:a\\b", "")831.relativize("C:a", "..")832.relativize("C:", "..\\..")833.relativize("C:.", "..\\..")834.relativize("C:..", "..\\..\\..")835.relativize("C:..\\..", "..\\..\\..\\..")836.relativize("C:.\\..", "..\\..\\..")837.relativize("C:a\\b\\c", "c")838.relativize("C:..\\x", "..\\..\\..\\x")839.relativizeFail("C:\\x")840.relativizeFail("x")841.relativizeFail("\\")842.relativizeFail("\\x");843test("C:a\\b\\c")844.relativize("C:a\\b\\c", "")845.relativize("C:a\\b", "..")846.relativize("C:a", "..\\..")847.relativize("C:", "..\\..\\..")848.relativize("C:.", "..\\..\\..")849.relativize("C:..", "..\\..\\..\\..")850.relativize("C:..\\..", "..\\..\\..\\..\\..")851.relativize("C:.\\..", "..\\..\\..\\..")852.relativize("C:a\\b\\c\\d", "d")853.relativize("C:a\\b\\c\\d\\e", "d\\e")854.relativize("C:a\\x", "..\\..\\x")855.relativize("C:..\\x", "..\\..\\..\\..\\x")856.relativizeFail("C:\\x")857.relativizeFail("x")858.relativizeFail("\\")859.relativizeFail("\\x");860test("C:")861.relativize("C:a", "a")862.relativize("C:a\\b\\c", "a\\b\\c")863.relativize("C:", "")864.relativize("C:.", "") // "" also valid865.relativize("C:..", "..")866.relativize("C:..\\..", "..\\..")867.relativize("C:.\\..", "..")868.relativizeFail("C:\\x")869.relativizeFail("\\")870.relativizeFail("\\x");871test("C:..")872.relativize("C:..\\a", "a")873.relativize("C:..", "")874.relativize("C:.\\..", "")875.relativizeFail("C:\\x")876.relativizeFail("\\")877.relativizeFail("\\x")878.relativizeFail("")879.relativizeFail(".")880.relativizeFail("x");881test("C:..\\a")882.relativize("C:..\\a\\b", "b")883.relativize("C:..\\a", "")884.relativize("C:..", "..")885.relativize("C:.\\..", "..")886.relativizeFail("C:\\x")887.relativizeFail("\\")888.relativizeFail("\\x")889.relativizeFail("")890.relativizeFail(".")891.relativizeFail("x");892test("C:..\\a\\b")893.relativize("C:..\\a\\b\\c", "c")894.relativize("C:..\\a\\b", "")895.relativize("C:..\\a", "..")896.relativize("C:..", "..\\..")897.relativize("C:.\\..", "..\\..")898.relativizeFail("C:\\x")899.relativizeFail("\\")900.relativizeFail("\\x")901.relativizeFail("")902.relativizeFail("x");903test("C:a\\..")904.relativize("C:b", "b")905.relativize("C:", "")906.relativize("C:.", "") // "." also valid907.relativize("C:..", "..")908.relativize("C:a\\..\\b", "b")909.relativize("C:a\\..", "")910.relativize("C:..\\b", "..\\b")911.relativize("C:b\\..", "")912.relativizeFail("C:\\x")913.relativizeFail("\\")914.relativizeFail("\\x")915.relativizeFail("x");916test("C:a\\..\\b")917.relativize("C:a\\..\\b", "")918.relativize("C:a\\..", "..")919.relativize("C:", "..")920.relativize("C:.", "..")921.relativize("C:..", "..\\..")922.relativize("C:b", "")923.relativize("C:c", "..\\c")924.relativize("C:..\\c", "..\\..\\c")925.relativize("C:a\\..\\b\\c", "c")926.relativizeFail("C:\\x")927.relativizeFail("\\")928.relativizeFail("\\x")929.relativizeFail("x");930test("\\a")931.relativize("\\a", "")932.relativize("\\", "..")933.relativize("\\.", "..")934.relativize("\\..", "..")935.relativize("\\..\\..", "..")936.relativize("\\a\\b", "b")937.relativize("\\a\\b\\c", "b\\c")938.relativize("\\a\\.", "") // "." also valid939.relativize("\\a\\..", "..")940.relativize("\\x", "..\\x")941.relativizeFail("C:\\x")942.relativizeFail("C:x")943.relativizeFail("x")944.relativizeFail("")945.relativizeFail(".")946.relativizeFail("..");947test("\\a\\b")948.relativize("\\a\\b", "")949.relativize("\\a", "..")950.relativize("\\", "..\\..")951.relativize("\\.", "..\\..")952.relativize("\\..", "..\\..")953.relativize("\\..\\..", "..\\..")954.relativize("\\a\\b\\c", "c")955.relativize("\\a\\.", "..")956.relativize("\\a\\..", "..\\..")957.relativize("\\x", "..\\..\\x")958.relativizeFail("C:\\x")959.relativizeFail("C:x")960.relativizeFail("x")961.relativizeFail("")962.relativizeFail(".")963.relativizeFail("..");964test("\\a\\b\\c")965.relativize("\\a\\b\\c", "")966.relativize("\\a\\b", "..")967.relativize("\\a", "..\\..")968.relativize("\\", "..\\..\\..")969.relativize("\\.", "..\\..\\..")970.relativize("\\..", "..\\..\\..")971.relativize("\\..\\..", "..\\..\\..")972.relativize("\\..\\..\\..", "..\\..\\..")973.relativize("\\..\\..\\..\\..", "..\\..\\..")974.relativize("\\a\\b\\c\\d", "d")975.relativize("\\a\\b\\c\\d\\e", "d\\e")976.relativize("\\a\\b\\c\\.", "") // "." also valid977.relativize("\\a\\b\\c\\..", "..")978.relativize("\\a\\x", "..\\..\\x")979.relativize("\\x", "..\\..\\..\\x")980.relativizeFail("C:\\x")981.relativizeFail("C:x")982.relativizeFail("x")983.relativizeFail("")984.relativizeFail(".")985.relativizeFail("..");986test("\\..\\a")987.relativize("\\a", "")988.relativize("\\", "..")989.relativize("\\.", "..")990.relativize("\\..", "..")991.relativize("\\..\\..", "..")992.relativize("\\a\\b", "b")993.relativize("\\a\\b\\c", "b\\c")994.relativize("\\a\\.", "") // "." also valid995.relativize("\\a\\..", "..")996.relativize("\\x", "..\\x")997.relativizeFail("C:\\x")998.relativizeFail("C:x")999.relativizeFail("x")1000.relativizeFail("")1001.relativizeFail(".")1002.relativizeFail("..");1003test("\\..\\a\\b")1004.relativize("\\a\\b", "")1005.relativize("\\a", "..")1006.relativize("\\", "..\\..")1007.relativize("\\.", "..\\..")1008.relativize("\\..", "..\\..")1009.relativize("\\..\\..", "..\\..")1010.relativize("\\..\\..\\..", "..\\..")1011.relativize("\\..\\..\\..\\..", "..\\..")1012.relativize("\\a\\b\\c", "c")1013.relativize("\\a\\b\\.", "") // "." also valid1014.relativize("\\a\\b\\..", "..")1015.relativize("\\a\\x", "..\\x")1016.relativize("\\x", "..\\..\\x")1017.relativizeFail("C:\\x")1018.relativizeFail("C:x")1019.relativizeFail("x")1020.relativizeFail("")1021.relativizeFail(".")1022.relativizeFail("..");1023test("\\..\\..\\a\\b")1024.relativize("\\a\\b", "")1025.relativize("\\a", "..")1026.relativize("\\", "..\\..")1027.relativize("\\.", "..\\..")1028.relativize("\\..", "..\\..")1029.relativize("\\..\\..", "..\\..")1030.relativize("\\..\\..\\..", "..\\..")1031.relativize("\\..\\..\\..\\..", "..\\..")1032.relativize("\\a\\b\\c", "c")1033.relativize("\\a\\b\\.", "") // "." also valid1034.relativize("\\a\\b\\..", "..")1035.relativize("\\a\\x", "..\\x")1036.relativize("\\x", "..\\..\\x")1037.relativizeFail("C:\\x")1038.relativizeFail("C:x")1039.relativizeFail("x")1040.relativizeFail("")1041.relativizeFail(".")1042.relativizeFail("..");1043test("\\..\\a\\b\\c")1044.relativize("\\a\\b\\c", "")1045.relativize("\\a\\b", "..")1046.relativize("\\a", "..\\..")1047.relativize("\\", "..\\..\\..")1048.relativize("\\.", "..\\..\\..")1049.relativize("\\..", "..\\..\\..")1050.relativize("\\..\\..", "..\\..\\..")1051.relativize("\\..\\..\\..", "..\\..\\..")1052.relativize("\\..\\..\\..\\..", "..\\..\\..")1053.relativize("\\a\\b\\c\\d", "d")1054.relativize("\\a\\b\\c\\d\\e", "d\\e")1055.relativize("\\a\\b\\c\\.", "") // "." also valid1056.relativize("\\a\\b\\c\\..", "..")1057.relativize("\\a\\x", "..\\..\\x")1058.relativize("\\x", "..\\..\\..\\x")1059.relativizeFail("C:\\x")1060.relativizeFail("C:x")1061.relativizeFail("x")1062.relativizeFail("")1063.relativizeFail(".")1064.relativizeFail("..");1065test("\\..\\..\\a\\b\\c")1066.relativize("\\a\\b\\c", "")1067.relativize("\\a\\b", "..")1068.relativize("\\a", "..\\..")1069.relativize("\\", "..\\..\\..")1070.relativize("\\.", "..\\..\\..")1071.relativize("\\..", "..\\..\\..")1072.relativize("\\..\\..", "..\\..\\..")1073.relativize("\\..\\..\\..", "..\\..\\..")1074.relativize("\\..\\..\\..\\..", "..\\..\\..")1075.relativize("\\a\\b\\c\\d", "d")1076.relativize("\\a\\b\\c\\d\\e", "d\\e")1077.relativize("\\a\\b\\c\\.", "") // "." also valid1078.relativize("\\a\\b\\c\\..", "..")1079.relativize("\\a\\x", "..\\..\\x")1080.relativize("\\x", "..\\..\\..\\x")1081.relativizeFail("C:\\x")1082.relativizeFail("C:x")1083.relativizeFail("x")1084.relativizeFail("")1085.relativizeFail(".")1086.relativizeFail("..");1087test("\\..\\..\\..\\a\\b\\c")1088.relativize("\\a\\b\\c", "")1089.relativize("\\a\\b", "..")1090.relativize("\\a", "..\\..")1091.relativize("\\", "..\\..\\..")1092.relativize("\\.", "..\\..\\..")1093.relativize("\\..", "..\\..\\..")1094.relativize("\\..\\..", "..\\..\\..")1095.relativize("\\..\\..\\..", "..\\..\\..")1096.relativize("\\..\\..\\..\\..", "..\\..\\..")1097.relativize("\\a\\b\\c\\d", "d")1098.relativize("\\a\\b\\c\\d\\e", "d\\e")1099.relativize("\\a\\b\\c\\.", "") // "." also valid1100.relativize("\\a\\b\\c\\..", "..")1101.relativize("\\a\\x", "..\\..\\x")1102.relativize("\\x", "..\\..\\..\\x")1103.relativizeFail("C:\\x")1104.relativizeFail("C:x")1105.relativizeFail("x")1106.relativizeFail("")1107.relativizeFail(".")1108.relativizeFail("..");1109test("\\.\\a")1110.relativize("\\a", "")1111.relativize("\\", "..")1112.relativize("\\.", "..")1113.relativize("\\..", "..")1114.relativize("\\..\\..", "..")1115.relativize("\\a\\b", "b")1116.relativize("\\a\\b\\c", "b\\c")1117.relativize("\\a\\.", "") // "." also valid1118.relativize("\\a\\..", "..")1119.relativize("\\x", "..\\x")1120.relativizeFail("C:\\x")1121.relativizeFail("C:x")1122.relativizeFail("x")1123.relativizeFail("")1124.relativizeFail(".")1125.relativizeFail("..");1126test("\\..\\a")1127.relativize("\\a", "")1128.relativize("\\", "..")1129.relativize("\\.", "..")1130.relativize("\\..", "..")1131.relativize("\\..\\..", "..")1132.relativize("\\a\\b", "b")1133.relativize("\\a\\b\\c", "b\\c")1134.relativize("\\a\\.", "") // "." also valid1135.relativize("\\a\\..", "..")1136.relativize("\\x", "..\\x")1137.relativizeFail("C:\\x")1138.relativizeFail("C:x")1139.relativizeFail("x")1140.relativizeFail("")1141.relativizeFail(".")1142.relativizeFail("..");1143test("\\a\\..")1144.relativize("\\a", "a")1145.relativize("\\", "") // "." is also valid1146.relativize("\\.", "")1147.relativize("\\..", "")1148.relativize("\\..\\..", "")1149.relativize("\\a\\.", "a")1150.relativize("\\a\\..", "")1151.relativize("\\x", "x")1152.relativizeFail("C:\\x")1153.relativizeFail("C:x")1154.relativizeFail("x")1155.relativizeFail("")1156.relativizeFail(".")1157.relativizeFail("..");1158test("\\")1159.relativize("\\a", "a")1160.relativize("\\", "") // "." is also valid1161.relativize("\\.", "")1162.relativize("\\..", "")1163.relativize("\\..\\..", "")1164.relativize("\\a\\.", "a")1165.relativize("\\a\\..", "")1166.relativize("\\x", "x")1167.relativizeFail("C:\\x")1168.relativizeFail("C:x")1169.relativizeFail("x")1170.relativizeFail("")1171.relativizeFail(".")1172.relativizeFail("..");1173test("a")1174.relativize("a", "")1175.relativize("", "..")1176.relativize(".", "..")1177.relativize("..", "..\\..")1178.relativize("..\\..", "..\\..\\..")1179.relativize(".\\..", "..\\..")1180.relativize("a\\b", "b")1181.relativize("a\\b\\c", "b\\c")1182.relativize("..\\x", "..\\..\\x")1183.relativizeFail("C:\\x")1184.relativizeFail("C:x")1185.relativizeFail("\\")1186.relativizeFail("\\x");1187test("a\\b")1188.relativize("a\\b", "")1189.relativize("a", "..")1190.relativize("", "..\\..")1191.relativize(".", "..\\..")1192.relativize("..", "..\\..\\..")1193.relativize("..\\..", "..\\..\\..\\..")1194.relativize(".\\..", "..\\..\\..")1195.relativize("a\\b\\c", "c")1196.relativize("..\\x", "..\\..\\..\\x")1197.relativizeFail("C:\\x")1198.relativizeFail("C:x")1199.relativizeFail("\\")1200.relativizeFail("\\x");1201test("a\\b\\c")1202.relativize("a\\b\\c", "")1203.relativize("a\\b", "..")1204.relativize("a", "..\\..")1205.relativize("", "..\\..\\..")1206.relativize(".", "..\\..\\..")1207.relativize("..", "..\\..\\..\\..")1208.relativize("..\\..", "..\\..\\..\\..\\..")1209.relativize(".\\..", "..\\..\\..\\..")1210.relativize("a\\b\\c\\d", "d")1211.relativize("a\\b\\c\\d\\e", "d\\e")1212.relativize("a\\x", "..\\..\\x")1213.relativize("..\\x", "..\\..\\..\\..\\x")1214.relativizeFail("C:\\x")1215.relativizeFail("C:x")1216.relativizeFail("\\")1217.relativizeFail("\\x");1218test("")1219.relativize("a", "a")1220.relativize("a\\b\\c", "a\\b\\c")1221.relativize("", "")1222.relativize(".", ".")1223.relativize("..", "..")1224.relativize("..\\..", "..\\..")1225.relativize(".\\..", ".\\..") // ".." also valid1226.relativizeFail("\\")1227.relativizeFail("\\x");1228test("..")1229.relativize("..\\a", "a")1230.relativize("..", "")1231.relativize(".\\..", "")1232.relativizeFail("C:\\x")1233.relativizeFail("C:x")1234.relativizeFail("\\")1235.relativizeFail("\\x")1236.relativizeFail("")1237.relativizeFail(".")1238.relativizeFail("x");1239test("..\\a")1240.relativize("..\\a\\b", "b")1241.relativize("..\\a", "")1242.relativize("..", "..")1243.relativize(".\\..", "..")1244.relativizeFail("C:\\x")1245.relativizeFail("C:x")1246.relativizeFail("\\")1247.relativizeFail("\\x")1248.relativizeFail("")1249.relativizeFail(".")1250.relativizeFail("x");1251test("..\\a\\b")1252.relativize("..\\a\\b\\c", "c")1253.relativize("..\\a\\b", "")1254.relativize("..\\a", "..")1255.relativize("..", "..\\..")1256.relativize(".\\..", "..\\..")1257.relativizeFail("C:\\x")1258.relativizeFail("C:x")1259.relativizeFail("\\")1260.relativizeFail("\\x")1261.relativizeFail("")1262.relativizeFail("x");1263test("a\\..")1264.relativize("b", "b")1265.relativize("", "")1266.relativize(".", "") // "." also valid1267.relativize("..", "..")1268.relativize("a\\..\\b", "b")1269.relativize("a\\..", "")1270.relativize("..\\b", "..\\b")1271.relativize("b\\..", "")1272.relativizeFail("C:\\x")1273.relativizeFail("C:x")1274.relativizeFail("\\")1275.relativizeFail("\\x");1276test("a\\..\\b")1277.relativize("a\\..\\b", "")1278.relativize("a\\..", "..")1279.relativize("", "..")1280.relativize(".", "..")1281.relativize("..", "..\\..")1282.relativize("b", "")1283.relativize("c", "..\\c")1284.relativize("..\\c", "..\\..\\c")1285.relativize("a\\..\\b\\c", "c")1286.relativizeFail("C:\\x")1287.relativizeFail("C:x")1288.relativizeFail("\\")1289.relativizeFail("\\x");12901291// normalize1292test("C:\\")1293.normalize("C:\\");1294test("C:\\.")1295.normalize("C:\\");1296test("C:\\..")1297.normalize("C:\\");1298test("\\\\server\\share")1299.normalize("\\\\server\\share\\");1300test("\\\\server\\share\\.")1301.normalize("\\\\server\\share\\");1302test("\\\\server\\share\\..")1303.normalize("\\\\server\\share\\");1304test("C:")1305.normalize("C:");1306test("C:.")1307.normalize("C:");1308test("C:..")1309.normalize("C:..");1310test("\\")1311.normalize("\\");1312test("\\.")1313.normalize("\\");1314test("\\..")1315.normalize("\\");1316test("foo")1317.normalize("foo");1318test("foo\\.")1319.normalize("foo");1320test("foo\\..")1321.normalize("");1322test("C:\\foo")1323.normalize("C:\\foo");1324test("C:\\foo\\.")1325.normalize("C:\\foo");1326test("C:\\.\\foo")1327.normalize("C:\\foo");1328test("C:\\foo\\..")1329.normalize("C:\\");1330test("C:\\..\\foo")1331.normalize("C:\\foo");1332test("\\\\server\\share\\foo")1333.normalize("\\\\server\\share\\foo");1334test("\\\\server\\share\\foo\\.")1335.normalize("\\\\server\\share\\foo");1336test("\\\\server\\share\\.\\foo")1337.normalize("\\\\server\\share\\foo");1338test("\\\\server\\share\\foo\\..")1339.normalize("\\\\server\\share\\");1340test("\\\\server\\share\\..\\foo")1341.normalize("\\\\server\\share\\foo");1342test("C:foo")1343.normalize("C:foo");1344test("C:foo\\.")1345.normalize("C:foo");1346test("C:.\\foo")1347.normalize("C:foo");1348test("C:foo\\..")1349.normalize("C:");1350test("C:..\\foo")1351.normalize("C:..\\foo");1352test("\\foo")1353.normalize("\\foo");1354test("\\foo\\.")1355.normalize("\\foo");1356test("\\.\\foo")1357.normalize("\\foo");1358test("\\foo\\..")1359.normalize("\\");1360test("\\..\\foo")1361.normalize("\\foo");1362test(".")1363.normalize("");1364test("..")1365.normalize("..");1366test("\\..\\..")1367.normalize("\\");1368test("..\\..\\foo")1369.normalize("..\\..\\foo");1370test("foo\\bar\\..")1371.normalize("foo");1372test("foo\\bar\\.\\..")1373.normalize("foo");1374test("foo\\bar\\gus\\..\\..")1375.normalize("foo");1376test(".\\foo\\.\\bar\\.\\gus\\..\\.\\..")1377.normalize("foo");1378test("")1379.normalize("");13801381// UNC corner cases1382test("\\\\server\\share\\")1383.root("\\\\server\\share\\")1384.parent(null)1385.name(null);1386test("\\\\server")1387.invalid();1388test("\\\\server\\")1389.invalid();1390test("\\\\server\\share")1391.root("\\\\server\\share\\")1392.parent(null)1393.name(null);13941395// invalid1396test(":\\foo")1397.invalid();1398test("C::")1399.invalid();1400test("C:\\?") // invalid character1401.invalid();1402test("C:\\*") // invalid character1403.invalid();1404test("C:\\abc\u0001\\foo")1405.invalid();1406test("C:\\\u0019\\foo")1407.invalid();1408test("\\\\server\u0019\\share")1409.invalid();1410test("\\\\server\\share\u0019")1411.invalid();1412test("foo\u0000\bar")1413.invalid();1414test("C:\\foo ") // trailing space1415.invalid();1416test("C:\\foo \\bar")1417.invalid();1418//test("C:\\foo.") // trailing dot1419//.invalid();1420//test("C:\\foo...\\bar")1421//.invalid();14221423// normalization at construction time (remove redundant and replace slashes)1424test("C:/a/b/c")1425.string("C:\\a\\b\\c")1426.root("C:\\")1427.parent("C:\\a\\b");1428test("C://a//b//c")1429.string("C:\\a\\b\\c")1430.root("C:\\")1431.parent("C:\\a\\b");14321433// hashCode1434header("hashCode");1435int h1 = test("C:\\foo").path().hashCode();1436int h2 = test("c:\\FOO").path().hashCode();1437if (h1 != h2)1438throw new RuntimeException("PathOps failed");1439}14401441static void doUnixTests() {1442header("Unix specific tests");1443Path cwd = Paths.get("").toAbsolutePath();14441445// construction1446test("/")1447.string("/");1448test("/", "")1449.string("/");1450test("/", "foo")1451.string("/foo");1452test("/", "/foo")1453.string("/foo");1454test("/", "foo/")1455.string("/foo");1456test("foo", "bar", "gus")1457.string("foo/bar/gus");1458test("")1459.string("");1460test("", "/")1461.string("/");1462test("", "foo", "", "bar", "", "/gus")1463.string("foo/bar/gus");14641465// all components1466test("/a/b/c")1467.root("/")1468.parent("/a/b")1469.name("c");14701471// root component only1472test("/")1473.root("/")1474.parent(null)1475.name(null);14761477// no root component1478test("a/b")1479.root(null)1480.parent("a")1481.name("b");14821483// name component only1484test("foo")1485.root(null)1486.parent(null)1487.name("foo");1488test("")1489.root(null)1490.parent(null)1491.name("");14921493// startsWith1494test("/")1495.starts("/")1496.notStarts("")1497.notStarts("/foo");1498test("/foo")1499.starts("/")1500.starts("/foo")1501.notStarts("/f");1502test("/foo/bar")1503.starts("/")1504.starts("/foo")1505.starts("/foo/bar")1506.notStarts("/f")1507.notStarts("foo")1508.notStarts("foo/bar");1509test("foo")1510.starts("foo")1511.notStarts("")1512.notStarts("f");1513test("foo/bar")1514.starts("foo")1515.starts("foo/bar")1516.notStarts("f")1517.notStarts("/foo")1518.notStarts("/foo/bar");1519test("")1520.starts("")1521.notStarts("/");15221523// endsWith1524test("/")1525.ends("/")1526.notEnds("")1527.notEnds("foo")1528.notEnds("/foo");1529test("/foo")1530.ends("foo")1531.ends("/foo")1532.notEnds("fool");1533test("/foo/bar")1534.ends("bar")1535.ends("foo/bar")1536.ends("/foo/bar")1537.notEnds("ar")1538.notEnds("barack")1539.notEnds("/bar")1540.notEnds("o/bar");1541test("foo")1542.ends("foo")1543.notEnds("")1544.notEnds("oo")1545.notEnds("oola");1546test("foo/bar")1547.ends("bar")1548.ends("foo/bar")1549.notEnds("r")1550.notEnds("barmaid")1551.notEnds("/bar");1552test("foo/bar/gus")1553.ends("gus")1554.ends("bar/gus")1555.ends("foo/bar/gus")1556.notEnds("g")1557.notEnds("/gus")1558.notEnds("r/gus")1559.notEnds("barack/gus")1560.notEnds("bar/gust");1561test("")1562.ends("")1563.notEnds("/");15641565// elements1566test("a/b/c")1567.element(0, "a")1568.element(1, "b")1569.element(2, "c");1570test("")1571.element(0, "");15721573// subpath1574test("/foo")1575.subpath(0, 1, "foo");1576test("foo")1577.subpath(0, 1, "foo");1578test("/foo/bar")1579.subpath(0, 1, "foo")1580.subpath(1, 2, "bar")1581.subpath(0, 2, "foo/bar");1582test("foo/bar")1583.subpath(0, 1, "foo")1584.subpath(1, 2, "bar")1585.subpath(0, 2, "foo/bar");1586test("/foo/bar/gus")1587.subpath(0, 1, "foo")1588.subpath(1, 2, "bar")1589.subpath(2, 3, "gus")1590.subpath(0, 2, "foo/bar")1591.subpath(1, 3, "bar/gus")1592.subpath(0, 3, "foo/bar/gus");1593test("foo/bar/gus")1594.subpath(0, 1, "foo")1595.subpath(1, 2, "bar")1596.subpath(2, 3, "gus")1597.subpath(0, 2, "foo/bar")1598.subpath(1, 3, "bar/gus")1599.subpath(0, 3, "foo/bar/gus");1600test("")1601.subpath(0, 1, "");16021603// isAbsolute1604test("/")1605.absolute();1606test("/tmp")1607.absolute();1608test("tmp")1609.notAbsolute();1610test("")1611.notAbsolute();1612test(cwd)1613.absolute();16141615// toAbsolutePath1616test("/")1617.makeAbsolute()1618.absolute();1619test("/tmp")1620.makeAbsolute()1621.absolute();1622test("tmp")1623.makeAbsolute()1624.absolute();1625test("")1626.makeAbsolute()1627.absolute();16281629// resolve1630test("/tmp")1631.resolve("foo", "/tmp/foo")1632.resolve("/foo", "/foo")1633.resolve("", "/tmp");1634test("tmp")1635.resolve("foo", "tmp/foo")1636.resolve("/foo", "/foo")1637.resolve("", "tmp");1638test("")1639.resolve("", "")1640.resolve("foo", "foo")1641.resolve("/foo", "/foo");16421643// resolveSibling1644test("foo")1645.resolveSibling("bar", "bar")1646.resolveSibling("/bar", "/bar")1647.resolveSibling("", "");1648test("foo/bar")1649.resolveSibling("gus", "foo/gus")1650.resolveSibling("/gus", "/gus")1651.resolveSibling("", "foo");1652test("/foo")1653.resolveSibling("gus", "/gus")1654.resolveSibling("/gus", "/gus")1655.resolveSibling("", "/");1656test("/foo/bar")1657.resolveSibling("gus", "/foo/gus")1658.resolveSibling("/gus", "/gus")1659.resolveSibling("", "/foo");1660test("")1661.resolveSibling("foo", "foo")1662.resolveSibling("/foo", "/foo")1663.resolve("", "");16641665// relativize1666test("/a")1667.relativize("/a", "")1668.relativize("/", "..")1669.relativize("/.", "..")1670.relativize("/..", "..")1671.relativize("/../..", "..")1672.relativize("/a/b", "b")1673.relativize("/a/b/c", "b/c")1674.relativize("/a/.", "") // "." also valid1675.relativize("/a/..", "..")1676.relativize("/x", "../x")1677.relativizeFail("x")1678.relativizeFail("")1679.relativizeFail(".")1680.relativizeFail("..");1681test("/a/b")1682.relativize("/a/b", "")1683.relativize("/a", "..")1684.relativize("/", "../..")1685.relativize("/.", "../..")1686.relativize("/..", "../..")1687.relativize("/../..", "../..")1688.relativize("/a/b/c", "c")1689.relativize("/a/.", "..")1690.relativize("/a/..", "../..")1691.relativize("/x", "../../x")1692.relativizeFail("x")1693.relativizeFail("")1694.relativizeFail(".")1695.relativizeFail("..");1696test("/a/b/c")1697.relativize("/a/b/c", "")1698.relativize("/a/b", "..")1699.relativize("/a", "../..")1700.relativize("/", "../../..")1701.relativize("/.", "../../..")1702.relativize("/..", "../../..")1703.relativize("/../..", "../../..")1704.relativize("/../../..", "../../..")1705.relativize("/../../../..", "../../..")1706.relativize("/a/b/c/d", "d")1707.relativize("/a/b/c/d/e", "d/e")1708.relativize("/a/b/c/.", "") // "." also valid1709.relativize("/a/b/c/..", "..")1710.relativize("/a/x", "../../x")1711.relativize("/x", "../../../x")1712.relativizeFail("x")1713.relativizeFail("")1714.relativizeFail(".")1715.relativizeFail("..");1716test("/../a")1717.relativize("/a", "")1718.relativize("/", "..")1719.relativize("/.", "..")1720.relativize("/..", "..")1721.relativize("/../..", "..")1722.relativize("/a/b", "b")1723.relativize("/a/b/c", "b/c")1724.relativize("/a/.", "") // "." also valid1725.relativize("/a/..", "..")1726.relativize("/x", "../x")1727.relativizeFail("x")1728.relativizeFail("")1729.relativizeFail(".")1730.relativizeFail("..");1731test("/../a/b")1732.relativize("/a/b", "")1733.relativize("/a", "..")1734.relativize("/", "../..")1735.relativize("/.", "../..")1736.relativize("/..", "../..")1737.relativize("/../..", "../..")1738.relativize("/../../..", "../..")1739.relativize("/../../../..", "../..")1740.relativize("/a/b/c", "c")1741.relativize("/a/b/.", "") // "." also valid1742.relativize("/a/b/..", "..")1743.relativize("/a/x", "../x")1744.relativize("/x", "../../x")1745.relativizeFail("x")1746.relativizeFail("")1747.relativizeFail(".")1748.relativizeFail("..");1749test("/../../a/b")1750.relativize("/a/b", "")1751.relativize("/a", "..")1752.relativize("/", "../..")1753.relativize("/.", "../..")1754.relativize("/..", "../..")1755.relativize("/../..", "../..")1756.relativize("/../../..", "../..")1757.relativize("/../../../..", "../..")1758.relativize("/a/b/c", "c")1759.relativize("/a/b/.", "") // "." also valid1760.relativize("/a/b/..", "..")1761.relativize("/a/x", "../x")1762.relativize("/x", "../../x")1763.relativizeFail("x")1764.relativizeFail("")1765.relativizeFail(".")1766.relativizeFail("..");1767test("/../a/b/c")1768.relativize("/a/b/c", "")1769.relativize("/a/b", "..")1770.relativize("/a", "../..")1771.relativize("/", "../../..")1772.relativize("/.", "../../..")1773.relativize("/..", "../../..")1774.relativize("/../..", "../../..")1775.relativize("/../../..", "../../..")1776.relativize("/../../../..", "../../..")1777.relativize("/a/b/c/d", "d")1778.relativize("/a/b/c/d/e", "d/e")1779.relativize("/a/b/c/.", "") // "." also valid1780.relativize("/a/b/c/..", "..")1781.relativize("/a/x", "../../x")1782.relativize("/x", "../../../x")1783.relativizeFail("x")1784.relativizeFail("")1785.relativizeFail(".")1786.relativizeFail("..");1787test("/../../a/b/c")1788.relativize("/a/b/c", "")1789.relativize("/a/b", "..")1790.relativize("/a", "../..")1791.relativize("/", "../../..")1792.relativize("/.", "../../..")1793.relativize("/..", "../../..")1794.relativize("/../..", "../../..")1795.relativize("/../../..", "../../..")1796.relativize("/../../../..", "../../..")1797.relativize("/a/b/c/d", "d")1798.relativize("/a/b/c/d/e", "d/e")1799.relativize("/a/b/c/.", "") // "." also valid1800.relativize("/a/b/c/..", "..")1801.relativize("/a/x", "../../x")1802.relativize("/x", "../../../x")1803.relativizeFail("x")1804.relativizeFail("")1805.relativizeFail(".")1806.relativizeFail("..");1807test("/../../../a/b/c")1808.relativize("/a/b/c", "")1809.relativize("/a/b", "..")1810.relativize("/a", "../..")1811.relativize("/", "../../..")1812.relativize("/.", "../../..")1813.relativize("/..", "../../..")1814.relativize("/../..", "../../..")1815.relativize("/../../..", "../../..")1816.relativize("/../../../..", "../../..")1817.relativize("/a/b/c/d", "d")1818.relativize("/a/b/c/d/e", "d/e")1819.relativize("/a/b/c/.", "") // "." also valid1820.relativize("/a/b/c/..", "..")1821.relativize("/a/x", "../../x")1822.relativize("/x", "../../../x")1823.relativizeFail("x")1824.relativizeFail("")1825.relativizeFail(".")1826.relativizeFail("..");1827test("/./a")1828.relativize("/a", "")1829.relativize("/", "..")1830.relativize("/.", "..")1831.relativize("/..", "..")1832.relativize("/../..", "..")1833.relativize("/a/b", "b")1834.relativize("/a/b/c", "b/c")1835.relativize("/a/.", "") // "." also valid1836.relativize("/a/..", "..")1837.relativize("/x", "../x")1838.relativizeFail("x")1839.relativizeFail("")1840.relativizeFail(".")1841.relativizeFail("..");1842test("/../a")1843.relativize("/a", "")1844.relativize("/", "..")1845.relativize("/.", "..")1846.relativize("/..", "..")1847.relativize("/../..", "..")1848.relativize("/a/b", "b")1849.relativize("/a/b/c", "b/c")1850.relativize("/a/.", "") // "." also valid1851.relativize("/a/..", "..")1852.relativize("/x", "../x")1853.relativizeFail("x")1854.relativizeFail("")1855.relativizeFail(".")1856.relativizeFail("..");1857test("/a/..")1858.relativize("/a", "a")1859.relativize("/", "") // "." is also valid1860.relativize("/.", "")1861.relativize("/..", "")1862.relativize("/../..", "")1863.relativize("/a/.", "a")1864.relativize("/a/..", "")1865.relativize("/x", "x")1866.relativizeFail("x")1867.relativizeFail("")1868.relativizeFail(".")1869.relativizeFail("..");1870test("/")1871.relativize("/a", "a")1872.relativize("/", "") // "." is also valid1873.relativize("/.", "")1874.relativize("/..", "")1875.relativize("/../..", "")1876.relativize("/a/.", "a")1877.relativize("/a/..", "")1878.relativize("/x", "x")1879.relativizeFail("x")1880.relativizeFail("")1881.relativizeFail(".")1882.relativizeFail("..");1883test("a")1884.relativize("a", "")1885.relativize("", "..")1886.relativize(".", "..")1887.relativize("..", "../..")1888.relativize("../..", "../../..")1889.relativize("./..", "../..")1890.relativize("a/b", "b")1891.relativize("a/b/c", "b/c")1892.relativize("../x", "../../x")1893.relativizeFail("/")1894.relativizeFail("/x");1895test("a/b")1896.relativize("a/b", "")1897.relativize("a", "..")1898.relativize("", "../..")1899.relativize(".", "../..")1900.relativize("..", "../../..")1901.relativize("../..", "../../../..")1902.relativize("./..", "../../..")1903.relativize("a/b/c", "c")1904.relativize("../x", "../../../x")1905.relativizeFail("/")1906.relativizeFail("/x");1907test("a/b/c")1908.relativize("a/b/c", "")1909.relativize("a/b", "..")1910.relativize("a", "../..")1911.relativize("", "../../..")1912.relativize(".", "../../..")1913.relativize("..", "../../../..")1914.relativize("../..", "../../../../..")1915.relativize("./..", "../../../..")1916.relativize("a/b/c/d", "d")1917.relativize("a/b/c/d/e", "d/e")1918.relativize("a/x", "../../x")1919.relativize("../x", "../../../../x")1920.relativizeFail("/")1921.relativizeFail("/x");1922test("")1923.relativize("a", "a")1924.relativize("a/b/c", "a/b/c")1925.relativize("", "")1926.relativize(".", ".")1927.relativize("..", "..")1928.relativize("../..", "../..")1929.relativize("./..", "./..") // ".." also valid1930.relativizeFail("/")1931.relativizeFail("/x");1932test("..")1933.relativize("../a", "a")1934.relativize("..", "")1935.relativize("./..", "")1936.relativizeFail("/")1937.relativizeFail("/x")1938.relativizeFail("")1939.relativizeFail(".")1940.relativizeFail("x");1941test("../a")1942.relativize("../a/b", "b")1943.relativize("../a", "")1944.relativize("..", "..")1945.relativize("./..", "..")1946.relativizeFail("/")1947.relativizeFail("/x")1948.relativizeFail("")1949.relativizeFail(".")1950.relativizeFail("x");1951test("../a/b")1952.relativize("../a/b/c", "c")1953.relativize("../a/b", "")1954.relativize("../a", "..")1955.relativize("..", "../..")1956.relativize("./..", "../..")1957.relativizeFail("/")1958.relativizeFail("/x")1959.relativizeFail("")1960.relativizeFail("x");1961test("a/..")1962.relativize("b", "b")1963.relativize("", "")1964.relativize(".", "") // "." also valid1965.relativize("..", "..")1966.relativize("a/../b", "b")1967.relativize("a/..", "")1968.relativize("../b", "../b")1969.relativize("b/..", "")1970.relativizeFail("/")1971.relativizeFail("/x");1972test("a/../b")1973.relativize("a/../b", "")1974.relativize("a/..", "..")1975.relativize("", "..")1976.relativize(".", "..")1977.relativize("..", "../..")1978.relativize("b", "")1979.relativize("c", "../c")1980.relativize("../c", "../../c")1981.relativize("a/../b/c", "c")1982.relativizeFail("/")1983.relativizeFail("/x");19841985// normalize1986test("/")1987.normalize("/");1988test("foo")1989.normalize("foo");1990test("/foo")1991.normalize("/foo");1992test("")1993.normalize("");1994test(".")1995.normalize("");1996test("..")1997.normalize("..");1998test("/..")1999.normalize("/");2000test("/../..")2001.normalize("/");2002test("foo/.")2003.normalize("foo");2004test("./foo")2005.normalize("foo");2006test("foo/..")2007.normalize("");2008test("../foo")2009.normalize("../foo");2010test("../../foo")2011.normalize("../../foo");2012test("foo/bar/..")2013.normalize("foo");2014test("foo/bar/gus/../..")2015.normalize("foo");2016test("/foo/bar/gus/../..")2017.normalize("/foo");20182019// invalid2020test("foo\u0000bar")2021.invalid();2022test("\u0000foo")2023.invalid();2024test("bar\u0000")2025.invalid();2026test("//foo\u0000bar")2027.invalid();2028test("//\u0000foo")2029.invalid();2030test("//bar\u0000")2031.invalid();20322033// normalization of input2034test("//foo//bar")2035.string("/foo/bar")2036.root("/")2037.parent("/foo")2038.name("bar");2039}20402041static void npes() {2042header("NullPointerException");20432044try {2045Path.of(null, "foo");2046throw new RuntimeException("NullPointerException not thrown");2047} catch (NullPointerException npe) {2048}20492050try {2051Path.of("foo", null);2052throw new RuntimeException("NullPointerException not thrown");2053} catch (NullPointerException npe) {2054}20552056Path path = FileSystems.getDefault().getPath("foo");20572058try {2059path.resolve((String)null);2060throw new RuntimeException("NullPointerException not thrown");2061} catch (NullPointerException npe) {2062}20632064try {2065path.relativize(null);2066throw new RuntimeException("NullPointerException not thrown");2067} catch (NullPointerException npe) {2068}20692070try {2071path.compareTo(null);2072throw new RuntimeException("NullPointerException not thrown");2073} catch (NullPointerException npe) {2074}20752076try {2077path.startsWith((Path)null);2078throw new RuntimeException("NullPointerException not thrown");2079} catch (NullPointerException npe) {2080}20812082try {2083path.endsWith((Path)null);2084throw new RuntimeException("NullPointerException not thrown");2085} catch (NullPointerException npe) {2086}20872088}20892090public static void main(String[] args) {2091// all platforms2092npes();20932094// operating system specific2095String osname = System.getProperty("os.name");2096if (osname.startsWith("Windows")) {2097doWindowsTests();2098} else {2099doUnixTests();2100}21012102}2103}210421052106