1 // path_test program -----------------------------------------------------------------//
3 // Copyright Beman Dawes 2002, 2008
4 // Copyright Vladimir Prus 2002
6 // Use, modification, and distribution is subject to the Boost Software
7 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
10 // See library home page at http://www.boost.org/libs/filesystem
12 // basic_path's stem(), extension(), and replace_extension() tests are based
13 // on basename(), extension(), and change_extension() tests from the original
14 // convenience_test.cpp by Vladimir Prus.
16 //--------------------------------------------------------------------------------------//
20 // The class path relational operators (==, !=, <, etc.) on Windows treat slash and //
21 // backslash as equal. Thus any tests on Windows where the difference between slash //
22 // and backslash is significant should compare strings rather than paths. //
24 // BOOST_TEST(path == path) // '\\' and '/' are equal //
25 // BOOST_TEST(path == convertable to string) // '\\' and '/' are equal //
26 // PATH_TEST_EQ(path, path) // '\\' and '/' are equal //
28 // BOOST_TEST(path.string() == path.string()) // '\\' and '/' are not equal //
29 // BOOST_TEST(path.string() == //
30 // convertable to string) // '\\' and '/' are not equal //
31 // PATH_TEST_EQ(path.string(), //
32 // convertable to string) // '\\' and '/' are not equal //
34 // The last of these is often what is needed, so the PATH_TEST_EQ macro is provided. //
35 // It converts its first argument to a path, and then performs a .string() on it, //
36 // eliminating much boilerplate .string() or even path(...).string() code. //
38 // PATH_TEST_EQ(path, convertable to string) // '\\' and '/' are not equal //
40 //--------------------------------------------------------------------------------------//
42 #include <boost/config/warning_disable.hpp>
44 // See deprecated_test for tests of deprecated features
45 #ifndef BOOST_FILESYSTEM_NO_DEPRECATED
46 #define BOOST_FILESYSTEM_NO_DEPRECATED
48 #ifndef BOOST_SYSTEM_NO_DEPRECATED
49 #define BOOST_SYSTEM_NO_DEPRECATED
52 #include <boost/filesystem/path.hpp>
53 #include <boost/filesystem/operations.hpp>
54 #include <boost/filesystem/exception.hpp>
56 #include <boost/next_prior.hpp>
62 #include <boost/core/lightweight_test.hpp>
63 #include <boost/detail/lightweight_main.hpp>
65 namespace fs
= boost::filesystem
;
66 using boost::filesystem::path
;
70 #ifdef BOOST_WINDOWS_API
71 #define BOOST_DIR_SEP "\\"
73 #define BOOST_DIR_SEP "/"
76 #if BOOST_FILESYSTEM_VERSION == 3
77 #define BOOST_FILESYSTEM_V3_TRAILING_DOT "."
79 #define BOOST_FILESYSTEM_V3_TRAILING_DOT ""
82 #define PATH_TEST_EQ(a, b) check(a, b, __FILE__, __LINE__)
86 class derived_from_path
:
90 derived_from_path() {}
91 derived_from_path(derived_from_path
const& that
) : fs::path(static_cast< fs::path
const& >(that
)) {}
92 template< typename T
>
93 derived_from_path(T
const& that
) : fs::path(that
) {}
95 derived_from_path
& operator= (derived_from_path
const& that
)
97 *static_cast< fs::path
* >(this) = that
;
100 template< typename T
>
101 derived_from_path
& operator= (T
const& that
)
103 *static_cast< fs::path
* >(this) = that
;
108 class convertible_to_path
114 convertible_to_path() {}
115 convertible_to_path(convertible_to_path
const& that
) : m_path(that
.m_path
) {}
116 template< typename T
>
117 convertible_to_path(T
const& that
) : m_path(that
) {}
119 convertible_to_path
& operator= (convertible_to_path
const& that
)
121 m_path
= that
.m_path
;
124 template< typename T
>
125 convertible_to_path
& operator= (T
const& that
)
131 operator fs::path() const { return m_path
; }
135 std::string
platform(BOOST_PLATFORM
);
137 void check(const fs::path
& source
, const std::string
& expected
, const char* file
, int line
)
139 if (source
.string() == expected
)
143 << '(' << line
<< "): source: \"" << source
.string()
144 << "\" != expected: \"" << expected
145 << "\"" << std::endl
;
147 ++::boost::detail::test_errors();
150 path
p1("fe/fi/fo/fum");
156 // exception_tests -----------------------------------------------------------------//
158 void exception_tests()
160 std::cout
<< "exception_tests..." << std::endl
;
161 const std::string
str_1("string-1");
162 boost::system::error_code
ec(12345, boost::system::system_category());
165 throw fs::filesystem_error(str_1
, ec
);
167 catch (const fs::filesystem_error
& ex
)
169 //std::cout << ex.what() << "*" << std::endl;
170 //BOOST_TEST(std::strcmp(ex.what(),
171 // "string-1: Unknown error") == 0);
172 BOOST_TEST(ex
.code() == ec
);
177 throw fs::filesystem_error(str_1
, "p1", "p2", ec
);
179 catch (const fs::filesystem_error
& ex
)
181 //std::cout << ex.what() << "*" << std::endl;
182 //BOOST_TEST(std::strcmp(ex.what(),
183 // "string-1: Unknown error: \"p1\", \"p2\"") == 0);
184 BOOST_TEST(ex
.code() == ec
);
185 BOOST_TEST(ex
.path1() == "p1");
186 BOOST_TEST(ex
.path2() == "p2");
190 // overload_tests ------------------------------------------------------------------//
192 // These verify various overloads don't cause compiler errors
193 // They pre-date operations_unit_test.cpp
195 void overload_tests()
197 std::cout
<< "overload_tests..." << std::endl
;
201 fs::exists(std::string("foo"));
203 fs::exists(p1
/ path("foo"));
204 fs::exists(p1
/ "foo");
205 fs::exists(p1
/ std::string("foo"));
207 fs::exists("foo" / p1
);
208 fs::exists(std::string("foo") / p1
);
212 p4
/= std::string("foo");
215 // iterator_tests ------------------------------------------------------------------//
217 void iterator_tests()
219 std::cout
<< "iterator_tests..." << std::endl
;
222 path::const_iterator itr
= itr_ck
.begin();
223 BOOST_TEST(itr
== itr_ck
.end());
226 itr
= itr_ck
.begin();
227 BOOST_TEST(itr
->string() == "/");
228 BOOST_TEST(++itr
== itr_ck
.end());
229 BOOST_TEST((--itr
)->string() == "/");
232 BOOST_TEST(*itr_ck
.begin() == std::string("foo"));
233 BOOST_TEST(boost::next(itr_ck
.begin()) == itr_ck
.end());
234 BOOST_TEST(*boost::prior(itr_ck
.end()) == std::string("foo"));
235 BOOST_TEST(boost::prior(itr_ck
.end()) == itr_ck
.begin());
237 itr_ck
= path("/foo");
238 BOOST_TEST((itr_ck
.begin())->string() == "/");
239 BOOST_TEST(*boost::next(itr_ck
.begin()) == std::string("foo"));
240 BOOST_TEST(boost::next(boost::next(itr_ck
.begin())) == itr_ck
.end());
241 BOOST_TEST(boost::next(itr_ck
.begin()) == boost::prior(itr_ck
.end()));
242 BOOST_TEST(*boost::prior(itr_ck
.end()) == std::string("foo"));
243 BOOST_TEST(*boost::prior(boost::prior(itr_ck
.end())) == std::string("/"));
244 BOOST_TEST(boost::prior(boost::prior(itr_ck
.end())) == itr_ck
.begin());
247 itr
= itr_ck
.begin();
248 path::const_iterator itr_begin
= itr
;
249 BOOST_TEST(itr
->string() == "/");
250 BOOST_TEST(*++itr
== std::string("foo"));
251 BOOST_TEST(*++itr
== std::string("bar"));
252 BOOST_TEST(++itr
== itr_ck
.end());
253 PATH_TEST_EQ(*--itr
, "bar");
254 PATH_TEST_EQ(*--itr
, "foo");
255 PATH_TEST_EQ(*--itr
, "/");
256 BOOST_TEST(itr
== itr_begin
);
258 itr_ck
= "../f"; // previously failed due to short name bug
259 itr_begin
= itr
= itr_ck
.begin();
260 PATH_TEST_EQ(itr
->string(), "..");
261 PATH_TEST_EQ(*++itr
, "f");
262 BOOST_TEST(++itr
== itr_ck
.end());
263 PATH_TEST_EQ(*--itr
, "f");
264 PATH_TEST_EQ(*--itr
, "..");
265 BOOST_TEST(itr
== itr_begin
);
267 // POSIX says treat "/foo/bar/" as "/foo/bar/."
268 itr_ck
= "/foo/bar/";
269 itr_begin
= itr
= itr_ck
.begin();
270 PATH_TEST_EQ(itr
->string(), "/");
271 PATH_TEST_EQ(*++itr
, "foo");
272 BOOST_TEST(itr
!= itr_ck
.end());
273 PATH_TEST_EQ(*++itr
, "bar");
274 BOOST_TEST(itr
!= itr_ck
.end());
275 PATH_TEST_EQ(*++itr
, BOOST_FILESYSTEM_V3_TRAILING_DOT
);
276 BOOST_TEST(itr
!= itr_ck
.end()); // verify the . isn't also seen as end()
277 BOOST_TEST(++itr
== itr_ck
.end());
278 PATH_TEST_EQ(*--itr
, BOOST_FILESYSTEM_V3_TRAILING_DOT
);
279 PATH_TEST_EQ(*--itr
, "bar");
280 PATH_TEST_EQ(*--itr
, "foo");
281 PATH_TEST_EQ(*--itr
, "/");
282 BOOST_TEST(itr
== itr_begin
);
284 // POSIX says treat "/f/b/" as "/f/b/."
286 itr_begin
= itr
= itr_ck
.begin();
287 PATH_TEST_EQ(itr
->string(), "/");
288 PATH_TEST_EQ(*++itr
, "f");
289 PATH_TEST_EQ(*++itr
, "b");
290 PATH_TEST_EQ(*++itr
, BOOST_FILESYSTEM_V3_TRAILING_DOT
);
291 BOOST_TEST(itr
!= itr_ck
.end()); // verify the . isn't also seen as end()
292 BOOST_TEST(++itr
== itr_ck
.end());
293 PATH_TEST_EQ(*--itr
, BOOST_FILESYSTEM_V3_TRAILING_DOT
);
294 PATH_TEST_EQ(*--itr
, "b");
295 PATH_TEST_EQ(*--itr
, "f");
296 PATH_TEST_EQ(*--itr
, "/");
297 BOOST_TEST(itr
== itr_begin
);
299 // POSIX says treat "a/b/" as "a/b/."
300 // Although similar to the prior test case, this failed the ". isn't end" test due to
301 // a bug while the prior case did not fail.
303 itr_begin
= itr
= itr_ck
.begin();
304 PATH_TEST_EQ(*itr
, "a");
305 PATH_TEST_EQ(*++itr
, "b");
306 PATH_TEST_EQ(*++itr
, BOOST_FILESYSTEM_V3_TRAILING_DOT
);
307 BOOST_TEST(itr
!= itr_ck
.end()); // verify the . isn't also seen as end()
308 BOOST_TEST(++itr
== itr_ck
.end());
309 PATH_TEST_EQ(*--itr
, BOOST_FILESYSTEM_V3_TRAILING_DOT
);
310 PATH_TEST_EQ(*--itr
, "b");
311 PATH_TEST_EQ(*--itr
, "a");
312 BOOST_TEST(itr
== itr_begin
);
315 itr_begin
= itr
= itr_ck
.begin();
316 // two leading slashes are permitted by POSIX (as implementation defined),
317 // while for Windows it is always well defined (as a network name)
318 PATH_TEST_EQ(itr
->string(), "//net");
319 BOOST_TEST(++itr
== itr_ck
.end());
320 PATH_TEST_EQ(*--itr
, "//net");
321 BOOST_TEST(itr
== itr_begin
);
324 itr_begin
= itr
= itr_ck
.begin();
325 PATH_TEST_EQ(itr
->string(), "//net");
326 PATH_TEST_EQ(*++itr
, "/");
327 BOOST_TEST(++itr
== itr_ck
.end());
328 PATH_TEST_EQ(*--itr
, "/");
329 PATH_TEST_EQ(*--itr
, "//net");
330 BOOST_TEST(itr
== itr_begin
);
332 itr_ck
= "//foo///bar///";
333 itr_begin
= itr
= itr_ck
.begin();
334 PATH_TEST_EQ(itr
->string(), "//foo");
335 PATH_TEST_EQ(*++itr
, "/");
336 PATH_TEST_EQ(*++itr
, "bar");
337 PATH_TEST_EQ(*++itr
, BOOST_FILESYSTEM_V3_TRAILING_DOT
);
338 BOOST_TEST(++itr
== itr_ck
.end());
339 PATH_TEST_EQ(*--itr
, BOOST_FILESYSTEM_V3_TRAILING_DOT
);
340 PATH_TEST_EQ(*--itr
, "bar");
341 PATH_TEST_EQ(*--itr
, "/");
342 PATH_TEST_EQ(*--itr
, "//foo");
343 BOOST_TEST(itr
== itr_begin
);
345 itr_ck
= "///foo///bar///";
346 itr_begin
= itr
= itr_ck
.begin();
347 // three or more leading slashes are to be treated as a single slash
348 PATH_TEST_EQ(itr
->string(), "/");
349 PATH_TEST_EQ(*++itr
, "foo");
350 PATH_TEST_EQ(*++itr
, "bar");
351 PATH_TEST_EQ(*++itr
, BOOST_FILESYSTEM_V3_TRAILING_DOT
);
352 BOOST_TEST(++itr
== itr_ck
.end());
353 PATH_TEST_EQ(*--itr
, BOOST_FILESYSTEM_V3_TRAILING_DOT
);
354 PATH_TEST_EQ(*--itr
, "bar");
355 PATH_TEST_EQ(*--itr
, "foo");
356 PATH_TEST_EQ(*--itr
, "/");
357 BOOST_TEST(itr
== itr_begin
);
359 if (platform
== "Windows")
362 itr_begin
= itr
= itr_ck
.begin();
363 PATH_TEST_EQ(itr
->string(), "c:");
364 PATH_TEST_EQ(*++itr
, std::string("/"));
365 BOOST_TEST(++itr
== itr_ck
.end());
366 PATH_TEST_EQ(*--itr
, "/");
367 PATH_TEST_EQ(*--itr
, "c:");
368 BOOST_TEST(itr
== itr_begin
);
371 itr_begin
= itr
= itr_ck
.begin();
372 PATH_TEST_EQ(itr
->string(), "c:");
373 PATH_TEST_EQ(*++itr
, "/"); // test that iteration returns generic format
374 BOOST_TEST(++itr
== itr_ck
.end());
375 PATH_TEST_EQ(*--itr
, "/"); // test that iteration returns generic format
376 PATH_TEST_EQ(*--itr
, "c:");
377 BOOST_TEST(itr
== itr_begin
);
380 itr_begin
= itr
= itr_ck
.begin();
381 PATH_TEST_EQ(*itr
, "c:");
382 PATH_TEST_EQ(*++itr
, "/");
383 PATH_TEST_EQ(*++itr
, "foo");
384 BOOST_TEST(++itr
== itr_ck
.end());
385 PATH_TEST_EQ(*--itr
, "foo");
386 PATH_TEST_EQ(*--itr
, "/");
387 PATH_TEST_EQ(*--itr
, "c:");
388 BOOST_TEST(itr
== itr_begin
);
391 itr_begin
= itr
= itr_ck
.begin();
392 BOOST_TEST_EQ(*itr
, "c:");
393 BOOST_TEST_EQ(*++itr
, "\\");
394 BOOST_TEST_EQ(*++itr
, "foo");
395 BOOST_TEST(++itr
== itr_ck
.end());
396 BOOST_TEST_EQ(*--itr
, "foo");
397 BOOST_TEST_EQ(*--itr
, "\\");
398 BOOST_TEST_EQ(*--itr
, "c:");
399 BOOST_TEST(itr
== itr_begin
);
401 itr_ck
= "\\\\?\\c:\\foo";
402 itr_begin
= itr
= itr_ck
.begin();
403 BOOST_TEST_EQ(*itr
, "\\\\?\\c:");
404 BOOST_TEST_EQ(*++itr
, "\\");
405 BOOST_TEST_EQ(*++itr
, "foo");
406 BOOST_TEST(++itr
== itr_ck
.end());
407 BOOST_TEST_EQ(*--itr
, "foo");
408 BOOST_TEST_EQ(*--itr
, "\\");
409 BOOST_TEST_EQ(*--itr
, "\\\\?\\c:");
410 BOOST_TEST(itr
== itr_begin
);
412 itr_ck
= "\\\\.\\c:\\foo";
413 itr_begin
= itr
= itr_ck
.begin();
414 BOOST_TEST_EQ(*itr
, "\\\\.\\c:");
415 BOOST_TEST_EQ(*++itr
, "\\");
416 BOOST_TEST_EQ(*++itr
, "foo");
417 BOOST_TEST(++itr
== itr_ck
.end());
418 BOOST_TEST_EQ(*--itr
, "foo");
419 BOOST_TEST_EQ(*--itr
, "\\");
420 BOOST_TEST_EQ(*--itr
, "\\\\.\\c:");
421 BOOST_TEST(itr
== itr_begin
);
423 itr_ck
= "\\??\\c:\\foo";
424 itr_begin
= itr
= itr_ck
.begin();
425 BOOST_TEST_EQ(*itr
, "\\??\\c:");
426 BOOST_TEST_EQ(*++itr
, "\\");
427 BOOST_TEST_EQ(*++itr
, "foo");
428 BOOST_TEST(++itr
== itr_ck
.end());
429 BOOST_TEST_EQ(*--itr
, "foo");
430 BOOST_TEST_EQ(*--itr
, "\\");
431 BOOST_TEST_EQ(*--itr
, "\\??\\c:");
432 BOOST_TEST(itr
== itr_begin
);
434 itr_ck
= "\\\\\\foo\\\\\\bar\\\\\\";
435 itr_begin
= itr
= itr_ck
.begin();
436 // three or more leading slashes are to be treated as a single slash
437 PATH_TEST_EQ(itr
->string(), "/");
438 PATH_TEST_EQ(*++itr
, "foo");
439 PATH_TEST_EQ(*++itr
, "bar");
440 PATH_TEST_EQ(*++itr
, BOOST_FILESYSTEM_V3_TRAILING_DOT
);
441 BOOST_TEST(++itr
== itr_ck
.end());
442 PATH_TEST_EQ(*--itr
, BOOST_FILESYSTEM_V3_TRAILING_DOT
);
443 PATH_TEST_EQ(*--itr
, "bar");
444 PATH_TEST_EQ(*--itr
, "foo");
445 PATH_TEST_EQ(*--itr
, "/");
446 BOOST_TEST(itr
== itr_begin
);
449 itr_begin
= itr
= itr_ck
.begin();
450 BOOST_TEST(*itr
== std::string("c:"));
451 BOOST_TEST(*++itr
== std::string("foo"));
452 BOOST_TEST(++itr
== itr_ck
.end());
453 BOOST_TEST(*--itr
== std::string("foo"));
454 BOOST_TEST(*--itr
== std::string("c:"));
455 BOOST_TEST(itr
== itr_begin
);
458 itr_begin
= itr
= itr_ck
.begin();
459 BOOST_TEST(*itr
== std::string("c:"));
460 BOOST_TEST(*++itr
== std::string("foo"));
461 BOOST_TEST(*++itr
== std::string(BOOST_FILESYSTEM_V3_TRAILING_DOT
));
462 BOOST_TEST(++itr
== itr_ck
.end());
463 BOOST_TEST(*--itr
== std::string(BOOST_FILESYSTEM_V3_TRAILING_DOT
));
464 BOOST_TEST(*--itr
== std::string("foo"));
465 BOOST_TEST(*--itr
== std::string("c:"));
466 BOOST_TEST(itr
== itr_begin
);
469 BOOST_TEST(*itr_ck
.begin() == std::string("c:"));
470 BOOST_TEST(next(itr_ck
.begin()) == itr_ck
.end());
471 BOOST_TEST(prior(itr_ck
.end()) == itr_ck
.begin());
472 BOOST_TEST(*prior(itr_ck
.end()) == std::string("c:"));
474 itr_ck
= path("c:/");
475 BOOST_TEST(*itr_ck
.begin() == std::string("c:"));
476 BOOST_TEST(*next(itr_ck
.begin()) == std::string("/"));
477 BOOST_TEST(next(next(itr_ck
.begin())) == itr_ck
.end());
478 BOOST_TEST(prior(prior(itr_ck
.end())) == itr_ck
.begin());
479 BOOST_TEST(*prior(itr_ck
.end()) == std::string("/"));
480 BOOST_TEST(*prior(prior(itr_ck
.end())) == std::string("c:"));
482 itr_ck
= path("c:foo");
483 BOOST_TEST(*itr_ck
.begin() == std::string("c:"));
484 BOOST_TEST(*next(itr_ck
.begin()) == std::string("foo"));
485 BOOST_TEST(next(next(itr_ck
.begin())) == itr_ck
.end());
486 BOOST_TEST(prior(prior(itr_ck
.end())) == itr_ck
.begin());
487 BOOST_TEST(*prior(itr_ck
.end()) == std::string("foo"));
488 BOOST_TEST(*prior(prior(itr_ck
.end())) == std::string("c:"));
490 itr_ck
= path("c:/foo");
491 BOOST_TEST(*itr_ck
.begin() == std::string("c:"));
492 BOOST_TEST(*next(itr_ck
.begin()) == std::string("/"));
493 BOOST_TEST(*next(next(itr_ck
.begin())) == std::string("foo"));
494 BOOST_TEST(next(next(next(itr_ck
.begin()))) == itr_ck
.end());
495 BOOST_TEST(prior(prior(prior(itr_ck
.end()))) == itr_ck
.begin());
496 BOOST_TEST(*prior(itr_ck
.end()) == std::string("foo"));
497 BOOST_TEST(*prior(prior(itr_ck
.end())) == std::string("/"));
498 BOOST_TEST(*prior(prior(prior(itr_ck
.end()))) == std::string("c:"));
500 itr_ck
= path("//net");
501 BOOST_TEST(*itr_ck
.begin() == std::string("//net"));
502 BOOST_TEST(next(itr_ck
.begin()) == itr_ck
.end());
503 BOOST_TEST(prior(itr_ck
.end()) == itr_ck
.begin());
504 BOOST_TEST(*prior(itr_ck
.end()) == std::string("//net"));
506 itr_ck
= path("//net/");
507 PATH_TEST_EQ(itr_ck
.begin()->string(), "//net");
508 PATH_TEST_EQ(next(itr_ck
.begin())->string(), "/");
509 BOOST_TEST(next(next(itr_ck
.begin())) == itr_ck
.end());
510 BOOST_TEST(prior(prior(itr_ck
.end())) == itr_ck
.begin());
511 PATH_TEST_EQ(prior(itr_ck
.end())->string(), "/");
512 PATH_TEST_EQ(prior(prior(itr_ck
.end()))->string(), "//net");
514 itr_ck
= path("//net/foo");
515 BOOST_TEST(*itr_ck
.begin() == std::string("//net"));
516 BOOST_TEST(*next(itr_ck
.begin()) == std::string("/"));
517 BOOST_TEST(*next(next(itr_ck
.begin())) == std::string("foo"));
518 BOOST_TEST(next(next(next(itr_ck
.begin()))) == itr_ck
.end());
519 BOOST_TEST(prior(prior(prior(itr_ck
.end()))) == itr_ck
.begin());
520 BOOST_TEST(*prior(itr_ck
.end()) == std::string("foo"));
521 BOOST_TEST(*prior(prior(itr_ck
.end())) == std::string("/"));
522 BOOST_TEST(*prior(prior(prior(itr_ck
.end()))) == std::string("//net"));
524 itr_ck
= path("prn:");
525 BOOST_TEST(*itr_ck
.begin() == std::string("prn:"));
526 BOOST_TEST(next(itr_ck
.begin()) == itr_ck
.end());
527 BOOST_TEST(prior(itr_ck
.end()) == itr_ck
.begin());
528 BOOST_TEST(*prior(itr_ck
.end()) == std::string("prn:"));
533 itr
= itr_ck
.begin();
534 PATH_TEST_EQ(itr
->string(), "/");
535 BOOST_TEST(++itr
== itr_ck
.end());
539 // non_member_tests ----------------------------------------------------------------//
541 void non_member_tests()
543 std::cout
<< "non_member_tests..." << std::endl
;
545 // test non-member functions, particularly operator overloads
557 std::string
as2(acs2
);
566 BOOST_TEST(a
.string() == "b");
567 BOOST_TEST(b
.string() == "a");
569 BOOST_TEST(a
.string() == "a");
570 BOOST_TEST(b
.string() == "b");
573 PATH_TEST_EQ(path("") / ".", ".");
574 PATH_TEST_EQ(path("") / "..", "..");
575 #if BOOST_FILESYSTEM_VERSION == 3
576 PATH_TEST_EQ(path("/") / "/", "//");
577 PATH_TEST_EQ(path("/") / "/foo", "//foo");
578 PATH_TEST_EQ(path("/foo") / "/bar", "/foo/bar");
580 PATH_TEST_EQ(path("/") / "/", "/");
581 PATH_TEST_EQ(path("/") / "/foo", "/foo");
582 PATH_TEST_EQ(path("/foo") / "/bar", "/bar");
585 if (platform
== "Windows")
587 BOOST_TEST(path("foo\\bar") == "foo/bar");
588 BOOST_TEST((b
/ a
).native() == path("b\\a").native());
589 BOOST_TEST((bs
/ a
).native() == path("b\\a").native());
590 BOOST_TEST((bcs
/ a
).native() == path("b\\a").native());
591 BOOST_TEST((b
/ as
).native() == path("b\\a").native());
592 BOOST_TEST((b
/ acs
).native() == path("b\\a").native());
593 PATH_TEST_EQ(path("a") / "b", "a\\b");
594 PATH_TEST_EQ(path("foo") / path("bar"), "foo\\bar"); // path arg
595 PATH_TEST_EQ(path("foo") / "bar", "foo\\bar"); // const char* arg
596 PATH_TEST_EQ(path("foo") / path("woo/bar").filename(), "foo\\bar"); // const std::string & arg
597 PATH_TEST_EQ("foo" / path("bar"), "foo\\bar");
598 #if BOOST_FILESYSTEM_VERSION == 3
599 PATH_TEST_EQ(path("..") / "", "..");
601 PATH_TEST_EQ(path("..") / "", "..\\");
603 PATH_TEST_EQ(path("..") / "..", "..\\..");
604 PATH_TEST_EQ(path("/") / "..", "/..");
605 PATH_TEST_EQ(path("/..") / "..", "/..\\..");
606 PATH_TEST_EQ(path("..") / "foo", "..\\foo");
607 PATH_TEST_EQ(path("foo") / "..", "foo\\..");
608 PATH_TEST_EQ(path("..") / "f", "..\\f");
609 PATH_TEST_EQ(path("/..") / "f", "/..\\f");
610 PATH_TEST_EQ(path("f") / "..", "f\\..");
611 PATH_TEST_EQ(path("foo") / ".." / "..", "foo\\..\\..");
612 PATH_TEST_EQ(path("foo") / ".." / ".." / "..", "foo\\..\\..\\..");
613 PATH_TEST_EQ(path("f") / ".." / "b", "f\\..\\b");
614 PATH_TEST_EQ(path("foo") / ".." / "bar", "foo\\..\\bar");
615 PATH_TEST_EQ(path("foo") / "bar" / "..", "foo\\bar\\..");
616 PATH_TEST_EQ(path("foo") / "bar" / ".." / "..", "foo\\bar\\..\\..");
617 PATH_TEST_EQ(path("foo") / "bar" / ".." / "blah", "foo\\bar\\..\\blah");
618 PATH_TEST_EQ(path("f") / "b" / "..", "f\\b\\..");
619 PATH_TEST_EQ(path("f") / "b" / ".." / "a", "f\\b\\..\\a");
620 PATH_TEST_EQ(path("foo") / "bar" / "blah" / ".." / "..", "foo\\bar\\blah\\..\\..");
621 PATH_TEST_EQ(path("foo") / "bar" / "blah" / ".." / ".." / "bletch", "foo\\bar\\blah\\..\\..\\bletch");
623 PATH_TEST_EQ(path(".") / "foo", ".\\foo");
624 PATH_TEST_EQ(path(".") / "..", ".\\..");
625 PATH_TEST_EQ(path("foo") / ".", "foo\\.");
626 PATH_TEST_EQ(path("..") / ".", "..\\.");
627 PATH_TEST_EQ(path(".") / ".", ".\\.");
628 PATH_TEST_EQ(path(".") / "." / ".", ".\\.\\.");
629 PATH_TEST_EQ(path(".") / "foo" / ".", ".\\foo\\.");
630 PATH_TEST_EQ(path("foo") / "." / "bar", "foo\\.\\bar");
631 PATH_TEST_EQ(path("foo") / "." / ".", "foo\\.\\.");
632 PATH_TEST_EQ(path("foo") / "." / "..", "foo\\.\\..");
633 PATH_TEST_EQ(path(".") / "." / "..", ".\\.\\..");
634 PATH_TEST_EQ(path(".") / ".." / ".", ".\\..\\.");
635 PATH_TEST_EQ(path("..") / "." / ".", "..\\.\\.");
637 #if BOOST_FILESYSTEM_VERSION == 3
638 PATH_TEST_EQ(path("\\\\net1\\foo") / "\\\\net2\\bar", "\\\\net1\\foo\\\\net2\\bar");
639 PATH_TEST_EQ(path("\\\\net1\\foo") / "\\bar", "\\\\net1\\foo\\bar");
640 PATH_TEST_EQ(path("c:\\foo") / "d:\\bar", "c:\\foo\\d:\\bar");
641 PATH_TEST_EQ(path("c:\\foo") / "\\bar", "c:\\foo\\bar");
642 PATH_TEST_EQ(path("c:foo") / "\\bar", "c:foo\\bar");
644 PATH_TEST_EQ(path("\\\\net1\\foo") / "\\\\net2\\bar", "\\\\net2\\bar");
645 PATH_TEST_EQ(path("\\\\net1\\foo") / "\\bar", "\\\\net1\\bar");
646 PATH_TEST_EQ(path("c:\\foo") / "d:\\bar", "d:\\bar");
647 PATH_TEST_EQ(path("c:\\foo") / "\\bar", "c:\\bar");
648 PATH_TEST_EQ(path("c:foo") / "\\bar", "c:\\bar");
650 PATH_TEST_EQ(path("c:foo") / "bar", "c:foo\\bar");
654 PATH_TEST_EQ(b
/ a
, "b/a");
655 PATH_TEST_EQ(bs
/ a
, "b/a");
656 PATH_TEST_EQ(bcs
/ a
, "b/a");
657 PATH_TEST_EQ(b
/ as
, "b/a");
658 PATH_TEST_EQ(b
/ acs
, "b/a");
659 PATH_TEST_EQ(path("a") / "b", "a/b");
660 PATH_TEST_EQ(path("") / "..", "..");
661 PATH_TEST_EQ(path("foo") / path("bar"), "foo/bar"); // path arg
662 PATH_TEST_EQ(path("foo") / "bar", "foo/bar"); // const char* arg
663 PATH_TEST_EQ(path("foo") / path("woo/bar").filename(), "foo/bar"); // const std::string & arg
664 PATH_TEST_EQ("foo" / path("bar"), "foo/bar");
665 #if BOOST_FILESYSTEM_VERSION == 3
666 PATH_TEST_EQ(path("..") / "", "..");
668 PATH_TEST_EQ(path("..") / "", "../");
670 PATH_TEST_EQ(path("..") / "..", "../..");
671 PATH_TEST_EQ(path("/") / "..", "/..");
672 PATH_TEST_EQ(path("/..") / "..", "/../..");
673 PATH_TEST_EQ(path("..") / "foo", "../foo");
674 PATH_TEST_EQ(path("foo") / "..", "foo/..");
675 PATH_TEST_EQ(path("..") / "f", "../f");
676 PATH_TEST_EQ(path("/..") / "f", "/../f");
677 PATH_TEST_EQ(path("f") / "..", "f/..");
678 PATH_TEST_EQ(path("foo") / ".." / "..", "foo/../..");
679 PATH_TEST_EQ(path("foo") / ".." / ".." / "..", "foo/../../..");
680 PATH_TEST_EQ(path("f") / ".." / "b", "f/../b");
681 PATH_TEST_EQ(path("foo") / ".." / "bar", "foo/../bar");
682 PATH_TEST_EQ(path("foo") / "bar" / "..", "foo/bar/..");
683 PATH_TEST_EQ(path("foo") / "bar" / ".." / "..", "foo/bar/../..");
684 PATH_TEST_EQ(path("foo") / "bar" / ".." / "blah", "foo/bar/../blah");
685 PATH_TEST_EQ(path("f") / "b" / "..", "f/b/..");
686 PATH_TEST_EQ(path("f") / "b" / ".." / "a", "f/b/../a");
687 PATH_TEST_EQ(path("foo") / "bar" / "blah" / ".." / "..", "foo/bar/blah/../..");
688 PATH_TEST_EQ(path("foo") / "bar" / "blah" / ".." / ".." / "bletch", "foo/bar/blah/../../bletch");
690 PATH_TEST_EQ(path(".") / "foo", "./foo");
691 PATH_TEST_EQ(path(".") / "..", "./..");
692 PATH_TEST_EQ(path("foo") / ".", "foo/.");
693 PATH_TEST_EQ(path("..") / ".", "../.");
694 PATH_TEST_EQ(path(".") / ".", "./.");
695 PATH_TEST_EQ(path(".") / "." / ".", "././.");
696 PATH_TEST_EQ(path(".") / "foo" / ".", "./foo/.");
697 PATH_TEST_EQ(path("foo") / "." / "bar", "foo/./bar");
698 PATH_TEST_EQ(path("foo") / "." / ".", "foo/./.");
699 PATH_TEST_EQ(path("foo") / "." / "..", "foo/./..");
700 PATH_TEST_EQ(path(".") / "." / "..", "././..");
701 PATH_TEST_EQ(path(".") / ".." / ".", "./../.");
702 PATH_TEST_EQ(path("..") / "." / ".", ".././.");
704 #if BOOST_FILESYSTEM_VERSION == 3
705 PATH_TEST_EQ(path("//net1/foo") / "//net2/bar", "//net1/foo//net2/bar");
706 PATH_TEST_EQ(path("//net1/foo") / "/bar", "//net1/foo/bar");
708 PATH_TEST_EQ(path("//net1/foo") / "//net2/bar", "//net2/bar");
709 PATH_TEST_EQ(path("//net1/foo") / "/bar", "/bar");
711 PATH_TEST_EQ(path("//net1/foo") / "bar", "//net1/foo/bar");
715 BOOST_TEST(!(e
< e2
));
716 BOOST_TEST(!(es
< e2
));
717 BOOST_TEST(!(ecs
< e2
));
718 BOOST_TEST(!(e
< es2
));
719 BOOST_TEST(!(e
< ecs2
));
733 BOOST_TEST(!(a
< a2
));
734 BOOST_TEST(!(as
< a2
));
735 BOOST_TEST(!(acs
< a2
));
736 BOOST_TEST(!(a
< as2
));
737 BOOST_TEST(!(a
< acs2
));
739 // make sure basic_path overloads don't conflict with std::string overloads
741 BOOST_TEST(!(as
< as
));
742 BOOST_TEST(!(as
< acs
));
743 BOOST_TEST(!(acs
< as
));
745 // character set reality check before lexicographical tests
746 BOOST_TEST(std::string("a.b") < std::string("a/b"));
747 // verify compare is actually lexicographical
748 BOOST_TEST(path("a/b") < path("a.b"));
749 BOOST_TEST(path("a/b") == path("a///b"));
750 #if BOOST_FILESYSTEM_VERSION == 3
751 BOOST_TEST(path("a/b/") == path("a/b/."));
753 BOOST_TEST(path("a/b/") != path("a/b/."));
755 BOOST_TEST(path("a/b") != path("a/b/"));
757 // make sure the derivative operators also work
765 BOOST_TEST(!(a2
> a
));
766 BOOST_TEST(!(a2
> as
));
767 BOOST_TEST(!(a2
> acs
));
768 BOOST_TEST(!(as2
> a
));
769 BOOST_TEST(!(acs2
> a
));
773 BOOST_TEST(acs
<= b
);
775 BOOST_TEST(a
<= bcs
);
778 BOOST_TEST(as
<= a2
);
779 BOOST_TEST(acs
<= a2
);
780 BOOST_TEST(a
<= as2
);
781 BOOST_TEST(a
<= acs2
);
785 BOOST_TEST(bcs
>= a
);
787 BOOST_TEST(b
>= acs
);
790 BOOST_TEST(as2
>= a
);
791 BOOST_TEST(acs2
>= a
);
792 BOOST_TEST(a2
>= as
);
793 BOOST_TEST(a2
>= acs
);
795 // operator == and != are implemented separately, so test separately
797 path
p101("fe/fi/fo/fum");
799 path
p103("fe/fi/fo/fumm");
800 BOOST_TEST(p101
.string() != p103
.string());
802 // check each overload
803 BOOST_TEST(p101
!= p103
);
804 BOOST_TEST(p101
!= p103
.string());
805 BOOST_TEST(p101
!= p103
.string().c_str());
806 BOOST_TEST(p101
.string() != p103
);
807 BOOST_TEST(p101
.string().c_str() != p103
);
810 BOOST_TEST(p101
.string() == p103
.string());
812 // check each overload
813 BOOST_TEST(p101
== p103
);
814 BOOST_TEST(p101
== p103
.string());
815 BOOST_TEST(p101
== p103
.string().c_str());
816 BOOST_TEST(p101
.string() == p103
);
817 BOOST_TEST(p101
.string().c_str() == p103
);
819 if (platform
== "Windows")
821 std::cout
<< " Windows relational tests..." << std::endl
;
822 path
p10("c:\\file");
824 // check each overload
825 BOOST_TEST(p10
.generic_string() == p11
.generic_string());
826 BOOST_TEST(p10
== p11
);
827 BOOST_TEST(p10
== p11
.string());
828 BOOST_TEST(p10
== p11
.string().c_str());
829 BOOST_TEST(p10
.string() == p11
);
830 BOOST_TEST(p10
.string().c_str() == p11
);
831 BOOST_TEST(p10
== L
"c:\\file");
832 BOOST_TEST(p10
== L
"c:/file");
833 BOOST_TEST(p11
== L
"c:\\file");
834 BOOST_TEST(p11
== L
"c:/file");
835 BOOST_TEST(L
"c:\\file" == p10
);
836 BOOST_TEST(L
"c:/file" == p10
);
837 BOOST_TEST(L
"c:\\file" == p11
);
838 BOOST_TEST(L
"c:/file" == p11
);
840 BOOST_TEST(!(p10
.generic_string() != p11
.generic_string()));
841 BOOST_TEST(!(p10
!= p11
));
842 BOOST_TEST(!(p10
!= p11
.string()));
843 BOOST_TEST(!(p10
!= p11
.string().c_str()));
844 BOOST_TEST(!(p10
.string() != p11
));
845 BOOST_TEST(!(p10
.string().c_str() != p11
));
846 BOOST_TEST(!(p10
!= L
"c:\\file"));
847 BOOST_TEST(!(p10
!= L
"c:/file"));
848 BOOST_TEST(!(p11
!= L
"c:\\file"));
849 BOOST_TEST(!(p11
!= L
"c:/file"));
850 BOOST_TEST(!(L
"c:\\file" != p10
));
851 BOOST_TEST(!(L
"c:/file" != p10
));
852 BOOST_TEST(!(L
"c:\\file" != p11
));
853 BOOST_TEST(!(L
"c:/file" != p11
));
855 BOOST_TEST(!(p10
.string() < p11
.string()));
856 BOOST_TEST(!(p10
< p11
));
857 BOOST_TEST(!(p10
< p11
.string()));
858 BOOST_TEST(!(p10
< p11
.string().c_str()));
859 BOOST_TEST(!(p10
.string() < p11
));
860 BOOST_TEST(!(p10
.string().c_str() < p11
));
861 BOOST_TEST(!(p10
< L
"c:\\file"));
862 BOOST_TEST(!(p10
< L
"c:/file"));
863 BOOST_TEST(!(p11
< L
"c:\\file"));
864 BOOST_TEST(!(p11
< L
"c:/file"));
865 BOOST_TEST(!(L
"c:\\file" < p10
));
866 BOOST_TEST(!(L
"c:/file" < p10
));
867 BOOST_TEST(!(L
"c:\\file" < p11
));
868 BOOST_TEST(!(L
"c:/file" < p11
));
870 BOOST_TEST(!(p10
.generic_string() > p11
.generic_string()));
871 BOOST_TEST(!(p10
> p11
));
872 BOOST_TEST(!(p10
> p11
.string()));
873 BOOST_TEST(!(p10
> p11
.string().c_str()));
874 BOOST_TEST(!(p10
.string() > p11
));
875 BOOST_TEST(!(p10
.string().c_str() > p11
));
876 BOOST_TEST(!(p10
> L
"c:\\file"));
877 BOOST_TEST(!(p10
> L
"c:/file"));
878 BOOST_TEST(!(p11
> L
"c:\\file"));
879 BOOST_TEST(!(p11
> L
"c:/file"));
880 BOOST_TEST(!(L
"c:\\file" > p10
));
881 BOOST_TEST(!(L
"c:/file" > p10
));
882 BOOST_TEST(!(L
"c:\\file" > p11
));
883 BOOST_TEST(!(L
"c:/file" > p11
));
888 BOOST_TEST(fs::relative("/abc/def", "/abc") == path("def"));
889 BOOST_TEST(fs::relative("abc/def", "abc") == path("def"));
890 BOOST_TEST(fs::relative("/abc/xyz/def", "/abc") == path("xyz/def"));
891 BOOST_TEST(fs::relative("abc/xyz/def", "abc") == path("xyz/def"));
893 if (platform
== "Windows")
895 std::cout
<< " Windows relatie tests..." << std::endl
;
896 BOOST_TEST(fs::relative("\\abc\\xyz\\def", "/abc") == path("xyz/def"));
897 std::cout
<< " fs::relative(\"/abc/xyz/def\", \"/abc\") is "
898 << fs::relative("/abc/xyz/def", "/abc") << std::endl
;
899 BOOST_TEST(fs::relative("abc\\xyz\\def", "abc") == path("xyz/def"));
903 // query_and_decomposition_tests ---------------------------------------------------//
905 // remove_filename() is also tested here, because its specification depends on
906 // a decomposition function.
908 void query_and_decomposition_tests()
910 std::cout
<< "query_and_decomposition_tests..." << std::endl
;
912 // these are the examples given in reference docs, so check they work
913 BOOST_TEST(path("/foo/bar.txt").parent_path() == "/foo");
914 BOOST_TEST(path("/foo/bar").parent_path() == "/foo");
915 BOOST_TEST(path("/foo/bar/").parent_path() == "/foo/bar");
916 BOOST_TEST(path("/").parent_path() == "");
917 BOOST_TEST(path(".").parent_path() == "");
918 BOOST_TEST(path("..").parent_path() == "");
919 BOOST_TEST(path("/foo/bar.txt").filename() == "bar.txt");
920 BOOST_TEST(path("/foo/bar").filename() == "bar");
921 BOOST_TEST(path("/foo/bar/").filename() == BOOST_FILESYSTEM_V3_TRAILING_DOT
);
922 #if BOOST_FILESYSTEM_VERSION == 3
923 BOOST_TEST(path("/").filename() == "/");
925 BOOST_TEST(path("/").filename() == "");
927 BOOST_TEST(path(".").filename() == ".");
928 BOOST_TEST(path("..").filename() == "..");
930 // stem() tests not otherwise covered
931 BOOST_TEST(path(".").stem() == ".");
932 BOOST_TEST(path("..").stem() == "..");
933 #if BOOST_FILESYSTEM_VERSION == 3
934 BOOST_TEST(path(".a").stem() == "");
936 BOOST_TEST(path(".a").stem() == ".a");
938 BOOST_TEST(path("b").stem() == "b");
939 BOOST_TEST(path("a/b.txt").stem() == "b");
940 BOOST_TEST(path("a/b.").stem() == "b");
941 BOOST_TEST(path("a.b.c").stem() == "a.b");
942 BOOST_TEST(path("a.b.c.").stem() == "a.b.c");
944 // extension() tests not otherwise covered
945 BOOST_TEST(path(".").extension() == "");
946 BOOST_TEST(path("..").extension() == "");
947 #if BOOST_FILESYSTEM_VERSION == 3
948 BOOST_TEST(path(".a").extension() == ".a");
950 BOOST_TEST(path(".a").extension() == "");
952 BOOST_TEST(path("a/b").extension() == "");
953 BOOST_TEST(path("a.b/c").extension() == "");
954 BOOST_TEST(path("a/b.txt").extension() == ".txt");
955 BOOST_TEST(path("a/b.").extension() == ".");
956 BOOST_TEST(path("a.b.c").extension() == ".c");
957 BOOST_TEST(path("a.b.c.").extension() == ".");
958 BOOST_TEST(path("a/").extension() == "");
960 // main q & d test sequence
965 BOOST_TEST(p
.relative_path().string() == "");
966 BOOST_TEST(p
.parent_path().string() == "");
967 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
968 BOOST_TEST(p
.filename() == "");
969 BOOST_TEST(p
.stem() == "");
970 BOOST_TEST(p
.extension() == "");
971 BOOST_TEST(p
.root_name() == "");
972 BOOST_TEST(p
.root_directory() == "");
973 BOOST_TEST(p
.root_path().string() == "");
974 BOOST_TEST(!p
.has_root_path());
975 BOOST_TEST(!p
.has_root_name());
976 BOOST_TEST(!p
.has_root_directory());
977 BOOST_TEST(!p
.has_relative_path());
978 BOOST_TEST(!p
.has_filename());
979 BOOST_TEST(!p
.has_stem());
980 BOOST_TEST(!p
.has_extension());
981 BOOST_TEST(!p
.has_parent_path());
982 BOOST_TEST(!p
.is_absolute());
985 BOOST_TEST(p
.relative_path().string() == "");
986 BOOST_TEST(p
.parent_path().string() == "");
987 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
988 #if BOOST_FILESYSTEM_VERSION == 3
989 BOOST_TEST(p
.filename() == "/");
990 BOOST_TEST(p
.stem() == "/");
992 BOOST_TEST(p
.filename() == "");
993 BOOST_TEST(p
.stem() == "");
995 BOOST_TEST(p
.extension() == "");
996 BOOST_TEST(p
.root_name() == "");
997 BOOST_TEST(p
.root_directory() == "/");
998 BOOST_TEST(p
.root_path().string() == "/");
999 BOOST_TEST(p
.has_root_path());
1000 BOOST_TEST(!p
.has_root_name());
1001 BOOST_TEST(p
.has_root_directory());
1002 BOOST_TEST(!p
.has_relative_path());
1003 #if BOOST_FILESYSTEM_VERSION == 3
1004 BOOST_TEST(p
.has_filename());
1005 BOOST_TEST(p
.has_stem());
1007 BOOST_TEST(!p
.has_filename());
1008 BOOST_TEST(!p
.has_stem());
1010 BOOST_TEST(!p
.has_extension());
1011 BOOST_TEST(!p
.has_parent_path());
1012 if (platform
== "POSIX")
1013 BOOST_TEST(p
.is_absolute());
1015 BOOST_TEST(!p
.is_absolute());
1018 PATH_TEST_EQ(p
.relative_path().string(), "");
1019 PATH_TEST_EQ(p
.parent_path().string(), "");
1020 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1021 #if BOOST_FILESYSTEM_VERSION == 3
1022 PATH_TEST_EQ(p
.filename(), "//");
1023 PATH_TEST_EQ(p
.stem(), "//");
1025 PATH_TEST_EQ(p
.filename(), "");
1026 PATH_TEST_EQ(p
.stem(), "");
1028 PATH_TEST_EQ(p
.extension(), "");
1029 PATH_TEST_EQ(p
.root_name(), "//");
1030 PATH_TEST_EQ(p
.root_directory(), "");
1031 PATH_TEST_EQ(p
.root_path().string(), "//");
1032 BOOST_TEST(p
.has_root_path());
1033 BOOST_TEST(p
.has_root_name());
1034 BOOST_TEST(!p
.has_root_directory());
1035 BOOST_TEST(!p
.has_relative_path());
1036 #if BOOST_FILESYSTEM_VERSION == 3
1037 BOOST_TEST(p
.has_filename());
1038 BOOST_TEST(p
.has_stem());
1040 BOOST_TEST(!p
.has_filename());
1041 BOOST_TEST(!p
.has_stem());
1043 BOOST_TEST(!p
.has_extension());
1044 BOOST_TEST(!p
.has_parent_path());
1045 BOOST_TEST(!p
.is_absolute());
1048 PATH_TEST_EQ(p
.relative_path().string(), "");
1049 PATH_TEST_EQ(p
.parent_path().string(), "");
1050 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1051 #if BOOST_FILESYSTEM_VERSION == 3
1052 PATH_TEST_EQ(p
.filename(), "/");
1053 PATH_TEST_EQ(p
.stem(), "/");
1055 PATH_TEST_EQ(p
.filename(), "");
1056 PATH_TEST_EQ(p
.stem(), "");
1058 PATH_TEST_EQ(p
.extension(), "");
1059 PATH_TEST_EQ(p
.root_name(), "");
1060 PATH_TEST_EQ(p
.root_directory(), "/");
1061 PATH_TEST_EQ(p
.root_path().string(), "/");
1062 BOOST_TEST(p
.has_root_path());
1063 BOOST_TEST(!p
.has_root_name());
1064 BOOST_TEST(p
.has_root_directory());
1065 BOOST_TEST(!p
.has_relative_path());
1066 #if BOOST_FILESYSTEM_VERSION == 3
1067 BOOST_TEST(p
.has_filename());
1068 BOOST_TEST(p
.has_stem());
1070 BOOST_TEST(!p
.has_filename());
1071 BOOST_TEST(!p
.has_stem());
1073 BOOST_TEST(!p
.has_extension());
1074 BOOST_TEST(!p
.has_parent_path());
1075 if (platform
== "POSIX")
1076 BOOST_TEST(p
.is_absolute());
1078 BOOST_TEST(!p
.is_absolute());
1081 BOOST_TEST(p
.relative_path().string() == ".");
1082 BOOST_TEST(p
.parent_path().string() == "");
1083 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1084 BOOST_TEST(p
.filename() == ".");
1085 BOOST_TEST(p
.stem() == ".");
1086 BOOST_TEST(p
.extension() == "");
1087 BOOST_TEST(p
.root_name() == "");
1088 BOOST_TEST(p
.root_directory() == "");
1089 BOOST_TEST(p
.root_path().string() == "");
1090 BOOST_TEST(!p
.has_root_path());
1091 BOOST_TEST(!p
.has_root_name());
1092 BOOST_TEST(!p
.has_root_directory());
1093 BOOST_TEST(p
.has_relative_path());
1094 BOOST_TEST(p
.has_filename());
1095 BOOST_TEST(p
.has_stem());
1096 BOOST_TEST(!p
.has_extension());
1097 BOOST_TEST(!p
.has_parent_path());
1098 BOOST_TEST(!p
.is_absolute());
1101 BOOST_TEST(p
.relative_path().string() == "..");
1102 BOOST_TEST(p
.parent_path().string() == "");
1103 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1104 BOOST_TEST(p
.filename() == "..");
1105 BOOST_TEST(p
.stem() == "..");
1106 BOOST_TEST(p
.extension() == "");
1107 BOOST_TEST(p
.root_name() == "");
1108 BOOST_TEST(p
.root_directory() == "");
1109 BOOST_TEST(p
.root_path().string() == "");
1110 BOOST_TEST(!p
.has_root_path());
1111 BOOST_TEST(!p
.has_root_name());
1112 BOOST_TEST(!p
.has_root_directory());
1113 BOOST_TEST(p
.has_relative_path());
1114 BOOST_TEST(p
.has_filename());
1115 BOOST_TEST(p
.has_stem());
1116 BOOST_TEST(!p
.has_extension());
1117 BOOST_TEST(!p
.has_parent_path());
1118 BOOST_TEST(!p
.is_absolute());
1121 BOOST_TEST(p
.relative_path().string() == "foo");
1122 BOOST_TEST(p
.parent_path().string() == "");
1123 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1124 BOOST_TEST(p
.filename() == "foo");
1125 BOOST_TEST(p
.stem() == "foo");
1126 BOOST_TEST(p
.extension() == "");
1127 BOOST_TEST(p
.root_name() == "");
1128 BOOST_TEST(p
.root_directory() == "");
1129 BOOST_TEST(p
.root_path().string() == "");
1130 BOOST_TEST(!p
.has_root_path());
1131 BOOST_TEST(!p
.has_root_name());
1132 BOOST_TEST(!p
.has_root_directory());
1133 BOOST_TEST(p
.has_relative_path());
1134 BOOST_TEST(p
.has_filename());
1135 BOOST_TEST(p
.has_stem());
1136 BOOST_TEST(!p
.has_extension());
1137 BOOST_TEST(!p
.has_parent_path());
1138 BOOST_TEST(!p
.is_absolute());
1141 PATH_TEST_EQ(p
.relative_path().string(), "foo");
1142 PATH_TEST_EQ(p
.parent_path().string(), "/");
1143 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1144 PATH_TEST_EQ(p
.filename(), "foo");
1145 PATH_TEST_EQ(p
.stem(), "foo");
1146 PATH_TEST_EQ(p
.extension(), "");
1147 PATH_TEST_EQ(p
.root_name(), "");
1148 PATH_TEST_EQ(p
.root_directory(), "/");
1149 PATH_TEST_EQ(p
.root_path().string(), "/");
1150 BOOST_TEST(p
.has_root_path());
1151 BOOST_TEST(!p
.has_root_name());
1152 BOOST_TEST(p
.has_root_directory());
1153 BOOST_TEST(p
.has_relative_path());
1154 BOOST_TEST(p
.has_filename());
1155 BOOST_TEST(p
.has_stem());
1156 BOOST_TEST(!p
.has_extension());
1157 BOOST_TEST(p
.has_parent_path());
1158 if (platform
== "POSIX")
1159 BOOST_TEST(p
.is_absolute());
1161 BOOST_TEST(!p
.is_absolute());
1164 PATH_TEST_EQ(p
.relative_path().string(), "foo/");
1165 PATH_TEST_EQ(p
.parent_path().string(), "/foo");
1166 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1167 PATH_TEST_EQ(p
.filename(), BOOST_FILESYSTEM_V3_TRAILING_DOT
);
1168 PATH_TEST_EQ(p
.stem(), BOOST_FILESYSTEM_V3_TRAILING_DOT
);
1169 PATH_TEST_EQ(p
.extension(), "");
1170 PATH_TEST_EQ(p
.root_name(), "");
1171 PATH_TEST_EQ(p
.root_directory(), "/");
1172 PATH_TEST_EQ(p
.root_path().string(), "/");
1173 BOOST_TEST(p
.has_root_path());
1174 BOOST_TEST(!p
.has_root_name());
1175 BOOST_TEST(p
.has_root_directory());
1176 BOOST_TEST(p
.has_relative_path());
1177 #if BOOST_FILESYSTEM_VERSION == 3
1178 BOOST_TEST(p
.has_filename());
1179 BOOST_TEST(p
.has_stem());
1181 BOOST_TEST(!p
.has_filename());
1182 BOOST_TEST(!p
.has_stem());
1184 BOOST_TEST(!p
.has_extension());
1185 BOOST_TEST(p
.has_parent_path());
1186 if (platform
== "POSIX")
1187 BOOST_TEST(p
.is_absolute());
1189 BOOST_TEST(!p
.is_absolute());
1192 PATH_TEST_EQ(p
.relative_path().string(), "foo");
1193 PATH_TEST_EQ(p
.parent_path().string(), "/");
1194 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1195 PATH_TEST_EQ(p
.filename(), "foo");
1196 PATH_TEST_EQ(p
.root_name(), "");
1197 PATH_TEST_EQ(p
.root_directory(), "/");
1198 PATH_TEST_EQ(p
.root_path().string(), "/");
1199 BOOST_TEST(p
.has_root_path());
1200 BOOST_TEST(!p
.has_root_name());
1201 BOOST_TEST(p
.has_root_directory());
1202 BOOST_TEST(p
.has_relative_path());
1203 BOOST_TEST(p
.has_filename());
1204 BOOST_TEST(p
.has_parent_path());
1205 if (platform
== "POSIX")
1206 BOOST_TEST(p
.is_absolute());
1208 BOOST_TEST(!p
.is_absolute());
1211 BOOST_TEST(p
.relative_path().string() == "foo/bar");
1212 BOOST_TEST(p
.parent_path().string() == "foo");
1213 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1214 BOOST_TEST(p
.filename() == "bar");
1215 BOOST_TEST(p
.stem() == "bar");
1216 BOOST_TEST(p
.extension() == "");
1217 BOOST_TEST(p
.root_name() == "");
1218 BOOST_TEST(p
.root_directory() == "");
1219 BOOST_TEST(p
.root_path().string() == "");
1220 BOOST_TEST(!p
.has_root_path());
1221 BOOST_TEST(!p
.has_root_name());
1222 BOOST_TEST(!p
.has_root_directory());
1223 BOOST_TEST(p
.has_relative_path());
1224 BOOST_TEST(p
.has_filename());
1225 BOOST_TEST(p
.has_stem());
1226 BOOST_TEST(!p
.has_extension());
1227 BOOST_TEST(p
.has_parent_path());
1228 BOOST_TEST(!p
.is_absolute());
1231 BOOST_TEST(p
.relative_path().string() == "../foo");
1232 BOOST_TEST(p
.parent_path().string() == "..");
1233 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1234 BOOST_TEST(p
.filename() == "foo");
1235 BOOST_TEST(p
.root_name() == "");
1236 BOOST_TEST(p
.root_directory() == "");
1237 BOOST_TEST(p
.root_path().string() == "");
1238 BOOST_TEST(!p
.has_root_path());
1239 BOOST_TEST(!p
.has_root_name());
1240 BOOST_TEST(!p
.has_root_directory());
1241 BOOST_TEST(p
.has_relative_path());
1242 BOOST_TEST(p
.has_filename());
1243 BOOST_TEST(p
.has_parent_path());
1244 BOOST_TEST(!p
.is_absolute());
1247 PATH_TEST_EQ(p
.relative_path().string(), "..///foo");
1248 PATH_TEST_EQ(p
.parent_path().string(), "..");
1249 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1250 PATH_TEST_EQ(p
.filename(), "foo");
1251 PATH_TEST_EQ(p
.root_name(), "");
1252 PATH_TEST_EQ(p
.root_directory(), "");
1253 PATH_TEST_EQ(p
.root_path().string(), "");
1254 BOOST_TEST(!p
.has_root_path());
1255 BOOST_TEST(!p
.has_root_name());
1256 BOOST_TEST(!p
.has_root_directory());
1257 BOOST_TEST(p
.has_relative_path());
1258 BOOST_TEST(p
.has_filename());
1259 BOOST_TEST(p
.has_parent_path());
1260 BOOST_TEST(!p
.is_absolute());
1263 BOOST_TEST(p
.relative_path().string() == "foo/bar");
1264 BOOST_TEST(p
.parent_path().string() == "/foo");
1265 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1266 BOOST_TEST(p
.filename() == "bar");
1267 BOOST_TEST(p
.root_name() == "");
1268 BOOST_TEST(p
.root_directory() == "/");
1269 BOOST_TEST(p
.root_path().string() == "/");
1270 BOOST_TEST(p
.has_root_path());
1271 BOOST_TEST(!p
.has_root_name());
1272 BOOST_TEST(p
.has_root_directory());
1273 BOOST_TEST(p
.has_relative_path());
1274 BOOST_TEST(p
.has_filename());
1275 BOOST_TEST(p
.has_parent_path());
1276 if (platform
== "POSIX")
1277 BOOST_TEST(p
.is_absolute());
1279 BOOST_TEST(!p
.is_absolute());
1281 // Both POSIX and Windows allow two leading slashs
1282 // (POSIX meaning is implementation defined)
1283 PATH_TEST_EQ(path("//resource"), "//resource");
1284 PATH_TEST_EQ(path("//resource/"), "//resource/");
1285 PATH_TEST_EQ(path("//resource/foo"), "//resource/foo");
1287 p
= q
= path("//net");
1288 PATH_TEST_EQ(p
.string(), "//net");
1289 PATH_TEST_EQ(p
.relative_path().string(), "");
1290 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1291 PATH_TEST_EQ(p
.parent_path().string(), "");
1292 #if BOOST_FILESYSTEM_VERSION == 3
1293 PATH_TEST_EQ(p
.filename(), "//net");
1295 PATH_TEST_EQ(p
.filename(), "");
1297 PATH_TEST_EQ(p
.root_name(), "//net");
1298 PATH_TEST_EQ(p
.root_directory(), "");
1299 PATH_TEST_EQ(p
.root_path().string(), "//net");
1300 BOOST_TEST(p
.has_root_path());
1301 BOOST_TEST(p
.has_root_name());
1302 BOOST_TEST(!p
.has_root_directory());
1303 BOOST_TEST(!p
.has_relative_path());
1304 #if BOOST_FILESYSTEM_VERSION == 3
1305 BOOST_TEST(p
.has_filename());
1307 BOOST_TEST(!p
.has_filename());
1309 BOOST_TEST(!p
.has_parent_path());
1310 BOOST_TEST(!p
.is_absolute());
1312 p
= q
= path("//net/");
1313 BOOST_TEST(p
.relative_path().string() == "");
1314 BOOST_TEST(p
.parent_path().string() == "//net");
1315 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1316 #if BOOST_FILESYSTEM_VERSION == 3
1317 BOOST_TEST(p
.filename() == "/");
1319 BOOST_TEST(p
.filename() == "");
1321 BOOST_TEST(p
.root_name() == "//net");
1322 BOOST_TEST(p
.root_directory() == "/");
1323 BOOST_TEST(p
.root_path().string() == "//net/");
1324 BOOST_TEST(p
.has_root_path());
1325 BOOST_TEST(p
.has_root_name());
1326 BOOST_TEST(p
.has_root_directory());
1327 BOOST_TEST(!p
.has_relative_path());
1328 #if BOOST_FILESYSTEM_VERSION == 3
1329 BOOST_TEST(p
.has_filename());
1331 BOOST_TEST(!p
.has_filename());
1333 BOOST_TEST(p
.has_parent_path());
1334 BOOST_TEST(p
.is_absolute());
1336 p
= q
= path("//net/foo");
1337 BOOST_TEST(p
.relative_path().string() == "foo");
1338 BOOST_TEST(p
.parent_path().string() == "//net/");
1339 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1340 BOOST_TEST(p
.filename() == "foo");
1341 BOOST_TEST(p
.root_name() == "//net");
1342 BOOST_TEST(p
.root_directory() == "/");
1343 BOOST_TEST(p
.root_path().string() == "//net/");
1344 BOOST_TEST(p
.has_root_path());
1345 BOOST_TEST(p
.has_root_name());
1346 BOOST_TEST(p
.has_root_directory());
1347 BOOST_TEST(p
.has_relative_path());
1348 BOOST_TEST(p
.has_filename());
1349 BOOST_TEST(p
.has_parent_path());
1350 BOOST_TEST(p
.is_absolute());
1352 p
= q
= path("//net///foo");
1353 PATH_TEST_EQ(p
.relative_path().string(), "foo");
1354 PATH_TEST_EQ(p
.parent_path().string(), "//net/");
1355 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1356 PATH_TEST_EQ(p
.filename(), "foo");
1357 PATH_TEST_EQ(p
.root_name(), "//net");
1358 PATH_TEST_EQ(p
.root_directory(), "/");
1359 PATH_TEST_EQ(p
.root_path().string(), "//net/");
1360 BOOST_TEST(p
.has_root_path());
1361 BOOST_TEST(p
.has_root_name());
1362 BOOST_TEST(p
.has_root_directory());
1363 BOOST_TEST(p
.has_relative_path());
1364 BOOST_TEST(p
.has_filename());
1365 BOOST_TEST(p
.has_parent_path());
1366 BOOST_TEST(p
.is_absolute());
1368 // ticket 2739, infinite recursion leading to stack overflow, was caused
1369 // by failure to handle this case correctly on Windows.
1371 PATH_TEST_EQ(p
.parent_path().string(), "");
1372 PATH_TEST_EQ(p
.filename(), ":");
1373 BOOST_TEST(!p
.has_parent_path());
1374 BOOST_TEST(p
.has_filename());
1377 // Windows specific tests
1378 if (platform
== "Windows")
1380 p
= q
= path("\\\\?\\");
1381 PATH_TEST_EQ(p
.relative_path().string(), "");
1382 PATH_TEST_EQ(p
.parent_path().string(), "");
1383 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1384 #if BOOST_FILESYSTEM_VERSION == 3
1385 PATH_TEST_EQ(p
.filename(), "\\\\?\\");
1386 PATH_TEST_EQ(p
.stem(), "\\\\?\\");
1388 PATH_TEST_EQ(p
.filename(), "");
1389 PATH_TEST_EQ(p
.stem(), "");
1391 PATH_TEST_EQ(p
.extension(), "");
1392 PATH_TEST_EQ(p
.root_name(), "\\\\?\\");
1393 PATH_TEST_EQ(p
.root_directory(), "");
1394 PATH_TEST_EQ(p
.root_path().string(), "\\\\?\\");
1395 BOOST_TEST(p
.has_root_path());
1396 BOOST_TEST(p
.has_root_name());
1397 BOOST_TEST(!p
.has_root_directory());
1398 BOOST_TEST(!p
.has_relative_path());
1399 #if BOOST_FILESYSTEM_VERSION == 3
1400 BOOST_TEST(p
.has_filename());
1401 BOOST_TEST(p
.has_stem());
1403 BOOST_TEST(!p
.has_filename());
1404 BOOST_TEST(!p
.has_stem());
1406 BOOST_TEST(!p
.has_extension());
1407 BOOST_TEST(!p
.has_parent_path());
1408 BOOST_TEST(!p
.is_absolute());
1410 p
= q
= path("\\\\.\\");
1411 PATH_TEST_EQ(p
.relative_path().string(), "");
1412 PATH_TEST_EQ(p
.parent_path().string(), "");
1413 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1414 #if BOOST_FILESYSTEM_VERSION == 3
1415 PATH_TEST_EQ(p
.filename(), "\\\\.\\");
1416 PATH_TEST_EQ(p
.stem(), "\\\\");
1417 PATH_TEST_EQ(p
.extension(), ".\\");
1419 PATH_TEST_EQ(p
.filename(), "");
1420 PATH_TEST_EQ(p
.stem(), "");
1421 PATH_TEST_EQ(p
.extension(), "");
1423 PATH_TEST_EQ(p
.root_name(), "\\\\.\\");
1424 PATH_TEST_EQ(p
.root_directory(), "");
1425 PATH_TEST_EQ(p
.root_path().string(), "\\\\.\\");
1426 BOOST_TEST(p
.has_root_path());
1427 BOOST_TEST(p
.has_root_name());
1428 BOOST_TEST(!p
.has_root_directory());
1429 BOOST_TEST(!p
.has_relative_path());
1430 #if BOOST_FILESYSTEM_VERSION == 3
1431 BOOST_TEST(p
.has_filename());
1432 BOOST_TEST(p
.has_stem());
1433 BOOST_TEST(p
.has_extension());
1435 BOOST_TEST(!p
.has_filename());
1436 BOOST_TEST(!p
.has_stem());
1437 BOOST_TEST(!p
.has_extension());
1439 BOOST_TEST(!p
.has_parent_path());
1440 BOOST_TEST(!p
.is_absolute());
1442 p
= q
= path("\\??\\");
1443 PATH_TEST_EQ(p
.relative_path().string(), "");
1444 PATH_TEST_EQ(p
.parent_path().string(), "");
1445 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1446 #if BOOST_FILESYSTEM_VERSION == 3
1447 PATH_TEST_EQ(p
.filename(), "\\??\\");
1448 PATH_TEST_EQ(p
.stem(), "\\??\\");
1450 PATH_TEST_EQ(p
.filename(), "");
1451 PATH_TEST_EQ(p
.stem(), "");
1453 PATH_TEST_EQ(p
.extension(), "");
1454 PATH_TEST_EQ(p
.root_name(), "\\??\\");
1455 PATH_TEST_EQ(p
.root_directory(), "");
1456 PATH_TEST_EQ(p
.root_path().string(), "\\??\\");
1457 BOOST_TEST(p
.has_root_path());
1458 BOOST_TEST(p
.has_root_name());
1459 BOOST_TEST(!p
.has_root_directory());
1460 BOOST_TEST(!p
.has_relative_path());
1461 #if BOOST_FILESYSTEM_VERSION == 3
1462 BOOST_TEST(p
.has_filename());
1463 BOOST_TEST(p
.has_stem());
1465 BOOST_TEST(!p
.has_filename());
1466 BOOST_TEST(!p
.has_stem());
1468 BOOST_TEST(!p
.has_extension());
1469 BOOST_TEST(!p
.has_parent_path());
1470 BOOST_TEST(!p
.is_absolute());
1473 PATH_TEST_EQ(p
.relative_path().string(), "");
1474 PATH_TEST_EQ(p
.parent_path().string(), "");
1475 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1476 #if BOOST_FILESYSTEM_VERSION == 3
1477 PATH_TEST_EQ(p
.filename(), "c:");
1479 PATH_TEST_EQ(p
.filename(), "");
1481 PATH_TEST_EQ(p
.root_name(), "c:");
1482 PATH_TEST_EQ(p
.root_directory(), "");
1483 PATH_TEST_EQ(p
.root_path().string(), "c:");
1484 BOOST_TEST(p
.has_root_path());
1485 BOOST_TEST(p
.has_root_name());
1486 BOOST_TEST(!p
.has_root_directory());
1487 BOOST_TEST(!p
.has_relative_path());
1488 #if BOOST_FILESYSTEM_VERSION == 3
1489 BOOST_TEST(p
.has_filename());
1491 BOOST_TEST(!p
.has_filename());
1493 BOOST_TEST(!p
.has_parent_path());
1494 BOOST_TEST(!p
.is_absolute());
1496 p
= q
= path("\\\\?\\c:");
1497 PATH_TEST_EQ(p
.relative_path().string(), "");
1498 PATH_TEST_EQ(p
.parent_path().string(), "");
1499 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1500 #if BOOST_FILESYSTEM_VERSION == 3
1501 PATH_TEST_EQ(p
.filename(), "\\\\?\\c:");
1503 PATH_TEST_EQ(p
.filename(), "");
1505 PATH_TEST_EQ(p
.root_name(), "\\\\?\\c:");
1506 PATH_TEST_EQ(p
.root_directory(), "");
1507 PATH_TEST_EQ(p
.root_path().string(), "\\\\?\\c:");
1508 BOOST_TEST(p
.has_root_path());
1509 BOOST_TEST(p
.has_root_name());
1510 BOOST_TEST(!p
.has_root_directory());
1511 BOOST_TEST(!p
.has_relative_path());
1512 #if BOOST_FILESYSTEM_VERSION == 3
1513 BOOST_TEST(p
.has_filename());
1515 BOOST_TEST(!p
.has_filename());
1517 BOOST_TEST(!p
.has_parent_path());
1518 BOOST_TEST(!p
.is_absolute());
1520 p
= q
= path("\\\\.\\c:");
1521 PATH_TEST_EQ(p
.relative_path().string(), "");
1522 PATH_TEST_EQ(p
.parent_path().string(), "");
1523 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1524 #if BOOST_FILESYSTEM_VERSION == 3
1525 PATH_TEST_EQ(p
.filename(), "\\\\.\\c:");
1527 PATH_TEST_EQ(p
.filename(), "");
1529 PATH_TEST_EQ(p
.root_name(), "\\\\.\\c:");
1530 PATH_TEST_EQ(p
.root_directory(), "");
1531 PATH_TEST_EQ(p
.root_path().string(), "\\\\.\\c:");
1532 BOOST_TEST(p
.has_root_path());
1533 BOOST_TEST(p
.has_root_name());
1534 BOOST_TEST(!p
.has_root_directory());
1535 BOOST_TEST(!p
.has_relative_path());
1536 #if BOOST_FILESYSTEM_VERSION == 3
1537 BOOST_TEST(p
.has_filename());
1539 BOOST_TEST(!p
.has_filename());
1541 BOOST_TEST(!p
.has_parent_path());
1542 BOOST_TEST(!p
.is_absolute());
1544 p
= q
= path("\\??\\c:");
1545 PATH_TEST_EQ(p
.relative_path().string(), "");
1546 PATH_TEST_EQ(p
.parent_path().string(), "");
1547 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1548 #if BOOST_FILESYSTEM_VERSION == 3
1549 PATH_TEST_EQ(p
.filename(), "\\??\\c:");
1551 PATH_TEST_EQ(p
.filename(), "");
1553 PATH_TEST_EQ(p
.root_name(), "\\??\\c:");
1554 PATH_TEST_EQ(p
.root_directory(), "");
1555 PATH_TEST_EQ(p
.root_path().string(), "\\??\\c:");
1556 BOOST_TEST(p
.has_root_path());
1557 BOOST_TEST(p
.has_root_name());
1558 BOOST_TEST(!p
.has_root_directory());
1559 BOOST_TEST(!p
.has_relative_path());
1560 #if BOOST_FILESYSTEM_VERSION == 3
1561 BOOST_TEST(p
.has_filename());
1563 BOOST_TEST(!p
.has_filename());
1565 BOOST_TEST(!p
.has_parent_path());
1566 BOOST_TEST(!p
.is_absolute());
1568 p
= q
= path("c:foo");
1569 PATH_TEST_EQ(p
.relative_path().string(), "foo");
1570 PATH_TEST_EQ(p
.parent_path().string(), "c:");
1571 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1572 PATH_TEST_EQ(p
.filename(), "foo");
1573 PATH_TEST_EQ(p
.root_name(), "c:");
1574 PATH_TEST_EQ(p
.root_directory(), "");
1575 PATH_TEST_EQ(p
.root_path().string(), "c:");
1576 BOOST_TEST(p
.has_root_path());
1577 BOOST_TEST(p
.has_root_name());
1578 BOOST_TEST(!p
.has_root_directory());
1579 BOOST_TEST(p
.has_relative_path());
1580 BOOST_TEST(p
.has_filename());
1581 BOOST_TEST(p
.has_parent_path());
1582 BOOST_TEST(!p
.is_absolute());
1584 p
= q
= path("\\\\?\\c:foo");
1585 PATH_TEST_EQ(p
.relative_path().string(), "foo");
1586 PATH_TEST_EQ(p
.parent_path().string(), "\\\\?\\c:");
1587 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1588 PATH_TEST_EQ(p
.filename(), "foo");
1589 PATH_TEST_EQ(p
.root_name(), "\\\\?\\c:");
1590 PATH_TEST_EQ(p
.root_directory(), "");
1591 PATH_TEST_EQ(p
.root_path().string(), "\\\\?\\c:");
1592 BOOST_TEST(p
.has_root_path());
1593 BOOST_TEST(p
.has_root_name());
1594 BOOST_TEST(!p
.has_root_directory());
1595 BOOST_TEST(p
.has_relative_path());
1596 BOOST_TEST(p
.has_filename());
1597 BOOST_TEST(p
.has_parent_path());
1598 BOOST_TEST(!p
.is_absolute());
1600 p
= q
= path("\\\\.\\c:foo");
1601 PATH_TEST_EQ(p
.relative_path().string(), "foo");
1602 PATH_TEST_EQ(p
.parent_path().string(), "\\\\.\\c:");
1603 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1604 PATH_TEST_EQ(p
.filename(), "foo");
1605 PATH_TEST_EQ(p
.root_name(), "\\\\.\\c:");
1606 PATH_TEST_EQ(p
.root_directory(), "");
1607 PATH_TEST_EQ(p
.root_path().string(), "\\\\.\\c:");
1608 BOOST_TEST(p
.has_root_path());
1609 BOOST_TEST(p
.has_root_name());
1610 BOOST_TEST(!p
.has_root_directory());
1611 BOOST_TEST(p
.has_relative_path());
1612 BOOST_TEST(p
.has_filename());
1613 BOOST_TEST(p
.has_parent_path());
1614 BOOST_TEST(!p
.is_absolute());
1616 p
= q
= path("\\??\\c:foo");
1617 PATH_TEST_EQ(p
.relative_path().string(), "foo");
1618 PATH_TEST_EQ(p
.parent_path().string(), "\\??\\c:");
1619 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1620 PATH_TEST_EQ(p
.filename(), "foo");
1621 PATH_TEST_EQ(p
.root_name(), "\\??\\c:");
1622 PATH_TEST_EQ(p
.root_directory(), "");
1623 PATH_TEST_EQ(p
.root_path().string(), "\\??\\c:");
1624 BOOST_TEST(p
.has_root_path());
1625 BOOST_TEST(p
.has_root_name());
1626 BOOST_TEST(!p
.has_root_directory());
1627 BOOST_TEST(p
.has_relative_path());
1628 BOOST_TEST(p
.has_filename());
1629 BOOST_TEST(p
.has_parent_path());
1630 BOOST_TEST(!p
.is_absolute());
1632 p
= q
= path("c:/");
1633 PATH_TEST_EQ(p
.relative_path().string(), "");
1634 PATH_TEST_EQ(p
.parent_path().string(), "c:");
1635 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1636 #if BOOST_FILESYSTEM_VERSION == 3
1637 PATH_TEST_EQ(p
.filename(), "/");
1639 PATH_TEST_EQ(p
.filename(), "");
1641 PATH_TEST_EQ(p
.root_name(), "c:");
1642 PATH_TEST_EQ(p
.root_directory(), "/");
1643 PATH_TEST_EQ(p
.root_path().string(), "c:/");
1644 BOOST_TEST(p
.has_root_path());
1645 BOOST_TEST(p
.has_root_name());
1646 BOOST_TEST(p
.has_root_directory());
1647 BOOST_TEST(!p
.has_relative_path());
1648 #if BOOST_FILESYSTEM_VERSION == 3
1649 BOOST_TEST(p
.has_filename());
1651 BOOST_TEST(!p
.has_filename());
1653 BOOST_TEST(p
.has_parent_path());
1654 BOOST_TEST(p
.is_absolute());
1656 p
= q
= path("\\\\?\\c:\\");
1657 PATH_TEST_EQ(p
.relative_path().string(), "");
1658 PATH_TEST_EQ(p
.parent_path().string(), "\\\\?\\c:");
1659 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1660 #if BOOST_FILESYSTEM_VERSION == 3
1661 PATH_TEST_EQ(p
.filename(), "\\");
1663 PATH_TEST_EQ(p
.filename(), "");
1665 PATH_TEST_EQ(p
.root_name(), "\\\\?\\c:");
1666 PATH_TEST_EQ(p
.root_directory(), "\\");
1667 PATH_TEST_EQ(p
.root_path().string(), "\\\\?\\c:\\");
1668 BOOST_TEST(p
.has_root_path());
1669 BOOST_TEST(p
.has_root_name());
1670 BOOST_TEST(p
.has_root_directory());
1671 BOOST_TEST(!p
.has_relative_path());
1672 #if BOOST_FILESYSTEM_VERSION == 3
1673 BOOST_TEST(p
.has_filename());
1675 BOOST_TEST(!p
.has_filename());
1677 BOOST_TEST(p
.has_parent_path());
1678 BOOST_TEST(p
.is_absolute());
1680 p
= q
= path("\\\\.\\c:\\");
1681 PATH_TEST_EQ(p
.relative_path().string(), "");
1682 PATH_TEST_EQ(p
.parent_path().string(), "\\\\.\\c:");
1683 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1684 #if BOOST_FILESYSTEM_VERSION == 3
1685 PATH_TEST_EQ(p
.filename(), "\\");
1687 PATH_TEST_EQ(p
.filename(), "");
1689 PATH_TEST_EQ(p
.root_name(), "\\\\.\\c:");
1690 PATH_TEST_EQ(p
.root_directory(), "\\");
1691 PATH_TEST_EQ(p
.root_path().string(), "\\\\.\\c:\\");
1692 BOOST_TEST(p
.has_root_path());
1693 BOOST_TEST(p
.has_root_name());
1694 BOOST_TEST(p
.has_root_directory());
1695 BOOST_TEST(!p
.has_relative_path());
1696 #if BOOST_FILESYSTEM_VERSION == 3
1697 BOOST_TEST(p
.has_filename());
1699 BOOST_TEST(!p
.has_filename());
1701 BOOST_TEST(p
.has_parent_path());
1702 BOOST_TEST(p
.is_absolute());
1704 p
= q
= path("\\??\\c:\\");
1705 PATH_TEST_EQ(p
.relative_path().string(), "");
1706 PATH_TEST_EQ(p
.parent_path().string(), "\\??\\c:");
1707 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1708 #if BOOST_FILESYSTEM_VERSION == 3
1709 PATH_TEST_EQ(p
.filename(), "\\");
1711 PATH_TEST_EQ(p
.filename(), "");
1713 PATH_TEST_EQ(p
.root_name(), "\\??\\c:");
1714 PATH_TEST_EQ(p
.root_directory(), "\\");
1715 PATH_TEST_EQ(p
.root_path().string(), "\\??\\c:\\");
1716 BOOST_TEST(p
.has_root_path());
1717 BOOST_TEST(p
.has_root_name());
1718 BOOST_TEST(p
.has_root_directory());
1719 BOOST_TEST(!p
.has_relative_path());
1720 #if BOOST_FILESYSTEM_VERSION == 3
1721 BOOST_TEST(p
.has_filename());
1723 BOOST_TEST(!p
.has_filename());
1725 BOOST_TEST(p
.has_parent_path());
1726 BOOST_TEST(p
.is_absolute());
1728 p
= q
= path("c:..");
1729 PATH_TEST_EQ(p
.relative_path().string(), "..");
1730 PATH_TEST_EQ(p
.parent_path().string(), "c:");
1731 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1732 PATH_TEST_EQ(p
.filename(), "..");
1733 PATH_TEST_EQ(p
.root_name(), "c:");
1734 PATH_TEST_EQ(p
.root_directory(), "");
1735 PATH_TEST_EQ(p
.root_path().string(), "c:");
1736 BOOST_TEST(p
.has_root_path());
1737 BOOST_TEST(p
.has_root_name());
1738 BOOST_TEST(!p
.has_root_directory());
1739 BOOST_TEST(p
.has_relative_path());
1740 BOOST_TEST(p
.has_filename());
1741 BOOST_TEST(p
.has_parent_path());
1742 BOOST_TEST(!p
.is_absolute());
1744 p
= q
= path("c:/foo");
1745 PATH_TEST_EQ(p
.relative_path().string(), "foo");
1746 PATH_TEST_EQ(p
.parent_path().string(), "c:/");
1747 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1748 PATH_TEST_EQ(p
.filename(), "foo");
1749 PATH_TEST_EQ(p
.root_name(), "c:");
1750 PATH_TEST_EQ(p
.root_directory(), "/");
1751 PATH_TEST_EQ(p
.root_path().string(), "c:/");
1752 BOOST_TEST(p
.has_root_path());
1753 BOOST_TEST(p
.has_root_name());
1754 BOOST_TEST(p
.has_root_directory());
1755 BOOST_TEST(p
.has_relative_path());
1756 BOOST_TEST(p
.has_filename());
1757 BOOST_TEST(p
.has_parent_path());
1758 BOOST_TEST(p
.is_absolute());
1760 p
= q
= path("c://foo");
1761 PATH_TEST_EQ(p
.relative_path().string(), "foo");
1762 PATH_TEST_EQ(p
.parent_path().string(), "c:/");
1763 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1764 PATH_TEST_EQ(p
.filename(), "foo");
1765 PATH_TEST_EQ(p
.root_name(), "c:");
1766 PATH_TEST_EQ(p
.root_directory(), "/");
1767 PATH_TEST_EQ(p
.root_path().string(), "c:/");
1768 BOOST_TEST(p
.has_root_path());
1769 BOOST_TEST(p
.has_root_name());
1770 BOOST_TEST(p
.has_root_directory());
1771 BOOST_TEST(p
.has_relative_path());
1772 BOOST_TEST(p
.has_filename());
1773 BOOST_TEST(p
.has_parent_path());
1774 BOOST_TEST(p
.is_absolute());
1776 p
= q
= path("c:\\foo\\bar");
1777 PATH_TEST_EQ(p
.relative_path().string(), "foo\\bar");
1778 PATH_TEST_EQ(p
.parent_path().string(), "c:\\foo");
1779 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1780 PATH_TEST_EQ(p
.filename(), "bar");
1781 PATH_TEST_EQ(p
.root_name(), "c:");
1782 PATH_TEST_EQ(p
.root_directory(), "\\");
1783 PATH_TEST_EQ(p
.root_path().string(), "c:\\");
1784 BOOST_TEST(p
.has_root_path());
1785 BOOST_TEST(p
.has_root_name());
1786 BOOST_TEST(p
.has_root_directory());
1787 BOOST_TEST(p
.has_relative_path());
1788 BOOST_TEST(p
.has_filename());
1789 BOOST_TEST(p
.has_parent_path());
1790 BOOST_TEST(p
.is_absolute());
1792 p
= q
= path("\\\\?\\c:\\foo\\bar");
1793 PATH_TEST_EQ(p
.relative_path().string(), "foo\\bar");
1794 PATH_TEST_EQ(p
.parent_path().string(), "\\\\?\\c:\\foo");
1795 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1796 PATH_TEST_EQ(p
.filename(), "bar");
1797 PATH_TEST_EQ(p
.root_name(), "\\\\?\\c:");
1798 PATH_TEST_EQ(p
.root_directory(), "\\");
1799 PATH_TEST_EQ(p
.root_path().string(), "\\\\?\\c:\\");
1800 BOOST_TEST(p
.has_root_path());
1801 BOOST_TEST(p
.has_root_name());
1802 BOOST_TEST(p
.has_root_directory());
1803 BOOST_TEST(p
.has_relative_path());
1804 BOOST_TEST(p
.has_filename());
1805 BOOST_TEST(p
.has_parent_path());
1806 BOOST_TEST(p
.is_absolute());
1808 p
= q
= path("\\\\.\\c:\\foo\\bar");
1809 PATH_TEST_EQ(p
.relative_path().string(), "foo\\bar");
1810 PATH_TEST_EQ(p
.parent_path().string(), "\\\\.\\c:\\foo");
1811 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1812 PATH_TEST_EQ(p
.filename(), "bar");
1813 PATH_TEST_EQ(p
.root_name(), "\\\\.\\c:");
1814 PATH_TEST_EQ(p
.root_directory(), "\\");
1815 PATH_TEST_EQ(p
.root_path().string(), "\\\\.\\c:\\");
1816 BOOST_TEST(p
.has_root_path());
1817 BOOST_TEST(p
.has_root_name());
1818 BOOST_TEST(p
.has_root_directory());
1819 BOOST_TEST(p
.has_relative_path());
1820 BOOST_TEST(p
.has_filename());
1821 BOOST_TEST(p
.has_parent_path());
1822 BOOST_TEST(p
.is_absolute());
1824 p
= q
= path("\\??\\c:\\foo\\bar");
1825 PATH_TEST_EQ(p
.relative_path().string(), "foo\\bar");
1826 PATH_TEST_EQ(p
.parent_path().string(), "\\??\\c:\\foo");
1827 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1828 PATH_TEST_EQ(p
.filename(), "bar");
1829 PATH_TEST_EQ(p
.root_name(), "\\??\\c:");
1830 PATH_TEST_EQ(p
.root_directory(), "\\");
1831 PATH_TEST_EQ(p
.root_path().string(), "\\??\\c:\\");
1832 BOOST_TEST(p
.has_root_path());
1833 BOOST_TEST(p
.has_root_name());
1834 BOOST_TEST(p
.has_root_directory());
1835 BOOST_TEST(p
.has_relative_path());
1836 BOOST_TEST(p
.has_filename());
1837 BOOST_TEST(p
.has_parent_path());
1838 BOOST_TEST(p
.is_absolute());
1840 p
= q
= path("prn:");
1841 PATH_TEST_EQ(p
.relative_path().string(), "");
1842 PATH_TEST_EQ(p
.parent_path().string(), "");
1843 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1844 #if BOOST_FILESYSTEM_VERSION == 3
1845 PATH_TEST_EQ(p
.filename(), "prn:");
1847 PATH_TEST_EQ(p
.filename(), "");
1849 PATH_TEST_EQ(p
.root_name(), "prn:");
1850 PATH_TEST_EQ(p
.root_directory(), "");
1851 PATH_TEST_EQ(p
.root_path().string(), "prn:");
1852 BOOST_TEST(p
.has_root_path());
1853 BOOST_TEST(p
.has_root_name());
1854 BOOST_TEST(!p
.has_root_directory());
1855 BOOST_TEST(!p
.has_relative_path());
1856 #if BOOST_FILESYSTEM_VERSION == 3
1857 BOOST_TEST(p
.has_filename());
1859 BOOST_TEST(!p
.has_filename());
1861 BOOST_TEST(!p
.has_parent_path());
1862 BOOST_TEST(!p
.is_absolute());
1864 p
= q
= path("\\\\net\\\\\\foo");
1865 PATH_TEST_EQ(p
.relative_path().string(), "foo");
1866 PATH_TEST_EQ(p
.parent_path().string(), "\\\\net\\");
1867 PATH_TEST_EQ(q
.remove_filename().string(), p
.parent_path().string());
1868 PATH_TEST_EQ(p
.filename(), "foo");
1869 PATH_TEST_EQ(p
.root_name(), "\\\\net");
1870 PATH_TEST_EQ(p
.root_directory(), "\\");
1871 PATH_TEST_EQ(p
.root_path().string(), "\\\\net\\");
1872 BOOST_TEST(p
.has_root_path());
1873 BOOST_TEST(p
.has_root_name());
1874 BOOST_TEST(p
.has_root_directory());
1875 BOOST_TEST(p
.has_relative_path());
1876 BOOST_TEST(p
.has_filename());
1877 BOOST_TEST(p
.has_parent_path());
1878 BOOST_TEST(p
.is_absolute());
1884 PATH_TEST_EQ(p
.parent_path().string(), "");
1885 PATH_TEST_EQ(p
.filename(), "c:");
1886 BOOST_TEST(!p
.has_parent_path());
1887 BOOST_TEST(p
.has_filename());
1890 PATH_TEST_EQ(p
.parent_path().string(), "");
1891 PATH_TEST_EQ(p
.filename(), "cc:");
1892 BOOST_TEST(!p
.has_parent_path());
1893 BOOST_TEST(p
.has_filename());
1895 PATH_TEST_EQ(path("/foo/bar/"), "/foo/bar/");
1896 PATH_TEST_EQ(path("//foo//bar//"), "//foo//bar//");
1897 PATH_TEST_EQ(path("///foo///bar///"), "///foo///bar///");
1899 p
= path("/usr/local/bin:/usr/bin:/bin");
1900 BOOST_TEST(p
.string() == "/usr/local/bin:/usr/bin:/bin");
1904 // composition_tests ----------------------------------------------------------------//
1906 void composition_tests()
1908 std::cout
<< "composition_tests..." << std::endl
;
1911 // construction_tests ---------------------------------------------------------------//
1913 void construction_tests()
1915 std::cout
<< "construction_tests..." << std::endl
;
1917 PATH_TEST_EQ("", "");
1919 PATH_TEST_EQ("foo", "foo");
1920 PATH_TEST_EQ("f", "f");
1922 PATH_TEST_EQ("foo/", "foo/");
1923 PATH_TEST_EQ("f/", "f/");
1924 PATH_TEST_EQ("foo/..", "foo/..");
1925 PATH_TEST_EQ("foo/../", "foo/../");
1926 PATH_TEST_EQ("foo/bar/../..", "foo/bar/../..");
1927 PATH_TEST_EQ("foo/bar/../../", "foo/bar/../../");
1928 PATH_TEST_EQ("/", "/");
1929 PATH_TEST_EQ("/f", "/f");
1931 PATH_TEST_EQ("/foo", "/foo");
1932 PATH_TEST_EQ("/foo/bar/", "/foo/bar/");
1933 PATH_TEST_EQ("//foo//bar//", "//foo//bar//");
1934 PATH_TEST_EQ("///foo///bar///", "///foo///bar///");
1935 PATH_TEST_EQ("\\/foo\\/bar\\/", "\\/foo\\/bar\\/");
1936 PATH_TEST_EQ("\\//foo\\//bar\\//", "\\//foo\\//bar\\//");
1938 if (platform
== "Windows")
1940 PATH_TEST_EQ(path("c:") / "foo", "c:foo");
1941 PATH_TEST_EQ(path("c:") / "/foo", "c:/foo");
1943 PATH_TEST_EQ("\\foo\\bar\\", "\\foo\\bar\\");
1944 PATH_TEST_EQ("\\\\foo\\\\bar\\\\", "\\\\foo\\\\bar\\\\");
1945 PATH_TEST_EQ("\\\\\\foo\\\\\\bar\\\\\\", "\\\\\\foo\\\\\\bar\\\\\\");
1947 PATH_TEST_EQ("\\", "\\");
1948 PATH_TEST_EQ("\\f", "\\f");
1949 PATH_TEST_EQ("\\foo", "\\foo");
1950 PATH_TEST_EQ("foo\\bar", "foo\\bar");
1951 PATH_TEST_EQ("foo bar", "foo bar");
1952 PATH_TEST_EQ("c:", "c:");
1953 PATH_TEST_EQ("c:/", "c:/");
1954 PATH_TEST_EQ("c:.", "c:.");
1955 PATH_TEST_EQ("c:./foo", "c:./foo");
1956 PATH_TEST_EQ("c:.\\foo", "c:.\\foo");
1957 PATH_TEST_EQ("c:..", "c:..");
1958 PATH_TEST_EQ("c:/.", "c:/.");
1959 PATH_TEST_EQ("c:/..", "c:/..");
1960 PATH_TEST_EQ("c:/../", "c:/../");
1961 PATH_TEST_EQ("c:\\..\\", "c:\\..\\");
1962 PATH_TEST_EQ("c:/../..", "c:/../..");
1963 PATH_TEST_EQ("c:/../foo", "c:/../foo");
1964 PATH_TEST_EQ("c:\\..\\foo", "c:\\..\\foo");
1965 PATH_TEST_EQ("c:../foo", "c:../foo");
1966 PATH_TEST_EQ("c:..\\foo", "c:..\\foo");
1967 PATH_TEST_EQ("c:/../../foo", "c:/../../foo");
1968 PATH_TEST_EQ("c:\\..\\..\\foo", "c:\\..\\..\\foo");
1969 PATH_TEST_EQ("c:foo/..", "c:foo/..");
1970 PATH_TEST_EQ("c:/foo/..", "c:/foo/..");
1971 PATH_TEST_EQ("c:/..foo", "c:/..foo");
1972 PATH_TEST_EQ("c:foo", "c:foo");
1973 PATH_TEST_EQ("c:/foo", "c:/foo");
1974 PATH_TEST_EQ("\\\\netname", "\\\\netname");
1975 PATH_TEST_EQ("\\\\netname\\", "\\\\netname\\");
1976 PATH_TEST_EQ("\\\\netname\\foo", "\\\\netname\\foo");
1977 PATH_TEST_EQ("c:/foo", "c:/foo");
1978 PATH_TEST_EQ("prn:", "prn:");
1984 PATH_TEST_EQ("foo/bar", "foo/bar");
1985 PATH_TEST_EQ("a/b", "a/b"); // probe for length effects
1986 PATH_TEST_EQ("..", "..");
1987 PATH_TEST_EQ("../..", "../..");
1988 PATH_TEST_EQ("/..", "/..");
1989 PATH_TEST_EQ("/../..", "/../..");
1990 PATH_TEST_EQ("../foo", "../foo");
1991 PATH_TEST_EQ("foo/..", "foo/..");
1992 PATH_TEST_EQ("foo/..bar", "foo/..bar");
1993 PATH_TEST_EQ("../f", "../f");
1994 PATH_TEST_EQ("/../f", "/../f");
1995 PATH_TEST_EQ("f/..", "f/..");
1996 PATH_TEST_EQ("foo/../..", "foo/../..");
1997 PATH_TEST_EQ("foo/../../..", "foo/../../..");
1998 PATH_TEST_EQ("foo/../bar", "foo/../bar");
1999 PATH_TEST_EQ("foo/bar/..", "foo/bar/..");
2000 PATH_TEST_EQ("foo/bar/../..", "foo/bar/../..");
2001 PATH_TEST_EQ("foo/bar/../blah", "foo/bar/../blah");
2002 PATH_TEST_EQ("f/../b", "f/../b");
2003 PATH_TEST_EQ("f/b/..", "f/b/..");
2004 PATH_TEST_EQ("f/b/../a", "f/b/../a");
2005 PATH_TEST_EQ("foo/bar/blah/../..", "foo/bar/blah/../..");
2006 PATH_TEST_EQ("foo/bar/blah/../../bletch", "foo/bar/blah/../../bletch");
2007 PATH_TEST_EQ("...", "...");
2008 PATH_TEST_EQ("....", "....");
2009 PATH_TEST_EQ("foo/...", "foo/...");
2010 PATH_TEST_EQ("abc.", "abc.");
2011 PATH_TEST_EQ("abc..", "abc..");
2012 PATH_TEST_EQ("foo/abc.", "foo/abc.");
2013 PATH_TEST_EQ("foo/abc..", "foo/abc..");
2015 PATH_TEST_EQ(".abc", ".abc");
2016 PATH_TEST_EQ("a.c", "a.c");
2017 PATH_TEST_EQ("..abc", "..abc");
2018 PATH_TEST_EQ("a..c", "a..c");
2019 PATH_TEST_EQ("foo/.abc", "foo/.abc");
2020 PATH_TEST_EQ("foo/a.c", "foo/a.c");
2021 PATH_TEST_EQ("foo/..abc", "foo/..abc");
2022 PATH_TEST_EQ("foo/a..c", "foo/a..c");
2024 PATH_TEST_EQ(".", ".");
2025 PATH_TEST_EQ("./foo", "./foo");
2026 PATH_TEST_EQ("./..", "./..");
2027 PATH_TEST_EQ("./../foo", "./../foo");
2028 PATH_TEST_EQ("foo/.", "foo/.");
2029 PATH_TEST_EQ("../.", "../.");
2030 PATH_TEST_EQ("./.", "./.");
2031 PATH_TEST_EQ("././.", "././.");
2032 PATH_TEST_EQ("./foo/.", "./foo/.");
2033 PATH_TEST_EQ("foo/./bar", "foo/./bar");
2034 PATH_TEST_EQ("foo/./.", "foo/./.");
2035 PATH_TEST_EQ("foo/./..", "foo/./..");
2036 PATH_TEST_EQ("foo/./../bar", "foo/./../bar");
2037 PATH_TEST_EQ("foo/../.", "foo/../.");
2038 PATH_TEST_EQ("././..", "././..");
2039 PATH_TEST_EQ("./../.", "./../.");
2040 PATH_TEST_EQ(".././.", ".././.");
2043 // append_tests --------------------------------------------------------------------//
2045 #define APPEND_TEST(pth, appnd, expected)\
2048 const std::string s(appnd);\
2049 PATH_TEST_EQ(p / appnd, expected);\
2050 PATH_TEST_EQ((p / path(s)).string(), expected);\
2051 PATH_TEST_EQ((p / s.c_str()).string(), expected);\
2052 PATH_TEST_EQ((p / s).string(), expected);\
2055 PATH_TEST_EQ(p1, expected);\
2057 p2 /= derived_from_path(appnd);\
2058 PATH_TEST_EQ(p2, expected);\
2060 p3 /= convertible_to_path(appnd);\
2061 PATH_TEST_EQ(p3, expected);\
2063 p4.append(s.begin(), s.end());\
2064 PATH_TEST_EQ(p4.string(), expected);\
2069 std::cout
<< "append_tests..." << std::endl
;
2071 // There are many control paths to be exercised, since empty paths and arguments,
2072 // paths with trailing separators, arguments with leading separators, with or without
2073 // other characters being present, are all separate cases that need to be tested.
2074 // Furthermore, some of the code to be tested is specific to argument categories,
2075 // so that results in further permutations to be tested.
2077 //// code to generate test cases
2079 //// expected results must be checked by hand
2080 //// "foo\bar" expected result must be edited by hand and moved for Windows/POSIX
2082 //const char* x[] = { "", "/", "foo", "foo/" };
2083 //const char* y[] = { "", "/", "bar", "/bar" };
2085 //for (int i = 0; i < sizeof(x)/sizeof(char*); ++i)
2086 // for (int j = 0; j < sizeof(y)/sizeof(char*); ++j)
2088 // std::cout << " APPEND_TEST(\"" << x[i] << "\", \"" << y[j] << "\", \""
2089 // << path(x[i]) / y[j] << "\");\n";
2092 APPEND_TEST("", "", "");
2093 APPEND_TEST("", "/", "/");
2094 APPEND_TEST("", "bar", "bar");
2095 APPEND_TEST("", "/bar", "/bar");
2097 APPEND_TEST("/", "", "/");
2098 #if BOOST_FILESYSTEM_VERSION == 3
2099 APPEND_TEST("/", "/", "//");
2101 APPEND_TEST("/", "/", "/");
2103 APPEND_TEST("/", "bar", "/bar");
2104 #if BOOST_FILESYSTEM_VERSION == 3
2105 APPEND_TEST("/", "/bar", "//bar");
2107 APPEND_TEST("/", "/bar", "/bar");
2110 #if BOOST_FILESYSTEM_VERSION == 3
2111 APPEND_TEST("foo", "/", "foo/");
2113 APPEND_TEST("foo", "/", "/");
2115 #if BOOST_FILESYSTEM_VERSION == 3
2116 APPEND_TEST("foo", "/bar", "foo/bar");
2118 APPEND_TEST("foo", "/bar", "/bar");
2121 APPEND_TEST("foo/", "", "foo/");
2122 #if BOOST_FILESYSTEM_VERSION == 3
2123 APPEND_TEST("foo/", "/", "foo//");
2125 APPEND_TEST("foo/", "/", "/");
2127 APPEND_TEST("foo/", "bar", "foo/bar");
2129 if (platform
== "Windows")
2131 #if BOOST_FILESYSTEM_VERSION == 3
2132 APPEND_TEST("foo", "", "foo");
2134 APPEND_TEST("foo", "", "foo\\");
2136 APPEND_TEST("foo", "bar", "foo\\bar");
2138 #if BOOST_FILESYSTEM_VERSION == 3
2139 APPEND_TEST("foo\\", "\\bar", "foo\\\\bar");
2141 APPEND_TEST("foo\\", "\\bar", "\\bar");
2144 // hand created test case specific to Windows
2145 APPEND_TEST("c:", "bar", "c:bar");
2149 #if BOOST_FILESYSTEM_VERSION == 3
2150 APPEND_TEST("foo", "", "foo");
2152 APPEND_TEST("foo", "", "foo/");
2154 APPEND_TEST("foo", "bar", "foo/bar");
2170 BOOST_TEST_EQ(p6819
, path("ab"));
2173 // concat_tests --------------------------------------------------------------------//
2175 #define CONCAT_TEST(pth, appnd, expected)\
2178 const std::string s(appnd);\
2181 PATH_TEST_EQ(p1.string(), expected);\
2184 PATH_TEST_EQ(p2.string(), expected);\
2187 PATH_TEST_EQ(p3.string(), expected);\
2190 PATH_TEST_EQ(p4.string(), expected);\
2192 p5 += derived_from_path(appnd);\
2193 PATH_TEST_EQ(p5, expected);\
2195 p6 += convertible_to_path(appnd);\
2196 PATH_TEST_EQ(p6, expected);\
2198 p7.concat(s.begin(), s.end());\
2199 PATH_TEST_EQ(p7.string(), expected);\
2204 std::cout
<< "concat_tests..." << std::endl
;
2206 CONCAT_TEST("", "", "");
2207 CONCAT_TEST("", "/", "/");
2208 CONCAT_TEST("", "bar", "bar");
2209 CONCAT_TEST("", "/bar", "/bar");
2211 CONCAT_TEST("/", "", "/");
2212 CONCAT_TEST("/", "/", "//");
2213 CONCAT_TEST("/", "bar", "/bar");
2214 CONCAT_TEST("/", "/bar", "//bar");
2216 CONCAT_TEST("foo", "/", "foo/");
2217 CONCAT_TEST("foo", "/bar", "foo/bar");
2219 CONCAT_TEST("foo/", "", "foo/");
2220 CONCAT_TEST("foo/", "/", "foo//");
2221 CONCAT_TEST("foo/", "bar", "foo/bar");
2223 CONCAT_TEST("foo", "", "foo");
2224 CONCAT_TEST("foo", "bar", "foobar");
2225 CONCAT_TEST("foo\\", "\\bar", "foo\\\\bar");
2226 CONCAT_TEST("c:", "bar", "c:bar");
2229 // self_assign_append_concat_tests -------------------------------------------------//
2231 void self_assign_append_concat_tests()
2233 std::cout
<< "self_assign_append_concat_tests..." << std::endl
;
2238 PATH_TEST_EQ(p
= p
, "snafubar");
2242 PATH_TEST_EQ(p
, "snafubar");
2245 p
.assign(p
.c_str(), path::codecvt());
2246 PATH_TEST_EQ(p
, "snafubar");
2249 PATH_TEST_EQ(p
= p
.c_str() + 5, "bar");
2252 PATH_TEST_EQ(p
.assign(p
.c_str() + 5, p
.c_str() + 7), "ba");
2256 PATH_TEST_EQ(p
, "snafubar" BOOST_DIR_SEP
"snafubar");
2260 PATH_TEST_EQ(p
, "snafubar" BOOST_DIR_SEP
"snafubar");
2263 p
.append(p
.c_str(), path::codecvt());
2264 PATH_TEST_EQ(p
, "snafubar" BOOST_DIR_SEP
"snafubar");
2267 PATH_TEST_EQ(p
.append(p
.c_str() + 5, p
.c_str() + 7), "snafubar" BOOST_DIR_SEP
"ba");
2271 PATH_TEST_EQ(p
, "snafubarsnafubar");
2275 PATH_TEST_EQ(p
, "snafubarsnafubar");
2278 p
.concat(p
.c_str(), path::codecvt());
2279 PATH_TEST_EQ(p
, "snafubarsnafubar");
2282 PATH_TEST_EQ(p
.concat(p
.c_str() + 5, p
.c_str() + 7), "snafubarba");
2285 // name_function_tests -------------------------------------------------------------//
2287 void name_function_tests()
2289 std::cout
<< "name_function_tests..." << std::endl
;
2291 BOOST_TEST(fs::portable_posix_name(std::string("x")));
2292 BOOST_TEST(fs::windows_name(std::string("x")));
2293 BOOST_TEST(fs::portable_name(std::string("x")));
2294 BOOST_TEST(fs::portable_directory_name(std::string("x")));
2295 BOOST_TEST(fs::portable_file_name(std::string("x")));
2297 BOOST_TEST(fs::portable_posix_name(std::string(".")));
2298 BOOST_TEST(fs::windows_name(std::string(".")));
2299 BOOST_TEST(fs::portable_name(std::string(".")));
2300 BOOST_TEST(fs::portable_directory_name(std::string(".")));
2301 BOOST_TEST(!fs::portable_file_name(std::string(".")));
2303 BOOST_TEST(fs::portable_posix_name(std::string("..")));
2304 BOOST_TEST(fs::windows_name(std::string("..")));
2305 BOOST_TEST(fs::portable_name(std::string("..")));
2306 BOOST_TEST(fs::portable_directory_name(std::string("..")));
2307 BOOST_TEST(!fs::portable_file_name(std::string("..")));
2309 BOOST_TEST(!fs::native(std::string("")));
2310 BOOST_TEST(!fs::portable_posix_name(std::string("")));
2311 BOOST_TEST(!fs::windows_name(std::string("")));
2312 BOOST_TEST(!fs::portable_name(std::string("")));
2313 BOOST_TEST(!fs::portable_directory_name(std::string("")));
2314 BOOST_TEST(!fs::portable_file_name(std::string("")));
2316 BOOST_TEST(!fs::native(std::string(" ")));
2317 BOOST_TEST(!fs::portable_posix_name(std::string(" ")));
2318 BOOST_TEST(!fs::windows_name(std::string(" ")));
2319 BOOST_TEST(!fs::portable_name(std::string(" ")));
2320 BOOST_TEST(!fs::portable_directory_name(std::string(" ")));
2321 BOOST_TEST(!fs::portable_file_name(std::string(" ")));
2323 BOOST_TEST(!fs::portable_posix_name(std::string(":")));
2324 BOOST_TEST(!fs::windows_name(std::string(":")));
2325 BOOST_TEST(!fs::portable_name(std::string(":")));
2326 BOOST_TEST(!fs::portable_directory_name(std::string(":")));
2327 BOOST_TEST(!fs::portable_file_name(std::string(":")));
2329 BOOST_TEST(fs::portable_posix_name(std::string("-")));
2330 BOOST_TEST(fs::windows_name(std::string("-")));
2331 BOOST_TEST(!fs::portable_name(std::string("-")));
2332 BOOST_TEST(!fs::portable_directory_name(std::string("-")));
2333 BOOST_TEST(!fs::portable_file_name(std::string("-")));
2335 BOOST_TEST(!fs::portable_posix_name(std::string("foo bar")));
2336 BOOST_TEST(fs::windows_name(std::string("foo bar")));
2337 BOOST_TEST(!fs::windows_name(std::string(" bar")));
2338 BOOST_TEST(!fs::windows_name(std::string("foo ")));
2339 BOOST_TEST(!fs::portable_name(std::string("foo bar")));
2340 BOOST_TEST(!fs::portable_directory_name(std::string("foo bar")));
2341 BOOST_TEST(!fs::portable_file_name(std::string("foo bar")));
2343 BOOST_TEST(fs::portable_posix_name(std::string("foo.bar")));
2344 BOOST_TEST(fs::windows_name(std::string("foo.bar")));
2345 BOOST_TEST(fs::portable_name(std::string("foo.bar")));
2346 BOOST_TEST(!fs::portable_directory_name(std::string("foo.bar")));
2347 BOOST_TEST(fs::portable_file_name(std::string("foo.bar")));
2349 BOOST_TEST(fs::portable_posix_name(std::string("foo.barf")));
2350 BOOST_TEST(fs::windows_name(std::string("foo.barf")));
2351 BOOST_TEST(fs::portable_name(std::string("foo.barf")));
2352 BOOST_TEST(!fs::portable_directory_name(std::string("foo.barf")));
2353 BOOST_TEST(!fs::portable_file_name(std::string("foo.barf")));
2355 BOOST_TEST(fs::portable_posix_name(std::string(".foo")));
2356 BOOST_TEST(fs::windows_name(std::string(".foo")));
2357 BOOST_TEST(!fs::portable_name(std::string(".foo")));
2358 BOOST_TEST(!fs::portable_directory_name(std::string(".foo")));
2359 BOOST_TEST(!fs::portable_file_name(std::string(".foo")));
2361 BOOST_TEST(fs::portable_posix_name(std::string("foo.")));
2362 BOOST_TEST(!fs::windows_name(std::string("foo.")));
2363 BOOST_TEST(!fs::portable_name(std::string("foo.")));
2364 BOOST_TEST(!fs::portable_directory_name(std::string("foo.")));
2365 BOOST_TEST(!fs::portable_file_name(std::string("foo.")));
2368 // replace_extension_tests ---------------------------------------------------------//
2370 void replace_extension_tests()
2372 std::cout
<< "replace_extension_tests..." << std::endl
;
2374 BOOST_TEST(path().replace_extension().empty());
2375 BOOST_TEST(path().replace_extension("a") == ".a");
2376 BOOST_TEST(path().replace_extension("a.") == ".a.");
2377 BOOST_TEST(path().replace_extension(".a") == ".a");
2378 BOOST_TEST(path().replace_extension("a.txt") == ".a.txt");
2379 // see the rationale in html docs for explanation why this works:
2380 BOOST_TEST(path().replace_extension(".txt") == ".txt");
2382 BOOST_TEST(path("a.txt").replace_extension() == "a");
2383 BOOST_TEST(path("a.txt").replace_extension("") == "a");
2384 BOOST_TEST(path("a.txt").replace_extension(".") == "a.");
2385 BOOST_TEST(path("a.txt").replace_extension(".tex") == "a.tex");
2386 BOOST_TEST(path("a.txt").replace_extension("tex") == "a.tex");
2387 BOOST_TEST(path("a.").replace_extension(".tex") == "a.tex");
2388 BOOST_TEST(path("a.").replace_extension("tex") == "a.tex");
2389 BOOST_TEST(path("a").replace_extension(".txt") == "a.txt");
2390 BOOST_TEST(path("a").replace_extension("txt") == "a.txt");
2391 BOOST_TEST(path("a.b.txt").replace_extension(".tex") == "a.b.tex");
2392 BOOST_TEST(path("a.b.txt").replace_extension("tex") == "a.b.tex");
2393 BOOST_TEST(path("a/b").replace_extension(".c") == "a/b.c");
2394 PATH_TEST_EQ(path("a.txt/b").replace_extension(".c"), "a.txt/b.c"); // ticket 4702
2395 BOOST_TEST(path("foo.txt").replace_extension("exe") == "foo.exe"); // ticket 5118
2396 BOOST_TEST(path("foo.txt").replace_extension(".tar.bz2") == "foo.tar.bz2"); // ticket 5118
2399 // make_preferred_tests ------------------------------------------------------------//
2401 void make_preferred_tests()
2403 std::cout
<< "make_preferred_tests..." << std::endl
;
2405 if (platform
== "Windows")
2407 BOOST_TEST(path("//abc\\def/ghi").make_preferred().native() == path("\\\\abc\\def\\ghi").native());
2411 BOOST_TEST(path("//abc\\def/ghi").make_preferred().native() == path("//abc\\def/ghi").native());
2415 // lexically_normal_tests ----------------------------------------------------------//
2417 void lexically_normal_tests()
2419 std::cout
<< "lexically_normal_tests..." << std::endl
;
2421 // Note: lexically_normal() uses /= to build up some results, so these results will
2422 // have the platform's preferred separator. Since that is immaterial to the correct
2423 // functioning of lexically_normal(), the test results are converted to generic form,
2424 // and the expected results are also given in generic form. Otherwise many of the
2425 // tests would incorrectly be reported as failing on Windows.
2427 PATH_TEST_EQ(path("").lexically_normal().generic_path(), "");
2428 PATH_TEST_EQ(path("/").lexically_normal().generic_path(), "/");
2429 PATH_TEST_EQ(path("//").lexically_normal().generic_path(), "//");
2430 PATH_TEST_EQ(path("///").lexically_normal().generic_path(), "/");
2431 PATH_TEST_EQ(path("f").lexically_normal().generic_path(), "f");
2432 PATH_TEST_EQ(path("foo").lexically_normal().generic_path(), "foo");
2433 PATH_TEST_EQ(path("foo/").lexically_normal().generic_path(), "foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2434 PATH_TEST_EQ(path("f/").lexically_normal().generic_path(), "f/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2435 PATH_TEST_EQ(path("/foo").lexically_normal().generic_path(), "/foo");
2436 PATH_TEST_EQ(path("/./foo").lexically_normal().generic_path(), "/foo");
2437 PATH_TEST_EQ(path("/./foo/.").lexically_normal().generic_path(), "/foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2438 PATH_TEST_EQ(path("foo/bar").lexically_normal().generic_path(), "foo/bar");
2439 PATH_TEST_EQ(path("..").lexically_normal().generic_path(), "..");
2440 PATH_TEST_EQ(path("../..").lexically_normal().generic_path(), "../..");
2441 PATH_TEST_EQ(path("/..").lexically_normal().generic_path(), "/..");
2442 PATH_TEST_EQ(path("/../..").lexically_normal().generic_path(), "/../..");
2443 PATH_TEST_EQ(path("../foo").lexically_normal().generic_path(), "../foo");
2444 PATH_TEST_EQ(path("foo/..").lexically_normal().generic_path(), ".");
2445 PATH_TEST_EQ(path("foo/../").lexically_normal().generic_path(), ".");
2446 PATH_TEST_EQ((path("foo") / "..").lexically_normal().generic_path(), ".");
2447 PATH_TEST_EQ(path("foo/...").lexically_normal().generic_path(), "foo/...");
2448 PATH_TEST_EQ(path("foo/.../").lexically_normal().generic_path(), "foo/.../" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2449 PATH_TEST_EQ(path("foo/..bar").lexically_normal().generic_path(), "foo/..bar");
2450 PATH_TEST_EQ(path("../f").lexically_normal().generic_path(), "../f");
2451 PATH_TEST_EQ(path("/../f").lexically_normal().generic_path(), "/../f");
2452 PATH_TEST_EQ(path("f/..").lexically_normal().generic_path(), ".");
2453 PATH_TEST_EQ((path("f") / "..").lexically_normal().generic_path(), ".");
2454 PATH_TEST_EQ(path("foo/../..").lexically_normal().generic_path(), "..");
2455 #if BOOST_FILESYSTEM_VERSION == 3
2456 PATH_TEST_EQ(path("foo/../../").lexically_normal().generic_path(), "../.");
2458 PATH_TEST_EQ(path("foo/../../").lexically_normal().generic_path(), "..");
2460 PATH_TEST_EQ(path("foo/../../..").lexically_normal().generic_path(), "../..");
2461 #if BOOST_FILESYSTEM_VERSION == 3
2462 PATH_TEST_EQ(path("foo/../../../").lexically_normal().generic_path(), "../../.");
2464 PATH_TEST_EQ(path("foo/../../../").lexically_normal().generic_path(), "../..");
2466 PATH_TEST_EQ(path("foo/../bar").lexically_normal().generic_path(), "bar");
2467 PATH_TEST_EQ(path("foo/../bar/").lexically_normal().generic_path(), "bar/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2468 PATH_TEST_EQ(path("foo/bar/..").lexically_normal().generic_path(), "foo");
2469 PATH_TEST_EQ(path("foo/./bar/..").lexically_normal().generic_path(), "foo");
2470 std::cout
<< path("foo/./bar/..").lexically_normal() << std::endl
; // outputs "foo"
2471 PATH_TEST_EQ(path("foo/bar/../").lexically_normal().generic_path(), "foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2472 PATH_TEST_EQ(path("foo/./bar/../").lexically_normal().generic_path(), "foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2473 std::cout
<< path("foo/./bar/../").lexically_normal() << std::endl
; // POSIX: "foo/", Windows: "foo\" (with a trailing dot for v3)
2474 PATH_TEST_EQ(path("foo/bar/../..").lexically_normal().generic_path(), ".");
2475 PATH_TEST_EQ(path("foo/bar/../../").lexically_normal().generic_path(), ".");
2476 PATH_TEST_EQ(path("foo/bar/../blah").lexically_normal().generic_path(), "foo/blah");
2477 PATH_TEST_EQ(path("f/../b").lexically_normal().generic_path(), "b");
2478 PATH_TEST_EQ(path("f/b/..").lexically_normal().generic_path(), "f");
2479 PATH_TEST_EQ(path("f/b/../").lexically_normal().generic_path(), "f/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2480 PATH_TEST_EQ(path("f/b/../a").lexically_normal().generic_path(), "f/a");
2481 PATH_TEST_EQ(path("foo/bar/blah/../..").lexically_normal().generic_path(), "foo");
2482 PATH_TEST_EQ(path("foo/bar/blah/../../bletch").lexically_normal().generic_path(), "foo/bletch");
2483 PATH_TEST_EQ(path("//net").lexically_normal().generic_path(), "//net");
2484 PATH_TEST_EQ(path("//net/").lexically_normal().generic_path(), "//net/");
2485 PATH_TEST_EQ(path("//..net").lexically_normal().generic_path(), "//..net");
2486 PATH_TEST_EQ(path("//net/..").lexically_normal().generic_path(), "//net/..");
2487 PATH_TEST_EQ(path("//net/foo").lexically_normal().generic_path(), "//net/foo");
2488 PATH_TEST_EQ(path("//net/foo/").lexically_normal().generic_path(), "//net/foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2489 PATH_TEST_EQ(path("//net/foo/..").lexically_normal().generic_path(), "//net/");
2490 PATH_TEST_EQ(path("//net/foo/../").lexically_normal().generic_path(), "//net/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2492 PATH_TEST_EQ(path("/net/foo/bar").lexically_normal().generic_path(), "/net/foo/bar");
2493 PATH_TEST_EQ(path("/net/foo/bar/").lexically_normal().generic_path(), "/net/foo/bar/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2494 PATH_TEST_EQ(path("/net/foo/..").lexically_normal().generic_path(), "/net");
2495 PATH_TEST_EQ(path("/net/foo/../").lexically_normal().generic_path(), "/net/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2497 PATH_TEST_EQ(path("//net//foo//bar").lexically_normal().generic_path(), "//net/foo/bar");
2498 PATH_TEST_EQ(path("//net//foo//bar//").lexically_normal().generic_path(), "//net/foo/bar/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2499 PATH_TEST_EQ(path("//net//foo//..").lexically_normal().generic_path(), "//net/");
2500 PATH_TEST_EQ(path("//net//foo//..//").lexically_normal().generic_path(), "//net/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2502 PATH_TEST_EQ(path("///net///foo///bar").lexically_normal().generic_path(), "/net/foo/bar");
2503 PATH_TEST_EQ(path("///net///foo///bar///").lexically_normal().generic_path(), "/net/foo/bar/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2504 PATH_TEST_EQ(path("///net///foo///..").lexically_normal().generic_path(), "/net");
2505 PATH_TEST_EQ(path("///net///foo///..///").lexically_normal().generic_path(), "/net/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2507 if (platform
== "Windows")
2509 BOOST_TEST_EQ(path("c:/foo/bar").lexically_normal().string(), "c:\\foo\\bar");
2511 PATH_TEST_EQ(path("c:foo").lexically_normal().generic_path(), "c:foo");
2512 PATH_TEST_EQ(path("c:..").lexically_normal().generic_path(), "c:..");
2513 PATH_TEST_EQ(path("c:foo/..").lexically_normal().generic_path(), "c:");
2515 PATH_TEST_EQ(path("c:foo/../").lexically_normal().generic_path(), "c:" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2517 PATH_TEST_EQ(path("c:/foo/..").lexically_normal().generic_path(), "c:/");
2518 PATH_TEST_EQ(path("c:/foo/../").lexically_normal().generic_path(), "c:/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2519 PATH_TEST_EQ(path("c:/..").lexically_normal().generic_path(), "c:/..");
2520 #if BOOST_FILESYSTEM_VERSION == 3
2521 PATH_TEST_EQ(path("c:/../").lexically_normal().generic_path(), "c:/../.");
2523 PATH_TEST_EQ(path("c:/../").lexically_normal().generic_path(), "c:/..");
2525 PATH_TEST_EQ(path("c:/../..").lexically_normal().generic_path(), "c:/../..");
2526 #if BOOST_FILESYSTEM_VERSION == 3
2527 PATH_TEST_EQ(path("c:/../../").lexically_normal().generic_path(), "c:/../../.");
2529 PATH_TEST_EQ(path("c:/../../").lexically_normal().generic_path(), "c:/../..");
2531 PATH_TEST_EQ(path("c:/../foo").lexically_normal().generic_path(), "c:/../foo");
2532 PATH_TEST_EQ(path("c:/../foo/").lexically_normal().generic_path(), "c:/../foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2533 PATH_TEST_EQ(path("c:/../../foo").lexically_normal().generic_path(), "c:/../../foo");
2534 PATH_TEST_EQ(path("c:/../../foo/").lexically_normal().generic_path(), "c:/../../foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2535 PATH_TEST_EQ(path("c:/..foo").lexically_normal().generic_path(), "c:/..foo");
2539 PATH_TEST_EQ(path("c:..").lexically_normal(), "c:..");
2540 PATH_TEST_EQ(path("c:foo/..").lexically_normal(), ".");
2541 PATH_TEST_EQ(path("c:foo/../").lexically_normal(), ".");
2542 PATH_TEST_EQ(path("c:/foo/..").lexically_normal(), "c:");
2543 PATH_TEST_EQ(path("c:/foo/../").lexically_normal(), "c:/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2544 PATH_TEST_EQ(path("c:/..").lexically_normal(), ".");
2545 PATH_TEST_EQ(path("c:/../").lexically_normal(), ".");
2546 PATH_TEST_EQ(path("c:/../..").lexically_normal(), "..");
2547 #if BOOST_FILESYSTEM_VERSION == 3
2548 PATH_TEST_EQ(path("c:/../../").lexically_normal(), "../.");
2550 PATH_TEST_EQ(path("c:/../../").lexically_normal(), "..");
2552 PATH_TEST_EQ(path("c:/../foo").lexically_normal(), "foo");
2553 PATH_TEST_EQ(path("c:/../foo/").lexically_normal(), "foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2554 PATH_TEST_EQ(path("c:/../../foo").lexically_normal(), "../foo");
2555 PATH_TEST_EQ(path("c:/../../foo/").lexically_normal(), "../foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT
);
2556 PATH_TEST_EQ(path("c:/..foo").lexically_normal(), "c:/..foo");
2560 inline void odr_use(const path::value_type
& c
)
2562 static const path::value_type dummy
= '\0';
2563 BOOST_TEST(&c
!= &dummy
);
2566 } // unnamed namespace
2568 static boost::filesystem::path ticket_6737
= "FilePath"; // #6737 reported this crashed
2569 // on VC++ debug mode build
2570 const boost::filesystem::path
ticket_6690("test"); // #6690 another V++ static init crash
2572 //--------------------------------------------------------------------------------------//
2576 //--------------------------------------------------------------------------------------//
2578 int cpp_main(int, char*[])
2580 // The choice of platform is make at runtime rather than compile-time
2581 // so that compile errors for all platforms will be detected even though
2582 // only the current platform is runtime tested.
2583 platform
= (platform
== "Win32" || platform
== "Win64" || platform
== "Cygwin") ? "Windows" : "POSIX";
2584 std::cout
<< "Platform is " << platform
<< '\n';
2586 BOOST_TEST(p1
.string() != p3
.string());
2588 BOOST_TEST(p1
.string() == p3
.string());
2591 BOOST_TEST(p04
.string() == "foobar");
2592 p04
= p04
; // self-assignment
2593 BOOST_TEST(p04
.string() == "foobar");
2595 construction_tests();
2598 self_assign_append_concat_tests();
2600 query_and_decomposition_tests();
2601 composition_tests();
2605 name_function_tests();
2606 replace_extension_tests();
2607 make_preferred_tests();
2608 lexically_normal_tests();
2610 // verify deprecated names still available
2612 #ifndef BOOST_FILESYSTEM_NO_DEPRECATED
2617 p_remove_leaf
.remove_leaf();
2621 std::string
s1("//:somestring"); // this used to be treated specially
2623 // check the path member templates
2624 p5
.assign(s1
.begin(), s1
.end());
2626 PATH_TEST_EQ(p5
.string(), "//:somestring");
2628 PATH_TEST_EQ(p5
.string(), "//:somestring");
2630 // this code, courtesy of David Whetstone, detects a now fixed bug that
2631 // derefereced the end iterator (assuming debug build with checked itors)
2632 std::vector
< char > v1
;
2633 p5
.assign(v1
.begin(), v1
.end());
2634 std::string
s2(v1
.begin(), v1
.end());
2635 PATH_TEST_EQ(p5
.string(), s2
);
2636 p5
.assign(s1
.begin(), s1
.begin() + 1);
2637 PATH_TEST_EQ(p5
.string(), "/");
2639 BOOST_TEST(p1
!= p4
);
2640 BOOST_TEST(p1
.string() == p2
.string());
2641 BOOST_TEST(p1
.string() == p3
.string());
2642 BOOST_TEST(path("foo").filename() == "foo");
2643 BOOST_TEST(path("foo").parent_path().string() == "");
2644 BOOST_TEST(p1
.filename() == "fum");
2645 BOOST_TEST(p1
.parent_path().string() == "fe/fi/fo");
2646 BOOST_TEST(path("").empty() == true);
2647 BOOST_TEST(path("foo").empty() == false);
2649 // inserter and extractor tests
2650 #if !defined(BOOST_MSVC) || BOOST_MSVC > 1300 // bypass VC++ 7.0 and earlier
2651 std::cout
<< "\nInserter and extractor test...";
2652 std::stringstream ss
;
2653 ss
<< fs::path("foo/bar") << std::endl
;
2654 fs::path round_trip
;
2656 BOOST_TEST(round_trip
.string() == "foo/bar");
2657 std::cout
<< round_trip
.string() << "..." << round_trip
<< " complete\n";
2660 // Check that path constants have definitions
2661 // https://svn.boost.org/trac10/ticket/12759
2662 odr_use(path::separator
);
2663 odr_use(path::preferred_separator
);
2666 return ::boost::report_errors();