OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "base/file_path.h" |
| 6 |
| 7 #include "base/basictypes.h" |
| 8 #include "gtest/gtest.h" |
| 9 |
| 10 // This macro helps avoid wrapped lines in the test structs. |
| 11 #define FPL(x) FILE_PATH_LITERAL(x) |
| 12 |
| 13 struct UnaryTestData { |
| 14 const FilePath::CharType* input; |
| 15 const FilePath::CharType* expected; |
| 16 }; |
| 17 |
| 18 struct UnaryBooleanTestData { |
| 19 const FilePath::CharType* input; |
| 20 bool expected; |
| 21 }; |
| 22 |
| 23 struct BinaryTestData { |
| 24 const FilePath::CharType* inputs[2]; |
| 25 const FilePath::CharType* expected; |
| 26 }; |
| 27 |
| 28 TEST(FilePathTest, DirName) { |
| 29 const struct UnaryTestData cases[] = { |
| 30 { FPL(""), FPL(".") }, |
| 31 { FPL("aa"), FPL(".") }, |
| 32 { FPL("/aa/bb"), FPL("/aa") }, |
| 33 { FPL("/aa/bb/"), FPL("/aa") }, |
| 34 { FPL("/aa/bb//"), FPL("/aa") }, |
| 35 { FPL("/aa/bb/ccc"), FPL("/aa/bb") }, |
| 36 { FPL("/aa"), FPL("/") }, |
| 37 { FPL("/aa/"), FPL("/") }, |
| 38 { FPL("/"), FPL("/") }, |
| 39 { FPL("//"), FPL("//") }, |
| 40 { FPL("///"), FPL("/") }, |
| 41 { FPL("aa/"), FPL(".") }, |
| 42 { FPL("aa/bb"), FPL("aa") }, |
| 43 { FPL("aa/bb/"), FPL("aa") }, |
| 44 { FPL("aa/bb//"), FPL("aa") }, |
| 45 { FPL("aa//bb//"), FPL("aa") }, |
| 46 { FPL("aa//bb/"), FPL("aa") }, |
| 47 { FPL("aa//bb"), FPL("aa") }, |
| 48 { FPL("//aa/bb"), FPL("//aa") }, |
| 49 { FPL("//aa/"), FPL("//") }, |
| 50 { FPL("//aa"), FPL("//") }, |
| 51 { FPL("0:"), FPL(".") }, |
| 52 { FPL("@:"), FPL(".") }, |
| 53 { FPL("[:"), FPL(".") }, |
| 54 { FPL("`:"), FPL(".") }, |
| 55 { FPL("{:"), FPL(".") }, |
| 56 { FPL("\xB3:"), FPL(".") }, |
| 57 { FPL("\xC5:"), FPL(".") }, |
| 58 #if defined(OS_WIN) |
| 59 { FPL("\x0143:"), FPL(".") }, |
| 60 #endif // OS_WIN |
| 61 #if defined(FILE_PATH_USES_DRIVE_LETTERS) |
| 62 { FPL("c:"), FPL("c:") }, |
| 63 { FPL("C:"), FPL("C:") }, |
| 64 { FPL("A:"), FPL("A:") }, |
| 65 { FPL("Z:"), FPL("Z:") }, |
| 66 { FPL("a:"), FPL("a:") }, |
| 67 { FPL("z:"), FPL("z:") }, |
| 68 { FPL("c:aa"), FPL("c:") }, |
| 69 { FPL("c:/"), FPL("c:/") }, |
| 70 { FPL("c://"), FPL("c://") }, |
| 71 { FPL("c:///"), FPL("c:/") }, |
| 72 { FPL("c:/aa"), FPL("c:/") }, |
| 73 { FPL("c:/aa/"), FPL("c:/") }, |
| 74 { FPL("c:/aa/bb"), FPL("c:/aa") }, |
| 75 { FPL("c:aa/bb"), FPL("c:aa") }, |
| 76 #endif // FILE_PATH_USES_DRIVE_LETTERS |
| 77 #if defined(FILE_PATH_USES_WIN_SEPARATORS) |
| 78 { FPL("\\aa\\bb"), FPL("\\aa") }, |
| 79 { FPL("\\aa\\bb\\"), FPL("\\aa") }, |
| 80 { FPL("\\aa\\bb\\\\"), FPL("\\aa") }, |
| 81 { FPL("\\aa\\bb\\ccc"), FPL("\\aa\\bb") }, |
| 82 { FPL("\\aa"), FPL("\\") }, |
| 83 { FPL("\\aa\\"), FPL("\\") }, |
| 84 { FPL("\\"), FPL("\\") }, |
| 85 { FPL("\\\\"), FPL("\\\\") }, |
| 86 { FPL("\\\\\\"), FPL("\\") }, |
| 87 { FPL("aa\\"), FPL(".") }, |
| 88 { FPL("aa\\bb"), FPL("aa") }, |
| 89 { FPL("aa\\bb\\"), FPL("aa") }, |
| 90 { FPL("aa\\bb\\\\"), FPL("aa") }, |
| 91 { FPL("aa\\\\bb\\\\"), FPL("aa") }, |
| 92 { FPL("aa\\\\bb\\"), FPL("aa") }, |
| 93 { FPL("aa\\\\bb"), FPL("aa") }, |
| 94 { FPL("\\\\aa\\bb"), FPL("\\\\aa") }, |
| 95 { FPL("\\\\aa\\"), FPL("\\\\") }, |
| 96 { FPL("\\\\aa"), FPL("\\\\") }, |
| 97 #if defined(FILE_PATH_USES_DRIVE_LETTERS) |
| 98 { FPL("c:\\"), FPL("c:\\") }, |
| 99 { FPL("c:\\\\"), FPL("c:\\\\") }, |
| 100 { FPL("c:\\\\\\"), FPL("c:\\") }, |
| 101 { FPL("c:\\aa"), FPL("c:\\") }, |
| 102 { FPL("c:\\aa\\"), FPL("c:\\") }, |
| 103 { FPL("c:\\aa\\bb"), FPL("c:\\aa") }, |
| 104 { FPL("c:aa\\bb"), FPL("c:aa") }, |
| 105 #endif // FILE_PATH_USES_DRIVE_LETTERS |
| 106 #endif // FILE_PATH_USES_WIN_SEPARATORS |
| 107 }; |
| 108 |
| 109 for (size_t i = 0; i < arraysize(cases); ++i) { |
| 110 FilePath input(cases[i].input); |
| 111 FilePath observed = input.DirName(); |
| 112 EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) << |
| 113 "i: " << i << ", input: " << input.value(); |
| 114 } |
| 115 } |
| 116 |
| 117 TEST(FilePathTest, BaseName) { |
| 118 const struct UnaryTestData cases[] = { |
| 119 { FPL(""), FPL("") }, |
| 120 { FPL("aa"), FPL("aa") }, |
| 121 { FPL("/aa/bb"), FPL("bb") }, |
| 122 { FPL("/aa/bb/"), FPL("bb") }, |
| 123 { FPL("/aa/bb//"), FPL("bb") }, |
| 124 { FPL("/aa/bb/ccc"), FPL("ccc") }, |
| 125 { FPL("/aa"), FPL("aa") }, |
| 126 { FPL("/"), FPL("/") }, |
| 127 { FPL("//"), FPL("//") }, |
| 128 { FPL("///"), FPL("/") }, |
| 129 { FPL("aa/"), FPL("aa") }, |
| 130 { FPL("aa/bb"), FPL("bb") }, |
| 131 { FPL("aa/bb/"), FPL("bb") }, |
| 132 { FPL("aa/bb//"), FPL("bb") }, |
| 133 { FPL("aa//bb//"), FPL("bb") }, |
| 134 { FPL("aa//bb/"), FPL("bb") }, |
| 135 { FPL("aa//bb"), FPL("bb") }, |
| 136 { FPL("//aa/bb"), FPL("bb") }, |
| 137 { FPL("//aa/"), FPL("aa") }, |
| 138 { FPL("//aa"), FPL("aa") }, |
| 139 { FPL("0:"), FPL("0:") }, |
| 140 { FPL("@:"), FPL("@:") }, |
| 141 { FPL("[:"), FPL("[:") }, |
| 142 { FPL("`:"), FPL("`:") }, |
| 143 { FPL("{:"), FPL("{:") }, |
| 144 { FPL("\xB3:"), FPL("\xB3:") }, |
| 145 { FPL("\xC5:"), FPL("\xC5:") }, |
| 146 #if defined(OS_WIN) |
| 147 { FPL("\x0143:"), FPL("\x0143:") }, |
| 148 #endif // OS_WIN |
| 149 #if defined(FILE_PATH_USES_DRIVE_LETTERS) |
| 150 { FPL("c:"), FPL("") }, |
| 151 { FPL("C:"), FPL("") }, |
| 152 { FPL("A:"), FPL("") }, |
| 153 { FPL("Z:"), FPL("") }, |
| 154 { FPL("a:"), FPL("") }, |
| 155 { FPL("z:"), FPL("") }, |
| 156 { FPL("c:aa"), FPL("aa") }, |
| 157 { FPL("c:/"), FPL("/") }, |
| 158 { FPL("c://"), FPL("//") }, |
| 159 { FPL("c:///"), FPL("/") }, |
| 160 { FPL("c:/aa"), FPL("aa") }, |
| 161 { FPL("c:/aa/"), FPL("aa") }, |
| 162 { FPL("c:/aa/bb"), FPL("bb") }, |
| 163 { FPL("c:aa/bb"), FPL("bb") }, |
| 164 #endif // FILE_PATH_USES_DRIVE_LETTERS |
| 165 #if defined(FILE_PATH_USES_WIN_SEPARATORS) |
| 166 { FPL("\\aa\\bb"), FPL("bb") }, |
| 167 { FPL("\\aa\\bb\\"), FPL("bb") }, |
| 168 { FPL("\\aa\\bb\\\\"), FPL("bb") }, |
| 169 { FPL("\\aa\\bb\\ccc"), FPL("ccc") }, |
| 170 { FPL("\\aa"), FPL("aa") }, |
| 171 { FPL("\\"), FPL("\\") }, |
| 172 { FPL("\\\\"), FPL("\\\\") }, |
| 173 { FPL("\\\\\\"), FPL("\\") }, |
| 174 { FPL("aa\\"), FPL("aa") }, |
| 175 { FPL("aa\\bb"), FPL("bb") }, |
| 176 { FPL("aa\\bb\\"), FPL("bb") }, |
| 177 { FPL("aa\\bb\\\\"), FPL("bb") }, |
| 178 { FPL("aa\\\\bb\\\\"), FPL("bb") }, |
| 179 { FPL("aa\\\\bb\\"), FPL("bb") }, |
| 180 { FPL("aa\\\\bb"), FPL("bb") }, |
| 181 { FPL("\\\\aa\\bb"), FPL("bb") }, |
| 182 { FPL("\\\\aa\\"), FPL("aa") }, |
| 183 { FPL("\\\\aa"), FPL("aa") }, |
| 184 #if defined(FILE_PATH_USES_DRIVE_LETTERS) |
| 185 { FPL("c:\\"), FPL("\\") }, |
| 186 { FPL("c:\\\\"), FPL("\\\\") }, |
| 187 { FPL("c:\\\\\\"), FPL("\\") }, |
| 188 { FPL("c:\\aa"), FPL("aa") }, |
| 189 { FPL("c:\\aa\\"), FPL("aa") }, |
| 190 { FPL("c:\\aa\\bb"), FPL("bb") }, |
| 191 { FPL("c:aa\\bb"), FPL("bb") }, |
| 192 #endif // FILE_PATH_USES_DRIVE_LETTERS |
| 193 #endif // FILE_PATH_USES_WIN_SEPARATORS |
| 194 }; |
| 195 |
| 196 for (size_t i = 0; i < arraysize(cases); ++i) { |
| 197 FilePath input(cases[i].input); |
| 198 FilePath observed = input.BaseName(); |
| 199 EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) << |
| 200 "i: " << i << ", input: " << input.value(); |
| 201 } |
| 202 } |
| 203 |
| 204 TEST(FilePathTest, Append) { |
| 205 const struct BinaryTestData cases[] = { |
| 206 { { FPL(""), FPL("cc") }, FPL("cc") }, |
| 207 { { FPL("."), FPL("ff") }, FPL("ff") }, |
| 208 { { FPL("/"), FPL("cc") }, FPL("/cc") }, |
| 209 { { FPL("/aa"), FPL("") }, FPL("/aa") }, |
| 210 { { FPL("/aa/"), FPL("") }, FPL("/aa") }, |
| 211 { { FPL("//aa"), FPL("") }, FPL("//aa") }, |
| 212 { { FPL("//aa/"), FPL("") }, FPL("//aa") }, |
| 213 { { FPL("//"), FPL("aa") }, FPL("//aa") }, |
| 214 #if defined(FILE_PATH_USES_DRIVE_LETTERS) |
| 215 { { FPL("c:"), FPL("a") }, FPL("c:a") }, |
| 216 { { FPL("c:"), FPL("") }, FPL("c:") }, |
| 217 { { FPL("c:/"), FPL("a") }, FPL("c:/a") }, |
| 218 { { FPL("c://"), FPL("a") }, FPL("c://a") }, |
| 219 { { FPL("c:///"), FPL("a") }, FPL("c:/a") }, |
| 220 #endif // FILE_PATH_USES_DRIVE_LETTERS |
| 221 #if defined(FILE_PATH_USES_WIN_SEPARATORS) |
| 222 // Append introduces the default separator character, so these test cases |
| 223 // need to be defined with different expected results on platforms that use |
| 224 // different default separator characters. |
| 225 { { FPL("\\"), FPL("cc") }, FPL("\\cc") }, |
| 226 { { FPL("\\aa"), FPL("") }, FPL("\\aa") }, |
| 227 { { FPL("\\aa\\"), FPL("") }, FPL("\\aa") }, |
| 228 { { FPL("\\\\aa"), FPL("") }, FPL("\\\\aa") }, |
| 229 { { FPL("\\\\aa\\"), FPL("") }, FPL("\\\\aa") }, |
| 230 { { FPL("\\\\"), FPL("aa") }, FPL("\\\\aa") }, |
| 231 { { FPL("/aa/bb"), FPL("cc") }, FPL("/aa/bb\\cc") }, |
| 232 { { FPL("/aa/bb/"), FPL("cc") }, FPL("/aa/bb\\cc") }, |
| 233 { { FPL("aa/bb/"), FPL("cc") }, FPL("aa/bb\\cc") }, |
| 234 { { FPL("aa/bb"), FPL("cc") }, FPL("aa/bb\\cc") }, |
| 235 { { FPL("a/b"), FPL("c") }, FPL("a/b\\c") }, |
| 236 { { FPL("a/b/"), FPL("c") }, FPL("a/b\\c") }, |
| 237 { { FPL("//aa"), FPL("bb") }, FPL("//aa\\bb") }, |
| 238 { { FPL("//aa/"), FPL("bb") }, FPL("//aa\\bb") }, |
| 239 { { FPL("\\aa\\bb"), FPL("cc") }, FPL("\\aa\\bb\\cc") }, |
| 240 { { FPL("\\aa\\bb\\"), FPL("cc") }, FPL("\\aa\\bb\\cc") }, |
| 241 { { FPL("aa\\bb\\"), FPL("cc") }, FPL("aa\\bb\\cc") }, |
| 242 { { FPL("aa\\bb"), FPL("cc") }, FPL("aa\\bb\\cc") }, |
| 243 { { FPL("a\\b"), FPL("c") }, FPL("a\\b\\c") }, |
| 244 { { FPL("a\\b\\"), FPL("c") }, FPL("a\\b\\c") }, |
| 245 { { FPL("\\\\aa"), FPL("bb") }, FPL("\\\\aa\\bb") }, |
| 246 { { FPL("\\\\aa\\"), FPL("bb") }, FPL("\\\\aa\\bb") }, |
| 247 #if defined(FILE_PATH_USES_DRIVE_LETTERS) |
| 248 { { FPL("c:\\"), FPL("a") }, FPL("c:\\a") }, |
| 249 { { FPL("c:\\\\"), FPL("a") }, FPL("c:\\\\a") }, |
| 250 { { FPL("c:\\\\\\"), FPL("a") }, FPL("c:\\a") }, |
| 251 { { FPL("c:\\"), FPL("") }, FPL("c:\\") }, |
| 252 { { FPL("c:\\a"), FPL("b") }, FPL("c:\\a\\b") }, |
| 253 { { FPL("c:\\a\\"), FPL("b") }, FPL("c:\\a\\b") }, |
| 254 #endif // FILE_PATH_USES_DRIVE_LETTERS |
| 255 #else // FILE_PATH_USES_WIN_SEPARATORS |
| 256 { { FPL("/aa/bb"), FPL("cc") }, FPL("/aa/bb/cc") }, |
| 257 { { FPL("/aa/bb/"), FPL("cc") }, FPL("/aa/bb/cc") }, |
| 258 { { FPL("aa/bb/"), FPL("cc") }, FPL("aa/bb/cc") }, |
| 259 { { FPL("aa/bb"), FPL("cc") }, FPL("aa/bb/cc") }, |
| 260 { { FPL("a/b"), FPL("c") }, FPL("a/b/c") }, |
| 261 { { FPL("a/b/"), FPL("c") }, FPL("a/b/c") }, |
| 262 { { FPL("//aa"), FPL("bb") }, FPL("//aa/bb") }, |
| 263 { { FPL("//aa/"), FPL("bb") }, FPL("//aa/bb") }, |
| 264 #if defined(FILE_PATH_USES_DRIVE_LETTERS) |
| 265 { { FPL("c:/"), FPL("a") }, FPL("c:/a") }, |
| 266 { { FPL("c:/"), FPL("") }, FPL("c:/") }, |
| 267 { { FPL("c:/a"), FPL("b") }, FPL("c:/a/b") }, |
| 268 { { FPL("c:/a/"), FPL("b") }, FPL("c:/a/b") }, |
| 269 #endif // FILE_PATH_USES_DRIVE_LETTERS |
| 270 #endif // FILE_PATH_USES_WIN_SEPARATORS |
| 271 }; |
| 272 |
| 273 for (size_t i = 0; i < arraysize(cases); ++i) { |
| 274 FilePath root(cases[i].inputs[0]); |
| 275 FilePath::StringType leaf(cases[i].inputs[1]); |
| 276 FilePath observed = root.Append(leaf); |
| 277 EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) << |
| 278 "i: " << i << ", root: " << root.value() << ", leaf: " << leaf; |
| 279 } |
| 280 } |
| 281 |
| 282 TEST(FilePathTest, IsAbsolute) { |
| 283 const struct UnaryBooleanTestData cases[] = { |
| 284 { FPL(""), false }, |
| 285 { FPL("a"), false }, |
| 286 { FPL("c:"), false }, |
| 287 { FPL("c:a"), false }, |
| 288 { FPL("a/b"), false }, |
| 289 { FPL("//"), true }, |
| 290 { FPL("//a"), true }, |
| 291 { FPL("c:a/b"), false }, |
| 292 { FPL("?:/a"), false }, |
| 293 #if defined(FILE_PATH_USES_DRIVE_LETTERS) |
| 294 { FPL("/"), false }, |
| 295 { FPL("/a"), false }, |
| 296 { FPL("/."), false }, |
| 297 { FPL("/.."), false }, |
| 298 { FPL("c:/"), true }, |
| 299 { FPL("c:/a"), true }, |
| 300 { FPL("c:/."), true }, |
| 301 { FPL("c:/.."), true }, |
| 302 { FPL("C:/a"), true }, |
| 303 { FPL("d:/a"), true }, |
| 304 #else // FILE_PATH_USES_DRIVE_LETTERS |
| 305 { FPL("/"), true }, |
| 306 { FPL("/a"), true }, |
| 307 { FPL("/."), true }, |
| 308 { FPL("/.."), true }, |
| 309 { FPL("c:/"), false }, |
| 310 #endif // FILE_PATH_USES_DRIVE_LETTERS |
| 311 #if defined(FILE_PATH_USES_WIN_SEPARATORS) |
| 312 { FPL("a\\b"), false }, |
| 313 { FPL("\\\\"), true }, |
| 314 { FPL("\\\\a"), true }, |
| 315 { FPL("a\\b"), false }, |
| 316 { FPL("\\\\"), true }, |
| 317 { FPL("//a"), true }, |
| 318 { FPL("c:a\\b"), false }, |
| 319 { FPL("?:\\a"), false }, |
| 320 #if defined(FILE_PATH_USES_DRIVE_LETTERS) |
| 321 { FPL("\\"), false }, |
| 322 { FPL("\\a"), false }, |
| 323 { FPL("\\."), false }, |
| 324 { FPL("\\.."), false }, |
| 325 { FPL("c:\\"), true }, |
| 326 { FPL("c:\\"), true }, |
| 327 { FPL("c:\\a"), true }, |
| 328 { FPL("c:\\."), true }, |
| 329 { FPL("c:\\.."), true }, |
| 330 { FPL("C:\\a"), true }, |
| 331 { FPL("d:\\a"), true }, |
| 332 #else // FILE_PATH_USES_DRIVE_LETTERS |
| 333 { FPL("\\"), true }, |
| 334 { FPL("\\a"), true }, |
| 335 { FPL("\\."), true }, |
| 336 { FPL("\\.."), true }, |
| 337 { FPL("c:\\"), false }, |
| 338 #endif // FILE_PATH_USES_DRIVE_LETTERS |
| 339 #endif // FILE_PATH_USES_WIN_SEPARATORS |
| 340 }; |
| 341 |
| 342 for (size_t i = 0; i < arraysize(cases); ++i) { |
| 343 FilePath input(cases[i].input); |
| 344 bool observed = input.IsAbsolute(); |
| 345 EXPECT_EQ(cases[i].expected, observed) << |
| 346 "i: " << i << ", input: " << input.value(); |
| 347 } |
| 348 } |
OLD | NEW |