blob: d68308c19cf3d276719ee2c382e4de22058e8a9a [file] [log] [blame]
Damien Martin-Guillerezf88f4d82015-09-25 13:56:55 +00001// Copyright 2014 The Bazel Authors. All rights reserved.
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +01002//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14package com.google.devtools.build.lib.vfs;
15
Ulf Adams795895a2015-03-06 15:58:35 +000016import static com.google.common.truth.Truth.assertThat;
Laszlo Csomorca99bb72016-10-25 13:15:55 +000017import static com.google.common.truth.Truth.assertWithMessage;
lberki4a45ea82017-06-01 10:05:42 +020018import static org.junit.Assert.fail;
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010019
Laszlo Csomorca99bb72016-10-25 13:15:55 +000020import java.io.File;
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010021import org.junit.Test;
22import org.junit.runner.RunWith;
23import org.junit.runners.JUnit4;
24
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010025/**
26 * This class tests the functionality of the PathFragment.
27 */
28@RunWith(JUnit4.class)
29public class PathFragmentWindowsTest {
Laszlo Csomorca99bb72016-10-25 13:15:55 +000030
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010031 @Test
32 public void testWindowsSeparator() {
lberkiaea56b32017-05-30 12:35:33 +020033 assertThat(PathFragment.create("bar\\baz").toString()).isEqualTo("bar/baz");
34 assertThat(PathFragment.create("c:\\bar\\baz").toString()).isEqualTo("C:/bar/baz");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010035 }
36
37 @Test
38 public void testIsAbsoluteWindows() {
lberkiaea56b32017-05-30 12:35:33 +020039 assertThat(PathFragment.create("C:/").isAbsolute()).isTrue();
40 assertThat(PathFragment.create("C:/").isAbsolute()).isTrue();
41 assertThat(PathFragment.create("C:/foo").isAbsolute()).isTrue();
42 assertThat(PathFragment.create("d:/foo/bar").isAbsolute()).isTrue();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010043
lberkiaea56b32017-05-30 12:35:33 +020044 assertThat(PathFragment.create("*:/").isAbsolute()).isFalse();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010045
46 // C: is not an absolute path, it points to the current active directory on drive C:.
lberkiaea56b32017-05-30 12:35:33 +020047 assertThat(PathFragment.create("C:").isAbsolute()).isFalse();
48 assertThat(PathFragment.create("C:foo").isAbsolute()).isFalse();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010049 }
50
51 @Test
Laszlo Csomorff8fcf02016-10-26 16:20:27 +000052 public void testAbsoluteAndAbsoluteLookingPaths() {
nharmatab4060b62017-04-04 17:11:39 +000053 PathFragment p1 = PathFragment.create("/c");
Laszlo Csomorca99bb72016-10-25 13:15:55 +000054 assertThat(p1.isAbsolute()).isTrue();
Laszlo Csomorff8fcf02016-10-26 16:20:27 +000055 assertThat(p1.getDriveLetter()).isEqualTo('\0');
56 assertThat(p1.getSegments()).containsExactly("c");
Laszlo Csomorca99bb72016-10-25 13:15:55 +000057
nharmatab4060b62017-04-04 17:11:39 +000058 PathFragment p2 = PathFragment.create("/c/");
Laszlo Csomorca99bb72016-10-25 13:15:55 +000059 assertThat(p2.isAbsolute()).isTrue();
Laszlo Csomorff8fcf02016-10-26 16:20:27 +000060 assertThat(p2.getDriveLetter()).isEqualTo('\0');
61 assertThat(p2.getSegments()).containsExactly("c");
62
nharmatab4060b62017-04-04 17:11:39 +000063 PathFragment p3 = PathFragment.create("C:/");
Laszlo Csomorff8fcf02016-10-26 16:20:27 +000064 assertThat(p3.isAbsolute()).isTrue();
65 assertThat(p3.getDriveLetter()).isEqualTo('C');
66 assertThat(p3.getSegments()).isEmpty();
67
nharmatab4060b62017-04-04 17:11:39 +000068 PathFragment p4 = PathFragment.create("C:");
Laszlo Csomorff8fcf02016-10-26 16:20:27 +000069 assertThat(p4.isAbsolute()).isFalse();
70 assertThat(p4.getDriveLetter()).isEqualTo('C');
71 assertThat(p4.getSegments()).isEmpty();
72
nharmatab4060b62017-04-04 17:11:39 +000073 PathFragment p5 = PathFragment.create("/c:");
Laszlo Csomorff8fcf02016-10-26 16:20:27 +000074 assertThat(p5.isAbsolute()).isTrue();
75 assertThat(p5.getDriveLetter()).isEqualTo('\0');
76 assertThat(p5.getSegments()).containsExactly("c:");
Laszlo Csomorca99bb72016-10-25 13:15:55 +000077
78 assertThat(p1).isEqualTo(p2);
Laszlo Csomorff8fcf02016-10-26 16:20:27 +000079 assertThat(p1).isNotEqualTo(p3);
80 assertThat(p1).isNotEqualTo(p4);
81 assertThat(p1).isNotEqualTo(p5);
82 assertThat(p3).isNotEqualTo(p4);
83 assertThat(p3).isNotEqualTo(p5);
84 assertThat(p4).isNotEqualTo(p5);
Laszlo Csomorca99bb72016-10-25 13:15:55 +000085 }
86
87 @Test
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010088 public void testIsAbsoluteWindowsBackslash() {
lberkiaea56b32017-05-30 12:35:33 +020089 assertThat(PathFragment.create(new File("C:\\blah")).isAbsolute()).isTrue();
90 assertThat(PathFragment.create(new File("C:\\")).isAbsolute()).isTrue();
91 assertThat(PathFragment.create(new File("\\blah")).isAbsolute()).isTrue();
92 assertThat(PathFragment.create(new File("\\")).isAbsolute()).isTrue();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010093 }
94
95 @Test
96 public void testIsNormalizedWindows() {
lberkiaea56b32017-05-30 12:35:33 +020097 assertThat(PathFragment.create("C:/").isNormalized()).isTrue();
98 assertThat(PathFragment.create("C:/absolute/path").isNormalized()).isTrue();
99 assertThat(PathFragment.create("C:/absolute/./path").isNormalized()).isFalse();
100 assertThat(PathFragment.create("C:/absolute/../path").isNormalized()).isFalse();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100101 }
102
103 @Test
104 public void testRootNodeReturnsRootStringWindows() {
nharmatab4060b62017-04-04 17:11:39 +0000105 PathFragment rootFragment = PathFragment.create("C:/");
lberkiaea56b32017-05-30 12:35:33 +0200106 assertThat(rootFragment.getPathString()).isEqualTo("C:/");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100107 }
108
109 @Test
110 public void testGetRelativeWindows() {
lberkiaea56b32017-05-30 12:35:33 +0200111 assertThat(PathFragment.create("C:/a").getRelative("b").getPathString()).isEqualTo("C:/a/b");
112 assertThat(PathFragment.create("C:/a/b").getRelative("c/d").getPathString())
113 .isEqualTo("C:/a/b/c/d");
114 assertThat(PathFragment.create("C:/a").getRelative("C:/b").getPathString()).isEqualTo("C:/b");
115 assertThat(PathFragment.create("C:/a/b").getRelative("C:/c/d").getPathString())
116 .isEqualTo("C:/c/d");
117 assertThat(PathFragment.create("a").getRelative("C:/b").getPathString()).isEqualTo("C:/b");
118 assertThat(PathFragment.create("a/b").getRelative("C:/c/d").getPathString())
119 .isEqualTo("C:/c/d");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100120 }
121
Laszlo Csomorca99bb72016-10-25 13:15:55 +0000122 private void assertGetRelative(String path, String relative, PathFragment expected)
123 throws Exception {
nharmatab4060b62017-04-04 17:11:39 +0000124 PathFragment actual = PathFragment.create(path).getRelative(relative);
Laszlo Csomorca99bb72016-10-25 13:15:55 +0000125 assertThat(actual.getPathString()).isEqualTo(expected.getPathString());
126 assertThat(actual).isEqualTo(expected);
127 assertThat(actual.getDriveLetter()).isEqualTo(expected.getDriveLetter());
128 assertThat(actual.hashCode()).isEqualTo(expected.hashCode());
129 }
130
131 private void assertRelativeTo(String path, String relativeTo, String... expectedPathSegments)
132 throws Exception {
nharmataaac13242017-04-24 17:41:23 +0200133 PathFragment expected = PathFragment.createAlreadyInterned('\0', false, expectedPathSegments);
nharmatab4060b62017-04-04 17:11:39 +0000134 PathFragment actual = PathFragment.create(path).relativeTo(relativeTo);
Laszlo Csomorca99bb72016-10-25 13:15:55 +0000135 assertThat(actual.getPathString()).isEqualTo(expected.getPathString());
136 assertThat(actual).isEqualTo(expected);
137 assertThat(actual.getDriveLetter()).isEqualTo(expected.getDriveLetter());
138 assertThat(actual.hashCode()).isEqualTo(expected.hashCode());
139 }
140
141 private void assertCantComputeRelativeTo(String path, String relativeTo) throws Exception {
142 try {
nharmatab4060b62017-04-04 17:11:39 +0000143 PathFragment.create(path).relativeTo(relativeTo);
lberki4a45ea82017-06-01 10:05:42 +0200144 fail("expected failure");
Laszlo Csomorca99bb72016-10-25 13:15:55 +0000145 } catch (Exception e) {
lberkiaea56b32017-05-30 12:35:33 +0200146 assertThat(e).hasMessageThat().contains("is not beneath");
Laszlo Csomorca99bb72016-10-25 13:15:55 +0000147 }
148 }
149
150 private static PathFragment makePath(char drive, boolean absolute, String... segments) {
nharmataaac13242017-04-24 17:41:23 +0200151 return PathFragment.createAlreadyInterned(drive, absolute, segments);
Laszlo Csomorca99bb72016-10-25 13:15:55 +0000152 }
153
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100154 @Test
Laszlo Csomorca99bb72016-10-25 13:15:55 +0000155 public void testGetRelativeMixed() throws Exception {
156 assertGetRelative("a", "b", makePath('\0', false, "a", "b"));
Laszlo Csomorff8fcf02016-10-26 16:20:27 +0000157 assertGetRelative("a", "/b", makePath('\0', true, "b"));
Laszlo Csomorca99bb72016-10-25 13:15:55 +0000158 assertGetRelative("a", "E:b", makePath('\0', false, "a", "b"));
159 assertGetRelative("a", "E:/b", makePath('E', true, "b"));
160
Laszlo Csomorff8fcf02016-10-26 16:20:27 +0000161 assertGetRelative("/a", "b", makePath('\0', true, "a", "b"));
162 assertGetRelative("/a", "/b", makePath('\0', true, "b"));
163 assertGetRelative("/a", "E:b", makePath('\0', true, "a", "b"));
Laszlo Csomorca99bb72016-10-25 13:15:55 +0000164 assertGetRelative("/a", "E:/b", makePath('E', true, "b"));
165
166 assertGetRelative("D:a", "b", makePath('D', false, "a", "b"));
Laszlo Csomorff8fcf02016-10-26 16:20:27 +0000167 assertGetRelative("D:a", "/b", makePath('D', true, "b"));
Laszlo Csomorca99bb72016-10-25 13:15:55 +0000168 assertGetRelative("D:a", "E:b", makePath('D', false, "a", "b"));
169 assertGetRelative("D:a", "E:/b", makePath('E', true, "b"));
170
171 assertGetRelative("D:/a", "b", makePath('D', true, "a", "b"));
Laszlo Csomorff8fcf02016-10-26 16:20:27 +0000172 assertGetRelative("D:/a", "/b", makePath('D', true, "b"));
Laszlo Csomorca99bb72016-10-25 13:15:55 +0000173 assertGetRelative("D:/a", "E:b", makePath('D', true, "a", "b"));
174 assertGetRelative("D:/a", "E:/b", makePath('E', true, "b"));
175 }
176
177 @Test
178 public void testRelativeTo() throws Exception {
179 assertRelativeTo("", "");
180 assertCantComputeRelativeTo("", "a");
181
182 assertRelativeTo("a", "", "a");
183 assertRelativeTo("a", "a");
184 assertCantComputeRelativeTo("a", "b");
185 assertRelativeTo("a/b", "a", "b");
186
187 assertRelativeTo("C:", "");
188 assertRelativeTo("C:", "C:");
189 assertCantComputeRelativeTo("C:/", "");
190 assertRelativeTo("C:/", "C:/");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100191 }
192
193 @Test
194 public void testGetChildWorks() {
nharmatab4060b62017-04-04 17:11:39 +0000195 PathFragment pf = PathFragment.create("../some/path");
lberkiaea56b32017-05-30 12:35:33 +0200196 assertThat(pf.getChild("hi")).isEqualTo(PathFragment.create("../some/path/hi"));
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100197 }
198
199 // Tests after here test the canonicalization
200 private void assertRegular(String expected, String actual) {
nharmatab4060b62017-04-04 17:11:39 +0000201 PathFragment exp = PathFragment.create(expected);
202 PathFragment act = PathFragment.create(actual);
Laszlo Csomorca99bb72016-10-25 13:15:55 +0000203 assertThat(exp.getPathString()).isEqualTo(expected);
204 assertThat(act.getPathString()).isEqualTo(expected);
205 assertThat(act).isEqualTo(exp);
206 assertThat(act.hashCode()).isEqualTo(exp.hashCode());
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100207 }
208
209 @Test
210 public void testEmptyPathToEmptyPathWindows() {
211 assertRegular("C:/", "C:/");
212 }
213
Laszlo Csomorca99bb72016-10-25 13:15:55 +0000214 private void assertAllEqual(PathFragment... ps) {
215 assertThat(ps.length).isGreaterThan(1);
216 for (int i = 1; i < ps.length; i++) {
217 String msg = "comparing items 0 and " + i;
218 assertWithMessage(msg + " for getPathString")
219 .that(ps[i].getPathString())
220 .isEqualTo(ps[0].getPathString());
221 assertWithMessage(msg + " for equals").that(ps[0]).isEqualTo(ps[i]);
222 assertWithMessage(msg + " for hashCode").that(ps[0].hashCode()).isEqualTo(ps[i].hashCode());
223 }
224 }
225
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100226 @Test
227 public void testEmptyRelativePathToEmptyPathWindows() {
Laszlo Csomorca99bb72016-10-25 13:15:55 +0000228 // Surprising but correct behavior: a PathFragment made of just a drive identifier (and not the
229 // absolute path "C:/") is equal not only to the empty fragment, but (therefore) also to other
230 // drive identifiers.
231 // This makes sense if you consider that these are still empty paths, the drive letter adds no
232 // information to the path itself.
233 assertAllEqual(
234 PathFragment.EMPTY_FRAGMENT,
nharmatab4060b62017-04-04 17:11:39 +0000235 PathFragment.create("C:"),
236 PathFragment.create("D:"),
nharmataaac13242017-04-24 17:41:23 +0200237 PathFragment.createAlreadyInterned('\0', false, new String[0]),
238 PathFragment.createAlreadyInterned('C', false, new String[0]),
239 PathFragment.createAlreadyInterned('D', false, new String[0]));
nharmatab4060b62017-04-04 17:11:39 +0000240 assertAllEqual(PathFragment.create("/c"), PathFragment.create("/c/"));
241 assertThat(PathFragment.create("C:/")).isNotEqualTo(PathFragment.create("/c"));
242 assertThat(PathFragment.create("C:/foo")).isNotEqualTo(PathFragment.create("/c/foo"));
Laszlo Csomorca99bb72016-10-25 13:15:55 +0000243
nharmatab4060b62017-04-04 17:11:39 +0000244 assertThat(PathFragment.create("C:/")).isNotEqualTo(PathFragment.create("C:"));
245 assertThat(PathFragment.create("C:/").getPathString())
246 .isNotEqualTo(PathFragment.create("C:").getPathString());
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100247 }
248
249 @Test
nharmata8dec2ca2017-04-12 16:00:51 +0000250 public void testConfusingSemanticsOfDriveLettersInRelativePaths() {
251 // This test serves to document the current confusing semantics of non-empty relative windows
252 // paths that have drive letters. Also note the above testEmptyRelativePathToEmptyPathWindows
253 // which documents the confusing semantics of empty relative windows paths that have drive
254 // letters.
255 //
256 // TODO(laszlocsomor): Reevaluate the current semantics. Depending on the results of that,
257 // consider not storing the drive letter in relative windows paths.
258 PathFragment cColonFoo = PathFragment.create("C:foo");
259 PathFragment dColonFoo = PathFragment.create("D:foo");
260 PathFragment foo = PathFragment.create("foo");
261 assertThat(cColonFoo).isNotEqualTo(dColonFoo);
262 assertThat(cColonFoo).isNotEqualTo(foo);
263 assertThat(dColonFoo).isNotEqualTo(foo);
264 assertThat(cColonFoo.segmentCount()).isEqualTo(dColonFoo.segmentCount());
265 assertThat(cColonFoo.segmentCount()).isEqualTo(foo.segmentCount());
266 assertThat(cColonFoo.startsWith(dColonFoo)).isTrue();
267 assertThat(cColonFoo.startsWith(foo)).isTrue();
268 assertThat(foo.startsWith(cColonFoo)).isTrue();
269 assertThat(cColonFoo.getPathString()).isEqualTo("foo");
270 assertThat(cColonFoo.getPathString()).isEqualTo(dColonFoo.getPathString());
271 assertThat(cColonFoo.getPathString()).isEqualTo(foo.getPathString());
272 }
273
274 @Test
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100275 public void testWindowsVolumeUppercase() {
276 assertRegular("C:/", "c:/");
277 }
278
279 @Test
280 public void testRedundantSlashesWindows() {
281 assertRegular("C:/", "C:///");
282 assertRegular("C:/foo/bar", "C:/foo///bar");
283 assertRegular("C:/foo/bar", "C:////foo//bar");
284 }
285
286 @Test
287 public void testSimpleNameToSimpleNameWindows() {
288 assertRegular("C:/foo", "C:/foo");
289 }
290
291 @Test
292 public void testStripsTrailingSlashWindows() {
293 assertRegular("C:/foo/bar", "C:/foo/bar/");
294 }
295
296 @Test
297 public void testGetParentDirectoryWindows() {
nharmatab4060b62017-04-04 17:11:39 +0000298 PathFragment fooBarWizAbs = PathFragment.create("C:/foo/bar/wiz");
299 PathFragment fooBarAbs = PathFragment.create("C:/foo/bar");
300 PathFragment fooAbs = PathFragment.create("C:/foo");
301 PathFragment rootAbs = PathFragment.create("C:/");
lberkiaea56b32017-05-30 12:35:33 +0200302 assertThat(fooBarWizAbs.getParentDirectory()).isEqualTo(fooBarAbs);
303 assertThat(fooBarAbs.getParentDirectory()).isEqualTo(fooAbs);
304 assertThat(fooAbs.getParentDirectory()).isEqualTo(rootAbs);
305 assertThat(rootAbs.getParentDirectory()).isNull();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100306
307 // Note, this is suprising but correct behaviour:
lberkiaea56b32017-05-30 12:35:33 +0200308 assertThat(PathFragment.create("C:/foo/bar/..").getParentDirectory()).isEqualTo(fooBarAbs);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100309 }
310
311 @Test
312 public void testSegmentsCountWindows() {
lberkiaea56b32017-05-30 12:35:33 +0200313 assertThat(PathFragment.create("C:/foo").segmentCount()).isEqualTo(1);
314 assertThat(PathFragment.create("C:/").segmentCount()).isEqualTo(0);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100315 }
316
317 @Test
318 public void testGetSegmentWindows() {
lberkiaea56b32017-05-30 12:35:33 +0200319 assertThat(PathFragment.create("C:/foo/bar").getSegment(0)).isEqualTo("foo");
320 assertThat(PathFragment.create("C:/foo/bar").getSegment(1)).isEqualTo("bar");
321 assertThat(PathFragment.create("C:/foo/").getSegment(0)).isEqualTo("foo");
322 assertThat(PathFragment.create("C:/foo").getSegment(0)).isEqualTo("foo");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100323 }
324
325 @Test
326 public void testBasenameWindows() throws Exception {
lberkiaea56b32017-05-30 12:35:33 +0200327 assertThat(PathFragment.create("C:/foo/bar").getBaseName()).isEqualTo("bar");
328 assertThat(PathFragment.create("C:/foo").getBaseName()).isEqualTo("foo");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100329 // Never return the drive name as a basename.
nharmatab4060b62017-04-04 17:11:39 +0000330 assertThat(PathFragment.create("C:/").getBaseName()).isEmpty();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100331 }
332
333 private static void assertPath(String expected, PathFragment actual) {
lberkiaea56b32017-05-30 12:35:33 +0200334 assertThat(actual.getPathString()).isEqualTo(expected);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100335 }
336
337 @Test
338 public void testReplaceNameWindows() throws Exception {
nharmatab4060b62017-04-04 17:11:39 +0000339 assertPath("C:/foo/baz", PathFragment.create("C:/foo/bar").replaceName("baz"));
lberkiaea56b32017-05-30 12:35:33 +0200340 assertThat(PathFragment.create("C:/").replaceName("baz")).isNull();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100341 }
342
343 @Test
344 public void testStartsWithWindows() {
lberkiaea56b32017-05-30 12:35:33 +0200345 assertThat(PathFragment.create("C:/foo/bar").startsWith(PathFragment.create("C:/foo")))
346 .isTrue();
347 assertThat(PathFragment.create("C:/foo/bar").startsWith(PathFragment.create("C:/"))).isTrue();
348 assertThat(PathFragment.create("C:foo/bar").startsWith(PathFragment.create("C:"))).isTrue();
349 assertThat(PathFragment.create("C:/").startsWith(PathFragment.create("C:/"))).isTrue();
350 assertThat(PathFragment.create("C:").startsWith(PathFragment.create("C:"))).isTrue();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100351
352 // The first path is absolute, the second is not.
lberkiaea56b32017-05-30 12:35:33 +0200353 assertThat(PathFragment.create("C:/foo/bar").startsWith(PathFragment.create("C:"))).isFalse();
354 assertThat(PathFragment.create("C:/").startsWith(PathFragment.create("C:"))).isFalse();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100355 }
356
357 @Test
358 public void testEndsWithWindows() {
lberkiaea56b32017-05-30 12:35:33 +0200359 assertThat(PathFragment.create("C:/foo/bar").endsWith(PathFragment.create("bar"))).isTrue();
360 assertThat(PathFragment.create("C:/foo/bar").endsWith(PathFragment.create("foo/bar"))).isTrue();
361 assertThat(PathFragment.create("C:/foo/bar").endsWith(PathFragment.create("C:/foo/bar")))
362 .isTrue();
363 assertThat(PathFragment.create("C:/").endsWith(PathFragment.create("C:/"))).isTrue();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100364 }
365
366 @Test
367 public void testGetSafePathStringWindows() {
lberkiaea56b32017-05-30 12:35:33 +0200368 assertThat(PathFragment.create("C:/").getSafePathString()).isEqualTo("C:/");
369 assertThat(PathFragment.create("C:/abc").getSafePathString()).isEqualTo("C:/abc");
370 assertThat(PathFragment.create("C:/abc/def").getSafePathString()).isEqualTo("C:/abc/def");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100371 }
372
373 @Test
374 public void testNormalizeWindows() {
lberkiaea56b32017-05-30 12:35:33 +0200375 assertThat(PathFragment.create("C:/a/b").normalize()).isEqualTo(PathFragment.create("C:/a/b"));
376 assertThat(PathFragment.create("C:/a/./b").normalize())
377 .isEqualTo(PathFragment.create("C:/a/b"));
378 assertThat(PathFragment.create("C:/a/../b").normalize()).isEqualTo(PathFragment.create("C:/b"));
379 assertThat(PathFragment.create("C:/../b").normalize())
380 .isEqualTo(PathFragment.create("C:/../b"));
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100381 }
382}