path_test.cpp 79 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046
  1. // path_test program -----------------------------------------------------------------//
  2. // Copyright Beman Dawes 2002, 2008
  3. // Copyright Vladimir Prus 2002
  4. // Use, modification, and distribution is subject to the Boost Software
  5. // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. // See library home page at http://www.boost.org/libs/filesystem
  8. // basic_path's stem(), extension(), and replace_extension() tests are based
  9. // on basename(), extension(), and change_extension() tests from the original
  10. // convenience_test.cpp by Vladimir Prus.
  11. //--------------------------------------------------------------------------------------//
  12. // //
  13. // Caution //
  14. // //
  15. // The class path relational operators (==, !=, <, etc.) on Windows treat slash and //
  16. // backslash as equal. Thus any tests on Windows where the difference between slash //
  17. // and backslash is significant should compare strings rather than paths. //
  18. // //
  19. // BOOST_TEST(path == path) // '\\' and '/' are equal //
  20. // BOOST_TEST(path == convertable to string) // '\\' and '/' are equal //
  21. // PATH_TEST_EQ(path, path) // '\\' and '/' are equal //
  22. // //
  23. // BOOST_TEST(path.string() == path.string()) // '\\' and '/' are not equal //
  24. // BOOST_TEST(path.string() == //
  25. // convertable to string) // '\\' and '/' are not equal //
  26. // PATH_TEST_EQ(path.string(), //
  27. // convertable to string) // '\\' and '/' are not equal //
  28. // //
  29. // The last of these is often what is needed, so the PATH_TEST_EQ macro is provided. //
  30. // It converts its first argument to a path, and then performs a .string() on it, //
  31. // eliminating much boilerplate .string() or even path(...).string() code. //
  32. // //
  33. // PATH_TEST_EQ(path, convertable to string) // '\\' and '/' are not equal //
  34. // //
  35. //--------------------------------------------------------------------------------------//
  36. #include <boost/config/warning_disable.hpp>
  37. // See deprecated_test for tests of deprecated features
  38. #ifndef BOOST_FILESYSTEM_NO_DEPRECATED
  39. # define BOOST_FILESYSTEM_NO_DEPRECATED
  40. #endif
  41. #ifndef BOOST_SYSTEM_NO_DEPRECATED
  42. # define BOOST_SYSTEM_NO_DEPRECATED
  43. #endif
  44. #include <boost/filesystem/operations.hpp>
  45. #include <boost/filesystem/exception.hpp>
  46. #include <boost/config.hpp>
  47. # if defined( BOOST_NO_STD_WSTRING )
  48. # error Configuration not supported: Boost.Filesystem V3 and later requires std::wstring support
  49. # endif
  50. #include <boost/utility.hpp>
  51. #include <boost/next_prior.hpp>
  52. #include <iostream>
  53. #include <sstream>
  54. #include <string>
  55. #include <vector>
  56. #include <cstring>
  57. #include <cassert>
  58. #include <boost/detail/lightweight_test.hpp>
  59. #include <boost/detail/lightweight_main.hpp>
  60. namespace fs = boost::filesystem;
  61. using boost::filesystem::path;
  62. using boost::next;
  63. using boost::prior;
  64. #ifdef BOOST_WINDOWS_API
  65. # define BOOST_DIR_SEP "\\"
  66. #else
  67. # define BOOST_DIR_SEP "/"
  68. #endif
  69. #define PATH_TEST_EQ(a, b) check(a, b, __FILE__, __LINE__)
  70. namespace
  71. {
  72. std::string platform(BOOST_PLATFORM);
  73. void check(const fs::path & source,
  74. const std::string & expected, const char* file, int line)
  75. {
  76. if (source.string() == expected)
  77. return;
  78. std::cout << file
  79. << '(' << line << "): source: \"" << source.string()
  80. << "\" != expected: \"" << expected
  81. << "\"" << std::endl;
  82. ++::boost::detail::test_errors();
  83. }
  84. path p1("fe/fi/fo/fum");
  85. path p2(p1);
  86. path p3;
  87. path p4("foobar");
  88. path p5;
  89. // exception_tests -----------------------------------------------------------------//
  90. void exception_tests()
  91. {
  92. std::cout << "exception_tests..." << std::endl;
  93. const std::string str_1("string-1");
  94. boost::system::error_code ec(12345, boost::system::system_category());
  95. try { throw fs::filesystem_error(str_1, ec); }
  96. catch (const fs::filesystem_error & ex)
  97. {
  98. //std::cout << ex.what() << "*" << std::endl;
  99. //BOOST_TEST(std::strcmp(ex.what(),
  100. // "string-1: Unknown error") == 0);
  101. BOOST_TEST(ex.code() == ec);
  102. }
  103. try { throw fs::filesystem_error(str_1, "p1", "p2", ec); }
  104. catch (const fs::filesystem_error & ex)
  105. {
  106. //std::cout << ex.what() << "*" << std::endl;
  107. //BOOST_TEST(std::strcmp(ex.what(),
  108. // "string-1: Unknown error: \"p1\", \"p2\"") == 0);
  109. BOOST_TEST(ex.code() == ec);
  110. BOOST_TEST(ex.path1() == "p1");
  111. BOOST_TEST(ex.path2() == "p2");
  112. }
  113. }
  114. // overload_tests ------------------------------------------------------------------//
  115. // These verify various overloads don't cause compiler errors
  116. // They pre-date operations_unit_test.cpp
  117. void overload_tests()
  118. {
  119. std::cout << "overload_tests..." << std::endl;
  120. fs::exists(p1);
  121. fs::exists("foo");
  122. fs::exists(std::string("foo"));
  123. fs::exists(p1 / path("foo"));
  124. fs::exists(p1 / "foo");
  125. fs::exists(p1 / std::string("foo"));
  126. fs::exists("foo" / p1);
  127. fs::exists(std::string("foo") / p1);
  128. p4 /= path("foo");
  129. p4 /= "foo";
  130. p4 /= std::string("foo");
  131. }
  132. // iterator_tests ------------------------------------------------------------------//
  133. void iterator_tests()
  134. {
  135. std::cout << "iterator_tests..." << std::endl;
  136. path itr_ck = "";
  137. path::const_iterator itr = itr_ck.begin();
  138. BOOST_TEST(itr == itr_ck.end());
  139. itr_ck = "/";
  140. itr = itr_ck.begin();
  141. BOOST_TEST(itr->string() == "/");
  142. BOOST_TEST(++itr == itr_ck.end());
  143. BOOST_TEST((--itr)->string() == "/");
  144. itr_ck = "foo";
  145. BOOST_TEST(*itr_ck.begin() == std::string("foo"));
  146. BOOST_TEST(boost::next(itr_ck.begin()) == itr_ck.end());
  147. BOOST_TEST(*boost::prior(itr_ck.end()) == std::string("foo"));
  148. BOOST_TEST(boost::prior(itr_ck.end()) == itr_ck.begin());
  149. itr_ck = path("/foo");
  150. BOOST_TEST((itr_ck.begin())->string() == "/");
  151. BOOST_TEST(*boost::next(itr_ck.begin()) == std::string("foo"));
  152. BOOST_TEST(boost::next(boost::next(itr_ck.begin())) == itr_ck.end());
  153. BOOST_TEST(boost::next(itr_ck.begin()) == boost::prior(itr_ck.end()));
  154. BOOST_TEST(*boost::prior(itr_ck.end()) == std::string("foo"));
  155. BOOST_TEST(*boost::prior(boost::prior(itr_ck.end())) == std::string("/"));
  156. BOOST_TEST(boost::prior(boost::prior(itr_ck.end())) == itr_ck.begin());
  157. itr_ck = "/foo/bar";
  158. itr = itr_ck.begin();
  159. BOOST_TEST(itr->string() == "/");
  160. BOOST_TEST(*++itr == std::string("foo"));
  161. BOOST_TEST(*++itr == std::string("bar"));
  162. BOOST_TEST(++itr == itr_ck.end());
  163. PATH_TEST_EQ(*--itr, "bar");
  164. PATH_TEST_EQ(*--itr, "foo");
  165. PATH_TEST_EQ(*--itr, "/");
  166. itr_ck = "../f"; // previously failed due to short name bug
  167. itr = itr_ck.begin();
  168. PATH_TEST_EQ(itr->string(), "..");
  169. PATH_TEST_EQ(*++itr, "f");
  170. BOOST_TEST(++itr == itr_ck.end());
  171. PATH_TEST_EQ(*--itr, "f");
  172. PATH_TEST_EQ(*--itr, "..");
  173. // POSIX says treat "/foo/bar/" as "/foo/bar/."
  174. itr_ck = "/foo/bar/";
  175. itr = itr_ck.begin();
  176. PATH_TEST_EQ(itr->string(), "/");
  177. PATH_TEST_EQ(*++itr, "foo");
  178. BOOST_TEST(itr != itr_ck.end());
  179. PATH_TEST_EQ(*++itr, "bar");
  180. BOOST_TEST(itr != itr_ck.end());
  181. PATH_TEST_EQ(*++itr, ".");
  182. BOOST_TEST(itr != itr_ck.end()); // verify the . isn't also seen as end()
  183. BOOST_TEST(++itr == itr_ck.end());
  184. PATH_TEST_EQ(*--itr, ".");
  185. PATH_TEST_EQ(*--itr, "bar");
  186. PATH_TEST_EQ(*--itr, "foo");
  187. PATH_TEST_EQ(*--itr, "/");
  188. // POSIX says treat "/f/b/" as "/f/b/."
  189. itr_ck = "/f/b/";
  190. itr = itr_ck.begin();
  191. PATH_TEST_EQ(itr->string(), "/");
  192. PATH_TEST_EQ(*++itr, "f");
  193. PATH_TEST_EQ(*++itr, "b");
  194. PATH_TEST_EQ(*++itr, ".");
  195. BOOST_TEST(itr != itr_ck.end()); // verify the . isn't also seen as end()
  196. BOOST_TEST(++itr == itr_ck.end());
  197. PATH_TEST_EQ(*--itr, ".");
  198. PATH_TEST_EQ(*--itr, "b");
  199. PATH_TEST_EQ(*--itr, "f");
  200. PATH_TEST_EQ(*--itr, "/");
  201. // POSIX says treat "a/b/" as "a/b/."
  202. // Although similar to the prior test case, this failed the ". isn't end" test due to
  203. // a bug while the prior case did not fail.
  204. itr_ck = "a/b/";
  205. itr = itr_ck.begin();
  206. PATH_TEST_EQ(*itr, "a");
  207. PATH_TEST_EQ(*++itr, "b");
  208. PATH_TEST_EQ(*++itr, ".");
  209. BOOST_TEST(itr != itr_ck.end()); // verify the . isn't also seen as end()
  210. BOOST_TEST(++itr == itr_ck.end());
  211. PATH_TEST_EQ(*--itr, ".");
  212. PATH_TEST_EQ(*--itr, "b");
  213. PATH_TEST_EQ(*--itr, "a");
  214. itr_ck = "//net";
  215. itr = itr_ck.begin();
  216. // two leading slashes are permitted by POSIX (as implementation defined),
  217. // while for Windows it is always well defined (as a network name)
  218. PATH_TEST_EQ(itr->string(), "//net");
  219. BOOST_TEST(++itr == itr_ck.end());
  220. PATH_TEST_EQ(*--itr, "//net");
  221. itr_ck = "//net/";
  222. itr = itr_ck.begin();
  223. PATH_TEST_EQ(itr->string(), "//net");
  224. PATH_TEST_EQ(*++itr, "/");
  225. BOOST_TEST(++itr == itr_ck.end());
  226. PATH_TEST_EQ(*--itr, "/");
  227. PATH_TEST_EQ(*--itr, "//net");
  228. itr_ck = "//foo///bar///";
  229. itr = itr_ck.begin();
  230. PATH_TEST_EQ(itr->string(), "//foo");
  231. PATH_TEST_EQ(*++itr, "/");
  232. PATH_TEST_EQ(*++itr, "bar");
  233. PATH_TEST_EQ(*++itr, ".");
  234. BOOST_TEST(++itr == itr_ck.end());
  235. PATH_TEST_EQ(*--itr, ".");
  236. PATH_TEST_EQ(*--itr, "bar");
  237. PATH_TEST_EQ(*--itr, "/");
  238. PATH_TEST_EQ(*--itr, "//foo");
  239. itr_ck = "///foo///bar///";
  240. itr = itr_ck.begin();
  241. // three or more leading slashes are to be treated as a single slash
  242. PATH_TEST_EQ(itr->string(), "/");
  243. PATH_TEST_EQ(*++itr, "foo");
  244. PATH_TEST_EQ(*++itr, "bar");
  245. PATH_TEST_EQ(*++itr, ".");
  246. BOOST_TEST(++itr == itr_ck.end());
  247. PATH_TEST_EQ(*--itr, ".");
  248. PATH_TEST_EQ(*--itr, "bar");
  249. PATH_TEST_EQ(*--itr, "foo");
  250. PATH_TEST_EQ(*--itr, "/");
  251. if (platform == "Windows")
  252. {
  253. itr_ck = "c:/";
  254. itr = itr_ck.begin();
  255. PATH_TEST_EQ(itr->string(), "c:");
  256. PATH_TEST_EQ(*++itr, std::string("/"));
  257. BOOST_TEST(++itr == itr_ck.end());
  258. PATH_TEST_EQ(*--itr, "/");
  259. PATH_TEST_EQ(*--itr, "c:");
  260. itr_ck = "c:\\";
  261. itr = itr_ck.begin();
  262. PATH_TEST_EQ(itr->string(), "c:");
  263. PATH_TEST_EQ(*++itr, "/"); // test that iteration returns generic format
  264. BOOST_TEST(++itr == itr_ck.end());
  265. PATH_TEST_EQ(*--itr, "/"); // test that iteration returns generic format
  266. PATH_TEST_EQ(*--itr, "c:");
  267. itr_ck = "c:/foo";
  268. itr = itr_ck.begin();
  269. BOOST_TEST(*itr == std::string("c:"));
  270. BOOST_TEST(*++itr == std::string("/"));
  271. BOOST_TEST(*++itr == std::string("foo"));
  272. BOOST_TEST(++itr == itr_ck.end());
  273. BOOST_TEST(*--itr == std::string("foo"));
  274. BOOST_TEST((--itr)->string() == "/");
  275. BOOST_TEST(*--itr == std::string("c:"));
  276. itr_ck = "c:\\foo";
  277. itr = itr_ck.begin();
  278. BOOST_TEST(*itr == std::string("c:"));
  279. BOOST_TEST(*++itr == std::string("\\"));
  280. BOOST_TEST(*++itr == std::string("foo"));
  281. BOOST_TEST(++itr == itr_ck.end());
  282. BOOST_TEST(*--itr == std::string("foo"));
  283. BOOST_TEST(*--itr == std::string("\\"));
  284. BOOST_TEST(*--itr == std::string("c:"));
  285. itr_ck = "\\\\\\foo\\\\\\bar\\\\\\";
  286. itr = itr_ck.begin();
  287. // three or more leading slashes are to be treated as a single slash
  288. PATH_TEST_EQ(itr->string(), "/");
  289. PATH_TEST_EQ(*++itr, "foo");
  290. PATH_TEST_EQ(*++itr, "bar");
  291. PATH_TEST_EQ(*++itr, ".");
  292. BOOST_TEST(++itr == itr_ck.end());
  293. PATH_TEST_EQ(*--itr, ".");
  294. PATH_TEST_EQ(*--itr, "bar");
  295. PATH_TEST_EQ(*--itr, "foo");
  296. PATH_TEST_EQ(*--itr, "/");
  297. itr_ck = "c:foo";
  298. itr = itr_ck.begin();
  299. BOOST_TEST(*itr == std::string("c:"));
  300. BOOST_TEST(*++itr == std::string("foo"));
  301. BOOST_TEST(++itr == itr_ck.end());
  302. BOOST_TEST(*--itr == std::string("foo"));
  303. BOOST_TEST(*--itr == std::string("c:"));
  304. itr_ck = "c:foo/";
  305. itr = itr_ck.begin();
  306. BOOST_TEST(*itr == std::string("c:"));
  307. BOOST_TEST(*++itr == std::string("foo"));
  308. BOOST_TEST(*++itr == std::string("."));
  309. BOOST_TEST(++itr == itr_ck.end());
  310. BOOST_TEST(*--itr == std::string("."));
  311. BOOST_TEST(*--itr == std::string("foo"));
  312. BOOST_TEST(*--itr == std::string("c:"));
  313. itr_ck = path("c:");
  314. BOOST_TEST(*itr_ck.begin() == std::string("c:"));
  315. BOOST_TEST(next(itr_ck.begin()) == itr_ck.end());
  316. BOOST_TEST(prior(itr_ck.end()) == itr_ck.begin());
  317. BOOST_TEST(*prior(itr_ck.end()) == std::string("c:"));
  318. itr_ck = path("c:/");
  319. BOOST_TEST(*itr_ck.begin() == std::string("c:"));
  320. BOOST_TEST(*next(itr_ck.begin()) == std::string("/"));
  321. BOOST_TEST(next(next(itr_ck.begin())) == itr_ck.end());
  322. BOOST_TEST(prior(prior(itr_ck.end())) == itr_ck.begin());
  323. BOOST_TEST(*prior(itr_ck.end()) == std::string("/"));
  324. BOOST_TEST(*prior(prior(itr_ck.end())) == std::string("c:"));
  325. itr_ck = path("c:foo");
  326. BOOST_TEST(*itr_ck.begin() == std::string("c:"));
  327. BOOST_TEST(*next(itr_ck.begin()) == std::string("foo"));
  328. BOOST_TEST(next(next(itr_ck.begin())) == itr_ck.end());
  329. BOOST_TEST(prior(prior(itr_ck.end())) == itr_ck.begin());
  330. BOOST_TEST(*prior(itr_ck.end()) == std::string("foo"));
  331. BOOST_TEST(*prior(prior(itr_ck.end())) == std::string("c:"));
  332. itr_ck = path("c:/foo");
  333. BOOST_TEST(*itr_ck.begin() == std::string("c:"));
  334. BOOST_TEST(*next(itr_ck.begin()) == std::string("/"));
  335. BOOST_TEST(*next(next(itr_ck.begin())) == std::string("foo"));
  336. BOOST_TEST(next(next(next(itr_ck.begin()))) == itr_ck.end());
  337. BOOST_TEST(prior(prior(prior(itr_ck.end()))) == itr_ck.begin());
  338. BOOST_TEST(*prior(itr_ck.end()) == std::string("foo"));
  339. BOOST_TEST(*prior(prior(itr_ck.end())) == std::string("/"));
  340. BOOST_TEST(*prior(prior(prior(itr_ck.end()))) == std::string("c:"));
  341. itr_ck = path("//net");
  342. BOOST_TEST(*itr_ck.begin() == std::string("//net"));
  343. BOOST_TEST(next(itr_ck.begin()) == itr_ck.end());
  344. BOOST_TEST(prior(itr_ck.end()) == itr_ck.begin());
  345. BOOST_TEST(*prior(itr_ck.end()) == std::string("//net"));
  346. itr_ck = path("//net/");
  347. PATH_TEST_EQ(itr_ck.begin()->string(), "//net");
  348. PATH_TEST_EQ(next(itr_ck.begin())->string(), "/");
  349. BOOST_TEST(next(next(itr_ck.begin())) == itr_ck.end());
  350. BOOST_TEST(prior(prior(itr_ck.end())) == itr_ck.begin());
  351. PATH_TEST_EQ(prior(itr_ck.end())->string(), "/");
  352. PATH_TEST_EQ(prior(prior(itr_ck.end()))->string(), "//net");
  353. itr_ck = path("//net/foo");
  354. BOOST_TEST(*itr_ck.begin() == std::string("//net"));
  355. BOOST_TEST(*next(itr_ck.begin()) == std::string("/"));
  356. BOOST_TEST(*next(next(itr_ck.begin())) == std::string("foo"));
  357. BOOST_TEST(next(next(next(itr_ck.begin()))) == itr_ck.end());
  358. BOOST_TEST(prior(prior(prior(itr_ck.end()))) == itr_ck.begin());
  359. BOOST_TEST(*prior(itr_ck.end()) == std::string("foo"));
  360. BOOST_TEST(*prior(prior(itr_ck.end())) == std::string("/"));
  361. BOOST_TEST(*prior(prior(prior(itr_ck.end()))) == std::string("//net"));
  362. itr_ck = path("prn:");
  363. BOOST_TEST(*itr_ck.begin() == std::string("prn:"));
  364. BOOST_TEST(next(itr_ck.begin()) == itr_ck.end());
  365. BOOST_TEST(prior(itr_ck.end()) == itr_ck.begin());
  366. BOOST_TEST(*prior(itr_ck.end()) == std::string("prn:"));
  367. }
  368. else
  369. {
  370. itr_ck = "///";
  371. itr = itr_ck.begin();
  372. PATH_TEST_EQ(itr->string(), "/");
  373. BOOST_TEST(++itr == itr_ck.end());
  374. }
  375. }
  376. // non_member_tests ----------------------------------------------------------------//
  377. void non_member_tests()
  378. {
  379. std::cout << "non_member_tests..." << std::endl;
  380. // test non-member functions, particularly operator overloads
  381. path e, e2;
  382. std::string es, es2;
  383. char ecs[] = "";
  384. char ecs2[] = "";
  385. char acs[] = "a";
  386. std::string as(acs);
  387. path a(as);
  388. char acs2[] = "a";
  389. std::string as2(acs2);
  390. path a2(as2);
  391. char bcs[] = "b";
  392. std::string bs(bcs);
  393. path b(bs);
  394. // swap
  395. a.swap(b);
  396. BOOST_TEST(a.string() == "b");
  397. BOOST_TEST(b.string() == "a");
  398. fs::swap(a, b);
  399. BOOST_TEST(a.string() == "a");
  400. BOOST_TEST(b.string() == "b");
  401. // probe operator /
  402. PATH_TEST_EQ(path("") / ".", ".");
  403. PATH_TEST_EQ(path("") / "..", "..");
  404. if (platform == "Windows")
  405. {
  406. BOOST_TEST(path("foo\\bar") == "foo/bar");
  407. BOOST_TEST((b / a).native() == path("b\\a").native());
  408. BOOST_TEST((bs / a).native() == path("b\\a").native());
  409. BOOST_TEST((bcs / a).native() == path("b\\a").native());
  410. BOOST_TEST((b / as).native() == path("b\\a").native());
  411. BOOST_TEST((b / acs).native() == path("b\\a").native());
  412. PATH_TEST_EQ(path("a") / "b", "a\\b");
  413. PATH_TEST_EQ(path("..") / "", "..");
  414. PATH_TEST_EQ(path("foo") / path("bar"), "foo\\bar"); // path arg
  415. PATH_TEST_EQ(path("foo") / "bar", "foo\\bar"); // const char* arg
  416. PATH_TEST_EQ(path("foo") / path("woo/bar").filename(), "foo\\bar"); // const std::string & arg
  417. PATH_TEST_EQ("foo" / path("bar"), "foo\\bar");
  418. PATH_TEST_EQ(path("..") / ".." , "..\\..");
  419. PATH_TEST_EQ(path("/") / ".." , "/..");
  420. PATH_TEST_EQ(path("/..") / ".." , "/..\\..");
  421. PATH_TEST_EQ(path("..") / "foo" , "..\\foo");
  422. PATH_TEST_EQ(path("foo") / ".." , "foo\\..");
  423. PATH_TEST_EQ(path("..") / "f" , "..\\f");
  424. PATH_TEST_EQ(path("/..") / "f" , "/..\\f");
  425. PATH_TEST_EQ(path("f") / ".." , "f\\..");
  426. PATH_TEST_EQ(path("foo") / ".." / ".." , "foo\\..\\..");
  427. PATH_TEST_EQ(path("foo") / ".." / ".." / ".." , "foo\\..\\..\\..");
  428. PATH_TEST_EQ(path("f") / ".." / "b" , "f\\..\\b");
  429. PATH_TEST_EQ(path("foo") / ".." / "bar" , "foo\\..\\bar");
  430. PATH_TEST_EQ(path("foo") / "bar" / ".." , "foo\\bar\\..");
  431. PATH_TEST_EQ(path("foo") / "bar" / ".." / "..", "foo\\bar\\..\\..");
  432. PATH_TEST_EQ(path("foo") / "bar" / ".." / "blah", "foo\\bar\\..\\blah");
  433. PATH_TEST_EQ(path("f") / "b" / ".." , "f\\b\\..");
  434. PATH_TEST_EQ(path("f") / "b" / ".." / "a", "f\\b\\..\\a");
  435. PATH_TEST_EQ(path("foo") / "bar" / "blah" / ".." / "..", "foo\\bar\\blah\\..\\..");
  436. PATH_TEST_EQ(path("foo") / "bar" / "blah" / ".." / ".." / "bletch", "foo\\bar\\blah\\..\\..\\bletch");
  437. PATH_TEST_EQ(path(".") / "foo", ".\\foo");
  438. PATH_TEST_EQ(path(".") / "..", ".\\..");
  439. PATH_TEST_EQ(path("foo") / ".", "foo\\.");
  440. PATH_TEST_EQ(path("..") / ".", "..\\.");
  441. PATH_TEST_EQ(path(".") / ".", ".\\.");
  442. PATH_TEST_EQ(path(".") / "." / ".", ".\\.\\.");
  443. PATH_TEST_EQ(path(".") / "foo" / ".", ".\\foo\\.");
  444. PATH_TEST_EQ(path("foo") / "." / "bar", "foo\\.\\bar");
  445. PATH_TEST_EQ(path("foo") / "." / ".", "foo\\.\\.");
  446. PATH_TEST_EQ(path("foo") / "." / "..", "foo\\.\\..");
  447. PATH_TEST_EQ(path(".") / "." / "..", ".\\.\\..");
  448. PATH_TEST_EQ(path(".") / ".." / ".", ".\\..\\.");
  449. PATH_TEST_EQ(path("..") / "." / ".", "..\\.\\.");
  450. }
  451. else // POSIX
  452. {
  453. PATH_TEST_EQ(b / a, "b/a");
  454. PATH_TEST_EQ(bs / a, "b/a");
  455. PATH_TEST_EQ(bcs / a, "b/a");
  456. PATH_TEST_EQ(b / as, "b/a");
  457. PATH_TEST_EQ(b / acs, "b/a");
  458. PATH_TEST_EQ(path("a") / "b", "a/b");
  459. PATH_TEST_EQ(path("..") / "", "..");
  460. PATH_TEST_EQ(path("") / "..", "..");
  461. PATH_TEST_EQ(path("foo") / path("bar"), "foo/bar"); // path arg
  462. PATH_TEST_EQ(path("foo") / "bar", "foo/bar"); // const char* arg
  463. PATH_TEST_EQ(path("foo") / path("woo/bar").filename(), "foo/bar"); // const std::string & arg
  464. PATH_TEST_EQ("foo" / path("bar"), "foo/bar");
  465. PATH_TEST_EQ(path("..") / ".." , "../..");
  466. PATH_TEST_EQ(path("/") / ".." , "/..");
  467. PATH_TEST_EQ(path("/..") / ".." , "/../..");
  468. PATH_TEST_EQ(path("..") / "foo" , "../foo");
  469. PATH_TEST_EQ(path("foo") / ".." , "foo/..");
  470. PATH_TEST_EQ(path("..") / "f" , "../f");
  471. PATH_TEST_EQ(path("/..") / "f" , "/../f");
  472. PATH_TEST_EQ(path("f") / ".." , "f/..");
  473. PATH_TEST_EQ(path("foo") / ".." / ".." , "foo/../..");
  474. PATH_TEST_EQ(path("foo") / ".." / ".." / ".." , "foo/../../..");
  475. PATH_TEST_EQ(path("f") / ".." / "b" , "f/../b");
  476. PATH_TEST_EQ(path("foo") / ".." / "bar" , "foo/../bar");
  477. PATH_TEST_EQ(path("foo") / "bar" / ".." , "foo/bar/..");
  478. PATH_TEST_EQ(path("foo") / "bar" / ".." / "..", "foo/bar/../..");
  479. PATH_TEST_EQ(path("foo") / "bar" / ".." / "blah", "foo/bar/../blah");
  480. PATH_TEST_EQ(path("f") / "b" / ".." , "f/b/..");
  481. PATH_TEST_EQ(path("f") / "b" / ".." / "a", "f/b/../a");
  482. PATH_TEST_EQ(path("foo") / "bar" / "blah" / ".." / "..", "foo/bar/blah/../..");
  483. PATH_TEST_EQ(path("foo") / "bar" / "blah" / ".." / ".." / "bletch", "foo/bar/blah/../../bletch");
  484. PATH_TEST_EQ(path(".") / "foo", "./foo");
  485. PATH_TEST_EQ(path(".") / "..", "./..");
  486. PATH_TEST_EQ(path("foo") / ".", "foo/.");
  487. PATH_TEST_EQ(path("..") / ".", "../.");
  488. PATH_TEST_EQ(path(".") / ".", "./.");
  489. PATH_TEST_EQ(path(".") / "." / ".", "././.");
  490. PATH_TEST_EQ(path(".") / "foo" / ".", "./foo/.");
  491. PATH_TEST_EQ(path("foo") / "." / "bar", "foo/./bar");
  492. PATH_TEST_EQ(path("foo") / "." / ".", "foo/./.");
  493. PATH_TEST_EQ(path("foo") / "." / "..", "foo/./..");
  494. PATH_TEST_EQ(path(".") / "." / "..", "././..");
  495. PATH_TEST_EQ(path(".") / ".." / ".", "./../.");
  496. PATH_TEST_EQ(path("..") / "." / ".", ".././.");
  497. }
  498. // probe operator <
  499. BOOST_TEST(!(e < e2));
  500. BOOST_TEST(!(es < e2));
  501. BOOST_TEST(!(ecs < e2));
  502. BOOST_TEST(!(e < es2));
  503. BOOST_TEST(!(e < ecs2));
  504. BOOST_TEST(e < a);
  505. BOOST_TEST(es < a);
  506. BOOST_TEST(ecs < a);
  507. BOOST_TEST(e < as);
  508. BOOST_TEST(e < acs);
  509. BOOST_TEST(a < b);
  510. BOOST_TEST(as < b);
  511. BOOST_TEST(acs < b);
  512. BOOST_TEST(a < bs);
  513. BOOST_TEST(a < bcs);
  514. BOOST_TEST(!(a < a2));
  515. BOOST_TEST(!(as < a2));
  516. BOOST_TEST(!(acs < a2));
  517. BOOST_TEST(!(a < as2));
  518. BOOST_TEST(!(a < acs2));
  519. // make sure basic_path overloads don't conflict with std::string overloads
  520. BOOST_TEST(!(as < as));
  521. BOOST_TEST(!(as < acs));
  522. BOOST_TEST(!(acs < as));
  523. // character set reality check before lexicographical tests
  524. BOOST_TEST(std::string("a.b") < std::string("a/b"));
  525. // verify compare is actually lexicographical
  526. BOOST_TEST(path("a/b") < path("a.b"));
  527. BOOST_TEST(path("a/b") == path("a///b"));
  528. BOOST_TEST(path("a/b/") == path("a/b/."));
  529. BOOST_TEST(path("a/b") != path("a/b/"));
  530. // make sure the derivative operators also work
  531. BOOST_TEST(b > a);
  532. BOOST_TEST(b > as);
  533. BOOST_TEST(b > acs);
  534. BOOST_TEST(bs > a);
  535. BOOST_TEST(bcs > a);
  536. BOOST_TEST(!(a2 > a));
  537. BOOST_TEST(!(a2 > as));
  538. BOOST_TEST(!(a2 > acs));
  539. BOOST_TEST(!(as2 > a));
  540. BOOST_TEST(!(acs2 > a));
  541. BOOST_TEST(a <= b);
  542. BOOST_TEST(as <= b);
  543. BOOST_TEST(acs <= b);
  544. BOOST_TEST(a <= bs);
  545. BOOST_TEST(a <= bcs);
  546. BOOST_TEST(a <= a2);
  547. BOOST_TEST(as <= a2);
  548. BOOST_TEST(acs <= a2);
  549. BOOST_TEST(a <= as2);
  550. BOOST_TEST(a <= acs2);
  551. BOOST_TEST(b >= a);
  552. BOOST_TEST(bs >= a);
  553. BOOST_TEST(bcs >= a);
  554. BOOST_TEST(b >= as);
  555. BOOST_TEST(b >= acs);
  556. BOOST_TEST(a2 >= a);
  557. BOOST_TEST(as2 >= a);
  558. BOOST_TEST(acs2 >= a);
  559. BOOST_TEST(a2 >= as);
  560. BOOST_TEST(a2 >= acs);
  561. // operator == and != are implemented separately, so test separately
  562. path p101("fe/fi/fo/fum");
  563. path p102(p101);
  564. path p103("fe/fi/fo/fumm");
  565. BOOST_TEST(p101.string() != p103.string());
  566. // check each overload
  567. BOOST_TEST(p101 != p103);
  568. BOOST_TEST(p101 != p103.string());
  569. BOOST_TEST(p101 != p103.string().c_str());
  570. BOOST_TEST(p101.string() != p103);
  571. BOOST_TEST(p101.string().c_str() != p103);
  572. p103 = p102;
  573. BOOST_TEST(p101.string() == p103.string());
  574. // check each overload
  575. BOOST_TEST(p101 == p103);
  576. BOOST_TEST(p101 == p103.string());
  577. BOOST_TEST(p101 == p103.string().c_str());
  578. BOOST_TEST(p101.string() == p103);
  579. BOOST_TEST(p101.string().c_str() == p103);
  580. if (platform == "Windows")
  581. {
  582. std::cout << " Windows relational tests..." << std::endl;
  583. path p10 ("c:\\file");
  584. path p11 ("c:/file");
  585. // check each overload
  586. BOOST_TEST(p10.generic_string() == p11.generic_string());
  587. BOOST_TEST(p10 == p11);
  588. BOOST_TEST(p10 == p11.string());
  589. BOOST_TEST(p10 == p11.string().c_str());
  590. BOOST_TEST(p10.string() == p11);
  591. BOOST_TEST(p10.string().c_str() == p11);
  592. BOOST_TEST(p10 == L"c:\\file");
  593. BOOST_TEST(p10 == L"c:/file");
  594. BOOST_TEST(p11 == L"c:\\file");
  595. BOOST_TEST(p11 == L"c:/file");
  596. BOOST_TEST(L"c:\\file" == p10);
  597. BOOST_TEST(L"c:/file" == p10);
  598. BOOST_TEST(L"c:\\file" == p11);
  599. BOOST_TEST(L"c:/file" == p11);
  600. BOOST_TEST(!(p10.generic_string() != p11.generic_string()));
  601. BOOST_TEST(!(p10 != p11));
  602. BOOST_TEST(!(p10 != p11.string()));
  603. BOOST_TEST(!(p10 != p11.string().c_str()));
  604. BOOST_TEST(!(p10.string() != p11));
  605. BOOST_TEST(!(p10.string().c_str() != p11));
  606. BOOST_TEST(!(p10 != L"c:\\file"));
  607. BOOST_TEST(!(p10 != L"c:/file"));
  608. BOOST_TEST(!(p11 != L"c:\\file"));
  609. BOOST_TEST(!(p11 != L"c:/file"));
  610. BOOST_TEST(!(L"c:\\file" != p10));
  611. BOOST_TEST(!(L"c:/file" != p10));
  612. BOOST_TEST(!(L"c:\\file" != p11));
  613. BOOST_TEST(!(L"c:/file" != p11));
  614. BOOST_TEST(!(p10.string() < p11.string()));
  615. BOOST_TEST(!(p10 < p11));
  616. BOOST_TEST(!(p10 < p11.string()));
  617. BOOST_TEST(!(p10 < p11.string().c_str()));
  618. BOOST_TEST(!(p10.string() < p11));
  619. BOOST_TEST(!(p10.string().c_str() < p11));
  620. BOOST_TEST(!(p10 < L"c:\\file"));
  621. BOOST_TEST(!(p10 < L"c:/file"));
  622. BOOST_TEST(!(p11 < L"c:\\file"));
  623. BOOST_TEST(!(p11 < L"c:/file"));
  624. BOOST_TEST(!(L"c:\\file" < p10));
  625. BOOST_TEST(!(L"c:/file" < p10));
  626. BOOST_TEST(!(L"c:\\file" < p11));
  627. BOOST_TEST(!(L"c:/file" < p11));
  628. BOOST_TEST(!(p10.generic_string() > p11.generic_string()));
  629. BOOST_TEST(!(p10 > p11));
  630. BOOST_TEST(!(p10 > p11.string()));
  631. BOOST_TEST(!(p10 > p11.string().c_str()));
  632. BOOST_TEST(!(p10.string() > p11));
  633. BOOST_TEST(!(p10.string().c_str() > p11));
  634. BOOST_TEST(!(p10 > L"c:\\file"));
  635. BOOST_TEST(!(p10 > L"c:/file"));
  636. BOOST_TEST(!(p11 > L"c:\\file"));
  637. BOOST_TEST(!(p11 > L"c:/file"));
  638. BOOST_TEST(!(L"c:\\file" > p10));
  639. BOOST_TEST(!(L"c:/file" > p10));
  640. BOOST_TEST(!(L"c:\\file" > p11));
  641. BOOST_TEST(!(L"c:/file" > p11));
  642. }
  643. // relative
  644. BOOST_TEST(fs::relative("/abc/def", "/abc") == path("def"));
  645. BOOST_TEST(fs::relative("abc/def", "abc") == path("def"));
  646. BOOST_TEST(fs::relative("/abc/xyz/def", "/abc") == path("xyz/def"));
  647. BOOST_TEST(fs::relative("abc/xyz/def", "abc") == path("xyz/def"));
  648. if (platform == "Windows")
  649. {
  650. std::cout << " Windows relatie tests..." << std::endl;
  651. BOOST_TEST(fs::relative("\\abc\\xyz\\def", "/abc") == path("xyz/def"));
  652. std::cout << " fs::relative(\"/abc/xyz/def\", \"/abc\") is "
  653. << fs::relative("/abc/xyz/def", "/abc") << std::endl;
  654. BOOST_TEST(fs::relative("abc\\xyz\\def", "abc") == path("xyz/def"));
  655. }
  656. }
  657. // query_and_decomposition_tests ---------------------------------------------------//
  658. //
  659. // remove_filename() is also tested here, because its specification depends on
  660. // a decomposition function.
  661. void query_and_decomposition_tests()
  662. {
  663. std::cout << "query_and_decomposition_tests..." << std::endl;
  664. // these are the examples given in reference docs, so check they work
  665. BOOST_TEST(path("/foo/bar.txt").parent_path() == "/foo");
  666. BOOST_TEST(path("/foo/bar").parent_path() == "/foo");
  667. BOOST_TEST(path("/foo/bar/").parent_path() == "/foo/bar");
  668. BOOST_TEST(path("/").parent_path() == "");
  669. BOOST_TEST(path(".").parent_path() == "");
  670. BOOST_TEST(path("..").parent_path() == "");
  671. BOOST_TEST(path("/foo/bar.txt").filename() == "bar.txt");
  672. BOOST_TEST(path("/foo/bar").filename() == "bar");
  673. BOOST_TEST(path("/foo/bar/").filename() == ".");
  674. BOOST_TEST(path("/").filename() == "/");
  675. BOOST_TEST(path(".").filename() == ".");
  676. BOOST_TEST(path("..").filename() == "..");
  677. // stem() tests not otherwise covered
  678. BOOST_TEST(path(".").stem() == ".");
  679. BOOST_TEST(path("..").stem() == "..");
  680. BOOST_TEST(path(".a").stem() == "");
  681. BOOST_TEST(path("b").stem() == "b");
  682. BOOST_TEST(path("a/b.txt").stem() == "b");
  683. BOOST_TEST(path("a/b.").stem() == "b");
  684. BOOST_TEST(path("a.b.c").stem() == "a.b");
  685. BOOST_TEST(path("a.b.c.").stem() == "a.b.c");
  686. // extension() tests not otherwise covered
  687. BOOST_TEST(path(".").extension() == "");
  688. BOOST_TEST(path("..").extension() == "");
  689. BOOST_TEST(path(".a").extension() == ".a");
  690. BOOST_TEST(path("a/b").extension() == "");
  691. BOOST_TEST(path("a.b/c").extension() == "");
  692. BOOST_TEST(path("a/b.txt").extension() == ".txt");
  693. BOOST_TEST(path("a/b.").extension() == ".");
  694. BOOST_TEST(path("a.b.c").extension() == ".c");
  695. BOOST_TEST(path("a.b.c.").extension() == ".");
  696. BOOST_TEST(path("a/").extension() == "");
  697. // main q & d test sequence
  698. path p;
  699. path q;
  700. p = q = "";
  701. BOOST_TEST(p.relative_path().string() == "");
  702. BOOST_TEST(p.parent_path().string() == "");
  703. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  704. BOOST_TEST(p.filename() == "");
  705. BOOST_TEST(p.stem() == "");
  706. BOOST_TEST(p.extension() == "");
  707. BOOST_TEST(p.root_name() == "");
  708. BOOST_TEST(p.root_directory() == "");
  709. BOOST_TEST(p.root_path().string() == "");
  710. BOOST_TEST(!p.has_root_path());
  711. BOOST_TEST(!p.has_root_name());
  712. BOOST_TEST(!p.has_root_directory());
  713. BOOST_TEST(!p.has_relative_path());
  714. BOOST_TEST(!p.has_filename());
  715. BOOST_TEST(!p.has_stem());
  716. BOOST_TEST(!p.has_extension());
  717. BOOST_TEST(!p.has_parent_path());
  718. BOOST_TEST(!p.is_absolute());
  719. p = q = "/";
  720. BOOST_TEST(p.relative_path().string() == "");
  721. BOOST_TEST(p.parent_path().string() == "");
  722. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  723. BOOST_TEST(p.filename() == "/");
  724. BOOST_TEST(p.stem() == "/");
  725. BOOST_TEST(p.extension() == "");
  726. BOOST_TEST(p.root_name() == "");
  727. BOOST_TEST(p.root_directory() == "/");
  728. BOOST_TEST(p.root_path().string() == "/");
  729. BOOST_TEST(p.has_root_path());
  730. BOOST_TEST(!p.has_root_name());
  731. BOOST_TEST(p.has_root_directory());
  732. BOOST_TEST(!p.has_relative_path());
  733. BOOST_TEST(p.has_filename());
  734. BOOST_TEST(p.has_stem());
  735. BOOST_TEST(!p.has_extension());
  736. BOOST_TEST(!p.has_parent_path());
  737. if (platform == "POSIX")
  738. BOOST_TEST(p.is_absolute());
  739. else
  740. BOOST_TEST(!p.is_absolute());
  741. p = q = "//";
  742. PATH_TEST_EQ(p.relative_path().string(), "");
  743. PATH_TEST_EQ(p.parent_path().string(), "");
  744. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  745. PATH_TEST_EQ(p.filename(), "//");
  746. PATH_TEST_EQ(p.stem(), "//");
  747. PATH_TEST_EQ(p.extension(), "");
  748. PATH_TEST_EQ(p.root_name(), "//");
  749. PATH_TEST_EQ(p.root_directory(), "");
  750. PATH_TEST_EQ(p.root_path().string(), "//");
  751. BOOST_TEST(p.has_root_path());
  752. BOOST_TEST(p.has_root_name());
  753. BOOST_TEST(!p.has_root_directory());
  754. BOOST_TEST(!p.has_relative_path());
  755. BOOST_TEST(p.has_filename());
  756. BOOST_TEST(p.has_stem());
  757. BOOST_TEST(!p.has_extension());
  758. BOOST_TEST(!p.has_parent_path());
  759. BOOST_TEST(!p.is_absolute());
  760. p = q = "///";
  761. PATH_TEST_EQ(p.relative_path().string(), "");
  762. PATH_TEST_EQ(p.parent_path().string(), "");
  763. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  764. PATH_TEST_EQ(p.filename(), "/");
  765. PATH_TEST_EQ(p.stem(), "/");
  766. PATH_TEST_EQ(p.extension(), "");
  767. PATH_TEST_EQ(p.root_name(), "");
  768. PATH_TEST_EQ(p.root_directory(), "/");
  769. PATH_TEST_EQ(p.root_path().string(), "/");
  770. BOOST_TEST(p.has_root_path());
  771. BOOST_TEST(!p.has_root_name());
  772. BOOST_TEST(p.has_root_directory());
  773. BOOST_TEST(!p.has_relative_path());
  774. BOOST_TEST(p.has_filename());
  775. BOOST_TEST(p.has_stem());
  776. BOOST_TEST(!p.has_extension());
  777. BOOST_TEST(!p.has_parent_path());
  778. if (platform == "POSIX")
  779. BOOST_TEST(p.is_absolute());
  780. else
  781. BOOST_TEST(!p.is_absolute());
  782. p = q = ".";
  783. BOOST_TEST(p.relative_path().string() == ".");
  784. BOOST_TEST(p.parent_path().string() == "");
  785. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  786. BOOST_TEST(p.filename() == ".");
  787. BOOST_TEST(p.stem() == ".");
  788. BOOST_TEST(p.extension() == "");
  789. BOOST_TEST(p.root_name() == "");
  790. BOOST_TEST(p.root_directory() == "");
  791. BOOST_TEST(p.root_path().string() == "");
  792. BOOST_TEST(!p.has_root_path());
  793. BOOST_TEST(!p.has_root_name());
  794. BOOST_TEST(!p.has_root_directory());
  795. BOOST_TEST(p.has_relative_path());
  796. BOOST_TEST(p.has_filename());
  797. BOOST_TEST(p.has_stem());
  798. BOOST_TEST(!p.has_extension());
  799. BOOST_TEST(!p.has_parent_path());
  800. BOOST_TEST(!p.is_absolute());
  801. p = q = "..";
  802. BOOST_TEST(p.relative_path().string() == "..");
  803. BOOST_TEST(p.parent_path().string() == "");
  804. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  805. BOOST_TEST(p.filename() == "..");
  806. BOOST_TEST(p.stem() == "..");
  807. BOOST_TEST(p.extension() == "");
  808. BOOST_TEST(p.root_name() == "");
  809. BOOST_TEST(p.root_directory() == "");
  810. BOOST_TEST(p.root_path().string() == "");
  811. BOOST_TEST(!p.has_root_path());
  812. BOOST_TEST(!p.has_root_name());
  813. BOOST_TEST(!p.has_root_directory());
  814. BOOST_TEST(p.has_relative_path());
  815. BOOST_TEST(p.has_filename());
  816. BOOST_TEST(p.has_stem());
  817. BOOST_TEST(!p.has_extension());
  818. BOOST_TEST(!p.has_parent_path());
  819. BOOST_TEST(!p.is_absolute());
  820. p = q = "foo";
  821. BOOST_TEST(p.relative_path().string() == "foo");
  822. BOOST_TEST(p.parent_path().string() == "");
  823. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  824. BOOST_TEST(p.filename() == "foo");
  825. BOOST_TEST(p.stem() == "foo");
  826. BOOST_TEST(p.extension() == "");
  827. BOOST_TEST(p.root_name() == "");
  828. BOOST_TEST(p.root_directory() == "");
  829. BOOST_TEST(p.root_path().string() == "");
  830. BOOST_TEST(!p.has_root_path());
  831. BOOST_TEST(!p.has_root_name());
  832. BOOST_TEST(!p.has_root_directory());
  833. BOOST_TEST(p.has_relative_path());
  834. BOOST_TEST(p.has_filename());
  835. BOOST_TEST(p.has_stem());
  836. BOOST_TEST(!p.has_extension());
  837. BOOST_TEST(!p.has_parent_path());
  838. BOOST_TEST(!p.is_absolute());
  839. p = q = "/foo";
  840. PATH_TEST_EQ(p.relative_path().string(), "foo");
  841. PATH_TEST_EQ(p.parent_path().string(), "/");
  842. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  843. PATH_TEST_EQ(p.filename(), "foo");
  844. PATH_TEST_EQ(p.stem(), "foo");
  845. PATH_TEST_EQ(p.extension(), "");
  846. PATH_TEST_EQ(p.root_name(), "");
  847. PATH_TEST_EQ(p.root_directory(), "/");
  848. PATH_TEST_EQ(p.root_path().string(), "/");
  849. BOOST_TEST(p.has_root_path());
  850. BOOST_TEST(!p.has_root_name());
  851. BOOST_TEST(p.has_root_directory());
  852. BOOST_TEST(p.has_relative_path());
  853. BOOST_TEST(p.has_filename());
  854. BOOST_TEST(p.has_stem());
  855. BOOST_TEST(!p.has_extension());
  856. BOOST_TEST(p.has_parent_path());
  857. if (platform == "POSIX")
  858. BOOST_TEST(p.is_absolute());
  859. else
  860. BOOST_TEST(!p.is_absolute());
  861. p = q = "/foo/";
  862. PATH_TEST_EQ(p.relative_path().string(), "foo/");
  863. PATH_TEST_EQ(p.parent_path().string(), "/foo");
  864. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  865. PATH_TEST_EQ(p.filename(), ".");
  866. PATH_TEST_EQ(p.stem(), ".");
  867. PATH_TEST_EQ(p.extension(), "");
  868. PATH_TEST_EQ(p.root_name(), "");
  869. PATH_TEST_EQ(p.root_directory(), "/");
  870. PATH_TEST_EQ(p.root_path().string(), "/");
  871. BOOST_TEST(p.has_root_path());
  872. BOOST_TEST(!p.has_root_name());
  873. BOOST_TEST(p.has_root_directory());
  874. BOOST_TEST(p.has_relative_path());
  875. BOOST_TEST(p.has_filename());
  876. BOOST_TEST(p.has_stem());
  877. BOOST_TEST(!p.has_extension());
  878. BOOST_TEST(p.has_parent_path());
  879. if (platform == "POSIX")
  880. BOOST_TEST(p.is_absolute());
  881. else
  882. BOOST_TEST(!p.is_absolute());
  883. p = q = "///foo";
  884. PATH_TEST_EQ(p.relative_path().string(), "foo");
  885. PATH_TEST_EQ(p.parent_path().string(), "/");
  886. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  887. PATH_TEST_EQ(p.filename(), "foo");
  888. PATH_TEST_EQ(p.root_name(), "");
  889. PATH_TEST_EQ(p.root_directory(), "/");
  890. PATH_TEST_EQ(p.root_path().string(), "/");
  891. BOOST_TEST(p.has_root_path());
  892. BOOST_TEST(!p.has_root_name());
  893. BOOST_TEST(p.has_root_directory());
  894. BOOST_TEST(p.has_relative_path());
  895. BOOST_TEST(p.has_filename());
  896. BOOST_TEST(p.has_parent_path());
  897. if (platform == "POSIX")
  898. BOOST_TEST(p.is_absolute());
  899. else
  900. BOOST_TEST(!p.is_absolute());
  901. p = q = "foo/bar";
  902. BOOST_TEST(p.relative_path().string() == "foo/bar");
  903. BOOST_TEST(p.parent_path().string() == "foo");
  904. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  905. BOOST_TEST(p.filename() == "bar");
  906. BOOST_TEST(p.stem() == "bar");
  907. BOOST_TEST(p.extension() == "");
  908. BOOST_TEST(p.root_name() == "");
  909. BOOST_TEST(p.root_directory() == "");
  910. BOOST_TEST(p.root_path().string() == "");
  911. BOOST_TEST(!p.has_root_path());
  912. BOOST_TEST(!p.has_root_name());
  913. BOOST_TEST(!p.has_root_directory());
  914. BOOST_TEST(p.has_relative_path());
  915. BOOST_TEST(p.has_filename());
  916. BOOST_TEST(p.has_stem());
  917. BOOST_TEST(!p.has_extension());
  918. BOOST_TEST(p.has_parent_path());
  919. BOOST_TEST(!p.is_absolute());
  920. p = q = "../foo";
  921. BOOST_TEST(p.relative_path().string() == "../foo");
  922. BOOST_TEST(p.parent_path().string() == "..");
  923. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  924. BOOST_TEST(p.filename() == "foo");
  925. BOOST_TEST(p.root_name() == "");
  926. BOOST_TEST(p.root_directory() == "");
  927. BOOST_TEST(p.root_path().string() == "");
  928. BOOST_TEST(!p.has_root_path());
  929. BOOST_TEST(!p.has_root_name());
  930. BOOST_TEST(!p.has_root_directory());
  931. BOOST_TEST(p.has_relative_path());
  932. BOOST_TEST(p.has_filename());
  933. BOOST_TEST(p.has_parent_path());
  934. BOOST_TEST(!p.is_absolute());
  935. p = q = "..///foo";
  936. PATH_TEST_EQ(p.relative_path().string(), "..///foo");
  937. PATH_TEST_EQ(p.parent_path().string(), "..");
  938. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  939. PATH_TEST_EQ(p.filename(), "foo");
  940. PATH_TEST_EQ(p.root_name(), "");
  941. PATH_TEST_EQ(p.root_directory(), "");
  942. PATH_TEST_EQ(p.root_path().string(), "");
  943. BOOST_TEST(!p.has_root_path());
  944. BOOST_TEST(!p.has_root_name());
  945. BOOST_TEST(!p.has_root_directory());
  946. BOOST_TEST(p.has_relative_path());
  947. BOOST_TEST(p.has_filename());
  948. BOOST_TEST(p.has_parent_path());
  949. BOOST_TEST(!p.is_absolute());
  950. p = q = "/foo/bar";
  951. BOOST_TEST(p.relative_path().string() == "foo/bar");
  952. BOOST_TEST(p.parent_path().string() == "/foo");
  953. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  954. BOOST_TEST(p.filename() == "bar");
  955. BOOST_TEST(p.root_name() == "");
  956. BOOST_TEST(p.root_directory() == "/");
  957. BOOST_TEST(p.root_path().string() == "/");
  958. BOOST_TEST(p.has_root_path());
  959. BOOST_TEST(!p.has_root_name());
  960. BOOST_TEST(p.has_root_directory());
  961. BOOST_TEST(p.has_relative_path());
  962. BOOST_TEST(p.has_filename());
  963. BOOST_TEST(p.has_parent_path());
  964. if (platform == "POSIX")
  965. BOOST_TEST(p.is_absolute());
  966. else
  967. BOOST_TEST(!p.is_absolute());
  968. // Both POSIX and Windows allow two leading slashs
  969. // (POSIX meaning is implementation defined)
  970. PATH_TEST_EQ(path("//resource"), "//resource");
  971. PATH_TEST_EQ(path("//resource/"), "//resource/");
  972. PATH_TEST_EQ(path("//resource/foo"), "//resource/foo");
  973. p = q = path("//net");
  974. PATH_TEST_EQ(p.string(), "//net");
  975. PATH_TEST_EQ(p.relative_path().string(), "");
  976. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  977. PATH_TEST_EQ(p.parent_path().string(), "");
  978. PATH_TEST_EQ(p.filename(), "//net");
  979. PATH_TEST_EQ(p.root_name(), "//net");
  980. PATH_TEST_EQ(p.root_directory(), "");
  981. PATH_TEST_EQ(p.root_path().string(), "//net");
  982. BOOST_TEST(p.has_root_path());
  983. BOOST_TEST(p.has_root_name());
  984. BOOST_TEST(!p.has_root_directory());
  985. BOOST_TEST(!p.has_relative_path());
  986. BOOST_TEST(p.has_filename());
  987. BOOST_TEST(!p.has_parent_path());
  988. BOOST_TEST(!p.is_absolute());
  989. p = q = path("//net/");
  990. BOOST_TEST(p.relative_path().string() == "");
  991. BOOST_TEST(p.parent_path().string() == "//net");
  992. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  993. BOOST_TEST(p.filename() == "/");
  994. BOOST_TEST(p.root_name() == "//net");
  995. BOOST_TEST(p.root_directory() == "/");
  996. BOOST_TEST(p.root_path().string() == "//net/");
  997. BOOST_TEST(p.has_root_path());
  998. BOOST_TEST(p.has_root_name());
  999. BOOST_TEST(p.has_root_directory());
  1000. BOOST_TEST(!p.has_relative_path());
  1001. BOOST_TEST(p.has_filename());
  1002. BOOST_TEST(p.has_parent_path());
  1003. BOOST_TEST(p.is_absolute());
  1004. p = q = path("//net/foo");
  1005. BOOST_TEST(p.relative_path().string() == "foo");
  1006. BOOST_TEST(p.parent_path().string() == "//net/");
  1007. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  1008. BOOST_TEST(p.filename() == "foo");
  1009. BOOST_TEST(p.root_name() == "//net");
  1010. BOOST_TEST(p.root_directory() == "/");
  1011. BOOST_TEST(p.root_path().string() == "//net/");
  1012. BOOST_TEST(p.has_root_path());
  1013. BOOST_TEST(p.has_root_name());
  1014. BOOST_TEST(p.has_root_directory());
  1015. BOOST_TEST(p.has_relative_path());
  1016. BOOST_TEST(p.has_filename());
  1017. BOOST_TEST(p.has_parent_path());
  1018. BOOST_TEST(p.is_absolute());
  1019. p = q = path("//net///foo");
  1020. PATH_TEST_EQ(p.relative_path().string(), "foo");
  1021. PATH_TEST_EQ(p.parent_path().string(), "//net/");
  1022. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  1023. PATH_TEST_EQ(p.filename(), "foo");
  1024. PATH_TEST_EQ(p.root_name(), "//net");
  1025. PATH_TEST_EQ(p.root_directory(), "/");
  1026. PATH_TEST_EQ(p.root_path().string(), "//net/");
  1027. BOOST_TEST(p.has_root_path());
  1028. BOOST_TEST(p.has_root_name());
  1029. BOOST_TEST(p.has_root_directory());
  1030. BOOST_TEST(p.has_relative_path());
  1031. BOOST_TEST(p.has_filename());
  1032. BOOST_TEST(p.has_parent_path());
  1033. BOOST_TEST(p.is_absolute());
  1034. // ticket 2739, infinite recursion leading to stack overflow, was caused
  1035. // by failure to handle this case correctly on Windows.
  1036. p = path(":");
  1037. PATH_TEST_EQ(p.parent_path().string(), "");
  1038. PATH_TEST_EQ(p.filename(), ":");
  1039. BOOST_TEST(!p.has_parent_path());
  1040. BOOST_TEST(p.has_filename());
  1041. // test some similar cases that both POSIX and Windows should handle identically
  1042. p = path("c:");
  1043. PATH_TEST_EQ(p.parent_path().string(), "");
  1044. PATH_TEST_EQ(p.filename(), "c:");
  1045. BOOST_TEST(!p.has_parent_path());
  1046. BOOST_TEST(p.has_filename());
  1047. p = path("cc:");
  1048. PATH_TEST_EQ(p.parent_path().string(), "");
  1049. PATH_TEST_EQ(p.filename(), "cc:");
  1050. BOOST_TEST(!p.has_parent_path());
  1051. BOOST_TEST(p.has_filename());
  1052. // Windows specific tests
  1053. if (platform == "Windows")
  1054. {
  1055. //p = q = L"\\\\?\\";
  1056. //BOOST_TEST(p.relative_path().string() == "");
  1057. //BOOST_TEST(p.parent_path().string() == "");
  1058. //PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  1059. //BOOST_TEST(p.filename() == "");
  1060. //BOOST_TEST(p.stem() == "");
  1061. //BOOST_TEST(p.extension() == "");
  1062. //BOOST_TEST(p.root_name() == "");
  1063. //BOOST_TEST(p.root_directory() == "");
  1064. //BOOST_TEST(p.root_path().string() == "");
  1065. //BOOST_TEST(!p.has_root_path());
  1066. //BOOST_TEST(!p.has_root_name());
  1067. //BOOST_TEST(!p.has_root_directory());
  1068. //BOOST_TEST(!p.has_relative_path());
  1069. //BOOST_TEST(!p.has_filename());
  1070. //BOOST_TEST(!p.has_stem());
  1071. //BOOST_TEST(!p.has_extension());
  1072. //BOOST_TEST(!p.has_parent_path());
  1073. //BOOST_TEST(!p.is_absolute());
  1074. p = q = path("c:");
  1075. BOOST_TEST(p.relative_path().string() == "");
  1076. BOOST_TEST(p.parent_path().string() == "");
  1077. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  1078. BOOST_TEST(p.filename() == "c:");
  1079. BOOST_TEST(p.root_name() == "c:");
  1080. BOOST_TEST(p.root_directory() == "");
  1081. BOOST_TEST(p.root_path().string() == "c:");
  1082. BOOST_TEST(p.has_root_path());
  1083. BOOST_TEST(p.has_root_name());
  1084. BOOST_TEST(!p.has_root_directory());
  1085. BOOST_TEST(!p.has_relative_path());
  1086. BOOST_TEST(p.has_filename());
  1087. BOOST_TEST(!p.has_parent_path());
  1088. BOOST_TEST(!p.is_absolute());
  1089. //p = q = path(L"\\\\?\\c:");
  1090. //BOOST_TEST(p.relative_path().string() == "");
  1091. //BOOST_TEST(p.parent_path().string() == "");
  1092. //PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  1093. //BOOST_TEST(p.filename() == "c:");
  1094. //BOOST_TEST(p.root_name() == "c:");
  1095. //BOOST_TEST(p.root_directory() == "");
  1096. //BOOST_TEST(p.root_path().string() == "c:");
  1097. //BOOST_TEST(p.has_root_path());
  1098. //BOOST_TEST(p.has_root_name());
  1099. //BOOST_TEST(!p.has_root_directory());
  1100. //BOOST_TEST(!p.has_relative_path());
  1101. //BOOST_TEST(p.has_filename());
  1102. //BOOST_TEST(!p.has_parent_path());
  1103. //BOOST_TEST(!p.is_absolute());
  1104. p = q = path("c:foo");
  1105. BOOST_TEST(p.relative_path().string() == "foo");
  1106. BOOST_TEST(p.parent_path().string() == "c:");
  1107. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  1108. BOOST_TEST(p.filename() == "foo");
  1109. BOOST_TEST(p.root_name() == "c:");
  1110. BOOST_TEST(p.root_directory() == "");
  1111. BOOST_TEST(p.root_path().string() == "c:");
  1112. BOOST_TEST(p.has_root_path());
  1113. BOOST_TEST(p.has_root_name());
  1114. BOOST_TEST(!p.has_root_directory());
  1115. BOOST_TEST(p.has_relative_path());
  1116. BOOST_TEST(p.has_filename());
  1117. BOOST_TEST(p.has_parent_path());
  1118. BOOST_TEST(!p.is_absolute());
  1119. //p = q = path(L"\\\\?\\c:foo");
  1120. //BOOST_TEST(p.relative_path().string() == "foo");
  1121. //BOOST_TEST(p.parent_path().string() == "c:");
  1122. //PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  1123. //BOOST_TEST(p.filename() == "foo");
  1124. //BOOST_TEST(p.root_name() == "c:");
  1125. //BOOST_TEST(p.root_directory() == "");
  1126. //BOOST_TEST(p.root_path().string() == "c:");
  1127. //BOOST_TEST(p.has_root_path());
  1128. //BOOST_TEST(p.has_root_name());
  1129. //BOOST_TEST(!p.has_root_directory());
  1130. //BOOST_TEST(p.has_relative_path());
  1131. //BOOST_TEST(p.has_filename());
  1132. //BOOST_TEST(p.has_parent_path());
  1133. //BOOST_TEST(!p.is_absolute());
  1134. p = q = path("c:/");
  1135. BOOST_TEST(p.relative_path().string() == "");
  1136. BOOST_TEST(p.parent_path().string() == "c:");
  1137. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  1138. BOOST_TEST(p.filename() == "/");
  1139. BOOST_TEST(p.root_name() == "c:");
  1140. BOOST_TEST(p.root_directory() == "/");
  1141. BOOST_TEST(p.root_path().string() == "c:/");
  1142. BOOST_TEST(p.has_root_path());
  1143. BOOST_TEST(p.has_root_name());
  1144. BOOST_TEST(p.has_root_directory());
  1145. BOOST_TEST(!p.has_relative_path());
  1146. BOOST_TEST(p.has_filename());
  1147. BOOST_TEST(p.has_parent_path());
  1148. BOOST_TEST(p.is_absolute());
  1149. p = q = path("c:..");
  1150. BOOST_TEST(p.relative_path().string() == "..");
  1151. BOOST_TEST(p.parent_path().string() == "c:");
  1152. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  1153. BOOST_TEST(p.filename() == "..");
  1154. BOOST_TEST(p.root_name() == "c:");
  1155. BOOST_TEST(p.root_directory() == "");
  1156. BOOST_TEST(p.root_path().string() == "c:");
  1157. BOOST_TEST(p.has_root_path());
  1158. BOOST_TEST(p.has_root_name());
  1159. BOOST_TEST(!p.has_root_directory());
  1160. BOOST_TEST(p.has_relative_path());
  1161. BOOST_TEST(p.has_filename());
  1162. BOOST_TEST(p.has_parent_path());
  1163. BOOST_TEST(!p.is_absolute());
  1164. p = q = path("c:/foo");
  1165. PATH_TEST_EQ(p.relative_path().string(), "foo");
  1166. PATH_TEST_EQ(p.parent_path().string(), "c:/");
  1167. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  1168. PATH_TEST_EQ(p.filename(), "foo");
  1169. PATH_TEST_EQ(p.root_name(), "c:");
  1170. PATH_TEST_EQ(p.root_directory(), "/");
  1171. PATH_TEST_EQ(p.root_path().string(), "c:/");
  1172. BOOST_TEST(p.has_root_path());
  1173. BOOST_TEST(p.has_root_name());
  1174. BOOST_TEST(p.has_root_directory());
  1175. BOOST_TEST(p.has_relative_path());
  1176. BOOST_TEST(p.has_filename());
  1177. BOOST_TEST(p.has_parent_path());
  1178. BOOST_TEST(p.is_absolute());
  1179. p = q = path("c://foo");
  1180. PATH_TEST_EQ(p.relative_path().string(), "foo");
  1181. PATH_TEST_EQ(p.parent_path().string(), "c:/");
  1182. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  1183. PATH_TEST_EQ(p.filename(), "foo");
  1184. PATH_TEST_EQ(p.root_name(), "c:");
  1185. PATH_TEST_EQ(p.root_directory(), "/");
  1186. PATH_TEST_EQ(p.root_path().string(), "c:/");
  1187. BOOST_TEST(p.has_root_path());
  1188. BOOST_TEST(p.has_root_name());
  1189. BOOST_TEST(p.has_root_directory());
  1190. BOOST_TEST(p.has_relative_path());
  1191. BOOST_TEST(p.has_filename());
  1192. BOOST_TEST(p.has_parent_path());
  1193. BOOST_TEST(p.is_absolute());
  1194. p = q = path("c:\\foo\\bar");
  1195. PATH_TEST_EQ(p.relative_path().string(), "foo\\bar");
  1196. PATH_TEST_EQ(p.parent_path().string(), "c:\\foo");
  1197. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  1198. PATH_TEST_EQ(p.filename(), "bar");
  1199. PATH_TEST_EQ(p.root_name(), "c:");
  1200. PATH_TEST_EQ(p.root_directory(), "\\");
  1201. PATH_TEST_EQ(p.root_path().string(), "c:\\");
  1202. BOOST_TEST(p.has_root_path());
  1203. BOOST_TEST(p.has_root_name());
  1204. BOOST_TEST(p.has_root_directory());
  1205. BOOST_TEST(p.has_relative_path());
  1206. BOOST_TEST(p.has_filename());
  1207. BOOST_TEST(p.has_parent_path());
  1208. BOOST_TEST(p.is_absolute());
  1209. p = q = path("prn:");
  1210. BOOST_TEST(p.relative_path().string() == "");
  1211. BOOST_TEST(p.parent_path().string() == "");
  1212. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  1213. BOOST_TEST(p.filename() == "prn:");
  1214. BOOST_TEST(p.root_name() == "prn:");
  1215. BOOST_TEST(p.root_directory() == "");
  1216. BOOST_TEST(p.root_path().string() == "prn:");
  1217. BOOST_TEST(p.has_root_path());
  1218. BOOST_TEST(p.has_root_name());
  1219. BOOST_TEST(!p.has_root_directory());
  1220. BOOST_TEST(!p.has_relative_path());
  1221. BOOST_TEST(p.has_filename());
  1222. BOOST_TEST(!p.has_parent_path());
  1223. BOOST_TEST(!p.is_absolute());
  1224. p = q = path("\\\\net\\\\\\foo");
  1225. PATH_TEST_EQ(p.relative_path().string(), "foo");
  1226. PATH_TEST_EQ(p.parent_path().string(), "\\\\net\\");
  1227. PATH_TEST_EQ(q.remove_filename().string(), p.parent_path().string());
  1228. PATH_TEST_EQ(p.filename(), "foo");
  1229. PATH_TEST_EQ(p.root_name(), "\\\\net");
  1230. PATH_TEST_EQ(p.root_directory(), "\\");
  1231. PATH_TEST_EQ(p.root_path().string(), "\\\\net\\");
  1232. BOOST_TEST(p.has_root_path());
  1233. BOOST_TEST(p.has_root_name());
  1234. BOOST_TEST(p.has_root_directory());
  1235. BOOST_TEST(p.has_relative_path());
  1236. BOOST_TEST(p.has_filename());
  1237. BOOST_TEST(p.has_parent_path());
  1238. BOOST_TEST(p.is_absolute());
  1239. } // Windows
  1240. else
  1241. { // POSIX
  1242. PATH_TEST_EQ(path("/foo/bar/"), "/foo/bar/");
  1243. PATH_TEST_EQ(path("//foo//bar//"), "//foo//bar//");
  1244. PATH_TEST_EQ(path("///foo///bar///"), "///foo///bar///");
  1245. p = path("/usr/local/bin:/usr/bin:/bin");
  1246. BOOST_TEST(p.string() == "/usr/local/bin:/usr/bin:/bin");
  1247. } // POSIX
  1248. }
  1249. // composition_tests ----------------------------------------------------------------//
  1250. void composition_tests()
  1251. {
  1252. std::cout << "composition_tests..." << std::endl;
  1253. }
  1254. // construction_tests ---------------------------------------------------------------//
  1255. void construction_tests()
  1256. {
  1257. std::cout << "construction_tests..." << std::endl;
  1258. PATH_TEST_EQ("", "");
  1259. PATH_TEST_EQ("foo", "foo");
  1260. PATH_TEST_EQ("f", "f");
  1261. PATH_TEST_EQ("foo/", "foo/");
  1262. PATH_TEST_EQ("f/", "f/");
  1263. PATH_TEST_EQ("foo/..", "foo/..");
  1264. PATH_TEST_EQ("foo/../", "foo/../");
  1265. PATH_TEST_EQ("foo/bar/../..", "foo/bar/../..");
  1266. PATH_TEST_EQ("foo/bar/../../", "foo/bar/../../");
  1267. PATH_TEST_EQ("/", "/");
  1268. PATH_TEST_EQ("/f", "/f");
  1269. PATH_TEST_EQ("/foo", "/foo");
  1270. PATH_TEST_EQ("/foo/bar/", "/foo/bar/");
  1271. PATH_TEST_EQ("//foo//bar//", "//foo//bar//");
  1272. PATH_TEST_EQ("///foo///bar///", "///foo///bar///");
  1273. PATH_TEST_EQ("\\/foo\\/bar\\/", "\\/foo\\/bar\\/");
  1274. PATH_TEST_EQ("\\//foo\\//bar\\//", "\\//foo\\//bar\\//");
  1275. if (platform == "Windows")
  1276. {
  1277. PATH_TEST_EQ(path("c:") / "foo", "c:foo");
  1278. PATH_TEST_EQ(path("c:") / "/foo", "c:/foo");
  1279. PATH_TEST_EQ("\\foo\\bar\\", "\\foo\\bar\\");
  1280. PATH_TEST_EQ("\\\\foo\\\\bar\\\\", "\\\\foo\\\\bar\\\\");
  1281. PATH_TEST_EQ("\\\\\\foo\\\\\\bar\\\\\\", "\\\\\\foo\\\\\\bar\\\\\\");
  1282. PATH_TEST_EQ("\\", "\\");
  1283. PATH_TEST_EQ("\\f", "\\f");
  1284. PATH_TEST_EQ("\\foo", "\\foo");
  1285. PATH_TEST_EQ("foo\\bar", "foo\\bar");
  1286. PATH_TEST_EQ("foo bar", "foo bar");
  1287. PATH_TEST_EQ("c:", "c:");
  1288. PATH_TEST_EQ("c:/", "c:/");
  1289. PATH_TEST_EQ("c:.", "c:.");
  1290. PATH_TEST_EQ("c:./foo", "c:./foo");
  1291. PATH_TEST_EQ("c:.\\foo", "c:.\\foo");
  1292. PATH_TEST_EQ("c:..", "c:..");
  1293. PATH_TEST_EQ("c:/.", "c:/.");
  1294. PATH_TEST_EQ("c:/..", "c:/..");
  1295. PATH_TEST_EQ("c:/../", "c:/../");
  1296. PATH_TEST_EQ("c:\\..\\", "c:\\..\\");
  1297. PATH_TEST_EQ("c:/../..", "c:/../..");
  1298. PATH_TEST_EQ("c:/../foo", "c:/../foo");
  1299. PATH_TEST_EQ("c:\\..\\foo", "c:\\..\\foo");
  1300. PATH_TEST_EQ("c:../foo", "c:../foo");
  1301. PATH_TEST_EQ("c:..\\foo", "c:..\\foo");
  1302. PATH_TEST_EQ("c:/../../foo", "c:/../../foo");
  1303. PATH_TEST_EQ("c:\\..\\..\\foo", "c:\\..\\..\\foo");
  1304. PATH_TEST_EQ("c:foo/..", "c:foo/..");
  1305. PATH_TEST_EQ("c:/foo/..", "c:/foo/..");
  1306. PATH_TEST_EQ("c:/..foo", "c:/..foo");
  1307. PATH_TEST_EQ("c:foo", "c:foo");
  1308. PATH_TEST_EQ("c:/foo", "c:/foo");
  1309. PATH_TEST_EQ("\\\\netname", "\\\\netname");
  1310. PATH_TEST_EQ("\\\\netname\\", "\\\\netname\\");
  1311. PATH_TEST_EQ("\\\\netname\\foo", "\\\\netname\\foo");
  1312. PATH_TEST_EQ("c:/foo", "c:/foo");
  1313. PATH_TEST_EQ("prn:", "prn:");
  1314. }
  1315. else
  1316. {
  1317. }
  1318. PATH_TEST_EQ("foo/bar", "foo/bar");
  1319. PATH_TEST_EQ("a/b", "a/b"); // probe for length effects
  1320. PATH_TEST_EQ("..", "..");
  1321. PATH_TEST_EQ("../..", "../..");
  1322. PATH_TEST_EQ("/..", "/..");
  1323. PATH_TEST_EQ("/../..", "/../..");
  1324. PATH_TEST_EQ("../foo", "../foo");
  1325. PATH_TEST_EQ("foo/..", "foo/..");
  1326. PATH_TEST_EQ("foo/..bar", "foo/..bar");
  1327. PATH_TEST_EQ("../f", "../f");
  1328. PATH_TEST_EQ("/../f", "/../f");
  1329. PATH_TEST_EQ("f/..", "f/..");
  1330. PATH_TEST_EQ("foo/../..", "foo/../..");
  1331. PATH_TEST_EQ("foo/../../..", "foo/../../..");
  1332. PATH_TEST_EQ("foo/../bar", "foo/../bar");
  1333. PATH_TEST_EQ("foo/bar/..", "foo/bar/..");
  1334. PATH_TEST_EQ("foo/bar/../..", "foo/bar/../..");
  1335. PATH_TEST_EQ("foo/bar/../blah", "foo/bar/../blah");
  1336. PATH_TEST_EQ("f/../b", "f/../b");
  1337. PATH_TEST_EQ("f/b/..", "f/b/..");
  1338. PATH_TEST_EQ("f/b/../a", "f/b/../a");
  1339. PATH_TEST_EQ("foo/bar/blah/../..", "foo/bar/blah/../..");
  1340. PATH_TEST_EQ("foo/bar/blah/../../bletch", "foo/bar/blah/../../bletch");
  1341. PATH_TEST_EQ("...", "...");
  1342. PATH_TEST_EQ("....", "....");
  1343. PATH_TEST_EQ("foo/...", "foo/...");
  1344. PATH_TEST_EQ("abc.", "abc.");
  1345. PATH_TEST_EQ("abc..", "abc..");
  1346. PATH_TEST_EQ("foo/abc.", "foo/abc.");
  1347. PATH_TEST_EQ("foo/abc..", "foo/abc..");
  1348. PATH_TEST_EQ(".abc", ".abc");
  1349. PATH_TEST_EQ("a.c", "a.c");
  1350. PATH_TEST_EQ("..abc", "..abc");
  1351. PATH_TEST_EQ("a..c", "a..c");
  1352. PATH_TEST_EQ("foo/.abc", "foo/.abc");
  1353. PATH_TEST_EQ("foo/a.c", "foo/a.c");
  1354. PATH_TEST_EQ("foo/..abc", "foo/..abc");
  1355. PATH_TEST_EQ("foo/a..c", "foo/a..c");
  1356. PATH_TEST_EQ(".", ".");
  1357. PATH_TEST_EQ("./foo", "./foo");
  1358. PATH_TEST_EQ("./..", "./..");
  1359. PATH_TEST_EQ("./../foo", "./../foo");
  1360. PATH_TEST_EQ("foo/.", "foo/.");
  1361. PATH_TEST_EQ("../.", "../.");
  1362. PATH_TEST_EQ("./.", "./.");
  1363. PATH_TEST_EQ("././.", "././.");
  1364. PATH_TEST_EQ("./foo/.", "./foo/.");
  1365. PATH_TEST_EQ("foo/./bar", "foo/./bar");
  1366. PATH_TEST_EQ("foo/./.", "foo/./.");
  1367. PATH_TEST_EQ("foo/./..", "foo/./..");
  1368. PATH_TEST_EQ("foo/./../bar", "foo/./../bar");
  1369. PATH_TEST_EQ("foo/../.", "foo/../.");
  1370. PATH_TEST_EQ("././..", "././..");
  1371. PATH_TEST_EQ("./../.", "./../.");
  1372. PATH_TEST_EQ(".././.", ".././.");
  1373. }
  1374. // append_tests --------------------------------------------------------------------//
  1375. void append_test_aux(const path & p, const std::string & s, const std::string & expect)
  1376. {
  1377. PATH_TEST_EQ((p / path(s)).string(), expect);
  1378. PATH_TEST_EQ((p / s.c_str()).string(), expect);
  1379. PATH_TEST_EQ((p / s).string(), expect);
  1380. path x(p);
  1381. x.append(s.begin(), s.end());
  1382. PATH_TEST_EQ(x.string(), expect);
  1383. }
  1384. void append_tests()
  1385. {
  1386. std::cout << "append_tests..." << std::endl;
  1387. // There are many control paths to be exercised, since empty paths and arguments,
  1388. // paths with trailing separators, arguments with leading separators, with or without
  1389. // other characters being present, are all separate cases that need to be tested.
  1390. // Furthermore, some of the code to be tested is specific to argument categories,
  1391. // so that results in further permutations to be tested.
  1392. //// code to generate test cases
  1393. ////
  1394. //// expected results must be checked by hand
  1395. //// "foo\bar" expected result must be edited by hand and moved for Windows/POSIX
  1396. ////
  1397. //const char* x[] = { "", "/", "foo", "foo/" };
  1398. //const char* y[] = { "", "/", "bar", "/bar" };
  1399. //for (int i = 0; i < sizeof(x)/sizeof(char*); ++i)
  1400. // for (int j = 0; j < sizeof(y)/sizeof(char*); ++j)
  1401. // {
  1402. // std::cout << "\n PATH_TEST_EQ(path(\"" << x[i] << "\") / \"" << y[j] << "\", \""
  1403. // << path(x[i]) / y[j] << "\");\n";
  1404. // std::cout << " append_test_aux(\"" << x[i] << "\", \"" << y[j] << "\", \""
  1405. // << path(x[i]) / y[j] << "\");\n";
  1406. // }
  1407. PATH_TEST_EQ(path("") / "", "");
  1408. append_test_aux("", "", "");
  1409. PATH_TEST_EQ(path("") / "/", "/");
  1410. append_test_aux("", "/", "/");
  1411. PATH_TEST_EQ(path("") / "bar", "bar");
  1412. append_test_aux("", "bar", "bar");
  1413. PATH_TEST_EQ(path("") / "/bar", "/bar");
  1414. append_test_aux("", "/bar", "/bar");
  1415. PATH_TEST_EQ(path("/") / "", "/");
  1416. append_test_aux("/", "", "/");
  1417. PATH_TEST_EQ(path("/") / "/", "//");
  1418. append_test_aux("/", "/", "//");
  1419. PATH_TEST_EQ(path("/") / "bar", "/bar");
  1420. append_test_aux("/", "bar", "/bar");
  1421. PATH_TEST_EQ(path("/") / "/bar", "//bar");
  1422. append_test_aux("/", "/bar", "//bar");
  1423. PATH_TEST_EQ(path("foo") / "", "foo");
  1424. append_test_aux("foo", "", "foo");
  1425. PATH_TEST_EQ(path("foo") / "/", "foo/");
  1426. append_test_aux("foo", "/", "foo/");
  1427. PATH_TEST_EQ(path("foo") / "/bar", "foo/bar");
  1428. append_test_aux("foo", "/bar", "foo/bar");
  1429. PATH_TEST_EQ(path("foo/") / "", "foo/");
  1430. append_test_aux("foo/", "", "foo/");
  1431. PATH_TEST_EQ(path("foo/") / "/", "foo//");
  1432. append_test_aux("foo/", "/", "foo//");
  1433. PATH_TEST_EQ(path("foo/") / "bar", "foo/bar");
  1434. append_test_aux("foo/", "bar", "foo/bar");
  1435. if (platform == "Windows")
  1436. {
  1437. PATH_TEST_EQ(path("foo") / "bar", "foo\\bar");
  1438. append_test_aux("foo", "bar", "foo\\bar");
  1439. PATH_TEST_EQ(path("foo\\") / "\\bar", "foo\\\\bar");
  1440. append_test_aux("foo\\", "\\bar", "foo\\\\bar");
  1441. // hand created test case specific to Windows
  1442. PATH_TEST_EQ(path("c:") / "bar", "c:bar");
  1443. append_test_aux("c:", "bar", "c:bar");
  1444. }
  1445. else
  1446. {
  1447. PATH_TEST_EQ(path("foo") / "bar", "foo/bar");
  1448. append_test_aux("foo", "bar", "foo/bar");
  1449. }
  1450. // ticket #6819
  1451. union
  1452. {
  1453. char a[1];
  1454. char b[3];
  1455. } u;
  1456. u.b[0] = 'a';
  1457. u.b[1] = 'b';
  1458. u.b[2] = '\0';
  1459. path p6819;
  1460. p6819 /= u.a;
  1461. BOOST_TEST_EQ(p6819, path("ab"));
  1462. }
  1463. // self_assign_and_append_tests ------------------------------------------------------//
  1464. void self_assign_and_append_tests()
  1465. {
  1466. std::cout << "self_assign_and_append_tests..." << std::endl;
  1467. path p;
  1468. p = "snafubar";
  1469. PATH_TEST_EQ(p = p, "snafubar");
  1470. p = "snafubar";
  1471. p = p.c_str();
  1472. PATH_TEST_EQ(p, "snafubar");
  1473. p = "snafubar";
  1474. p.assign(p.c_str(), path::codecvt());
  1475. PATH_TEST_EQ(p, "snafubar");
  1476. p = "snafubar";
  1477. PATH_TEST_EQ(p = p.c_str()+5, "bar");
  1478. p = "snafubar";
  1479. PATH_TEST_EQ(p.assign(p.c_str() + 5, p.c_str() + 7), "ba");
  1480. p = "snafubar";
  1481. p /= p;
  1482. PATH_TEST_EQ(p, "snafubar" BOOST_DIR_SEP "snafubar");
  1483. p = "snafubar";
  1484. p /= p.c_str();
  1485. PATH_TEST_EQ(p, "snafubar" BOOST_DIR_SEP "snafubar");
  1486. p = "snafubar";
  1487. p.append(p.c_str(), path::codecvt());
  1488. PATH_TEST_EQ(p, "snafubar" BOOST_DIR_SEP "snafubar");
  1489. p = "snafubar";
  1490. PATH_TEST_EQ(p.append(p.c_str() + 5, p.c_str() + 7), "snafubar" BOOST_DIR_SEP "ba");
  1491. }
  1492. // name_function_tests -------------------------------------------------------------//
  1493. void name_function_tests()
  1494. {
  1495. std::cout << "name_function_tests..." << std::endl;
  1496. BOOST_TEST(fs::portable_posix_name(std::string("x")));
  1497. BOOST_TEST(fs::windows_name(std::string("x")));
  1498. BOOST_TEST(fs::portable_name(std::string("x")));
  1499. BOOST_TEST(fs::portable_directory_name(std::string("x")));
  1500. BOOST_TEST(fs::portable_file_name(std::string("x")));
  1501. BOOST_TEST(fs::portable_posix_name(std::string(".")));
  1502. BOOST_TEST(fs::windows_name(std::string(".")));
  1503. BOOST_TEST(fs::portable_name(std::string(".")));
  1504. BOOST_TEST(fs::portable_directory_name(std::string(".")));
  1505. BOOST_TEST(!fs::portable_file_name(std::string(".")));
  1506. BOOST_TEST(fs::portable_posix_name(std::string("..")));
  1507. BOOST_TEST(fs::windows_name(std::string("..")));
  1508. BOOST_TEST(fs::portable_name(std::string("..")));
  1509. BOOST_TEST(fs::portable_directory_name(std::string("..")));
  1510. BOOST_TEST(!fs::portable_file_name(std::string("..")));
  1511. BOOST_TEST(!fs::native(std::string("")));
  1512. BOOST_TEST(!fs::portable_posix_name(std::string("")));
  1513. BOOST_TEST(!fs::windows_name(std::string("")));
  1514. BOOST_TEST(!fs::portable_name(std::string("")));
  1515. BOOST_TEST(!fs::portable_directory_name(std::string("")));
  1516. BOOST_TEST(!fs::portable_file_name(std::string("")));
  1517. BOOST_TEST(!fs::native(std::string(" ")));
  1518. BOOST_TEST(!fs::portable_posix_name(std::string(" ")));
  1519. BOOST_TEST(!fs::windows_name(std::string(" ")));
  1520. BOOST_TEST(!fs::portable_name(std::string(" ")));
  1521. BOOST_TEST(!fs::portable_directory_name(std::string(" ")));
  1522. BOOST_TEST(!fs::portable_file_name(std::string(" ")));
  1523. BOOST_TEST(!fs::portable_posix_name(std::string(":")));
  1524. BOOST_TEST(!fs::windows_name(std::string(":")));
  1525. BOOST_TEST(!fs::portable_name(std::string(":")));
  1526. BOOST_TEST(!fs::portable_directory_name(std::string(":")));
  1527. BOOST_TEST(!fs::portable_file_name(std::string(":")));
  1528. BOOST_TEST(fs::portable_posix_name(std::string("-")));
  1529. BOOST_TEST(fs::windows_name(std::string("-")));
  1530. BOOST_TEST(!fs::portable_name(std::string("-")));
  1531. BOOST_TEST(!fs::portable_directory_name(std::string("-")));
  1532. BOOST_TEST(!fs::portable_file_name(std::string("-")));
  1533. BOOST_TEST(!fs::portable_posix_name(std::string("foo bar")));
  1534. BOOST_TEST(fs::windows_name(std::string("foo bar")));
  1535. BOOST_TEST(!fs::windows_name(std::string(" bar")));
  1536. BOOST_TEST(!fs::windows_name(std::string("foo ")));
  1537. BOOST_TEST(!fs::portable_name(std::string("foo bar")));
  1538. BOOST_TEST(!fs::portable_directory_name(std::string("foo bar")));
  1539. BOOST_TEST(!fs::portable_file_name(std::string("foo bar")));
  1540. BOOST_TEST(fs::portable_posix_name(std::string("foo.bar")));
  1541. BOOST_TEST(fs::windows_name(std::string("foo.bar")));
  1542. BOOST_TEST(fs::portable_name(std::string("foo.bar")));
  1543. BOOST_TEST(!fs::portable_directory_name(std::string("foo.bar")));
  1544. BOOST_TEST(fs::portable_file_name(std::string("foo.bar")));
  1545. BOOST_TEST(fs::portable_posix_name(std::string("foo.barf")));
  1546. BOOST_TEST(fs::windows_name(std::string("foo.barf")));
  1547. BOOST_TEST(fs::portable_name(std::string("foo.barf")));
  1548. BOOST_TEST(!fs::portable_directory_name(std::string("foo.barf")));
  1549. BOOST_TEST(!fs::portable_file_name(std::string("foo.barf")));
  1550. BOOST_TEST(fs::portable_posix_name(std::string(".foo")));
  1551. BOOST_TEST(fs::windows_name(std::string(".foo")));
  1552. BOOST_TEST(!fs::portable_name(std::string(".foo")));
  1553. BOOST_TEST(!fs::portable_directory_name(std::string(".foo")));
  1554. BOOST_TEST(!fs::portable_file_name(std::string(".foo")));
  1555. BOOST_TEST(fs::portable_posix_name(std::string("foo.")));
  1556. BOOST_TEST(!fs::windows_name(std::string("foo.")));
  1557. BOOST_TEST(!fs::portable_name(std::string("foo.")));
  1558. BOOST_TEST(!fs::portable_directory_name(std::string("foo.")));
  1559. BOOST_TEST(!fs::portable_file_name(std::string("foo.")));
  1560. }
  1561. // replace_extension_tests ---------------------------------------------------------//
  1562. void replace_extension_tests()
  1563. {
  1564. std::cout << "replace_extension_tests..." << std::endl;
  1565. BOOST_TEST(path().replace_extension().empty());
  1566. BOOST_TEST(path().replace_extension("a") == ".a");
  1567. BOOST_TEST(path().replace_extension("a.") == ".a.");
  1568. BOOST_TEST(path().replace_extension(".a") == ".a");
  1569. BOOST_TEST(path().replace_extension("a.txt") == ".a.txt");
  1570. // see the rationale in html docs for explanation why this works:
  1571. BOOST_TEST(path().replace_extension(".txt") == ".txt");
  1572. BOOST_TEST(path("a.txt").replace_extension() == "a");
  1573. BOOST_TEST(path("a.txt").replace_extension("") == "a");
  1574. BOOST_TEST(path("a.txt").replace_extension(".") == "a.");
  1575. BOOST_TEST(path("a.txt").replace_extension(".tex") == "a.tex");
  1576. BOOST_TEST(path("a.txt").replace_extension("tex") == "a.tex");
  1577. BOOST_TEST(path("a.").replace_extension(".tex") == "a.tex");
  1578. BOOST_TEST(path("a.").replace_extension("tex") == "a.tex");
  1579. BOOST_TEST(path("a").replace_extension(".txt") == "a.txt");
  1580. BOOST_TEST(path("a").replace_extension("txt") == "a.txt");
  1581. BOOST_TEST(path("a.b.txt").replace_extension(".tex") == "a.b.tex");
  1582. BOOST_TEST(path("a.b.txt").replace_extension("tex") == "a.b.tex");
  1583. BOOST_TEST(path("a/b").replace_extension(".c") == "a/b.c");
  1584. PATH_TEST_EQ(path("a.txt/b").replace_extension(".c"), "a.txt/b.c"); // ticket 4702
  1585. BOOST_TEST(path("foo.txt").replace_extension("exe") == "foo.exe"); // ticket 5118
  1586. BOOST_TEST(path("foo.txt").replace_extension(".tar.bz2")
  1587. == "foo.tar.bz2"); // ticket 5118
  1588. }
  1589. // make_preferred_tests ------------------------------------------------------------//
  1590. void make_preferred_tests()
  1591. {
  1592. std::cout << "make_preferred_tests..." << std::endl;
  1593. if (platform == "Windows")
  1594. {
  1595. BOOST_TEST(path("//abc\\def/ghi").make_preferred().native()
  1596. == path("\\\\abc\\def\\ghi").native());
  1597. }
  1598. else
  1599. {
  1600. BOOST_TEST(path("//abc\\def/ghi").make_preferred().native()
  1601. == path("//abc\\def/ghi").native());
  1602. }
  1603. }
  1604. // lexically_normal_tests ----------------------------------------------------------//
  1605. void lexically_normal_tests()
  1606. {
  1607. std::cout << "lexically_normal_tests..." << std::endl;
  1608. // Note: lexically_lexically_normal() uses /= to build up some results, so these results will
  1609. // have the platform's preferred separator. Since that is immaterial to the correct
  1610. // functioning of lexically_lexically_normal(), the test results are converted to generic form,
  1611. // and the expected results are also given in generic form. Otherwise many of the
  1612. // tests would incorrectly be reported as failing on Windows.
  1613. PATH_TEST_EQ(path("").lexically_normal().generic_path(), "");
  1614. PATH_TEST_EQ(path("/").lexically_normal().generic_path(), "/");
  1615. PATH_TEST_EQ(path("//").lexically_normal().generic_path(), "//");
  1616. PATH_TEST_EQ(path("///").lexically_normal().generic_path(), "/");
  1617. PATH_TEST_EQ(path("f").lexically_normal().generic_path(), "f");
  1618. PATH_TEST_EQ(path("foo").lexically_normal().generic_path(), "foo");
  1619. PATH_TEST_EQ(path("foo/").lexically_normal().generic_path(), "foo/.");
  1620. PATH_TEST_EQ(path("f/").lexically_normal().generic_path(), "f/.");
  1621. PATH_TEST_EQ(path("/foo").lexically_normal().generic_path(), "/foo");
  1622. PATH_TEST_EQ(path("foo/bar").lexically_normal().generic_path(), "foo/bar");
  1623. PATH_TEST_EQ(path("..").lexically_normal().generic_path(), "..");
  1624. PATH_TEST_EQ(path("../..").lexically_normal().generic_path(), "../..");
  1625. PATH_TEST_EQ(path("/..").lexically_normal().generic_path(), "/..");
  1626. PATH_TEST_EQ(path("/../..").lexically_normal().generic_path(), "/../..");
  1627. PATH_TEST_EQ(path("../foo").lexically_normal().generic_path(), "../foo");
  1628. PATH_TEST_EQ(path("foo/..").lexically_normal().generic_path(), ".");
  1629. PATH_TEST_EQ(path("foo/../").lexically_normal().generic_path(), "./.");
  1630. PATH_TEST_EQ((path("foo") / "..").lexically_normal().generic_path() , ".");
  1631. PATH_TEST_EQ(path("foo/...").lexically_normal().generic_path(), "foo/...");
  1632. PATH_TEST_EQ(path("foo/.../").lexically_normal().generic_path(), "foo/.../.");
  1633. PATH_TEST_EQ(path("foo/..bar").lexically_normal().generic_path(), "foo/..bar");
  1634. PATH_TEST_EQ(path("../f").lexically_normal().generic_path(), "../f");
  1635. PATH_TEST_EQ(path("/../f").lexically_normal().generic_path(), "/../f");
  1636. PATH_TEST_EQ(path("f/..").lexically_normal().generic_path(), ".");
  1637. PATH_TEST_EQ((path("f") / "..").lexically_normal().generic_path() , ".");
  1638. PATH_TEST_EQ(path("foo/../..").lexically_normal().generic_path(), "..");
  1639. PATH_TEST_EQ(path("foo/../../").lexically_normal().generic_path(), "../.");
  1640. PATH_TEST_EQ(path("foo/../../..").lexically_normal().generic_path(), "../..");
  1641. PATH_TEST_EQ(path("foo/../../../").lexically_normal().generic_path(), "../../.");
  1642. PATH_TEST_EQ(path("foo/../bar").lexically_normal().generic_path(), "bar");
  1643. PATH_TEST_EQ(path("foo/../bar/").lexically_normal().generic_path(), "bar/.");
  1644. PATH_TEST_EQ(path("foo/bar/..").lexically_normal().generic_path(), "foo");
  1645. PATH_TEST_EQ(path("foo/./bar/..").lexically_normal().generic_path(), "foo");
  1646. std::cout << path("foo/./bar/..").lexically_normal() << std::endl; // outputs "foo"
  1647. PATH_TEST_EQ(path("foo/bar/../").lexically_normal().generic_path(), "foo/.");
  1648. PATH_TEST_EQ(path("foo/./bar/../").lexically_normal().generic_path(), "foo/.");
  1649. std::cout << path("foo/./bar/../").lexically_normal() << std::endl; // POSIX: "foo/.", Windows: "foo\."
  1650. PATH_TEST_EQ(path("foo/bar/../..").lexically_normal().generic_path(), ".");
  1651. PATH_TEST_EQ(path("foo/bar/../../").lexically_normal().generic_path(), "./.");
  1652. PATH_TEST_EQ(path("foo/bar/../blah").lexically_normal().generic_path(), "foo/blah");
  1653. PATH_TEST_EQ(path("f/../b").lexically_normal().generic_path(), "b");
  1654. PATH_TEST_EQ(path("f/b/..").lexically_normal().generic_path(), "f");
  1655. PATH_TEST_EQ(path("f/b/../").lexically_normal().generic_path(), "f/.");
  1656. PATH_TEST_EQ(path("f/b/../a").lexically_normal().generic_path(), "f/a");
  1657. PATH_TEST_EQ(path("foo/bar/blah/../..").lexically_normal().generic_path(), "foo");
  1658. PATH_TEST_EQ(path("foo/bar/blah/../../bletch").lexically_normal().generic_path(), "foo/bletch");
  1659. PATH_TEST_EQ(path("//net").lexically_normal().generic_path(), "//net");
  1660. PATH_TEST_EQ(path("//net/").lexically_normal().generic_path(), "//net/");
  1661. PATH_TEST_EQ(path("//..net").lexically_normal().generic_path(), "//..net");
  1662. PATH_TEST_EQ(path("//net/..").lexically_normal().generic_path(), "//net/..");
  1663. PATH_TEST_EQ(path("//net/foo").lexically_normal().generic_path(), "//net/foo");
  1664. PATH_TEST_EQ(path("//net/foo/").lexically_normal().generic_path(), "//net/foo/.");
  1665. PATH_TEST_EQ(path("//net/foo/..").lexically_normal().generic_path(), "//net/");
  1666. PATH_TEST_EQ(path("//net/foo/../").lexically_normal().generic_path(), "//net/.");
  1667. PATH_TEST_EQ(path("/net/foo/bar").lexically_normal().generic_path(), "/net/foo/bar");
  1668. PATH_TEST_EQ(path("/net/foo/bar/").lexically_normal().generic_path(), "/net/foo/bar/.");
  1669. PATH_TEST_EQ(path("/net/foo/..").lexically_normal().generic_path(), "/net");
  1670. PATH_TEST_EQ(path("/net/foo/../").lexically_normal().generic_path(), "/net/.");
  1671. PATH_TEST_EQ(path("//net//foo//bar").lexically_normal().generic_path(), "//net/foo/bar");
  1672. PATH_TEST_EQ(path("//net//foo//bar//").lexically_normal().generic_path(), "//net/foo/bar/.");
  1673. PATH_TEST_EQ(path("//net//foo//..").lexically_normal().generic_path(), "//net/");
  1674. PATH_TEST_EQ(path("//net//foo//..//").lexically_normal().generic_path(), "//net/.");
  1675. PATH_TEST_EQ(path("///net///foo///bar").lexically_normal().generic_path(), "/net/foo/bar");
  1676. PATH_TEST_EQ(path("///net///foo///bar///").lexically_normal().generic_path(), "/net/foo/bar/.");
  1677. PATH_TEST_EQ(path("///net///foo///..").lexically_normal().generic_path(), "/net");
  1678. PATH_TEST_EQ(path("///net///foo///..///").lexically_normal().generic_path(), "/net/.");
  1679. if (platform == "Windows")
  1680. {
  1681. PATH_TEST_EQ(path("c:..").lexically_normal().generic_path(), "c:..");
  1682. PATH_TEST_EQ(path("c:foo/..").lexically_normal().generic_path(), "c:");
  1683. PATH_TEST_EQ(path("c:foo/../").lexically_normal().generic_path(), "c:.");
  1684. PATH_TEST_EQ(path("c:/foo/..").lexically_normal().generic_path(), "c:/");
  1685. PATH_TEST_EQ(path("c:/foo/../").lexically_normal().generic_path(), "c:/.");
  1686. PATH_TEST_EQ(path("c:/..").lexically_normal().generic_path(), "c:/..");
  1687. PATH_TEST_EQ(path("c:/../").lexically_normal().generic_path(), "c:/../.");
  1688. PATH_TEST_EQ(path("c:/../..").lexically_normal().generic_path(), "c:/../..");
  1689. PATH_TEST_EQ(path("c:/../../").lexically_normal().generic_path(), "c:/../../.");
  1690. PATH_TEST_EQ(path("c:/../foo").lexically_normal().generic_path(), "c:/../foo");
  1691. PATH_TEST_EQ(path("c:/../foo/").lexically_normal().generic_path(), "c:/../foo/.");
  1692. PATH_TEST_EQ(path("c:/../../foo").lexically_normal().generic_path(), "c:/../../foo");
  1693. PATH_TEST_EQ(path("c:/../../foo/").lexically_normal().generic_path(), "c:/../../foo/.");
  1694. PATH_TEST_EQ(path("c:/..foo").lexically_normal().generic_path(), "c:/..foo");
  1695. }
  1696. else // POSIX
  1697. {
  1698. PATH_TEST_EQ(path("c:..").lexically_normal(), "c:..");
  1699. PATH_TEST_EQ(path("c:foo/..").lexically_normal(), ".");
  1700. PATH_TEST_EQ(path("c:foo/../").lexically_normal(), "./.");
  1701. PATH_TEST_EQ(path("c:/foo/..").lexically_normal(), "c:");
  1702. PATH_TEST_EQ(path("c:/foo/../").lexically_normal(), "c:/.");
  1703. PATH_TEST_EQ(path("c:/..").lexically_normal(), ".");
  1704. PATH_TEST_EQ(path("c:/../").lexically_normal(), "./.");
  1705. PATH_TEST_EQ(path("c:/../..").lexically_normal(), "..");
  1706. PATH_TEST_EQ(path("c:/../../").lexically_normal(), "../.");
  1707. PATH_TEST_EQ(path("c:/../foo").lexically_normal(), "foo");
  1708. PATH_TEST_EQ(path("c:/../foo/").lexically_normal(), "foo/.");
  1709. PATH_TEST_EQ(path("c:/../../foo").lexically_normal(), "../foo");
  1710. PATH_TEST_EQ(path("c:/../../foo/").lexically_normal(), "../foo/.");
  1711. PATH_TEST_EQ(path("c:/..foo").lexically_normal(), "c:/..foo");
  1712. }
  1713. }
  1714. inline void odr_use(const path::value_type& c)
  1715. {
  1716. static const path::value_type dummy = '\0';
  1717. BOOST_TEST(&c != &dummy);
  1718. }
  1719. } // unnamed namespace
  1720. static boost::filesystem::path ticket_6737 = "FilePath"; // #6737 reported this crashed
  1721. // on VC++ debug mode build
  1722. const boost::filesystem::path ticket_6690("test"); // #6690 another V++ static init crash
  1723. //--------------------------------------------------------------------------------------//
  1724. // //
  1725. // main //
  1726. // //
  1727. //--------------------------------------------------------------------------------------//
  1728. int cpp_main(int, char*[])
  1729. {
  1730. // The choice of platform is make at runtime rather than compile-time
  1731. // so that compile errors for all platforms will be detected even though
  1732. // only the current platform is runtime tested.
  1733. platform = (platform == "Win32" || platform == "Win64" || platform == "Cygwin")
  1734. ? "Windows"
  1735. : "POSIX";
  1736. std::cout << "Platform is " << platform << '\n';
  1737. BOOST_TEST(p1.string() != p3.string());
  1738. p3 = p2;
  1739. BOOST_TEST(p1.string() == p3.string());
  1740. path p04("foobar");
  1741. BOOST_TEST(p04.string() == "foobar");
  1742. p04 = p04; // self-assignment
  1743. BOOST_TEST(p04.string() == "foobar");
  1744. construction_tests();
  1745. append_tests();
  1746. self_assign_and_append_tests();
  1747. overload_tests();
  1748. query_and_decomposition_tests();
  1749. composition_tests();
  1750. iterator_tests();
  1751. non_member_tests();
  1752. exception_tests();
  1753. name_function_tests();
  1754. replace_extension_tests();
  1755. make_preferred_tests();
  1756. lexically_normal_tests();
  1757. // verify deprecated names still available
  1758. # ifndef BOOST_FILESYSTEM_NO_DEPRECATED
  1759. p1.branch_path();
  1760. p1.leaf();
  1761. path p_remove_leaf;
  1762. p_remove_leaf.remove_leaf();
  1763. # endif
  1764. std::string s1("//:somestring"); // this used to be treated specially
  1765. // check the path member templates
  1766. p5.assign(s1.begin(), s1.end());
  1767. PATH_TEST_EQ(p5.string(), "//:somestring");
  1768. p5 = s1;
  1769. PATH_TEST_EQ(p5.string(), "//:somestring");
  1770. // this code, courtesy of David Whetstone, detects a now fixed bug that
  1771. // derefereced the end iterator (assuming debug build with checked itors)
  1772. std::vector<char> v1;
  1773. p5.assign(v1.begin(), v1.end());
  1774. std::string s2(v1.begin(), v1.end());
  1775. PATH_TEST_EQ(p5.string(), s2);
  1776. p5.assign(s1.begin(), s1.begin() + 1);
  1777. PATH_TEST_EQ(p5.string(), "/");
  1778. BOOST_TEST(p1 != p4);
  1779. BOOST_TEST(p1.string() == p2.string());
  1780. BOOST_TEST(p1.string() == p3.string());
  1781. BOOST_TEST(path("foo").filename() == "foo");
  1782. BOOST_TEST(path("foo").parent_path().string() == "");
  1783. BOOST_TEST(p1.filename() == "fum");
  1784. BOOST_TEST(p1.parent_path().string() == "fe/fi/fo");
  1785. BOOST_TEST(path("").empty() == true);
  1786. BOOST_TEST(path("foo").empty() == false);
  1787. // inserter and extractor tests
  1788. # if !defined(BOOST_MSVC) || BOOST_MSVC > 1300 // bypass VC++ 7.0 and earlier
  1789. std::cout << "\nInserter and extractor test...";
  1790. std::stringstream ss;
  1791. ss << fs::path("foo/bar") << std::endl;
  1792. fs::path round_trip;
  1793. ss >> round_trip;
  1794. BOOST_TEST(round_trip.string() == "foo/bar");
  1795. std::cout << round_trip.string() << "..." << round_trip << " complete\n";
  1796. # endif
  1797. // Check that path constants have definitions
  1798. // https://svn.boost.org/trac10/ticket/12759
  1799. odr_use(path::separator);
  1800. odr_use(path::preferred_separator);
  1801. odr_use(path::dot);
  1802. return ::boost::report_errors();
  1803. }