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 | #include <boost/program_options.hpp> |
7 | using namespace boost::program_options; |
8 | |
9 | #include <string> |
10 | #include <iostream> |
11 | #include <fstream> |
12 | using namespace std; |
13 | |
14 | #include "minitest.hpp" |
15 | |
16 | |
17 | void required_throw_test() |
18 | { |
19 | options_description opts; |
20 | opts.add_options() |
21 | ("cfgfile,c" , value<string>()->required(), "the configfile" ) |
22 | ("fritz,f" , value<string>()->required(), "the output file" ) |
23 | ; |
24 | |
25 | variables_map vm; |
26 | bool thrown = false; |
27 | { |
28 | // This test must throw exception |
29 | string cmdline = "prg -f file.txt" ; |
30 | vector< string > tokens = split_unix(cmdline); |
31 | thrown = false; |
32 | try { |
33 | store(options: command_line_parser(tokens).options(desc: opts).run(), m&: vm); |
34 | notify(m&: vm); |
35 | } |
36 | catch (required_option& e) { |
37 | BOOST_CHECK_EQUAL(e.what(), string("the option '--cfgfile' is required but missing" )); |
38 | thrown = true; |
39 | } |
40 | BOOST_CHECK(thrown); |
41 | } |
42 | |
43 | { |
44 | // This test mustn't throw exception |
45 | string cmdline = "prg -c config.txt" ; |
46 | vector< string > tokens = split_unix(cmdline); |
47 | thrown = false; |
48 | try { |
49 | store(options: command_line_parser(tokens).options(desc: opts).run(), m&: vm); |
50 | notify(m&: vm); |
51 | } |
52 | catch (required_option& e) { |
53 | thrown = true; |
54 | } |
55 | BOOST_CHECK(!thrown); |
56 | } |
57 | } |
58 | |
59 | |
60 | |
61 | void simple_required_test(const char* config_file) |
62 | { |
63 | options_description opts; |
64 | opts.add_options() |
65 | ("cfgfile,c" , value<string>()->required(), "the configfile" ) |
66 | ("fritz,f" , value<string>()->required(), "the output file" ) |
67 | ; |
68 | |
69 | variables_map vm; |
70 | bool thrown = false; |
71 | { |
72 | // This test must throw exception |
73 | string cmdline = "prg -f file.txt" ; |
74 | vector< string > tokens = split_unix(cmdline); |
75 | thrown = false; |
76 | try { |
77 | // options coming from different sources |
78 | store(options: command_line_parser(tokens).options(desc: opts).run(), m&: vm); |
79 | store(options: parse_config_file<char>(filename: config_file, opts), m&: vm); |
80 | notify(m&: vm); |
81 | } |
82 | catch (required_option& e) { |
83 | thrown = true; |
84 | } |
85 | BOOST_CHECK(!thrown); |
86 | } |
87 | } |
88 | |
89 | void multiname_required_test() |
90 | { |
91 | options_description opts; |
92 | opts.add_options() |
93 | ("foo,bar" , value<string>()->required(), "the foo" ) |
94 | ; |
95 | |
96 | variables_map vm; |
97 | bool thrown = false; |
98 | { |
99 | // This test must throw exception |
100 | string cmdline = "prg --bar file.txt" ; |
101 | vector< string > tokens = split_unix(cmdline); |
102 | thrown = false; |
103 | try { |
104 | // options coming from different sources |
105 | store(options: command_line_parser(tokens).options(desc: opts).run(), m&: vm); |
106 | notify(m&: vm); |
107 | } |
108 | catch (required_option& e) { |
109 | thrown = true; |
110 | } |
111 | BOOST_CHECK(!thrown); |
112 | } |
113 | } |
114 | |
115 | |
116 | |
117 | int main(int /*argc*/, char* av[]) |
118 | { |
119 | required_throw_test(); |
120 | simple_required_test(config_file: av[1]); |
121 | multiname_required_test(); |
122 | |
123 | return 0; |
124 | } |
125 | |
126 | |