// path_test program -----------------------------------------------------------------// // Copyright Beman Dawes 2002, 2008 // Copyright Vladimir Prus 2002 // Use, modification, and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // See library home page at http://www.boost.org/libs/filesystem // basic_path's stem(), extension(), and replace_extension() tests are based // on basename(), extension(), and change_extension() tests from the original // convenience_test.cpp by Vladimir Prus. #define BOOST_FILESYSTEM_VERSION 3 #include # if defined( BOOST_NO_STD_WSTRING ) # error Configuration not supported: Boost.Filesystem V3 and later requires std::wstring support # endif #include // See deprecated_test for tests of deprecated features #ifndef BOOST_FILESYSTEM_NO_DEPRECATED # define BOOST_FILESYSTEM_NO_DEPRECATED #endif #ifndef BOOST_SYSTEM_NO_DEPRECATED # define BOOST_SYSTEM_NO_DEPRECATED #endif #include #include #include #include #include #include #include #include namespace fs = boost::filesystem; using boost::filesystem::path; #include #define PATH_CHECK(a, b) check(a, b, __FILE__, __LINE__) #define CHECK_EQUAL(a,b) check_equal(a, b, __FILE__, __LINE__) namespace { std::string platform(BOOST_PLATFORM); void check(const fs::path & source, const std::string & expected, const char* file, int line) { if (source.string() == expected) return; std::cout << file << '(' << line << "): source: \"" << source << "\" != expected: \"" << expected << "\"" << std::endl; ++::boost::detail::test_errors(); } void check_equal(const fs::path & source, const std::string & expected, const char* file, int line) { if (source == expected) return; ++::boost::detail::test_errors(); std::cout << file << '(' << line << "): source: \"" << source << "\" != expected: \"" << expected << "\"" << std::endl; } path p1("fe/fi/fo/fum"); path p2(p1); path p3; path p4("foobar"); path p5; // exception_tests -----------------------------------------------------------------// void exception_tests() { std::cout << "exception_tests..." << std::endl; const std::string str_1("string-1"); boost::system::error_code ec(12345, boost::system::system_category()); try { throw fs::filesystem_error(str_1, ec); } catch (const fs::filesystem_error & ex) { //std::cout << ex.what() << "*" << std::endl; //BOOST_TEST(std::strcmp(ex.what(), // "string-1: Unknown error") == 0); BOOST_TEST(ex.code() == ec); } try { throw fs::filesystem_error(str_1, "p1", "p2", ec); } catch (const fs::filesystem_error & ex) { //std::cout << ex.what() << "*" << std::endl; //BOOST_TEST(std::strcmp(ex.what(), // "string-1: Unknown error: \"p1\", \"p2\"") == 0); BOOST_TEST(ex.code() == ec); BOOST_TEST(ex.path1() == "p1"); BOOST_TEST(ex.path2() == "p2"); } } // overload_tests ------------------------------------------------------------------// // These verify various overloads don't cause compiler errors // They pre-date operations_unit_test.cpp void overload_tests() { std::cout << "overload_tests..." << std::endl; fs::exists(p1); fs::exists("foo"); fs::exists(std::string("foo")); fs::exists(p1 / path("foo")); fs::exists(p1 / "foo"); fs::exists(p1 / std::string("foo")); fs::exists("foo" / p1); fs::exists(std::string("foo") / p1); p4 /= path("foo"); p4 /= "foo"; p4 /= std::string("foo"); } // iterator_tests ------------------------------------------------------------------// void iterator_tests() { std::cout << "iterator_tests..." << std::endl; path itr_ck = ""; path::const_iterator itr = itr_ck.begin(); BOOST_TEST(itr == itr_ck.end()); itr_ck = "/"; itr = itr_ck.begin(); BOOST_TEST(*itr == std::string("/")); BOOST_TEST(++itr == itr_ck.end()); BOOST_TEST(*--itr == std::string("/")); itr_ck = "foo"; BOOST_TEST(*itr_ck.begin() == std::string("foo")); BOOST_TEST(boost::next(itr_ck.begin()) == itr_ck.end()); BOOST_TEST(*boost::prior(itr_ck.end()) == std::string("foo")); BOOST_TEST(boost::prior(itr_ck.end()) == itr_ck.begin()); itr_ck = path("/foo"); BOOST_TEST(*itr_ck.begin() == std::string("/")); BOOST_TEST(*boost::next(itr_ck.begin()) == std::string("foo")); BOOST_TEST(boost::next(boost::next(itr_ck.begin())) == itr_ck.end()); BOOST_TEST(boost::next(itr_ck.begin()) == boost::prior(itr_ck.end())); BOOST_TEST(*boost::prior(itr_ck.end()) == std::string("foo")); BOOST_TEST(*boost::prior(boost::prior(itr_ck.end())) == std::string("/")); BOOST_TEST(boost::prior(boost::prior(itr_ck.end())) == itr_ck.begin()); itr_ck = "/foo/bar"; itr = itr_ck.begin(); BOOST_TEST(*itr == std::string("/")); BOOST_TEST(*++itr == std::string("foo")); BOOST_TEST(*++itr == std::string("bar")); BOOST_TEST(++itr == itr_ck.end()); CHECK_EQUAL(*--itr, "bar"); CHECK_EQUAL(*--itr, "foo"); CHECK_EQUAL(*--itr, "/"); itr_ck = "../f"; // previously failed due to short name bug itr = itr_ck.begin(); CHECK_EQUAL(*itr, ".."); CHECK_EQUAL(*++itr, "f"); BOOST_TEST(++itr == itr_ck.end()); CHECK_EQUAL(*--itr, "f"); CHECK_EQUAL(*--itr, ".."); // POSIX says treat "/foo/bar/" as "/foo/bar/." itr_ck = "/foo/bar/"; itr = itr_ck.begin(); CHECK_EQUAL(*itr, "/"); CHECK_EQUAL(*++itr, "foo"); CHECK_EQUAL(*++itr, "bar"); CHECK_EQUAL(*++itr, "."); BOOST_TEST(++itr == itr_ck.end()); CHECK_EQUAL(*--itr, "."); CHECK_EQUAL(*--itr, "bar"); CHECK_EQUAL(*--itr, "foo"); CHECK_EQUAL(*--itr, "/"); // POSIX says treat "/f/b/" as "/f/b/." itr_ck = "/f/b/"; itr = itr_ck.begin(); CHECK_EQUAL(*itr, "/"); CHECK_EQUAL(*++itr, "f"); CHECK_EQUAL(*++itr, "b"); CHECK_EQUAL(*++itr, "."); BOOST_TEST(++itr == itr_ck.end()); CHECK_EQUAL(*--itr, "."); CHECK_EQUAL(*--itr, "b"); CHECK_EQUAL(*--itr, "f"); CHECK_EQUAL(*--itr, "/"); itr_ck = "//net"; itr = itr_ck.begin(); // two leading slashes are permitted by POSIX (as implementation defined), // while for Windows it is always well defined (as a network name) CHECK_EQUAL(*itr, "//net"); BOOST_TEST(++itr == itr_ck.end()); CHECK_EQUAL(*--itr, "//net"); itr_ck = "//net/"; itr = itr_ck.begin(); CHECK_EQUAL(*itr, "//net"); CHECK_EQUAL(*++itr, "/"); BOOST_TEST(++itr == itr_ck.end()); CHECK_EQUAL(*--itr, "/"); CHECK_EQUAL(*--itr, "//net"); itr_ck = "//foo///bar///"; itr = itr_ck.begin(); CHECK_EQUAL(*itr, "//foo"); CHECK_EQUAL(*++itr, "/"); CHECK_EQUAL(*++itr, "bar"); CHECK_EQUAL(*++itr, "."); BOOST_TEST(++itr == itr_ck.end()); CHECK_EQUAL(*--itr, "."); CHECK_EQUAL(*--itr, "bar"); CHECK_EQUAL(*--itr, "/"); CHECK_EQUAL(*--itr, "//foo"); itr_ck = "///foo///bar///"; itr = itr_ck.begin(); // three or more leading slashes are to be treated as a single slash CHECK_EQUAL(*itr, "/"); CHECK_EQUAL(*++itr, "foo"); CHECK_EQUAL(*++itr, "bar"); CHECK_EQUAL(*++itr, "."); BOOST_TEST(++itr == itr_ck.end()); CHECK_EQUAL(*--itr, "."); CHECK_EQUAL(*--itr, "bar"); CHECK_EQUAL(*--itr, "foo"); CHECK_EQUAL(*--itr, "/"); if (platform == "Windows") { itr_ck = "c:/"; itr = itr_ck.begin(); CHECK_EQUAL(*itr, "c:"); CHECK_EQUAL(*++itr, "/"); BOOST_TEST(++itr == itr_ck.end()); CHECK_EQUAL(*--itr, "/"); CHECK_EQUAL(*--itr, "c:"); itr_ck = "c:\\foo"; itr = itr_ck.begin(); BOOST_TEST(*itr == std::string("c:")); BOOST_TEST(*++itr == std::string("/")); BOOST_TEST(*++itr == std::string("foo")); BOOST_TEST(++itr == itr_ck.end()); BOOST_TEST(*--itr == std::string("foo")); BOOST_TEST(*--itr == std::string("/")); BOOST_TEST(*--itr == std::string("c:")); itr_ck = "\\\\\\foo\\\\\\bar\\\\\\"; itr = itr_ck.begin(); // three or more leading slashes are to be treated as a single slash CHECK_EQUAL(*itr, "/"); CHECK_EQUAL(*++itr, "foo"); CHECK_EQUAL(*++itr, "bar"); CHECK_EQUAL(*++itr, "."); BOOST_TEST(++itr == itr_ck.end()); CHECK_EQUAL(*--itr, "."); CHECK_EQUAL(*--itr, "bar"); CHECK_EQUAL(*--itr, "foo"); CHECK_EQUAL(*--itr, "/"); itr_ck = "c:foo"; itr = itr_ck.begin(); BOOST_TEST(*itr == std::string("c:")); BOOST_TEST(*++itr == std::string("foo")); BOOST_TEST(++itr == itr_ck.end()); BOOST_TEST(*--itr == std::string("foo")); BOOST_TEST(*--itr == std::string("c:")); itr_ck = "c:foo/"; itr = itr_ck.begin(); BOOST_TEST(*itr == std::string("c:")); BOOST_TEST(*++itr == std::string("foo")); BOOST_TEST(*++itr == std::string(".")); BOOST_TEST(++itr == itr_ck.end()); BOOST_TEST(*--itr == std::string(".")); BOOST_TEST(*--itr == std::string("foo")); BOOST_TEST(*--itr == std::string("c:")); itr_ck = path("c:"); BOOST_TEST(*itr_ck.begin() == std::string("c:")); BOOST_TEST(next(itr_ck.begin()) == itr_ck.end()); BOOST_TEST(prior(itr_ck.end()) == itr_ck.begin()); BOOST_TEST(*prior(itr_ck.end()) == std::string("c:")); itr_ck = path("c:/"); BOOST_TEST(*itr_ck.begin() == std::string("c:")); BOOST_TEST(*next(itr_ck.begin()) == std::string("/")); BOOST_TEST(next(next(itr_ck.begin())) == itr_ck.end()); BOOST_TEST(prior(prior(itr_ck.end())) == itr_ck.begin()); BOOST_TEST(*prior(itr_ck.end()) == std::string("/")); BOOST_TEST(*prior(prior(itr_ck.end())) == std::string("c:")); itr_ck = path("c:foo"); BOOST_TEST(*itr_ck.begin() == std::string("c:")); BOOST_TEST(*next(itr_ck.begin()) == std::string("foo")); BOOST_TEST(next(next(itr_ck.begin())) == itr_ck.end()); BOOST_TEST(prior(prior(itr_ck.end())) == itr_ck.begin()); BOOST_TEST(*prior(itr_ck.end()) == std::string("foo")); BOOST_TEST(*prior(prior(itr_ck.end())) == std::string("c:")); itr_ck = path("c:/foo"); BOOST_TEST(*itr_ck.begin() == std::string("c:")); BOOST_TEST(*next(itr_ck.begin()) == std::string("/")); BOOST_TEST(*next(next(itr_ck.begin())) == std::string("foo")); BOOST_TEST(next(next(next(itr_ck.begin()))) == itr_ck.end()); BOOST_TEST(prior(prior(prior(itr_ck.end()))) == itr_ck.begin()); BOOST_TEST(*prior(itr_ck.end()) == std::string("foo")); BOOST_TEST(*prior(prior(itr_ck.end())) == std::string("/")); BOOST_TEST(*prior(prior(prior(itr_ck.end()))) == std::string("c:")); itr_ck = path("//net"); BOOST_TEST(*itr_ck.begin() == std::string("//net")); BOOST_TEST(next(itr_ck.begin()) == itr_ck.end()); BOOST_TEST(prior(itr_ck.end()) == itr_ck.begin()); BOOST_TEST(*prior(itr_ck.end()) == std::string("//net")); itr_ck = path("//net/"); CHECK_EQUAL(*itr_ck.begin(), "//net"); CHECK_EQUAL(*next(itr_ck.begin()), "/"); BOOST_TEST(next(next(itr_ck.begin())) == itr_ck.end()); BOOST_TEST(prior(prior(itr_ck.end())) == itr_ck.begin()); CHECK_EQUAL(*prior(itr_ck.end()), "/"); CHECK_EQUAL(*prior(prior(itr_ck.end())), "//net"); itr_ck = path("//net/foo"); BOOST_TEST(*itr_ck.begin() == std::string("//net")); BOOST_TEST(*next(itr_ck.begin()) == std::string("/")); BOOST_TEST(*next(next(itr_ck.begin())) == std::string("foo")); BOOST_TEST(next(next(next(itr_ck.begin()))) == itr_ck.end()); BOOST_TEST(prior(prior(prior(itr_ck.end()))) == itr_ck.begin()); BOOST_TEST(*prior(itr_ck.end()) == std::string("foo")); BOOST_TEST(*prior(prior(itr_ck.end())) == std::string("/")); BOOST_TEST(*prior(prior(prior(itr_ck.end()))) == std::string("//net")); itr_ck = path("prn:"); BOOST_TEST(*itr_ck.begin() == std::string("prn:")); BOOST_TEST(next(itr_ck.begin()) == itr_ck.end()); BOOST_TEST(prior(itr_ck.end()) == itr_ck.begin()); BOOST_TEST(*prior(itr_ck.end()) == std::string("prn:")); } else { itr_ck = "///"; itr = itr_ck.begin(); CHECK_EQUAL(*itr, "/"); BOOST_TEST(++itr == itr_ck.end()); } } // non_member_tests ----------------------------------------------------------------// void non_member_tests() { std::cout << "non_member_tests..." << std::endl; // test non-member functions, particularly operator overloads path e, e2; std::string es, es2; char ecs[] = ""; char ecs2[] = ""; char acs[] = "a"; std::string as(acs); path a(as); char acs2[] = "a"; std::string as2(acs2); path a2(as2); char bcs[] = "b"; std::string bs(bcs); path b(bs); // swap a.swap(b); BOOST_TEST(a.string() == "b"); BOOST_TEST(b.string() == "a"); fs::swap(a, b); BOOST_TEST(a.string() == "a"); BOOST_TEST(b.string() == "b"); // probe operator / PATH_CHECK(path("") / ".", "."); PATH_CHECK(path("") / "..", ".."); if (platform == "Windows") { BOOST_TEST(path("foo\\bar") == "foo/bar"); BOOST_TEST((b / a).string() == "b\\a"); BOOST_TEST((bs / a).string() == "b\\a"); BOOST_TEST((bcs / a).string() == "b\\a"); BOOST_TEST((b / as).string() == "b\\a"); BOOST_TEST((b / acs).string() == "b\\a"); PATH_CHECK(path("a") / "b", "a\\b"); PATH_CHECK(path("..") / "", ".."); PATH_CHECK(path("foo") / path("bar"), "foo\\bar"); // path arg PATH_CHECK(path("foo") / "bar", "foo\\bar"); // const char* arg PATH_CHECK(path("foo") / path("woo/bar").filename(), "foo\\bar"); // const std::string & arg PATH_CHECK("foo" / path("bar"), "foo\\bar"); PATH_CHECK(path("..") / ".." , "..\\.."); PATH_CHECK(path("/") / ".." , "/.."); PATH_CHECK(path("/..") / ".." , "/..\\.."); PATH_CHECK(path("..") / "foo" , "..\\foo"); PATH_CHECK(path("foo") / ".." , "foo\\.."); PATH_CHECK(path("..") / "f" , "..\\f"); PATH_CHECK(path("/..") / "f" , "/..\\f"); PATH_CHECK(path("f") / ".." , "f\\.."); PATH_CHECK(path("foo") / ".." / ".." , "foo\\..\\.."); PATH_CHECK(path("foo") / ".." / ".." / ".." , "foo\\..\\..\\.."); PATH_CHECK(path("f") / ".." / "b" , "f\\..\\b"); PATH_CHECK(path("foo") / ".." / "bar" , "foo\\..\\bar"); PATH_CHECK(path("foo") / "bar" / ".." , "foo\\bar\\.."); PATH_CHECK(path("foo") / "bar" / ".." / "..", "foo\\bar\\..\\.."); PATH_CHECK(path("foo") / "bar" / ".." / "blah", "foo\\bar\\..\\blah"); PATH_CHECK(path("f") / "b" / ".." , "f\\b\\.."); PATH_CHECK(path("f") / "b" / ".." / "a", "f\\b\\..\\a"); PATH_CHECK(path("foo") / "bar" / "blah" / ".." / "..", "foo\\bar\\blah\\..\\.."); PATH_CHECK(path("foo") / "bar" / "blah" / ".." / ".." / "bletch", "foo\\bar\\blah\\..\\..\\bletch"); PATH_CHECK(path(".") / "foo", ".\\foo"); PATH_CHECK(path(".") / "..", ".\\.."); PATH_CHECK(path("foo") / ".", "foo\\."); PATH_CHECK(path("..") / ".", "..\\."); PATH_CHECK(path(".") / ".", ".\\."); PATH_CHECK(path(".") / "." / ".", ".\\.\\."); PATH_CHECK(path(".") / "foo" / ".", ".\\foo\\."); PATH_CHECK(path("foo") / "." / "bar", "foo\\.\\bar"); PATH_CHECK(path("foo") / "." / ".", "foo\\.\\."); PATH_CHECK(path("foo") / "." / "..", "foo\\.\\.."); PATH_CHECK(path(".") / "." / "..", ".\\.\\.."); PATH_CHECK(path(".") / ".." / ".", ".\\..\\."); PATH_CHECK(path("..") / "." / ".", "..\\.\\."); } else // POSIX { BOOST_TEST((b / a).string() == "b/a"); BOOST_TEST((bs / a).string() == "b/a"); BOOST_TEST((bcs / a).string() == "b/a"); BOOST_TEST((b / as).string() == "b/a"); BOOST_TEST((b / acs).string() == "b/a"); PATH_CHECK(path("a") / "b", "a/b"); PATH_CHECK(path("..") / "", ".."); PATH_CHECK(path("") / "..", ".."); PATH_CHECK(path("foo") / path("bar"), "foo/bar"); // path arg PATH_CHECK(path("foo") / "bar", "foo/bar"); // const char* arg PATH_CHECK(path("foo") / path("woo/bar").filename(), "foo/bar"); // const std::string & arg PATH_CHECK("foo" / path("bar"), "foo/bar"); PATH_CHECK(path("..") / ".." , "../.."); PATH_CHECK(path("/") / ".." , "/.."); PATH_CHECK(path("/..") / ".." , "/../.."); PATH_CHECK(path("..") / "foo" , "../foo"); PATH_CHECK(path("foo") / ".." , "foo/.."); PATH_CHECK(path("..") / "f" , "../f"); PATH_CHECK(path("/..") / "f" , "/../f"); PATH_CHECK(path("f") / ".." , "f/.."); PATH_CHECK(path("foo") / ".." / ".." , "foo/../.."); PATH_CHECK(path("foo") / ".." / ".." / ".." , "foo/../../.."); PATH_CHECK(path("f") / ".." / "b" , "f/../b"); PATH_CHECK(path("foo") / ".." / "bar" , "foo/../bar"); PATH_CHECK(path("foo") / "bar" / ".." , "foo/bar/.."); PATH_CHECK(path("foo") / "bar" / ".." / "..", "foo/bar/../.."); PATH_CHECK(path("foo") / "bar" / ".." / "blah", "foo/bar/../blah"); PATH_CHECK(path("f") / "b" / ".." , "f/b/.."); PATH_CHECK(path("f") / "b" / ".." / "a", "f/b/../a"); PATH_CHECK(path("foo") / "bar" / "blah" / ".." / "..", "foo/bar/blah/../.."); PATH_CHECK(path("foo") / "bar" / "blah" / ".." / ".." / "bletch", "foo/bar/blah/../../bletch"); PATH_CHECK(path(".") / "foo", "./foo"); PATH_CHECK(path(".") / "..", "./.."); PATH_CHECK(path("foo") / ".", "foo/."); PATH_CHECK(path("..") / ".", "../."); PATH_CHECK(path(".") / ".", "./."); PATH_CHECK(path(".") / "." / ".", "././."); PATH_CHECK(path(".") / "foo" / ".", "./foo/."); PATH_CHECK(path("foo") / "." / "bar", "foo/./bar"); PATH_CHECK(path("foo") / "." / ".", "foo/./."); PATH_CHECK(path("foo") / "." / "..", "foo/./.."); PATH_CHECK(path(".") / "." / "..", "././.."); PATH_CHECK(path(".") / ".." / ".", "./../."); PATH_CHECK(path("..") / "." / ".", ".././."); } // probe operator < BOOST_TEST(!(e < e2)); BOOST_TEST(!(es < e2)); BOOST_TEST(!(ecs < e2)); BOOST_TEST(!(e < es2)); BOOST_TEST(!(e < ecs2)); BOOST_TEST(e < a); BOOST_TEST(es < a); BOOST_TEST(ecs < a); BOOST_TEST(e < as); BOOST_TEST(e < acs); BOOST_TEST(a < b); BOOST_TEST(as < b); BOOST_TEST(acs < b); BOOST_TEST(a < bs); BOOST_TEST(a < bcs); BOOST_TEST(!(a < a2)); BOOST_TEST(!(as < a2)); BOOST_TEST(!(acs < a2)); BOOST_TEST(!(a < as2)); BOOST_TEST(!(a < acs2)); // make sure basic_path overloads don't conflict with std::string overloads BOOST_TEST(!(as < as)); BOOST_TEST(!(as < acs)); BOOST_TEST(!(acs < as)); // reality check character set is as expected BOOST_TEST(std::string("a.b") < std::string("a/b")); // verify compare is actually lexicographical BOOST_TEST(path("a/b") < path("a.b")); // make sure the derivative operators also work BOOST_TEST(b > a); BOOST_TEST(b > as); BOOST_TEST(b > acs); BOOST_TEST(bs > a); BOOST_TEST(bcs > a); BOOST_TEST(!(a2 > a)); BOOST_TEST(!(a2 > as)); BOOST_TEST(!(a2 > acs)); BOOST_TEST(!(as2 > a)); BOOST_TEST(!(acs2 > a)); BOOST_TEST(a <= b); BOOST_TEST(as <= b); BOOST_TEST(acs <= b); BOOST_TEST(a <= bs); BOOST_TEST(a <= bcs); BOOST_TEST(a <= a2); BOOST_TEST(as <= a2); BOOST_TEST(acs <= a2); BOOST_TEST(a <= as2); BOOST_TEST(a <= acs2); BOOST_TEST(b >= a); BOOST_TEST(bs >= a); BOOST_TEST(bcs >= a); BOOST_TEST(b >= as); BOOST_TEST(b >= acs); BOOST_TEST(a2 >= a); BOOST_TEST(as2 >= a); BOOST_TEST(acs2 >= a); BOOST_TEST(a2 >= as); BOOST_TEST(a2 >= acs); // operator == and != are implemented separately, so test separately path p1("fe/fi/fo/fum"); path p2(p1); path p3("fe/fi/fo/fumm"); BOOST_TEST(p1.string() != p3.string()); // check each overload BOOST_TEST(p1 != p3); BOOST_TEST(p1 != p3.string()); BOOST_TEST(p1 != p3.string().c_str()); BOOST_TEST(p1.string() != p3); BOOST_TEST(p1.string().c_str() != p3); p3 = p2; BOOST_TEST(p1.string() == p3.string()); // check each overload BOOST_TEST(p1 == p3); BOOST_TEST(p1 == p3.string()); BOOST_TEST(p1 == p3.string().c_str()); BOOST_TEST(p1.string() == p3); BOOST_TEST(p1.string().c_str() == p3); if (platform == "Windows") { std::cout << "Windows relational tests..." << std::endl; path p10 ("c:\\file"); path p11 ("c:/file"); // check each overload BOOST_TEST(p10.generic_string() == p11.generic_string()); BOOST_TEST(p10 == p11); BOOST_TEST(p10 == p11.string()); BOOST_TEST(p10 == p11.string().c_str()); BOOST_TEST(p10.string() == p11); BOOST_TEST(p10.string().c_str() == p11); BOOST_TEST(p10 == L"c:\\file"); BOOST_TEST(p10 == L"c:/file"); BOOST_TEST(p11 == L"c:\\file"); BOOST_TEST(p11 == L"c:/file"); BOOST_TEST(L"c:\\file" == p10); BOOST_TEST(L"c:/file" == p10); BOOST_TEST(L"c:\\file" == p11); BOOST_TEST(L"c:/file" == p11); BOOST_TEST(!(p10.generic_string() != p11.generic_string())); BOOST_TEST(!(p10 != p11)); BOOST_TEST(!(p10 != p11.string())); BOOST_TEST(!(p10 != p11.string().c_str())); BOOST_TEST(!(p10.string() != p11)); BOOST_TEST(!(p10.string().c_str() != p11)); BOOST_TEST(!(p10 != L"c:\\file")); BOOST_TEST(!(p10 != L"c:/file")); BOOST_TEST(!(p11 != L"c:\\file")); BOOST_TEST(!(p11 != L"c:/file")); BOOST_TEST(!(L"c:\\file" != p10)); BOOST_TEST(!(L"c:/file" != p10)); BOOST_TEST(!(L"c:\\file" != p11)); BOOST_TEST(!(L"c:/file" != p11)); BOOST_TEST(!(p10.string() < p11.string())); BOOST_TEST(!(p10 < p11)); BOOST_TEST(!(p10 < p11.string())); BOOST_TEST(!(p10 < p11.string().c_str())); BOOST_TEST(!(p10.string() < p11)); BOOST_TEST(!(p10.string().c_str() < p11)); BOOST_TEST(!(p10 < L"c:\\file")); BOOST_TEST(!(p10 < L"c:/file")); BOOST_TEST(!(p11 < L"c:\\file")); BOOST_TEST(!(p11 < L"c:/file")); BOOST_TEST(!(L"c:\\file" < p10)); BOOST_TEST(!(L"c:/file" < p10)); BOOST_TEST(!(L"c:\\file" < p11)); BOOST_TEST(!(L"c:/file" < p11)); BOOST_TEST(!(p10.generic_string() > p11.generic_string())); BOOST_TEST(!(p10 > p11)); BOOST_TEST(!(p10 > p11.string())); BOOST_TEST(!(p10 > p11.string().c_str())); BOOST_TEST(!(p10.string() > p11)); BOOST_TEST(!(p10.string().c_str() > p11)); BOOST_TEST(!(p10 > L"c:\\file")); BOOST_TEST(!(p10 > L"c:/file")); BOOST_TEST(!(p11 > L"c:\\file")); BOOST_TEST(!(p11 > L"c:/file")); BOOST_TEST(!(L"c:\\file" > p10)); BOOST_TEST(!(L"c:/file" > p10)); BOOST_TEST(!(L"c:\\file" > p11)); BOOST_TEST(!(L"c:/file" > p11)); } } // query_and_decomposition_tests ---------------------------------------------------// // // remove_filename() is also tested here, because its specification depends on // a decomposition function. void query_and_decomposition_tests() { std::cout << "query_and_decomposition_tests..." << std::endl; // stem() tests not otherwise covered BOOST_TEST(path("b").stem() == "b"); BOOST_TEST(path("a/b.txt").stem() == "b"); BOOST_TEST(path("a/b.").stem() == "b"); BOOST_TEST(path("a.b.c").stem() == "a.b"); BOOST_TEST(path("a.b.c.").stem() == "a.b.c"); // extension() tests not otherwise covered BOOST_TEST(path("a/b").extension() == ""); BOOST_TEST(path("a/b.txt").extension() == ".txt"); BOOST_TEST(path("a/b.").extension() == "."); BOOST_TEST(path("a.b.c").extension() == ".c"); BOOST_TEST(path("a.b.c.").extension() == "."); BOOST_TEST(path("a/").extension() == ""); // main q & d test sequence path p; path q; p = q = ""; BOOST_TEST(p.relative_path().string() == ""); BOOST_TEST(p.parent_path().string() == ""); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); BOOST_TEST(p.filename() == ""); BOOST_TEST(p.stem() == ""); BOOST_TEST(p.extension() == ""); BOOST_TEST(p.root_name() == ""); BOOST_TEST(p.root_directory() == ""); BOOST_TEST(p.root_path().string() == ""); BOOST_TEST(!p.has_root_path()); BOOST_TEST(!p.has_root_name()); BOOST_TEST(!p.has_root_directory()); BOOST_TEST(!p.has_relative_path()); BOOST_TEST(!p.has_filename()); BOOST_TEST(!p.has_stem()); BOOST_TEST(!p.has_extension()); BOOST_TEST(!p.has_parent_path()); BOOST_TEST(!p.is_absolute()); p = q = "/"; BOOST_TEST(p.relative_path().string() == ""); BOOST_TEST(p.parent_path().string() == ""); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); BOOST_TEST(p.filename() == "/"); BOOST_TEST(p.stem() == "/"); BOOST_TEST(p.extension() == ""); BOOST_TEST(p.root_name() == ""); BOOST_TEST(p.root_directory() == "/"); BOOST_TEST(p.root_path().string() == "/"); BOOST_TEST(p.has_root_path()); BOOST_TEST(!p.has_root_name()); BOOST_TEST(p.has_root_directory()); BOOST_TEST(!p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_stem()); BOOST_TEST(!p.has_extension()); BOOST_TEST(!p.has_parent_path()); if (platform == "POSIX") BOOST_TEST(p.is_absolute()); else BOOST_TEST(!p.is_absolute()); p = q = "//"; CHECK_EQUAL(p.relative_path().string(), ""); CHECK_EQUAL(p.parent_path().string(), ""); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); CHECK_EQUAL(p.filename(), "//"); CHECK_EQUAL(p.stem(), "//"); CHECK_EQUAL(p.extension(), ""); CHECK_EQUAL(p.root_name(), "//"); CHECK_EQUAL(p.root_directory(), ""); CHECK_EQUAL(p.root_path().string(), "//"); BOOST_TEST(p.has_root_path()); BOOST_TEST(p.has_root_name()); BOOST_TEST(!p.has_root_directory()); BOOST_TEST(!p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_stem()); BOOST_TEST(!p.has_extension()); BOOST_TEST(!p.has_parent_path()); BOOST_TEST(!p.is_absolute()); p = q = "///"; CHECK_EQUAL(p.relative_path().string(), ""); CHECK_EQUAL(p.parent_path().string(), ""); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); CHECK_EQUAL(p.filename(), "/"); CHECK_EQUAL(p.stem(), "/"); CHECK_EQUAL(p.extension(), ""); CHECK_EQUAL(p.root_name(), ""); CHECK_EQUAL(p.root_directory(), "/"); CHECK_EQUAL(p.root_path().string(), "/"); BOOST_TEST(p.has_root_path()); BOOST_TEST(!p.has_root_name()); BOOST_TEST(p.has_root_directory()); BOOST_TEST(!p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_stem()); BOOST_TEST(!p.has_extension()); BOOST_TEST(!p.has_parent_path()); if (platform == "POSIX") BOOST_TEST(p.is_absolute()); else BOOST_TEST(!p.is_absolute()); p = q = "."; BOOST_TEST(p.relative_path().string() == "."); BOOST_TEST(p.parent_path().string() == ""); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); BOOST_TEST(p.filename() == "."); BOOST_TEST(p.stem() == "."); BOOST_TEST(p.extension() == ""); BOOST_TEST(p.root_name() == ""); BOOST_TEST(p.root_directory() == ""); BOOST_TEST(p.root_path().string() == ""); BOOST_TEST(!p.has_root_path()); BOOST_TEST(!p.has_root_name()); BOOST_TEST(!p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_stem()); BOOST_TEST(!p.has_extension()); BOOST_TEST(!p.has_parent_path()); BOOST_TEST(!p.is_absolute()); p = q = ".."; BOOST_TEST(p.relative_path().string() == ".."); BOOST_TEST(p.parent_path().string() == ""); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); BOOST_TEST(p.filename() == ".."); BOOST_TEST(p.stem() == ".."); BOOST_TEST(p.extension() == ""); BOOST_TEST(p.root_name() == ""); BOOST_TEST(p.root_directory() == ""); BOOST_TEST(p.root_path().string() == ""); BOOST_TEST(!p.has_root_path()); BOOST_TEST(!p.has_root_name()); BOOST_TEST(!p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_stem()); BOOST_TEST(!p.has_extension()); BOOST_TEST(!p.has_parent_path()); BOOST_TEST(!p.is_absolute()); p = q = "foo"; BOOST_TEST(p.relative_path().string() == "foo"); BOOST_TEST(p.parent_path().string() == ""); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); BOOST_TEST(p.filename() == "foo"); BOOST_TEST(p.stem() == "foo"); BOOST_TEST(p.extension() == ""); BOOST_TEST(p.root_name() == ""); BOOST_TEST(p.root_directory() == ""); BOOST_TEST(p.root_path().string() == ""); BOOST_TEST(!p.has_root_path()); BOOST_TEST(!p.has_root_name()); BOOST_TEST(!p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_stem()); BOOST_TEST(!p.has_extension()); BOOST_TEST(!p.has_parent_path()); BOOST_TEST(!p.is_absolute()); p = q = "/foo"; CHECK_EQUAL(p.relative_path().string(), "foo"); CHECK_EQUAL(p.parent_path().string(), "/"); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); CHECK_EQUAL(p.filename(), "foo"); CHECK_EQUAL(p.stem(), "foo"); CHECK_EQUAL(p.extension(), ""); CHECK_EQUAL(p.root_name(), ""); CHECK_EQUAL(p.root_directory(), "/"); CHECK_EQUAL(p.root_path().string(), "/"); BOOST_TEST(p.has_root_path()); BOOST_TEST(!p.has_root_name()); BOOST_TEST(p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_stem()); BOOST_TEST(!p.has_extension()); BOOST_TEST(p.has_parent_path()); if (platform == "POSIX") BOOST_TEST(p.is_absolute()); else BOOST_TEST(!p.is_absolute()); p = q = "/foo/"; CHECK_EQUAL(p.relative_path().string(), "foo/"); CHECK_EQUAL(p.parent_path().string(), "/foo"); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); CHECK_EQUAL(p.filename(), "."); CHECK_EQUAL(p.stem(), "."); CHECK_EQUAL(p.extension(), ""); CHECK_EQUAL(p.root_name(), ""); CHECK_EQUAL(p.root_directory(), "/"); CHECK_EQUAL(p.root_path().string(), "/"); BOOST_TEST(p.has_root_path()); BOOST_TEST(!p.has_root_name()); BOOST_TEST(p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_stem()); BOOST_TEST(!p.has_extension()); BOOST_TEST(p.has_parent_path()); if (platform == "POSIX") BOOST_TEST(p.is_absolute()); else BOOST_TEST(!p.is_absolute()); p = q = "///foo"; CHECK_EQUAL(p.relative_path().string(), "foo"); CHECK_EQUAL(p.parent_path().string(), "/"); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); CHECK_EQUAL(p.filename(), "foo"); CHECK_EQUAL(p.root_name(), ""); CHECK_EQUAL(p.root_directory(), "/"); CHECK_EQUAL(p.root_path().string(), "/"); BOOST_TEST(p.has_root_path()); BOOST_TEST(!p.has_root_name()); BOOST_TEST(p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_parent_path()); if (platform == "POSIX") BOOST_TEST(p.is_absolute()); else BOOST_TEST(!p.is_absolute()); p = q = "foo/bar"; BOOST_TEST(p.relative_path().string() == "foo/bar"); BOOST_TEST(p.parent_path().string() == "foo"); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); BOOST_TEST(p.filename() == "bar"); BOOST_TEST(p.stem() == "bar"); BOOST_TEST(p.extension() == ""); BOOST_TEST(p.root_name() == ""); BOOST_TEST(p.root_directory() == ""); BOOST_TEST(p.root_path().string() == ""); BOOST_TEST(!p.has_root_path()); BOOST_TEST(!p.has_root_name()); BOOST_TEST(!p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_stem()); BOOST_TEST(!p.has_extension()); BOOST_TEST(p.has_parent_path()); BOOST_TEST(!p.is_absolute()); p = q = "../foo"; BOOST_TEST(p.relative_path().string() == "../foo"); BOOST_TEST(p.parent_path().string() == ".."); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); BOOST_TEST(p.filename() == "foo"); BOOST_TEST(p.root_name() == ""); BOOST_TEST(p.root_directory() == ""); BOOST_TEST(p.root_path().string() == ""); BOOST_TEST(!p.has_root_path()); BOOST_TEST(!p.has_root_name()); BOOST_TEST(!p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_parent_path()); BOOST_TEST(!p.is_absolute()); p = q = "..///foo"; CHECK_EQUAL(p.relative_path().string(), "..///foo"); CHECK_EQUAL(p.parent_path().string(), ".."); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); CHECK_EQUAL(p.filename(), "foo"); CHECK_EQUAL(p.root_name(), ""); CHECK_EQUAL(p.root_directory(), ""); CHECK_EQUAL(p.root_path().string(), ""); BOOST_TEST(!p.has_root_path()); BOOST_TEST(!p.has_root_name()); BOOST_TEST(!p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_parent_path()); BOOST_TEST(!p.is_absolute()); p = q = "/foo/bar"; BOOST_TEST(p.relative_path().string() == "foo/bar"); BOOST_TEST(p.parent_path().string() == "/foo"); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); BOOST_TEST(p.filename() == "bar"); BOOST_TEST(p.root_name() == ""); BOOST_TEST(p.root_directory() == "/"); BOOST_TEST(p.root_path().string() == "/"); BOOST_TEST(p.has_root_path()); BOOST_TEST(!p.has_root_name()); BOOST_TEST(p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_parent_path()); if (platform == "POSIX") BOOST_TEST(p.is_absolute()); else BOOST_TEST(!p.is_absolute()); // Both POSIX and Windows allow two leading slashs // (POSIX meaning is implementation defined) PATH_CHECK(path("//resource"), "//resource"); PATH_CHECK(path("//resource/"), "//resource/"); PATH_CHECK(path("//resource/foo"), "//resource/foo"); p = q = path("//net"); CHECK_EQUAL(p.string(), "//net"); CHECK_EQUAL(p.relative_path().string(), ""); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); CHECK_EQUAL(p.parent_path().string(), ""); CHECK_EQUAL(p.filename(), "//net"); CHECK_EQUAL(p.root_name(), "//net"); CHECK_EQUAL(p.root_directory(), ""); CHECK_EQUAL(p.root_path().string(), "//net"); BOOST_TEST(p.has_root_path()); BOOST_TEST(p.has_root_name()); BOOST_TEST(!p.has_root_directory()); BOOST_TEST(!p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(!p.has_parent_path()); BOOST_TEST(!p.is_absolute()); p = q = path("//net/"); BOOST_TEST(p.relative_path().string() == ""); BOOST_TEST(p.parent_path().string() == "//net"); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); BOOST_TEST(p.filename() == "/"); BOOST_TEST(p.root_name() == "//net"); BOOST_TEST(p.root_directory() == "/"); BOOST_TEST(p.root_path().string() == "//net/"); BOOST_TEST(p.has_root_path()); BOOST_TEST(p.has_root_name()); BOOST_TEST(p.has_root_directory()); BOOST_TEST(!p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_parent_path()); BOOST_TEST(p.is_absolute()); p = q = path("//net/foo"); BOOST_TEST(p.relative_path().string() == "foo"); BOOST_TEST(p.parent_path().string() == "//net/"); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); BOOST_TEST(p.filename() == "foo"); BOOST_TEST(p.root_name() == "//net"); BOOST_TEST(p.root_directory() == "/"); BOOST_TEST(p.root_path().string() == "//net/"); BOOST_TEST(p.has_root_path()); BOOST_TEST(p.has_root_name()); BOOST_TEST(p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_parent_path()); BOOST_TEST(p.is_absolute()); p = q = path("//net///foo"); CHECK_EQUAL(p.relative_path().string(), "foo"); CHECK_EQUAL(p.parent_path().string(), "//net/"); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); CHECK_EQUAL(p.filename(), "foo"); CHECK_EQUAL(p.root_name(), "//net"); CHECK_EQUAL(p.root_directory(), "/"); CHECK_EQUAL(p.root_path().string(), "//net/"); BOOST_TEST(p.has_root_path()); BOOST_TEST(p.has_root_name()); BOOST_TEST(p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_parent_path()); BOOST_TEST(p.is_absolute()); if (platform == "Windows") { p = q = path("c:"); BOOST_TEST(p.relative_path().string() == ""); BOOST_TEST(p.parent_path().string() == ""); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); BOOST_TEST(p.filename() == "c:"); BOOST_TEST(p.root_name() == "c:"); BOOST_TEST(p.root_directory() == ""); BOOST_TEST(p.root_path().string() == "c:"); BOOST_TEST(p.has_root_path()); BOOST_TEST(p.has_root_name()); BOOST_TEST(!p.has_root_directory()); BOOST_TEST(!p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(!p.has_parent_path()); BOOST_TEST(!p.is_absolute()); p = q = path("c:foo"); BOOST_TEST(p.relative_path().string() == "foo"); BOOST_TEST(p.parent_path().string() == "c:"); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); BOOST_TEST(p.filename() == "foo"); BOOST_TEST(p.root_name() == "c:"); BOOST_TEST(p.root_directory() == ""); BOOST_TEST(p.root_path().string() == "c:"); BOOST_TEST(p.has_root_path()); BOOST_TEST(p.has_root_name()); BOOST_TEST(!p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_parent_path()); BOOST_TEST(!p.is_absolute()); p = q = path("c:/"); BOOST_TEST(p.relative_path().string() == ""); BOOST_TEST(p.parent_path().string() == "c:"); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); BOOST_TEST(p.filename() == "/"); BOOST_TEST(p.root_name() == "c:"); BOOST_TEST(p.root_directory() == "/"); BOOST_TEST(p.root_path().string() == "c:/"); BOOST_TEST(p.has_root_path()); BOOST_TEST(p.has_root_name()); BOOST_TEST(p.has_root_directory()); BOOST_TEST(!p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_parent_path()); BOOST_TEST(p.is_absolute()); p = q = path("c:.."); BOOST_TEST(p.relative_path().string() == ".."); BOOST_TEST(p.parent_path().string() == "c:"); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); BOOST_TEST(p.filename() == ".."); BOOST_TEST(p.root_name() == "c:"); BOOST_TEST(p.root_directory() == ""); BOOST_TEST(p.root_path().string() == "c:"); BOOST_TEST(p.has_root_path()); BOOST_TEST(p.has_root_name()); BOOST_TEST(!p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_parent_path()); BOOST_TEST(!p.is_absolute()); p = q = path("c:/foo"); CHECK_EQUAL(p.relative_path().string(), "foo"); CHECK_EQUAL(p.parent_path().string(), "c:/"); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); CHECK_EQUAL(p.filename(), "foo"); CHECK_EQUAL(p.root_name(), "c:"); CHECK_EQUAL(p.root_directory(), "/"); CHECK_EQUAL(p.root_path().string(), "c:/"); BOOST_TEST(p.has_root_path()); BOOST_TEST(p.has_root_name()); BOOST_TEST(p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_parent_path()); BOOST_TEST(p.is_absolute()); p = q = path("c://foo"); CHECK_EQUAL(p.relative_path().string(), "foo"); CHECK_EQUAL(p.parent_path().string(), "c:/"); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); CHECK_EQUAL(p.filename(), "foo"); CHECK_EQUAL(p.root_name(), "c:"); CHECK_EQUAL(p.root_directory(), "/"); CHECK_EQUAL(p.root_path().string(), "c:/"); BOOST_TEST(p.has_root_path()); BOOST_TEST(p.has_root_name()); BOOST_TEST(p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_parent_path()); BOOST_TEST(p.is_absolute()); p = q = path("c:\\foo\\bar"); CHECK_EQUAL(p.relative_path().string(), "foo\\bar"); CHECK_EQUAL(p.parent_path().string(), "c:\\foo"); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); CHECK_EQUAL(p.filename(), "bar"); CHECK_EQUAL(p.root_name(), "c:"); CHECK_EQUAL(p.root_directory(), "\\"); CHECK_EQUAL(p.root_path().string(), "c:\\"); BOOST_TEST(p.has_root_path()); BOOST_TEST(p.has_root_name()); BOOST_TEST(p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_parent_path()); BOOST_TEST(p.is_absolute()); p = q = path("prn:"); BOOST_TEST(p.relative_path().string() == ""); BOOST_TEST(p.parent_path().string() == ""); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); BOOST_TEST(p.filename() == "prn:"); BOOST_TEST(p.root_name() == "prn:"); BOOST_TEST(p.root_directory() == ""); BOOST_TEST(p.root_path().string() == "prn:"); BOOST_TEST(p.has_root_path()); BOOST_TEST(p.has_root_name()); BOOST_TEST(!p.has_root_directory()); BOOST_TEST(!p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(!p.has_parent_path()); BOOST_TEST(!p.is_absolute()); p = q = path("\\\\net\\\\\\foo"); CHECK_EQUAL(p.relative_path().string(), "foo"); CHECK_EQUAL(p.parent_path().string(), "\\\\net\\"); BOOST_TEST_EQ(q.remove_filename().string(), p.parent_path().string()); CHECK_EQUAL(p.filename(), "foo"); CHECK_EQUAL(p.root_name(), "\\\\net"); CHECK_EQUAL(p.root_directory(), "\\"); CHECK_EQUAL(p.root_path().string(), "\\\\net\\"); BOOST_TEST(p.has_root_path()); BOOST_TEST(p.has_root_name()); BOOST_TEST(p.has_root_directory()); BOOST_TEST(p.has_relative_path()); BOOST_TEST(p.has_filename()); BOOST_TEST(p.has_parent_path()); BOOST_TEST(p.is_absolute()); } // Windows else { // POSIX PATH_CHECK(path("/foo/bar/"), "/foo/bar/"); PATH_CHECK(path("//foo//bar//"), "//foo//bar//"); PATH_CHECK(path("///foo///bar///"), "///foo///bar///"); p = path("/usr/local/bin:/usr/bin:/bin"); BOOST_TEST(p.string() == "/usr/local/bin:/usr/bin:/bin"); } // POSIX } // composition_tests ----------------------------------------------------------------// void composition_tests() { std::cout << "composition_tests..." << std::endl; } // construction_tests ---------------------------------------------------------------// void construction_tests() { std::cout << "construction_tests..." << std::endl; PATH_CHECK("", ""); PATH_CHECK("foo", "foo"); PATH_CHECK("f", "f"); PATH_CHECK("foo/", "foo/"); PATH_CHECK("f/", "f/"); PATH_CHECK("foo/..", "foo/.."); PATH_CHECK("foo/../", "foo/../"); PATH_CHECK("foo/bar/../..", "foo/bar/../.."); PATH_CHECK("foo/bar/../../", "foo/bar/../../"); PATH_CHECK(path("/"), "/"); PATH_CHECK(path("/f"), "/f"); PATH_CHECK("/foo", "/foo"); PATH_CHECK(path("/foo/bar/"), "/foo/bar/"); PATH_CHECK(path("//foo//bar//"), "//foo//bar//"); PATH_CHECK(path("///foo///bar///"), "///foo///bar///"); PATH_CHECK(path("\\/foo\\/bar\\/"), "\\/foo\\/bar\\/"); PATH_CHECK(path("\\//foo\\//bar\\//"), "\\//foo\\//bar\\//"); if (platform == "Windows") { PATH_CHECK(path("c:") / "foo", "c:foo"); PATH_CHECK(path("c:") / "/foo", "c:/foo"); PATH_CHECK(path("\\foo\\bar\\"), "\\foo\\bar\\"); PATH_CHECK(path("\\\\foo\\\\bar\\\\"), "\\\\foo\\\\bar\\\\"); PATH_CHECK(path("\\\\\\foo\\\\\\bar\\\\\\"), "\\\\\\foo\\\\\\bar\\\\\\"); PATH_CHECK(path("\\"), "\\"); PATH_CHECK(path("\\f"), "\\f"); PATH_CHECK(path("\\foo"), "\\foo"); PATH_CHECK(path("foo\\bar"), "foo\\bar"); PATH_CHECK(path("foo bar"), "foo bar"); PATH_CHECK(path("c:"), "c:"); PATH_CHECK(path("c:/"), "c:/"); PATH_CHECK(path("c:."), "c:."); PATH_CHECK(path("c:./foo"), "c:./foo"); PATH_CHECK(path("c:.\\foo"), "c:.\\foo"); PATH_CHECK(path("c:.."), "c:.."); PATH_CHECK(path("c:/."), "c:/."); PATH_CHECK(path("c:/.."), "c:/.."); PATH_CHECK(path("c:/../"), "c:/../"); PATH_CHECK(path("c:\\..\\"), "c:\\..\\"); PATH_CHECK(path("c:/../.."), "c:/../.."); PATH_CHECK(path("c:/../foo"), "c:/../foo"); PATH_CHECK(path("c:\\..\\foo"), "c:\\..\\foo"); PATH_CHECK(path("c:../foo"), "c:../foo"); PATH_CHECK(path("c:..\\foo"), "c:..\\foo"); PATH_CHECK(path("c:/../../foo"), "c:/../../foo"); PATH_CHECK(path("c:\\..\\..\\foo"), "c:\\..\\..\\foo"); PATH_CHECK(path("c:foo/.."), "c:foo/.."); PATH_CHECK(path("c:/foo/.."), "c:/foo/.."); PATH_CHECK(path("c:/..foo"), "c:/..foo"); PATH_CHECK(path("c:foo"), "c:foo"); PATH_CHECK(path("c:/foo"), "c:/foo"); PATH_CHECK(path("\\\\netname"), "\\\\netname"); PATH_CHECK(path("\\\\netname\\"), "\\\\netname\\"); PATH_CHECK(path("\\\\netname\\foo"), "\\\\netname\\foo"); PATH_CHECK(path("c:/foo"), "c:/foo"); PATH_CHECK(path("prn:"), "prn:"); } else { } PATH_CHECK("foo/bar", "foo/bar"); PATH_CHECK("a/b", "a/b"); // probe for length effects PATH_CHECK("..", ".."); PATH_CHECK("../..", "../.."); PATH_CHECK("/..", "/.."); PATH_CHECK("/../..", "/../.."); PATH_CHECK("../foo", "../foo"); PATH_CHECK("foo/..", "foo/.."); PATH_CHECK(path("foo/..bar"), "foo/..bar"); PATH_CHECK("../f", "../f"); PATH_CHECK("/../f", "/../f"); PATH_CHECK("f/..", "f/.."); PATH_CHECK("foo/../..", "foo/../.."); PATH_CHECK("foo/../../..", "foo/../../.."); PATH_CHECK("foo/../bar", "foo/../bar"); PATH_CHECK("foo/bar/..", "foo/bar/.."); PATH_CHECK("foo/bar/../..", "foo/bar/../.."); PATH_CHECK("foo/bar/../blah", "foo/bar/../blah"); PATH_CHECK("f/../b", "f/../b"); PATH_CHECK("f/b/..", "f/b/.."); PATH_CHECK("f/b/../a", "f/b/../a"); PATH_CHECK("foo/bar/blah/../..", "foo/bar/blah/../.."); PATH_CHECK("foo/bar/blah/../../bletch", "foo/bar/blah/../../bletch"); PATH_CHECK("...", "..."); PATH_CHECK("....", "...."); PATH_CHECK("foo/...", "foo/..."); PATH_CHECK("abc.", "abc."); PATH_CHECK("abc..", "abc.."); PATH_CHECK("foo/abc.", "foo/abc."); PATH_CHECK("foo/abc..", "foo/abc.."); PATH_CHECK(path(".abc"), ".abc"); PATH_CHECK("a.c", "a.c"); PATH_CHECK(path("..abc"), "..abc"); PATH_CHECK("a..c", "a..c"); PATH_CHECK(path("foo/.abc"), "foo/.abc"); PATH_CHECK("foo/a.c", "foo/a.c"); PATH_CHECK(path("foo/..abc"), "foo/..abc"); PATH_CHECK("foo/a..c", "foo/a..c"); PATH_CHECK(".", "."); PATH_CHECK("./foo", "./foo"); PATH_CHECK("./..", "./.."); PATH_CHECK("./../foo", "./../foo"); PATH_CHECK("foo/.", "foo/."); PATH_CHECK("../.", "../."); PATH_CHECK("./.", "./."); PATH_CHECK("././.", "././."); PATH_CHECK("./foo/.", "./foo/."); PATH_CHECK("foo/./bar", "foo/./bar"); PATH_CHECK("foo/./.", "foo/./."); PATH_CHECK("foo/./..", "foo/./.."); PATH_CHECK("foo/./../bar", "foo/./../bar"); PATH_CHECK("foo/../.", "foo/../."); PATH_CHECK("././..", "././.."); PATH_CHECK("./../.", "./../."); PATH_CHECK(".././.", ".././."); } // append_tests --------------------------------------------------------------------// void append_test_aux(const path & p, const std::string & s, const std::string & expect) { PATH_CHECK(p / path(s), expect); PATH_CHECK(p / s.c_str(), expect); PATH_CHECK(p / s, expect); path x(p); x.append(s.begin(), s.end()); PATH_CHECK(x, expect); } void append_tests() { std::cout << "append_tests..." << std::endl; // There are many control paths to be exercised, since empty paths and arguments, // paths with trailing separators, arguments with leading separators, with or without // other characters being present, are all separate cases that need to be tested. // Furthermore, some of the code to be tested is specific to argument categories, // so that results in further permutations to be tested. //// code to generate test cases //// //// expected results must be checked by hand //// "foo\bar" expected result must be edited by hand and moved for Windows/POSIX //// //const char* x[] = { "", "/", "foo", "foo/" }; //const char* y[] = { "", "/", "bar", "/bar" }; //for (int i = 0; i < sizeof(x)/sizeof(char*); ++i) // for (int j = 0; j < sizeof(y)/sizeof(char*); ++j) // { // std::cout << "\n PATH_CHECK(path(\"" << x[i] << "\") / \"" << y[j] << "\", \"" // << path(x[i]) / y[j] << "\");\n"; // std::cout << " append_test_aux(\"" << x[i] << "\", \"" << y[j] << "\", \"" // << path(x[i]) / y[j] << "\");\n"; // } PATH_CHECK(path("") / "", ""); append_test_aux("", "", ""); PATH_CHECK(path("") / "/", "/"); append_test_aux("", "/", "/"); PATH_CHECK(path("") / "bar", "bar"); append_test_aux("", "bar", "bar"); PATH_CHECK(path("") / "/bar", "/bar"); append_test_aux("", "/bar", "/bar"); PATH_CHECK(path("/") / "", "/"); append_test_aux("/", "", "/"); PATH_CHECK(path("/") / "/", "//"); append_test_aux("/", "/", "//"); PATH_CHECK(path("/") / "bar", "/bar"); append_test_aux("/", "bar", "/bar"); PATH_CHECK(path("/") / "/bar", "//bar"); append_test_aux("/", "/bar", "//bar"); PATH_CHECK(path("foo") / "", "foo"); append_test_aux("foo", "", "foo"); PATH_CHECK(path("foo") / "/", "foo/"); append_test_aux("foo", "/", "foo/"); PATH_CHECK(path("foo") / "/bar", "foo/bar"); append_test_aux("foo", "/bar", "foo/bar"); PATH_CHECK(path("foo/") / "", "foo/"); append_test_aux("foo/", "", "foo/"); PATH_CHECK(path("foo/") / "/", "foo//"); append_test_aux("foo/", "/", "foo//"); PATH_CHECK(path("foo/") / "bar", "foo/bar"); append_test_aux("foo/", "bar", "foo/bar"); PATH_CHECK(path("foo/") / "/bar", "foo//bar"); append_test_aux("foo/", "/bar", "foo//bar"); if (platform == "Windows") { PATH_CHECK(path("foo") / "bar", "foo\\bar"); append_test_aux("foo", "bar", "foo\\bar"); // hand created test case specific to Windows PATH_CHECK(path("c:") / "bar", "c:bar"); append_test_aux("c:", "bar", "c:bar"); } else { PATH_CHECK(path("foo") / "bar", "foo/bar"); append_test_aux("foo", "bar", "foo/bar"); } } // name_function_tests -------------------------------------------------------------// void name_function_tests() { std::cout << "name_function_tests..." << std::endl; BOOST_TEST(fs::portable_posix_name(std::string("x"))); BOOST_TEST(fs::windows_name(std::string("x"))); BOOST_TEST(fs::portable_name(std::string("x"))); BOOST_TEST(fs::portable_directory_name(std::string("x"))); BOOST_TEST(fs::portable_file_name(std::string("x"))); BOOST_TEST(fs::portable_posix_name(std::string("."))); BOOST_TEST(fs::windows_name(std::string("."))); BOOST_TEST(fs::portable_name(std::string("."))); BOOST_TEST(fs::portable_directory_name(std::string("."))); BOOST_TEST(!fs::portable_file_name(std::string("."))); BOOST_TEST(fs::portable_posix_name(std::string(".."))); BOOST_TEST(fs::windows_name(std::string(".."))); BOOST_TEST(fs::portable_name(std::string(".."))); BOOST_TEST(fs::portable_directory_name(std::string(".."))); BOOST_TEST(!fs::portable_file_name(std::string(".."))); BOOST_TEST(!fs::native(std::string(""))); BOOST_TEST(!fs::portable_posix_name(std::string(""))); BOOST_TEST(!fs::windows_name(std::string(""))); BOOST_TEST(!fs::portable_name(std::string(""))); BOOST_TEST(!fs::portable_directory_name(std::string(""))); BOOST_TEST(!fs::portable_file_name(std::string(""))); BOOST_TEST(!fs::native(std::string(" "))); BOOST_TEST(!fs::portable_posix_name(std::string(" "))); BOOST_TEST(!fs::windows_name(std::string(" "))); BOOST_TEST(!fs::portable_name(std::string(" "))); BOOST_TEST(!fs::portable_directory_name(std::string(" "))); BOOST_TEST(!fs::portable_file_name(std::string(" "))); BOOST_TEST(!fs::portable_posix_name(std::string(":"))); BOOST_TEST(!fs::windows_name(std::string(":"))); BOOST_TEST(!fs::portable_name(std::string(":"))); BOOST_TEST(!fs::portable_directory_name(std::string(":"))); BOOST_TEST(!fs::portable_file_name(std::string(":"))); BOOST_TEST(fs::portable_posix_name(std::string("-"))); BOOST_TEST(fs::windows_name(std::string("-"))); BOOST_TEST(!fs::portable_name(std::string("-"))); BOOST_TEST(!fs::portable_directory_name(std::string("-"))); BOOST_TEST(!fs::portable_file_name(std::string("-"))); BOOST_TEST(!fs::portable_posix_name(std::string("foo bar"))); BOOST_TEST(fs::windows_name(std::string("foo bar"))); BOOST_TEST(!fs::windows_name(std::string(" bar"))); BOOST_TEST(!fs::windows_name(std::string("foo "))); BOOST_TEST(!fs::portable_name(std::string("foo bar"))); BOOST_TEST(!fs::portable_directory_name(std::string("foo bar"))); BOOST_TEST(!fs::portable_file_name(std::string("foo bar"))); BOOST_TEST(fs::portable_posix_name(std::string("foo.bar"))); BOOST_TEST(fs::windows_name(std::string("foo.bar"))); BOOST_TEST(fs::portable_name(std::string("foo.bar"))); BOOST_TEST(!fs::portable_directory_name(std::string("foo.bar"))); BOOST_TEST(fs::portable_file_name(std::string("foo.bar"))); BOOST_TEST(fs::portable_posix_name(std::string("foo.barf"))); BOOST_TEST(fs::windows_name(std::string("foo.barf"))); BOOST_TEST(fs::portable_name(std::string("foo.barf"))); BOOST_TEST(!fs::portable_directory_name(std::string("foo.barf"))); BOOST_TEST(!fs::portable_file_name(std::string("foo.barf"))); BOOST_TEST(fs::portable_posix_name(std::string(".foo"))); BOOST_TEST(fs::windows_name(std::string(".foo"))); BOOST_TEST(!fs::portable_name(std::string(".foo"))); BOOST_TEST(!fs::portable_directory_name(std::string(".foo"))); BOOST_TEST(!fs::portable_file_name(std::string(".foo"))); BOOST_TEST(fs::portable_posix_name(std::string("foo."))); BOOST_TEST(!fs::windows_name(std::string("foo."))); BOOST_TEST(!fs::portable_name(std::string("foo."))); BOOST_TEST(!fs::portable_directory_name(std::string("foo."))); BOOST_TEST(!fs::portable_file_name(std::string("foo."))); } // replace_extension_tests ---------------------------------------------------// void replace_extension_tests() { std::cout << "replace_extension_tests..." << std::endl; BOOST_TEST(path().replace_extension().empty()); BOOST_TEST(path().replace_extension("a").empty()); BOOST_TEST(path().replace_extension("a.") == "."); BOOST_TEST(path().replace_extension("a.txt") == ".txt"); // see the rationale in html docs for explanation why this works: BOOST_TEST(path().replace_extension(".txt") == ".txt"); BOOST_TEST(path("a.txt").replace_extension() == "a"); BOOST_TEST(path("a.txt").replace_extension("") == "a"); BOOST_TEST(path("a.txt").replace_extension(".") == "a."); BOOST_TEST(path("a.txt").replace_extension(".tex") == "a.tex"); BOOST_TEST(path("a.txt").replace_extension("tex") == "a"); BOOST_TEST(path("a.").replace_extension(".tex") == "a.tex"); BOOST_TEST(path("a.").replace_extension("tex") == "a"); BOOST_TEST(path("a").replace_extension(".txt") == "a.txt"); BOOST_TEST(path("a").replace_extension("txt") == "a"); BOOST_TEST(path("a.b.txt").replace_extension(".tex") == "a.b.tex"); BOOST_TEST(path("a.b.txt").replace_extension("tex") == "a.b"); } } // unnamed namespace //--------------------------------------------------------------------------------------// // // // main // // // //--------------------------------------------------------------------------------------// int main(int, char*[]) { // The choice of platform is make at runtime rather than compile-time // so that compile errors for all platforms will be detected even though // only the current platform is runtime tested. platform = (platform == "Win32" || platform == "Win64" || platform == "Cygwin") ? "Windows" : "POSIX"; std::cout << "Platform is " << platform << '\n'; BOOST_TEST(p1.string() != p3.string()); p3 = p2; BOOST_TEST(p1.string() == p3.string()); path p4("foobar"); BOOST_TEST(p4.string() == "foobar"); p4 = p4; // self-assignment BOOST_TEST(p4.string() == "foobar"); construction_tests(); append_tests(); overload_tests(); query_and_decomposition_tests(); composition_tests(); iterator_tests(); non_member_tests(); exception_tests(); name_function_tests(); replace_extension_tests(); // verify deprecated names still available # ifndef BOOST_FILESYSTEM_NO_DEPRECATED p1.branch_path(); p1.leaf(); path p_remove_leaf; p_remove_leaf.remove_leaf(); # endif std::string s1("//:somestring"); // this used to be treated specially // check the path member templates p5.assign(s1.begin(), s1.end()); PATH_CHECK(p5, "//:somestring"); p5 = s1; PATH_CHECK(p5, "//:somestring"); // this code, courtesy of David Whetstone, detects a now fixed bug that // derefereced the end iterator (assuming debug build with checked itors) std::vector v1; p5.assign(v1.begin(), v1.end()); std::string s2(v1.begin(), v1.end()); PATH_CHECK(p5, s2); p5.assign(s1.begin(), s1.begin() + 1); PATH_CHECK(p5, "/"); BOOST_TEST(p1 != p4); BOOST_TEST(p1.string() == p2.string()); BOOST_TEST(p1.string() == p3.string()); BOOST_TEST(path("foo").filename() == "foo"); BOOST_TEST(path("foo").parent_path().string() == ""); BOOST_TEST(p1.filename() == "fum"); BOOST_TEST(p1.parent_path().string() == "fe/fi/fo"); BOOST_TEST(path("").empty() == true); BOOST_TEST(path("foo").empty() == false); // inserter and extractor tests # if !defined(BOOST_MSVC) || BOOST_MSVC > 1300 // bypass VC++ 7.0 and earlier std::cout << "\nInserter and extractor test..."; std::stringstream ss; ss << fs::path("foo/bar") << std::endl; fs::path round_trip; ss >> round_trip; BOOST_TEST(round_trip.string() == "foo/bar"); std::cout << round_trip.string() << "..." << round_trip << " complete\n"; # endif return ::boost::report_errors(); }