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