170 changes: 67 additions & 103 deletions test/path_test.cpp
Expand Up @@ -72,6 +72,12 @@ using boost::prior;
#define BOOST_DIR_SEP "/"
#endif

#if BOOST_FILESYSTEM_VERSION == 3
#define BOOST_FILESYSTEM_V3_TRAILING_DOT "."
#else
#define BOOST_FILESYSTEM_V3_TRAILING_DOT ""
#endif

#define PATH_TEST_EQ(a, b) check(a, b, __FILE__, __LINE__)

namespace {
Expand Down Expand Up @@ -215,18 +221,10 @@ void iterator_tests()
BOOST_TEST(itr != itr_ck.end());
PATH_TEST_EQ(*++itr, "bar");
BOOST_TEST(itr != itr_ck.end());
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(*++itr, ".");
#else
PATH_TEST_EQ(*++itr, "");
#endif
PATH_TEST_EQ(*++itr, BOOST_FILESYSTEM_V3_TRAILING_DOT);
BOOST_TEST(itr != itr_ck.end()); // verify the . isn't also seen as end()
BOOST_TEST(++itr == itr_ck.end());
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(*--itr, ".");
#else
PATH_TEST_EQ(*--itr, "");
#endif
PATH_TEST_EQ(*--itr, BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(*--itr, "bar");
PATH_TEST_EQ(*--itr, "foo");
PATH_TEST_EQ(*--itr, "/");
Expand All @@ -238,18 +236,10 @@ void iterator_tests()
PATH_TEST_EQ(itr->string(), "/");
PATH_TEST_EQ(*++itr, "f");
PATH_TEST_EQ(*++itr, "b");
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(*++itr, ".");
#else
PATH_TEST_EQ(*++itr, "");
#endif
PATH_TEST_EQ(*++itr, BOOST_FILESYSTEM_V3_TRAILING_DOT);
BOOST_TEST(itr != itr_ck.end()); // verify the . isn't also seen as end()
BOOST_TEST(++itr == itr_ck.end());
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(*--itr, ".");
#else
PATH_TEST_EQ(*--itr, "");
#endif
PATH_TEST_EQ(*--itr, BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(*--itr, "b");
PATH_TEST_EQ(*--itr, "f");
PATH_TEST_EQ(*--itr, "/");
Expand All @@ -262,18 +252,10 @@ void iterator_tests()
itr_begin = itr = itr_ck.begin();
PATH_TEST_EQ(*itr, "a");
PATH_TEST_EQ(*++itr, "b");
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(*++itr, ".");
#else
PATH_TEST_EQ(*++itr, "");
#endif
PATH_TEST_EQ(*++itr, BOOST_FILESYSTEM_V3_TRAILING_DOT);
BOOST_TEST(itr != itr_ck.end()); // verify the . isn't also seen as end()
BOOST_TEST(++itr == itr_ck.end());
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(*--itr, ".");
#else
PATH_TEST_EQ(*--itr, "");
#endif
PATH_TEST_EQ(*--itr, BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(*--itr, "b");
PATH_TEST_EQ(*--itr, "a");
BOOST_TEST(itr == itr_begin);
Expand Down Expand Up @@ -301,17 +283,9 @@ void iterator_tests()
PATH_TEST_EQ(itr->string(), "//foo");
PATH_TEST_EQ(*++itr, "/");
PATH_TEST_EQ(*++itr, "bar");
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(*++itr, ".");
#else
PATH_TEST_EQ(*++itr, "");
#endif
PATH_TEST_EQ(*++itr, BOOST_FILESYSTEM_V3_TRAILING_DOT);
BOOST_TEST(++itr == itr_ck.end());
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(*--itr, ".");
#else
PATH_TEST_EQ(*--itr, "");
#endif
PATH_TEST_EQ(*--itr, BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(*--itr, "bar");
PATH_TEST_EQ(*--itr, "/");
PATH_TEST_EQ(*--itr, "//foo");
Expand All @@ -323,17 +297,9 @@ void iterator_tests()
PATH_TEST_EQ(itr->string(), "/");
PATH_TEST_EQ(*++itr, "foo");
PATH_TEST_EQ(*++itr, "bar");
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(*++itr, ".");
#else
PATH_TEST_EQ(*++itr, "");
#endif
PATH_TEST_EQ(*++itr, BOOST_FILESYSTEM_V3_TRAILING_DOT);
BOOST_TEST(++itr == itr_ck.end());
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(*--itr, ".");
#else
PATH_TEST_EQ(*--itr, "");
#endif
PATH_TEST_EQ(*--itr, BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(*--itr, "bar");
PATH_TEST_EQ(*--itr, "foo");
PATH_TEST_EQ(*--itr, "/");
Expand Down Expand Up @@ -420,17 +386,9 @@ void iterator_tests()
PATH_TEST_EQ(itr->string(), "/");
PATH_TEST_EQ(*++itr, "foo");
PATH_TEST_EQ(*++itr, "bar");
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(*++itr, ".");
#else
PATH_TEST_EQ(*++itr, "");
#endif
PATH_TEST_EQ(*++itr, BOOST_FILESYSTEM_V3_TRAILING_DOT);
BOOST_TEST(++itr == itr_ck.end());
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(*--itr, ".");
#else
PATH_TEST_EQ(*--itr, "");
#endif
PATH_TEST_EQ(*--itr, BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(*--itr, "bar");
PATH_TEST_EQ(*--itr, "foo");
PATH_TEST_EQ(*--itr, "/");
Expand All @@ -449,17 +407,9 @@ void iterator_tests()
itr_begin = itr = itr_ck.begin();
BOOST_TEST(*itr == std::string("c:"));
BOOST_TEST(*++itr == std::string("foo"));
#if BOOST_FILESYSTEM_VERSION == 3
BOOST_TEST(*++itr == std::string("."));
#else
BOOST_TEST(*++itr == std::string());
#endif
BOOST_TEST(*++itr == std::string(BOOST_FILESYSTEM_V3_TRAILING_DOT));
BOOST_TEST(++itr == itr_ck.end());
#if BOOST_FILESYSTEM_VERSION == 3
BOOST_TEST(*--itr == std::string("."));
#else
BOOST_TEST(*--itr == std::string());
#endif
BOOST_TEST(*--itr == std::string(BOOST_FILESYSTEM_V3_TRAILING_DOT));
BOOST_TEST(*--itr == std::string("foo"));
BOOST_TEST(*--itr == std::string("c:"));
BOOST_TEST(itr == itr_begin);
Expand Down Expand Up @@ -917,11 +867,10 @@ void query_and_decomposition_tests()
BOOST_TEST(path("..").parent_path() == "");
BOOST_TEST(path("/foo/bar.txt").filename() == "bar.txt");
BOOST_TEST(path("/foo/bar").filename() == "bar");
BOOST_TEST(path("/foo/bar/").filename() == BOOST_FILESYSTEM_V3_TRAILING_DOT);
#if BOOST_FILESYSTEM_VERSION == 3
BOOST_TEST(path("/foo/bar/").filename() == ".");
BOOST_TEST(path("/").filename() == "/");
#else
BOOST_TEST(path("/foo/bar/").filename() == "");
BOOST_TEST(path("/").filename() == "");
#endif
BOOST_TEST(path(".").filename() == ".");
Expand Down Expand Up @@ -1164,13 +1113,8 @@ void query_and_decomposition_tests()
PATH_TEST_EQ(p.relative_path().string(), "foo/");
PATH_TEST_EQ(p.parent_path().string(), "/foo");
PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(p.filename(), ".");
PATH_TEST_EQ(p.stem(), ".");
#else
PATH_TEST_EQ(p.filename(), "");
PATH_TEST_EQ(p.stem(), "");
#endif
PATH_TEST_EQ(p.filename(), BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(p.stem(), BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(p.extension(), "");
PATH_TEST_EQ(p.root_name(), "");
PATH_TEST_EQ(p.root_directory(), "/");
Expand Down Expand Up @@ -2358,11 +2302,11 @@ void lexically_normal_tests()
PATH_TEST_EQ(path("///").lexically_normal().generic_path(), "/");
PATH_TEST_EQ(path("f").lexically_normal().generic_path(), "f");
PATH_TEST_EQ(path("foo").lexically_normal().generic_path(), "foo");
PATH_TEST_EQ(path("foo/").lexically_normal().generic_path(), "foo/.");
PATH_TEST_EQ(path("f/").lexically_normal().generic_path(), "f/.");
PATH_TEST_EQ(path("foo/").lexically_normal().generic_path(), "foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(path("f/").lexically_normal().generic_path(), "f/" BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(path("/foo").lexically_normal().generic_path(), "/foo");
PATH_TEST_EQ(path("/./foo").lexically_normal().generic_path(), "/foo");
PATH_TEST_EQ(path("/./foo/.").lexically_normal().generic_path(), "/foo/.");
PATH_TEST_EQ(path("/./foo/.").lexically_normal().generic_path(), "/foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(path("foo/bar").lexically_normal().generic_path(), "foo/bar");
PATH_TEST_EQ(path("..").lexically_normal().generic_path(), "..");
PATH_TEST_EQ(path("../..").lexically_normal().generic_path(), "../..");
Expand All @@ -2373,30 +2317,38 @@ void lexically_normal_tests()
PATH_TEST_EQ(path("foo/../").lexically_normal().generic_path(), ".");
PATH_TEST_EQ((path("foo") / "..").lexically_normal().generic_path(), ".");
PATH_TEST_EQ(path("foo/...").lexically_normal().generic_path(), "foo/...");
PATH_TEST_EQ(path("foo/.../").lexically_normal().generic_path(), "foo/.../.");
PATH_TEST_EQ(path("foo/.../").lexically_normal().generic_path(), "foo/.../" BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(path("foo/..bar").lexically_normal().generic_path(), "foo/..bar");
PATH_TEST_EQ(path("../f").lexically_normal().generic_path(), "../f");
PATH_TEST_EQ(path("/../f").lexically_normal().generic_path(), "/../f");
PATH_TEST_EQ(path("f/..").lexically_normal().generic_path(), ".");
PATH_TEST_EQ((path("f") / "..").lexically_normal().generic_path(), ".");
PATH_TEST_EQ(path("foo/../..").lexically_normal().generic_path(), "..");
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(path("foo/../../").lexically_normal().generic_path(), "../.");
#else
PATH_TEST_EQ(path("foo/../../").lexically_normal().generic_path(), "..");
#endif
PATH_TEST_EQ(path("foo/../../..").lexically_normal().generic_path(), "../..");
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(path("foo/../../../").lexically_normal().generic_path(), "../../.");
#else
PATH_TEST_EQ(path("foo/../../../").lexically_normal().generic_path(), "../..");
#endif
PATH_TEST_EQ(path("foo/../bar").lexically_normal().generic_path(), "bar");
PATH_TEST_EQ(path("foo/../bar/").lexically_normal().generic_path(), "bar/.");
PATH_TEST_EQ(path("foo/../bar/").lexically_normal().generic_path(), "bar/" BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(path("foo/bar/..").lexically_normal().generic_path(), "foo");
PATH_TEST_EQ(path("foo/./bar/..").lexically_normal().generic_path(), "foo");
std::cout << path("foo/./bar/..").lexically_normal() << std::endl; // outputs "foo"
PATH_TEST_EQ(path("foo/bar/../").lexically_normal().generic_path(), "foo/.");
PATH_TEST_EQ(path("foo/./bar/../").lexically_normal().generic_path(), "foo/.");
std::cout << path("foo/./bar/../").lexically_normal() << std::endl; // POSIX: "foo/.", Windows: "foo\."
PATH_TEST_EQ(path("foo/bar/../").lexically_normal().generic_path(), "foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(path("foo/./bar/../").lexically_normal().generic_path(), "foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT);
std::cout << path("foo/./bar/../").lexically_normal() << std::endl; // POSIX: "foo/", Windows: "foo\" (with a trailing dot for v3)
PATH_TEST_EQ(path("foo/bar/../..").lexically_normal().generic_path(), ".");
PATH_TEST_EQ(path("foo/bar/../../").lexically_normal().generic_path(), ".");
PATH_TEST_EQ(path("foo/bar/../blah").lexically_normal().generic_path(), "foo/blah");
PATH_TEST_EQ(path("f/../b").lexically_normal().generic_path(), "b");
PATH_TEST_EQ(path("f/b/..").lexically_normal().generic_path(), "f");
PATH_TEST_EQ(path("f/b/../").lexically_normal().generic_path(), "f/.");
PATH_TEST_EQ(path("f/b/../").lexically_normal().generic_path(), "f/" BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(path("f/b/../a").lexically_normal().generic_path(), "f/a");
PATH_TEST_EQ(path("foo/bar/blah/../..").lexically_normal().generic_path(), "foo");
PATH_TEST_EQ(path("foo/bar/blah/../../bletch").lexically_normal().generic_path(), "foo/bletch");
Expand All @@ -2405,24 +2357,24 @@ void lexically_normal_tests()
PATH_TEST_EQ(path("//..net").lexically_normal().generic_path(), "//..net");
PATH_TEST_EQ(path("//net/..").lexically_normal().generic_path(), "//net/..");
PATH_TEST_EQ(path("//net/foo").lexically_normal().generic_path(), "//net/foo");
PATH_TEST_EQ(path("//net/foo/").lexically_normal().generic_path(), "//net/foo/.");
PATH_TEST_EQ(path("//net/foo/").lexically_normal().generic_path(), "//net/foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(path("//net/foo/..").lexically_normal().generic_path(), "//net/");
PATH_TEST_EQ(path("//net/foo/../").lexically_normal().generic_path(), "//net/.");
PATH_TEST_EQ(path("//net/foo/../").lexically_normal().generic_path(), "//net/" BOOST_FILESYSTEM_V3_TRAILING_DOT);

PATH_TEST_EQ(path("/net/foo/bar").lexically_normal().generic_path(), "/net/foo/bar");
PATH_TEST_EQ(path("/net/foo/bar/").lexically_normal().generic_path(), "/net/foo/bar/.");
PATH_TEST_EQ(path("/net/foo/bar/").lexically_normal().generic_path(), "/net/foo/bar/" BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(path("/net/foo/..").lexically_normal().generic_path(), "/net");
PATH_TEST_EQ(path("/net/foo/../").lexically_normal().generic_path(), "/net/.");
PATH_TEST_EQ(path("/net/foo/../").lexically_normal().generic_path(), "/net/" BOOST_FILESYSTEM_V3_TRAILING_DOT);

PATH_TEST_EQ(path("//net//foo//bar").lexically_normal().generic_path(), "//net/foo/bar");
PATH_TEST_EQ(path("//net//foo//bar//").lexically_normal().generic_path(), "//net/foo/bar/.");
PATH_TEST_EQ(path("//net//foo//bar//").lexically_normal().generic_path(), "//net/foo/bar/" BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(path("//net//foo//..").lexically_normal().generic_path(), "//net/");
PATH_TEST_EQ(path("//net//foo//..//").lexically_normal().generic_path(), "//net/.");
PATH_TEST_EQ(path("//net//foo//..//").lexically_normal().generic_path(), "//net/" BOOST_FILESYSTEM_V3_TRAILING_DOT);

PATH_TEST_EQ(path("///net///foo///bar").lexically_normal().generic_path(), "/net/foo/bar");
PATH_TEST_EQ(path("///net///foo///bar///").lexically_normal().generic_path(), "/net/foo/bar/.");
PATH_TEST_EQ(path("///net///foo///bar///").lexically_normal().generic_path(), "/net/foo/bar/" BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(path("///net///foo///..").lexically_normal().generic_path(), "/net");
PATH_TEST_EQ(path("///net///foo///..///").lexically_normal().generic_path(), "/net/.");
PATH_TEST_EQ(path("///net///foo///..///").lexically_normal().generic_path(), "/net/" BOOST_FILESYSTEM_V3_TRAILING_DOT);

if (platform == "Windows")
{
Expand All @@ -2432,18 +2384,26 @@ void lexically_normal_tests()
PATH_TEST_EQ(path("c:..").lexically_normal().generic_path(), "c:..");
PATH_TEST_EQ(path("c:foo/..").lexically_normal().generic_path(), "c:");

PATH_TEST_EQ(path("c:foo/../").lexically_normal().generic_path(), "c:.");
PATH_TEST_EQ(path("c:foo/../").lexically_normal().generic_path(), "c:" BOOST_FILESYSTEM_V3_TRAILING_DOT);

PATH_TEST_EQ(path("c:/foo/..").lexically_normal().generic_path(), "c:/");
PATH_TEST_EQ(path("c:/foo/../").lexically_normal().generic_path(), "c:/.");
PATH_TEST_EQ(path("c:/foo/../").lexically_normal().generic_path(), "c:/" BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(path("c:/..").lexically_normal().generic_path(), "c:/..");
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(path("c:/../").lexically_normal().generic_path(), "c:/../.");
#else
PATH_TEST_EQ(path("c:/../").lexically_normal().generic_path(), "c:/..");
#endif
PATH_TEST_EQ(path("c:/../..").lexically_normal().generic_path(), "c:/../..");
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(path("c:/../../").lexically_normal().generic_path(), "c:/../../.");
#else
PATH_TEST_EQ(path("c:/../../").lexically_normal().generic_path(), "c:/../..");
#endif
PATH_TEST_EQ(path("c:/../foo").lexically_normal().generic_path(), "c:/../foo");
PATH_TEST_EQ(path("c:/../foo/").lexically_normal().generic_path(), "c:/../foo/.");
PATH_TEST_EQ(path("c:/../foo/").lexically_normal().generic_path(), "c:/../foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(path("c:/../../foo").lexically_normal().generic_path(), "c:/../../foo");
PATH_TEST_EQ(path("c:/../../foo/").lexically_normal().generic_path(), "c:/../../foo/.");
PATH_TEST_EQ(path("c:/../../foo/").lexically_normal().generic_path(), "c:/../../foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(path("c:/..foo").lexically_normal().generic_path(), "c:/..foo");
}
else // POSIX
Expand All @@ -2452,15 +2412,19 @@ void lexically_normal_tests()
PATH_TEST_EQ(path("c:foo/..").lexically_normal(), ".");
PATH_TEST_EQ(path("c:foo/../").lexically_normal(), ".");
PATH_TEST_EQ(path("c:/foo/..").lexically_normal(), "c:");
PATH_TEST_EQ(path("c:/foo/../").lexically_normal(), "c:/.");
PATH_TEST_EQ(path("c:/foo/../").lexically_normal(), "c:/" BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(path("c:/..").lexically_normal(), ".");
PATH_TEST_EQ(path("c:/../").lexically_normal(), ".");
PATH_TEST_EQ(path("c:/../..").lexically_normal(), "..");
#if BOOST_FILESYSTEM_VERSION == 3
PATH_TEST_EQ(path("c:/../../").lexically_normal(), "../.");
#else
PATH_TEST_EQ(path("c:/../../").lexically_normal(), "..");
#endif
PATH_TEST_EQ(path("c:/../foo").lexically_normal(), "foo");
PATH_TEST_EQ(path("c:/../foo/").lexically_normal(), "foo/.");
PATH_TEST_EQ(path("c:/../foo/").lexically_normal(), "foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(path("c:/../../foo").lexically_normal(), "../foo");
PATH_TEST_EQ(path("c:/../../foo/").lexically_normal(), "../foo/.");
PATH_TEST_EQ(path("c:/../../foo/").lexically_normal(), "../foo/" BOOST_FILESYSTEM_V3_TRAILING_DOT);
PATH_TEST_EQ(path("c:/..foo").lexically_normal(), "c:/..foo");
}
}
Expand Down