1 // Unit test for boost::lexical_cast.
2 //
3 // See http://www.boost.org for most recent version, including documentation.
4 //
5 // Copyright Antony Polukhin, 2013-2021.
6 //
7 // Distributed under the Boost
8 // Software License, Version 1.0. (See accompanying file
9 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt).
10 //
11 // Test lexical_cast usage with long filesystem::path. Bug 7704.
12
13 #include <boost/config.hpp>
14
15 #include <boost/test/unit_test.hpp>
16 #include <boost/lexical_cast.hpp>
17 #include <boost/filesystem/path.hpp>
18
19 using namespace boost;
20
21 void test_filesystem();
22
init_unit_test_suite(int,char * [])23 unit_test::test_suite *init_unit_test_suite(int, char *[])
24 {
25 unit_test::test_suite *suite =
26 BOOST_TEST_SUITE("lexical_cast+filesystem unit test");
27 suite->add(BOOST_TEST_CASE(&test_filesystem));
28
29 return suite;
30 }
31
test_filesystem()32 void test_filesystem()
33 {
34 boost::filesystem::path p;
35 std::string s1 = "aaaaaaaaaaaaaaaaaaaaaaa";
36 p = boost::lexical_cast<boost::filesystem::path>(s1);
37 BOOST_CHECK(!p.empty());
38 BOOST_CHECK_EQUAL(p, s1);
39 p.clear();
40
41 const char ab[] = "aaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
42 p = boost::lexical_cast<boost::filesystem::path>(ab);
43 BOOST_CHECK(!p.empty());
44 BOOST_CHECK_EQUAL(p, ab);
45
46 // Tests for
47 // https://github.com/boostorg/lexical_cast/issues/25
48
49 const char quoted_path[] = "\"/home/my user\"";
50 p = boost::lexical_cast<boost::filesystem::path>(quoted_path);
51 BOOST_CHECK(!p.empty());
52 const char unquoted_path[] = "/home/my user";
53 BOOST_CHECK_EQUAL(p, boost::filesystem::path(unquoted_path));
54
55 // Converting back to std::string gives the initial string
56 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(p), quoted_path);
57
58 try {
59 // Without quotes the path will have only `/home/my` in it.
60 // `user` remains in the stream, so an exception must be thrown.
61 p = boost::lexical_cast<boost::filesystem::path>(unquoted_path);
62 BOOST_CHECK(false);
63 } catch (const boost::bad_lexical_cast& ) {
64 // Exception is expected
65 }
66 }
67
68