Damien Martin-Guillerez | f88f4d8 | 2015-09-25 13:56:55 +0000 | [diff] [blame] | 1 | // Copyright 2014 The Bazel Authors. All rights reserved. |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 2 | // |
| 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. |
| 14 | package com.google.devtools.build.lib.vfs; |
| 15 | |
Ulf Adams | 795895a | 2015-03-06 15:58:35 +0000 | [diff] [blame] | 16 | import static com.google.common.truth.Truth.assertThat; |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 17 | import static com.google.common.truth.Truth.assertWithMessage; |
lberki | 4a45ea8 | 2017-06-01 10:05:42 +0200 | [diff] [blame] | 18 | import static org.junit.Assert.fail; |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 19 | |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 20 | import java.io.File; |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 21 | import org.junit.Test; |
| 22 | import org.junit.runner.RunWith; |
| 23 | import org.junit.runners.JUnit4; |
| 24 | |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 25 | /** |
| 26 | * This class tests the functionality of the PathFragment. |
| 27 | */ |
| 28 | @RunWith(JUnit4.class) |
| 29 | public class PathFragmentWindowsTest { |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 30 | |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 31 | @Test |
| 32 | public void testWindowsSeparator() { |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 33 | assertThat(PathFragment.create("bar\\baz").toString()).isEqualTo("bar/baz"); |
| 34 | assertThat(PathFragment.create("c:\\bar\\baz").toString()).isEqualTo("C:/bar/baz"); |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 35 | } |
| 36 | |
| 37 | @Test |
| 38 | public void testIsAbsoluteWindows() { |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 39 | 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 Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 43 | |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 44 | assertThat(PathFragment.create("*:/").isAbsolute()).isFalse(); |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 45 | |
| 46 | // C: is not an absolute path, it points to the current active directory on drive C:. |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 47 | assertThat(PathFragment.create("C:").isAbsolute()).isFalse(); |
| 48 | assertThat(PathFragment.create("C:foo").isAbsolute()).isFalse(); |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 49 | } |
| 50 | |
| 51 | @Test |
Laszlo Csomor | ff8fcf0 | 2016-10-26 16:20:27 +0000 | [diff] [blame] | 52 | public void testAbsoluteAndAbsoluteLookingPaths() { |
nharmata | b4060b6 | 2017-04-04 17:11:39 +0000 | [diff] [blame] | 53 | PathFragment p1 = PathFragment.create("/c"); |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 54 | assertThat(p1.isAbsolute()).isTrue(); |
Laszlo Csomor | ff8fcf0 | 2016-10-26 16:20:27 +0000 | [diff] [blame] | 55 | assertThat(p1.getDriveLetter()).isEqualTo('\0'); |
| 56 | assertThat(p1.getSegments()).containsExactly("c"); |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 57 | |
nharmata | b4060b6 | 2017-04-04 17:11:39 +0000 | [diff] [blame] | 58 | PathFragment p2 = PathFragment.create("/c/"); |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 59 | assertThat(p2.isAbsolute()).isTrue(); |
Laszlo Csomor | ff8fcf0 | 2016-10-26 16:20:27 +0000 | [diff] [blame] | 60 | assertThat(p2.getDriveLetter()).isEqualTo('\0'); |
| 61 | assertThat(p2.getSegments()).containsExactly("c"); |
| 62 | |
nharmata | b4060b6 | 2017-04-04 17:11:39 +0000 | [diff] [blame] | 63 | PathFragment p3 = PathFragment.create("C:/"); |
Laszlo Csomor | ff8fcf0 | 2016-10-26 16:20:27 +0000 | [diff] [blame] | 64 | assertThat(p3.isAbsolute()).isTrue(); |
| 65 | assertThat(p3.getDriveLetter()).isEqualTo('C'); |
| 66 | assertThat(p3.getSegments()).isEmpty(); |
| 67 | |
nharmata | b4060b6 | 2017-04-04 17:11:39 +0000 | [diff] [blame] | 68 | PathFragment p4 = PathFragment.create("C:"); |
Laszlo Csomor | ff8fcf0 | 2016-10-26 16:20:27 +0000 | [diff] [blame] | 69 | assertThat(p4.isAbsolute()).isFalse(); |
| 70 | assertThat(p4.getDriveLetter()).isEqualTo('C'); |
| 71 | assertThat(p4.getSegments()).isEmpty(); |
| 72 | |
nharmata | b4060b6 | 2017-04-04 17:11:39 +0000 | [diff] [blame] | 73 | PathFragment p5 = PathFragment.create("/c:"); |
Laszlo Csomor | ff8fcf0 | 2016-10-26 16:20:27 +0000 | [diff] [blame] | 74 | assertThat(p5.isAbsolute()).isTrue(); |
| 75 | assertThat(p5.getDriveLetter()).isEqualTo('\0'); |
| 76 | assertThat(p5.getSegments()).containsExactly("c:"); |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 77 | |
| 78 | assertThat(p1).isEqualTo(p2); |
Laszlo Csomor | ff8fcf0 | 2016-10-26 16:20:27 +0000 | [diff] [blame] | 79 | 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 Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 85 | } |
| 86 | |
| 87 | @Test |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 88 | public void testIsAbsoluteWindowsBackslash() { |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 89 | 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 Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 93 | } |
| 94 | |
| 95 | @Test |
| 96 | public void testIsNormalizedWindows() { |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 97 | 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 Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 101 | } |
| 102 | |
| 103 | @Test |
| 104 | public void testRootNodeReturnsRootStringWindows() { |
nharmata | b4060b6 | 2017-04-04 17:11:39 +0000 | [diff] [blame] | 105 | PathFragment rootFragment = PathFragment.create("C:/"); |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 106 | assertThat(rootFragment.getPathString()).isEqualTo("C:/"); |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 107 | } |
| 108 | |
| 109 | @Test |
| 110 | public void testGetRelativeWindows() { |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 111 | 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 Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 120 | } |
| 121 | |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 122 | private void assertGetRelative(String path, String relative, PathFragment expected) |
| 123 | throws Exception { |
nharmata | b4060b6 | 2017-04-04 17:11:39 +0000 | [diff] [blame] | 124 | PathFragment actual = PathFragment.create(path).getRelative(relative); |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 125 | 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 { |
nharmata | aac1324 | 2017-04-24 17:41:23 +0200 | [diff] [blame] | 133 | PathFragment expected = PathFragment.createAlreadyInterned('\0', false, expectedPathSegments); |
nharmata | b4060b6 | 2017-04-04 17:11:39 +0000 | [diff] [blame] | 134 | PathFragment actual = PathFragment.create(path).relativeTo(relativeTo); |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 135 | 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 { |
nharmata | b4060b6 | 2017-04-04 17:11:39 +0000 | [diff] [blame] | 143 | PathFragment.create(path).relativeTo(relativeTo); |
lberki | 4a45ea8 | 2017-06-01 10:05:42 +0200 | [diff] [blame] | 144 | fail("expected failure"); |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 145 | } catch (Exception e) { |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 146 | assertThat(e).hasMessageThat().contains("is not beneath"); |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 147 | } |
| 148 | } |
| 149 | |
| 150 | private static PathFragment makePath(char drive, boolean absolute, String... segments) { |
nharmata | aac1324 | 2017-04-24 17:41:23 +0200 | [diff] [blame] | 151 | return PathFragment.createAlreadyInterned(drive, absolute, segments); |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 152 | } |
| 153 | |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 154 | @Test |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 155 | public void testGetRelativeMixed() throws Exception { |
| 156 | assertGetRelative("a", "b", makePath('\0', false, "a", "b")); |
Laszlo Csomor | ff8fcf0 | 2016-10-26 16:20:27 +0000 | [diff] [blame] | 157 | assertGetRelative("a", "/b", makePath('\0', true, "b")); |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 158 | assertGetRelative("a", "E:b", makePath('\0', false, "a", "b")); |
| 159 | assertGetRelative("a", "E:/b", makePath('E', true, "b")); |
| 160 | |
Laszlo Csomor | ff8fcf0 | 2016-10-26 16:20:27 +0000 | [diff] [blame] | 161 | 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 Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 164 | assertGetRelative("/a", "E:/b", makePath('E', true, "b")); |
| 165 | |
| 166 | assertGetRelative("D:a", "b", makePath('D', false, "a", "b")); |
Laszlo Csomor | ff8fcf0 | 2016-10-26 16:20:27 +0000 | [diff] [blame] | 167 | assertGetRelative("D:a", "/b", makePath('D', true, "b")); |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 168 | 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 Csomor | ff8fcf0 | 2016-10-26 16:20:27 +0000 | [diff] [blame] | 172 | assertGetRelative("D:/a", "/b", makePath('D', true, "b")); |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 173 | 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 Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 191 | } |
| 192 | |
| 193 | @Test |
| 194 | public void testGetChildWorks() { |
nharmata | b4060b6 | 2017-04-04 17:11:39 +0000 | [diff] [blame] | 195 | PathFragment pf = PathFragment.create("../some/path"); |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 196 | assertThat(pf.getChild("hi")).isEqualTo(PathFragment.create("../some/path/hi")); |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 197 | } |
| 198 | |
| 199 | // Tests after here test the canonicalization |
| 200 | private void assertRegular(String expected, String actual) { |
nharmata | b4060b6 | 2017-04-04 17:11:39 +0000 | [diff] [blame] | 201 | PathFragment exp = PathFragment.create(expected); |
| 202 | PathFragment act = PathFragment.create(actual); |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 203 | 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 Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 207 | } |
| 208 | |
| 209 | @Test |
| 210 | public void testEmptyPathToEmptyPathWindows() { |
| 211 | assertRegular("C:/", "C:/"); |
| 212 | } |
| 213 | |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 214 | 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 Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 226 | @Test |
| 227 | public void testEmptyRelativePathToEmptyPathWindows() { |
Laszlo Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 228 | // 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, |
nharmata | b4060b6 | 2017-04-04 17:11:39 +0000 | [diff] [blame] | 235 | PathFragment.create("C:"), |
| 236 | PathFragment.create("D:"), |
nharmata | aac1324 | 2017-04-24 17:41:23 +0200 | [diff] [blame] | 237 | PathFragment.createAlreadyInterned('\0', false, new String[0]), |
| 238 | PathFragment.createAlreadyInterned('C', false, new String[0]), |
| 239 | PathFragment.createAlreadyInterned('D', false, new String[0])); |
nharmata | b4060b6 | 2017-04-04 17:11:39 +0000 | [diff] [blame] | 240 | 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 Csomor | ca99bb7 | 2016-10-25 13:15:55 +0000 | [diff] [blame] | 243 | |
nharmata | b4060b6 | 2017-04-04 17:11:39 +0000 | [diff] [blame] | 244 | assertThat(PathFragment.create("C:/")).isNotEqualTo(PathFragment.create("C:")); |
| 245 | assertThat(PathFragment.create("C:/").getPathString()) |
| 246 | .isNotEqualTo(PathFragment.create("C:").getPathString()); |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 247 | } |
| 248 | |
| 249 | @Test |
nharmata | 8dec2ca | 2017-04-12 16:00:51 +0000 | [diff] [blame] | 250 | 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 Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 275 | 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() { |
nharmata | b4060b6 | 2017-04-04 17:11:39 +0000 | [diff] [blame] | 298 | 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:/"); |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 302 | assertThat(fooBarWizAbs.getParentDirectory()).isEqualTo(fooBarAbs); |
| 303 | assertThat(fooBarAbs.getParentDirectory()).isEqualTo(fooAbs); |
| 304 | assertThat(fooAbs.getParentDirectory()).isEqualTo(rootAbs); |
| 305 | assertThat(rootAbs.getParentDirectory()).isNull(); |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 306 | |
| 307 | // Note, this is suprising but correct behaviour: |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 308 | assertThat(PathFragment.create("C:/foo/bar/..").getParentDirectory()).isEqualTo(fooBarAbs); |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 309 | } |
| 310 | |
| 311 | @Test |
| 312 | public void testSegmentsCountWindows() { |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 313 | assertThat(PathFragment.create("C:/foo").segmentCount()).isEqualTo(1); |
| 314 | assertThat(PathFragment.create("C:/").segmentCount()).isEqualTo(0); |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 315 | } |
| 316 | |
| 317 | @Test |
| 318 | public void testGetSegmentWindows() { |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 319 | 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 Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 323 | } |
| 324 | |
| 325 | @Test |
| 326 | public void testBasenameWindows() throws Exception { |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 327 | assertThat(PathFragment.create("C:/foo/bar").getBaseName()).isEqualTo("bar"); |
| 328 | assertThat(PathFragment.create("C:/foo").getBaseName()).isEqualTo("foo"); |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 329 | // Never return the drive name as a basename. |
nharmata | b4060b6 | 2017-04-04 17:11:39 +0000 | [diff] [blame] | 330 | assertThat(PathFragment.create("C:/").getBaseName()).isEmpty(); |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 331 | } |
| 332 | |
| 333 | private static void assertPath(String expected, PathFragment actual) { |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 334 | assertThat(actual.getPathString()).isEqualTo(expected); |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 335 | } |
| 336 | |
| 337 | @Test |
| 338 | public void testReplaceNameWindows() throws Exception { |
nharmata | b4060b6 | 2017-04-04 17:11:39 +0000 | [diff] [blame] | 339 | assertPath("C:/foo/baz", PathFragment.create("C:/foo/bar").replaceName("baz")); |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 340 | assertThat(PathFragment.create("C:/").replaceName("baz")).isNull(); |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 341 | } |
| 342 | |
| 343 | @Test |
| 344 | public void testStartsWithWindows() { |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 345 | 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 Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 351 | |
| 352 | // The first path is absolute, the second is not. |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 353 | assertThat(PathFragment.create("C:/foo/bar").startsWith(PathFragment.create("C:"))).isFalse(); |
| 354 | assertThat(PathFragment.create("C:/").startsWith(PathFragment.create("C:"))).isFalse(); |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 355 | } |
| 356 | |
| 357 | @Test |
| 358 | public void testEndsWithWindows() { |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 359 | 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 Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 364 | } |
| 365 | |
| 366 | @Test |
| 367 | public void testGetSafePathStringWindows() { |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 368 | 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 Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 371 | } |
| 372 | |
| 373 | @Test |
| 374 | public void testNormalizeWindows() { |
lberki | aea56b3 | 2017-05-30 12:35:33 +0200 | [diff] [blame] | 375 | 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 Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 381 | } |
| 382 | } |