1// Copyright Sascha Ochsenknecht 2009.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt
4// or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6
7#include <boost/program_options/parsers.hpp>
8#include <boost/program_options/options_description.hpp>
9#include <boost/program_options/variables_map.hpp>
10#include <boost/program_options/cmdline.hpp>
11using namespace boost::program_options;
12
13#include <iostream>
14#include <sstream>
15#include <vector>
16#include <cassert>
17using namespace std;
18
19#include "minitest.hpp"
20
21void check_value(const string& option, const string& value)
22{
23 BOOST_CHECK(option == value);
24}
25
26void split_whitespace(const options_description& description)
27{
28
29 const char* cmdline = "prg --input input.txt \r --optimization 4 \t --opt \n option";
30
31 vector< string > tokens = split_unix(cmdline, seperator: " \t\n\r");
32
33 BOOST_REQUIRE(tokens.size() == 7);
34
35 check_value(option: tokens[0], value: "prg");
36 check_value(option: tokens[1], value: "--input");
37 check_value(option: tokens[2], value: "input.txt");
38 check_value(option: tokens[3], value: "--optimization");
39 check_value(option: tokens[4], value: "4");
40 check_value(option: tokens[5], value: "--opt");
41 check_value(option: tokens[6], value: "option");
42
43 variables_map vm;
44 store(options: command_line_parser(tokens).options(desc: description).run(), m&: vm);
45 notify(m&: vm);
46}
47
48void split_equalsign(const options_description& description)
49{
50
51 const char* cmdline = "prg --input=input.txt --optimization=4 --opt=option";
52
53 vector< string > tokens = split_unix(cmdline, seperator: "= ");
54
55 BOOST_REQUIRE(tokens.size() == 7);
56 check_value(option: tokens[0], value: "prg");
57 check_value(option: tokens[1], value: "--input");
58 check_value(option: tokens[2], value: "input.txt");
59 check_value(option: tokens[3], value: "--optimization");
60 check_value(option: tokens[4], value: "4");
61 check_value(option: tokens[5], value: "--opt");
62 check_value(option: tokens[6], value: "option");
63
64 variables_map vm;
65 store(options: command_line_parser(tokens).options(desc: description).run(), m&: vm);
66 notify(m&: vm);
67}
68
69void split_semi(const options_description& description)
70{
71
72 const char* cmdline = "prg;--input input.txt;--optimization 4;--opt option";
73
74 vector< string > tokens = split_unix(cmdline, seperator: "; ");
75
76 BOOST_REQUIRE(tokens.size() == 7);
77 check_value(option: tokens[0], value: "prg");
78 check_value(option: tokens[1], value: "--input");
79 check_value(option: tokens[2], value: "input.txt");
80 check_value(option: tokens[3], value: "--optimization");
81 check_value(option: tokens[4], value: "4");
82 check_value(option: tokens[5], value: "--opt");
83 check_value(option: tokens[6], value: "option");
84
85 variables_map vm;
86 store(options: command_line_parser(tokens).options(desc: description).run(), m&: vm);
87 notify(m&: vm);
88}
89
90void split_quotes(const options_description& description)
91{
92 const char* cmdline = "prg --input \"input.txt input.txt\" --optimization 4 --opt \"option1 option2\"";
93
94 vector< string > tokens = split_unix(cmdline, seperator: " ");
95
96 BOOST_REQUIRE(tokens.size() == 7);
97 check_value(option: tokens[0], value: "prg");
98 check_value(option: tokens[1], value: "--input");
99 check_value(option: tokens[2], value: "input.txt input.txt");
100 check_value(option: tokens[3], value: "--optimization");
101 check_value(option: tokens[4], value: "4");
102 check_value(option: tokens[5], value: "--opt");
103 check_value(option: tokens[6], value: "option1 option2");
104
105 variables_map vm;
106 store(options: command_line_parser(tokens).options(desc: description).run(), m&: vm);
107 notify(m&: vm);
108}
109
110void split_escape(const options_description& description)
111{
112 const char* cmdline = "prg --input \\\"input.txt\\\" --optimization 4 --opt \\\"option1\\ option2\\\"";
113
114 vector< string > tokens = split_unix(cmdline, seperator: " ");
115
116 BOOST_REQUIRE(tokens.size() == 7);
117 check_value(option: tokens[0], value: "prg");
118 check_value(option: tokens[1], value: "--input");
119 check_value(option: tokens[2], value: "\"input.txt\"");
120 check_value(option: tokens[3], value: "--optimization");
121 check_value(option: tokens[4], value: "4");
122 check_value(option: tokens[5], value: "--opt");
123 check_value(option: tokens[6], value: "\"option1 option2\"");
124
125 variables_map vm;
126 store(options: command_line_parser(tokens).options(desc: description).run(), m&: vm);
127 notify(m&: vm);
128}
129
130
131void split_single_quote(const options_description& description)
132{
133 const char* cmdline = "prg --input 'input.txt input.txt' --optimization 4 --opt 'option1 option2'";
134
135 vector< string > tokens = split_unix(cmdline, seperator: " ", quote: "'");
136
137 BOOST_REQUIRE(tokens.size() == 7);
138 check_value(option: tokens[0], value: "prg");
139 check_value(option: tokens[1], value: "--input");
140 check_value(option: tokens[2], value: "input.txt input.txt");
141 check_value(option: tokens[3], value: "--optimization");
142 check_value(option: tokens[4], value: "4");
143 check_value(option: tokens[5], value: "--opt");
144 check_value(option: tokens[6], value: "option1 option2");
145
146 variables_map vm;
147 store(options: command_line_parser(tokens).options(desc: description).run(), m&: vm);
148 notify(m&: vm);
149}
150
151void split_defaults(const options_description& description)
152{
153 const char* cmdline = "prg --input \t \'input file.txt\' \t --optimization 4 --opt \\\"option1\\ option2\\\"";
154
155 vector< string > tokens = split_unix(cmdline);
156
157 BOOST_REQUIRE(tokens.size() == 7);
158 check_value(option: tokens[0], value: "prg");
159 check_value(option: tokens[1], value: "--input");
160 check_value(option: tokens[2], value: "input file.txt");
161 check_value(option: tokens[3], value: "--optimization");
162 check_value(option: tokens[4], value: "4");
163 check_value(option: tokens[5], value: "--opt");
164 check_value(option: tokens[6], value: "\"option1 option2\"");
165
166 variables_map vm;
167 store(options: command_line_parser(tokens).options(desc: description).run(), m&: vm);
168 notify(m&: vm);
169}
170
171int main(int /*ac*/, char** /*av*/)
172{
173 options_description desc;
174 desc.add_options()
175 ("input,i", value<string>(), "the input file")
176 ("optimization,O", value<unsigned>(), "optimization level")
177 ("opt,o", value<string>(), "misc option")
178 ;
179
180 split_whitespace(description: desc);
181 split_equalsign(description: desc);
182 split_semi(description: desc);
183 split_quotes(description: desc);
184 split_escape(description: desc);
185 split_single_quote(description: desc);
186 split_defaults(description: desc);
187
188 return 0;
189}
190

source code of boost/libs/program_options/test/split_test.cpp