1 //  deprecated_test program --------------------------------------------------//
2 
3 //  Copyright Beman Dawes 2002
4 //  Copyright Vladimir Prus 2002
5 
6 //  Distributed under the Boost Software License, Version 1.0.
7 //  See http://www.boost.org/LICENSE_1_0.txt
8 
9 //  Library home page: http://www.boost.org/libs/filesystem
10 
11 //  This test verifies that various deprecated names still work. This is
12 //  important to preserve existing code that uses the old names.
13 
14 #define BOOST_FILESYSTEM_DEPRECATED
15 
16 #include <boost/filesystem.hpp>
17 
18 #include <boost/config.hpp>
19 # if defined( BOOST_NO_STD_WSTRING )
20 #   error Configuration not supported: Boost.Filesystem V3 and later requires std::wstring support
21 # endif
22 
23 #include <boost/detail/lightweight_test.hpp>
24 #include <boost/detail/lightweight_main.hpp>
25 
26 namespace fs = boost::filesystem;
27 using boost::filesystem::path;
28 
29 #define PATH_CHECK(a, b) check(a, b, __LINE__)
30 
31 namespace
32 {
33   std::string platform(BOOST_PLATFORM);
34 
check(const fs::path & source,const std::string & expected,int line)35   void check(const fs::path & source,
36               const std::string & expected, int line)
37   {
38     if (source.generic_string()== expected) return;
39 
40     ++::boost::detail::test_errors();
41 
42     std::cout << '(' << line << ") source.string(): \"" << source.string()
43               << "\" != expected: \"" << expected
44               << "\"" << std::endl;
45   }
46 
normalize_test()47   void normalize_test()
48   {
49     PATH_CHECK(path("").normalize(), "");
50     PATH_CHECK(path("/").normalize(), "/");
51     PATH_CHECK(path("//").normalize(), "//");
52     PATH_CHECK(path("///").normalize(), "/");
53     PATH_CHECK(path("f").normalize(), "f");
54     PATH_CHECK(path("foo").normalize(), "foo");
55     PATH_CHECK(path("foo/").normalize(), "foo/.");
56     PATH_CHECK(path("f/").normalize(), "f/.");
57     PATH_CHECK(path("/foo").normalize(), "/foo");
58     PATH_CHECK(path("foo/bar").normalize(), "foo/bar");
59     PATH_CHECK(path("..").normalize(), "..");
60     PATH_CHECK(path("../..").normalize(), "../..");
61     PATH_CHECK(path("/..").normalize(), "/..");
62     PATH_CHECK(path("/../..").normalize(), "/../..");
63     PATH_CHECK(path("../foo").normalize(), "../foo");
64     PATH_CHECK(path("foo/..").normalize(), ".");
65     PATH_CHECK(path("foo/../").normalize(), "./.");
66     PATH_CHECK((path("foo") / "..").normalize() , ".");
67     PATH_CHECK(path("foo/...").normalize(), "foo/...");
68     PATH_CHECK(path("foo/.../").normalize(), "foo/.../.");
69     PATH_CHECK(path("foo/..bar").normalize(), "foo/..bar");
70     PATH_CHECK(path("../f").normalize(), "../f");
71     PATH_CHECK(path("/../f").normalize(), "/../f");
72     PATH_CHECK(path("f/..").normalize(), ".");
73     PATH_CHECK((path("f") / "..").normalize() , ".");
74     PATH_CHECK(path("foo/../..").normalize(), "..");
75     PATH_CHECK(path("foo/../../").normalize(), "../.");
76     PATH_CHECK(path("foo/../../..").normalize(), "../..");
77     PATH_CHECK(path("foo/../../../").normalize(), "../../.");
78     PATH_CHECK(path("foo/../bar").normalize(), "bar");
79     PATH_CHECK(path("foo/../bar/").normalize(), "bar/.");
80     PATH_CHECK(path("foo/bar/..").normalize(), "foo");
81     PATH_CHECK(path("foo/bar/../").normalize(), "foo/.");
82     PATH_CHECK(path("foo/bar/../..").normalize(), ".");
83     PATH_CHECK(path("foo/bar/../../").normalize(), "./.");
84     PATH_CHECK(path("foo/bar/../blah").normalize(), "foo/blah");
85     PATH_CHECK(path("f/../b").normalize(), "b");
86     PATH_CHECK(path("f/b/..").normalize(), "f");
87     PATH_CHECK(path("f/b/../").normalize(), "f/.");
88     PATH_CHECK(path("f/b/../a").normalize(), "f/a");
89     PATH_CHECK(path("foo/bar/blah/../..").normalize(), "foo");
90     PATH_CHECK(path("foo/bar/blah/../../bletch").normalize(), "foo/bletch");
91     PATH_CHECK(path("//net").normalize(), "//net");
92     PATH_CHECK(path("//net/").normalize(), "//net/");
93     PATH_CHECK(path("//..net").normalize(), "//..net");
94     PATH_CHECK(path("//net/..").normalize(), "//net/..");
95     PATH_CHECK(path("//net/foo").normalize(), "//net/foo");
96     PATH_CHECK(path("//net/foo/").normalize(), "//net/foo/.");
97     PATH_CHECK(path("//net/foo/..").normalize(), "//net/");
98     PATH_CHECK(path("//net/foo/../").normalize(), "//net/.");
99 
100     PATH_CHECK(path("/net/foo/bar").normalize(), "/net/foo/bar");
101     PATH_CHECK(path("/net/foo/bar/").normalize(), "/net/foo/bar/.");
102     PATH_CHECK(path("/net/foo/..").normalize(), "/net");
103     PATH_CHECK(path("/net/foo/../").normalize(), "/net/.");
104 
105     PATH_CHECK(path("//net//foo//bar").normalize(), "//net/foo/bar");
106     PATH_CHECK(path("//net//foo//bar//").normalize(), "//net/foo/bar/.");
107     PATH_CHECK(path("//net//foo//..").normalize(), "//net/");
108     PATH_CHECK(path("//net//foo//..//").normalize(), "//net/.");
109 
110     PATH_CHECK(path("///net///foo///bar").normalize(), "/net/foo/bar");
111     PATH_CHECK(path("///net///foo///bar///").normalize(), "/net/foo/bar/.");
112     PATH_CHECK(path("///net///foo///..").normalize(), "/net");
113     PATH_CHECK(path("///net///foo///..///").normalize(), "/net/.");
114 
115     if (platform == "Windows")
116     {
117       PATH_CHECK(path("c:..").normalize(), "c:..");
118       PATH_CHECK(path("c:foo/..").normalize(), "c:");
119 
120       PATH_CHECK(path("c:foo/../").normalize(), "c:.");
121 
122       PATH_CHECK(path("c:/foo/..").normalize(), "c:/");
123       PATH_CHECK(path("c:/foo/../").normalize(), "c:/.");
124       PATH_CHECK(path("c:/..").normalize(), "c:/..");
125       PATH_CHECK(path("c:/../").normalize(), "c:/../.");
126       PATH_CHECK(path("c:/../..").normalize(), "c:/../..");
127       PATH_CHECK(path("c:/../../").normalize(), "c:/../../.");
128       PATH_CHECK(path("c:/../foo").normalize(), "c:/../foo");
129       PATH_CHECK(path("c:/../foo/").normalize(), "c:/../foo/.");
130       PATH_CHECK(path("c:/../../foo").normalize(), "c:/../../foo");
131       PATH_CHECK(path("c:/../../foo/").normalize(), "c:/../../foo/.");
132       PATH_CHECK(path("c:/..foo").normalize(), "c:/..foo");
133     }
134     else // POSIX
135     {
136       PATH_CHECK(path("c:..").normalize(), "c:..");
137       PATH_CHECK(path("c:foo/..").normalize(), ".");
138       PATH_CHECK(path("c:foo/../").normalize(), "./.");
139       PATH_CHECK(path("c:/foo/..").normalize(), "c:");
140       PATH_CHECK(path("c:/foo/../").normalize(), "c:/.");
141       PATH_CHECK(path("c:/..").normalize(), ".");
142       PATH_CHECK(path("c:/../").normalize(), "./.");
143       PATH_CHECK(path("c:/../..").normalize(), "..");
144       PATH_CHECK(path("c:/../../").normalize(), "../.");
145       PATH_CHECK(path("c:/../foo").normalize(), "foo");
146       PATH_CHECK(path("c:/../foo/").normalize(), "foo/.");
147       PATH_CHECK(path("c:/../../foo").normalize(), "../foo");
148       PATH_CHECK(path("c:/../../foo/").normalize(), "../foo/.");
149       PATH_CHECK(path("c:/..foo").normalize(), "c:/..foo");
150     }
151   }
152 
153   //  Compile-only tests not intended to be executed -----------------------------------//
154 
compile_only()155   void compile_only()
156   {
157     fs::path p;
158 
159     fs::initial_path<fs::path>();
160     fs::initial_path<fs::wpath>();
161 
162     p.file_string();
163     p.directory_string();
164   }
165 
166   //  path_rename_test -----------------------------------------------------------------//
167 
path_rename_test()168   void path_rename_test()
169   {
170     fs::path p("foo/bar/blah");
171 
172     BOOST_TEST_EQ(path("foo/bar/blah").remove_leaf(), "foo/bar");
173     BOOST_TEST_EQ(p.leaf(), "blah");
174     BOOST_TEST_EQ(p.branch_path(), "foo/bar");
175     BOOST_TEST(p.has_leaf());
176     BOOST_TEST(p.has_branch_path());
177     BOOST_TEST(!p.is_complete());
178 
179     if (platform == "Windows")
180     {
181       BOOST_TEST_EQ(path("foo\\bar\\blah").remove_leaf(), "foo\\bar");
182       p = "foo\\bar\\blah";
183       BOOST_TEST_EQ(p.branch_path(), "foo\\bar");
184     }
185   }
186 
187 } // unnamed namespace
188 
189 
190 //--------------------------------------------------------------------------------------//
191 
cpp_main(int,char * [])192 int cpp_main(int /*argc*/, char* /*argv*/[])
193 {
194   // The choice of platform is make at runtime rather than compile-time
195   // so that compile errors for all platforms will be detected even though
196   // only the current platform is runtime tested.
197   platform = (platform == "Win32" || platform == "Win64" || platform == "Cygwin")
198                ? "Windows"
199                : "POSIX";
200   std::cout << "Platform is " << platform << '\n';
201 
202   BOOST_TEST(fs::initial_path() == fs::current_path());
203 
204   //path::default_name_check(fs::no_check);
205 
206   fs::directory_entry de("foo/bar");
207 
208   de.replace_leaf("", fs::file_status(), fs::file_status());
209 
210   //de.leaf();
211   //de.string();
212 
213   fs::path ng(" no-way, Jose");
214   BOOST_TEST(!fs::is_regular(ng));  // verify deprecated name still works
215   BOOST_TEST(!fs::symbolic_link_exists("nosuchfileordirectory"));
216 
217   path_rename_test();
218   normalize_test();
219 
220 // extension() tests ---------------------------------------------------------//
221 
222   BOOST_TEST(fs::extension("a/b") == "");
223   BOOST_TEST(fs::extension("a/b.txt") == ".txt");
224   BOOST_TEST(fs::extension("a/b.") == ".");
225   BOOST_TEST(fs::extension("a.b.c") == ".c");
226   BOOST_TEST(fs::extension("a.b.c.") == ".");
227   BOOST_TEST(fs::extension("") == "");
228   BOOST_TEST(fs::extension("a/") == "");
229 
230 // basename() tests ----------------------------------------------------------//
231 
232   BOOST_TEST(fs::basename("b") == "b");
233   BOOST_TEST(fs::basename("a/b.txt") == "b");
234   BOOST_TEST(fs::basename("a/b.") == "b");
235   BOOST_TEST(fs::basename("a.b.c") == "a.b");
236   BOOST_TEST(fs::basename("a.b.c.") == "a.b.c");
237   BOOST_TEST(fs::basename("") == "");
238 
239 // change_extension tests ---------------------------------------------------//
240 
241   BOOST_TEST(fs::change_extension("a.txt", ".tex").string() == "a.tex");
242   BOOST_TEST(fs::change_extension("a.", ".tex").string() == "a.tex");
243   BOOST_TEST(fs::change_extension("a", ".txt").string() == "a.txt");
244   BOOST_TEST(fs::change_extension("a.b.txt", ".tex").string() == "a.b.tex");
245   // see the rationale in html docs for explanation why this works
246   BOOST_TEST(fs::change_extension("", ".png").string() == ".png");
247 
248   return ::boost::report_errors();
249 }
250