1// Boost.Convert test and usage example
2// Copyright (c) 2009-2020 Vladimir Batov.
3// Use, modification and distribution are subject to the Boost Software License,
4// Version 1.0. See http://www.boost.org/LICENSE_1_0.txt.
5
6#include "./test.hpp"
7
8#if !defined(BOOST_CONVERT_CXX14)
9int main(int, char const* []) { return 0; }
10#else
11
12#include <boost/convert.hpp>
13#include <boost/convert/stream.hpp>
14#include <boost/convert/printf.hpp>
15#include <boost/convert/strtol.hpp>
16#include <boost/convert/lexical_cast.hpp>
17#include <boost/convert/spirit.hpp>
18
19using std::string;
20
21template<typename Converter>
22void
23int_to_str(Converter const& cnv)
24{
25 string const not_int_str = "not an int";
26 string const std_str = "-11";
27 char const* const c_str = "-12";
28 char const array_str[] = "-15";
29
30 ////////////////////////////////////////////////////////////////////////////
31 // Testing int-to-string conversion with various string
32 // containers as the fallback values.
33 ////////////////////////////////////////////////////////////////////////////
34
35 string s01 = boost::convert<string>(-1, cnv).value_or(std_str);
36 string s02 = boost::convert<string>(-2, cnv).value_or(c_str);
37 string s05 = boost::convert<string>(-5, cnv).value_or(array_str);
38 boost::optional<string> rs01 = boost::convert<string>(-1, cnv);
39 boost::optional<string> rs02 = boost::convert<string>(-2, cnv);
40 boost::optional<string> rs05 = boost::convert<string>(-5, cnv);
41
42 BOOST_TEST(s01 == "-1"); BOOST_TEST(rs01 && rs01.value() == "-1");
43 BOOST_TEST(s02 == "-2"); BOOST_TEST(rs02 && rs02.value() == "-2");
44 BOOST_TEST(s05 == "-5"); BOOST_TEST(rs05 && rs05.value() == "-5");
45
46 string s11 = boost::convert<string>(-1, cnv).value();
47 boost::optional< string> rs11 = boost::convert<string>(-1, cnv);
48
49 BOOST_TEST( s11 == "-1");
50 BOOST_TEST(rs11 && rs11.value() == "-1");
51}
52
53template<typename Converter>
54void
55str_to_int(Converter const& cnv)
56{
57 string const not_int_str = "not an int";
58 string const std_str = "-11";
59 char const* const c_str = "-123";
60 char const array_str[] = "3456";
61
62 ////////////////////////////////////////////////////////////////////////////
63 // Testing various kinds of string containers.
64 // Testing implicit conversion directly to TypeOut (int).
65 // Testing with the fallback value value provided.
66 // On failure returns the provided fallback value and DOES NOT THROW.
67 ////////////////////////////////////////////////////////////////////////////
68
69 int const a00 = boost::convert<int>(not_int_str, cnv).value_or(-1);
70 int const a01 = boost::convert<int>(std_str, cnv).value_or(-1);
71 int const a02 = boost::convert<int>(c_str, cnv).value_or(-1);
72 int const a05 = boost::convert<int>(array_str, cnv).value_or(-1);
73
74 BOOST_TEST(a00 == -1); // Failed conversion
75 BOOST_TEST(a01 == -11);
76 BOOST_TEST(a02 == -123);
77 BOOST_TEST(a05 == 3456);
78
79 ////////////////////////////////////////////////////////////////////////////
80 // Testing "optional"
81 ////////////////////////////////////////////////////////////////////////////
82
83 boost::optional<int> const r00 = boost::convert<int>(not_int_str, cnv);
84 boost::optional<int> const r01 = boost::convert<int>(std_str, cnv);
85 boost::optional<int> const r02 = boost::convert<int>(c_str, cnv);
86 boost::optional<int> const r05 = boost::convert<int>(array_str, cnv);
87
88 BOOST_TEST(!r00); // Failed conversion
89 BOOST_TEST( r01 && r01.value() == -11);
90 BOOST_TEST( r02 && r02.value() == -123);
91 BOOST_TEST( r05 && r05.value() == 3456);
92
93 ////////////////////////////////////////////////////////////////////////////
94 // Testing value() on invalid result.
95 ////////////////////////////////////////////////////////////////////////////
96
97 try
98 {
99 boost::convert<int>(not_int_str, cnv).value();
100 BOOST_TEST(!"failed to throw");
101 }
102 catch (std::exception&)
103 {
104 // Expected behavior: received 'boost::convert failed' exception. All well.
105 }
106 ////////////////////////////////////////////////////////////////////////////
107 // Testing value() on valid result.
108 ////////////////////////////////////////////////////////////////////////////
109
110 int a21 = boost::convert<int>(std_str, cnv).value();
111 int a22 = boost::convert<int>(c_str, cnv).value();
112 int a25 = boost::convert<int>(array_str, cnv).value();
113
114 BOOST_TEST(a21 == -11);
115 BOOST_TEST(a22 == -123);
116 BOOST_TEST(a25 == 3456);
117
118 ////////////////////////////////////////////////////////////////////////////
119 // Testing empty string.
120 ////////////////////////////////////////////////////////////////////////////
121
122 int a31 = boost::convert<int>(std::string(), cnv).value_or(-1);
123 int a32 = boost::convert<int>(std::string(""), cnv).value_or(-1);
124 int a33 = boost::convert<int>("", cnv).value_or(-1);
125
126 BOOST_ASSERT(a31 == -1);
127 BOOST_ASSERT(a32 == -1);
128 BOOST_ASSERT(a33 == -1);
129}
130
131int
132main(int, char const* [])
133{
134 auto lxcast_cnv = boost::cnv::lexical_cast();
135 auto stream_cnv = boost::cnv::cstream();
136 auto strtol_cnv = boost::cnv::strtol();
137 auto printf_cnv = boost::cnv::printf();
138 auto spirit_cnv = boost::cnv::spirit();
139
140 str_to_int(lxcast_cnv);
141 str_to_int(stream_cnv);
142 str_to_int(strtol_cnv);
143 str_to_int(printf_cnv);
144 str_to_int(spirit_cnv);
145
146 int_to_str(lxcast_cnv);
147 int_to_str(stream_cnv);
148 int_to_str(strtol_cnv);
149 int_to_str(printf_cnv);
150 int_to_str(spirit_cnv);
151
152 return boost::report_errors();
153}
154
155#endif
156

source code of boost/libs/convert/test/str_to_int.cpp