1 /*=========================================================================
3 Program: KWSys - Kitware System Library
4 Module: $RCSfile: testCommandLineArguments.cxx,v $
6 Copyright (c) Kitware, Inc., Insight Consortium. All rights reserved.
7 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the above copyright notices for more information.
13 =========================================================================*/
14 #include "kwsysPrivate.h"
15 #include KWSYS_HEADER(CommandLineArguments.hxx)
16 #include KWSYS_HEADER(ios/iostream)
17 #include KWSYS_HEADER(stl/vector)
19 // Work-around CMake dependency scanning limitation. This must
20 // duplicate the above list of headers.
22 # include "CommandLineArguments.hxx.in"
23 # include "kwsys_ios_iostream.h.in"
26 #include <stddef.h> /* size_t */
27 #include <string.h> /* strcmp */
29 void* random_ptr
= reinterpret_cast<void*>(0x123);
31 int argument(const char* arg
, const char* value
, void* call_data
)
33 kwsys_ios::cout
<< "Got argument: \"" << arg
<< "\" value: \"" << (value
?value
:"(null)") << "\"" << kwsys_ios::endl
;
34 if ( call_data
!= random_ptr
)
36 kwsys_ios::cerr
<< "Problem processing call_data" << kwsys_ios::endl
;
42 int unknown_argument(const char* argument
, void* call_data
)
44 kwsys_ios::cout
<< "Got unknown argument: \"" << argument
<< "\"" << kwsys_ios::endl
;
45 if ( call_data
!= random_ptr
)
47 kwsys_ios::cerr
<< "Problem processing call_data" << kwsys_ios::endl
;
53 bool CompareTwoItemsOnList(bool i1
, bool i2
) { return i1
== i2
; }
54 bool CompareTwoItemsOnList(int i1
, int i2
) { return i1
== i2
; }
55 bool CompareTwoItemsOnList(double i1
, double i2
) { return i1
== i2
; }
56 bool CompareTwoItemsOnList(const char* i1
,
57 const char* i2
) { return strcmp(i1
, i2
) == 0; }
58 bool CompareTwoItemsOnList(const kwsys_stl::string
& i1
,
59 const kwsys_stl::string
& i2
) { return i1
== i2
; }
61 int testCommandLineArguments(int argc
, char* argv
[])
63 // Example run: ./testCommandLineArguments --some-int-variable 4
64 // --another-bool-variable --some-bool-variable=yes
65 // --some-stl-string-variable=foobar --set-bool-arg1 --set-bool-arg2
66 // --some-string-variable=hello
69 kwsys::CommandLineArguments arg
;
70 arg
.Initialize(argc
, argv
);
73 arg
.SetClientData(random_ptr
);
74 arg
.SetUnknownArgumentCallback(unknown_argument
);
76 int some_int_variable
= 10;
77 double some_double_variable
= 10.10;
78 char* some_string_variable
= 0;
79 kwsys_stl::string some_stl_string_variable
= "";
80 bool some_bool_variable
= false;
81 bool some_bool_variable1
= false;
82 bool bool_arg1
= false;
85 kwsys_stl::vector
<int> numbers_argument
;
86 int valid_numbers
[] = { 5, 1, 8, 3, 7, 1, 3, 9, 7, 1 };
88 kwsys_stl::vector
<double> doubles_argument
;
89 double valid_doubles
[] = { 12.5, 1.31, 22 };
91 kwsys_stl::vector
<bool> bools_argument
;
92 bool valid_bools
[] = { true, true, false };
94 kwsys_stl::vector
<char*> strings_argument
;
95 const char* valid_strings
[] = { "andy", "bill", "brad", "ken" };
97 kwsys_stl::vector
<kwsys_stl::string
> stl_strings_argument
;
98 kwsys_stl::string valid_stl_strings
[] = { "ken", "brad", "bill", "andy" };
100 typedef kwsys::CommandLineArguments argT
;
102 arg
.AddArgument("--some-int-variable", argT::SPACE_ARGUMENT
, &some_int_variable
, "Set some random int variable");
103 arg
.AddArgument("--some-double-variable", argT::CONCAT_ARGUMENT
, &some_double_variable
, "Set some random double variable");
104 arg
.AddArgument("--some-string-variable", argT::EQUAL_ARGUMENT
, &some_string_variable
, "Set some random string variable");
105 arg
.AddArgument("--some-stl-string-variable", argT::EQUAL_ARGUMENT
, &some_stl_string_variable
, "Set some random stl string variable");
106 arg
.AddArgument("--some-bool-variable", argT::EQUAL_ARGUMENT
, &some_bool_variable
, "Set some random bool variable");
107 arg
.AddArgument("--another-bool-variable", argT::NO_ARGUMENT
, &some_bool_variable1
, "Set some random bool variable 1");
108 arg
.AddBooleanArgument("--set-bool-arg1", &bool_arg1
, "Test AddBooleanArgument 1");
109 arg
.AddBooleanArgument("--set-bool-arg2", &bool_arg2
, "Test AddBooleanArgument 2");
110 arg
.AddArgument("--some-multi-argument", argT::MULTI_ARGUMENT
, &numbers_argument
, "Some multiple values variable");
111 arg
.AddArgument("-N", argT::SPACE_ARGUMENT
, &doubles_argument
, "Some explicit multiple values variable");
112 arg
.AddArgument("-BB", argT::CONCAT_ARGUMENT
, &bools_argument
, "Some explicit multiple values variable");
113 arg
.AddArgument("-SS", argT::EQUAL_ARGUMENT
, &strings_argument
, "Some explicit multiple values variable");
114 arg
.AddArgument("-SSS", argT::MULTI_ARGUMENT
, &stl_strings_argument
, "Some explicit multiple values variable");
116 arg
.AddCallback("-A", argT::NO_ARGUMENT
, argument
, random_ptr
, "Some option -A. This option has a multiline comment. It should demonstrate how the code splits lines.");
117 arg
.AddCallback("-B", argT::SPACE_ARGUMENT
, argument
, random_ptr
, "Option -B takes argument with space");
118 arg
.AddCallback("-C", argT::EQUAL_ARGUMENT
, argument
, random_ptr
, "Option -C takes argument after =");
119 arg
.AddCallback("-D", argT::CONCAT_ARGUMENT
, argument
, random_ptr
, "This option takes concatinated argument");
120 arg
.AddCallback("--long1", argT::NO_ARGUMENT
, argument
, random_ptr
, "-A");
121 arg
.AddCallback("--long2", argT::SPACE_ARGUMENT
, argument
, random_ptr
, "-B");
122 arg
.AddCallback("--long3", argT::EQUAL_ARGUMENT
, argument
, random_ptr
, "Same as -C but a bit different");
123 arg
.AddCallback("--long4", argT::CONCAT_ARGUMENT
, argument
, random_ptr
, "-C");
127 kwsys_ios::cerr
<< "Problem parsing arguments" << kwsys_ios::endl
;
130 kwsys_ios::cout
<< "Help: " << arg
.GetHelp() << kwsys_ios::endl
;
132 kwsys_ios::cout
<< "Some int variable was set to: " << some_int_variable
<< kwsys_ios::endl
;
133 kwsys_ios::cout
<< "Some double variable was set to: " << some_double_variable
<< kwsys_ios::endl
;
134 if ( some_string_variable
&& strcmp(some_string_variable
, "test string with space") == 0)
136 kwsys_ios::cout
<< "Some string variable was set to: " << some_string_variable
<< kwsys_ios::endl
;
137 delete [] some_string_variable
;
141 kwsys_ios::cerr
<< "Problem setting string variable" << kwsys_ios::endl
;
145 #define CompareTwoLists(list1, list_valid, lsize) \
146 if ( list1.size() != lsize ) \
148 kwsys_ios::cerr << "Problem setting " #list1 ". Size is: " << list1.size() \
149 << " should be: " << lsize << kwsys_ios::endl; \
154 kwsys_ios::cout << #list1 " argument set:"; \
155 for ( cc =0; cc < lsize; ++ cc ) \
157 kwsys_ios::cout << " " << list1[cc]; \
158 if ( !CompareTwoItemsOnList(list1[cc], list_valid[cc]) ) \
160 kwsys_ios::cerr << "Problem setting " #list1 ". Value of " \
161 << cc << " is: [" << list1[cc] << "] <> [" \
162 << list_valid[cc] << "]" << kwsys_ios::endl; \
167 kwsys_ios::cout << kwsys_ios::endl; \
170 CompareTwoLists(numbers_argument
, valid_numbers
, 10);
171 CompareTwoLists(doubles_argument
, valid_doubles
, 3);
172 CompareTwoLists(bools_argument
, valid_bools
, 3);
173 CompareTwoLists(strings_argument
, valid_strings
, 4);
174 CompareTwoLists(stl_strings_argument
, valid_stl_strings
, 4);
176 kwsys_ios::cout
<< "Some STL String variable was set to: " << some_stl_string_variable
.c_str() << kwsys_ios::endl
;
177 kwsys_ios::cout
<< "Some bool variable was set to: " << some_bool_variable
<< kwsys_ios::endl
;
178 kwsys_ios::cout
<< "Some bool variable was set to: " << some_bool_variable1
<< kwsys_ios::endl
;
179 kwsys_ios::cout
<< "bool_arg1 variable was set to: " << bool_arg1
<< kwsys_ios::endl
;
180 kwsys_ios::cout
<< "bool_arg2 variable was set to: " << bool_arg2
<< kwsys_ios::endl
;
181 kwsys_ios::cout
<< kwsys_ios::endl
;
183 for ( cc
= 0; cc
< strings_argument
.size(); ++ cc
)
185 delete [] strings_argument
[cc
];
186 strings_argument
[cc
] = 0;