2
2
#include " pgm/args.hpp"
3
3
4
4
#include < gtest/gtest.h>
5
- #include < tuple>
5
+ #include < string>
6
+ #include < vector>
6
7
7
- template <int N>
8
- auto to_argcv (const char * const (&args)[N])
8
+ struct argcv
9
9
{
10
- return std::make_tuple (N, const_cast <char **>(args));
11
- }
10
+ template <typename ... Args>
11
+ argcv (Args&&... args) : args_{std::forward<Args>(args)...}
12
+ {
13
+ for (auto & arg : args_) argcv_.push_back (arg.data ());
14
+ argcv_.push_back (nullptr );
15
+ }
16
+
17
+ auto argc () { return argcv_.size () - 1 ; }
18
+ auto argv () { return argcv_.data (); }
19
+
20
+ private:
21
+ std::vector<std::string> args_;
22
+ std::vector<char *> argcv_;
23
+ };
12
24
13
25
// //////////////////////////////////////////////////////////////////////////////
14
26
struct params_0 : testing::Test
@@ -25,27 +37,27 @@ struct params_0 : testing::Test
25
37
26
38
TEST_F (params_0, not_enough_0)
27
39
{
28
- auto [argc, argv] = to_argcv ({ " pgm" }) ;
29
- EXPECT_THROW ({ args.parse (argc, argv); }, pgm::missing_argument);
40
+ auto p = argcv{ " pgm" } ;
41
+ EXPECT_THROW ({ args.parse (p. argc (), p. argv () ); }, pgm::missing_argument);
30
42
}
31
43
32
44
TEST_F (params_0, not_enough_1)
33
45
{
34
- auto [argc, argv] = to_argcv ({ " pgm" , " p1" }) ;
35
- EXPECT_THROW ({ args.parse (argc, argv); }, pgm::missing_argument);
46
+ auto p = argcv{ " pgm" , " p1" } ;
47
+ EXPECT_THROW ({ args.parse (p. argc (), p. argv () ); }, pgm::missing_argument);
36
48
}
37
49
38
50
TEST_F (params_0, not_enough_2)
39
51
{
40
- auto [argc, argv] = to_argcv ({ " pgm" , " p1" , " p3" }) ;
41
- EXPECT_THROW ({ args.parse (argc, argv); }, pgm::missing_argument);
52
+ auto p = argcv{ " pgm" , " p1" , " p3" } ;
53
+ EXPECT_THROW ({ args.parse (p. argc (), p. argv () ); }, pgm::missing_argument);
42
54
}
43
55
44
56
TEST_F (params_0, req_only)
45
57
{
46
- auto [argc, argv] = to_argcv ({ " pgm" , " p1" , " p3" , " p5" }) ;
58
+ auto p = argcv{ " pgm" , " p1" , " p3" , " p5" } ;
47
59
48
- EXPECT_NO_THROW ({ args.parse (argc, argv); });
60
+ EXPECT_NO_THROW ({ args.parse (p. argc (), p. argv () ); });
49
61
EXPECT_EQ (args[" p1" ].value (), " p1" );
50
62
EXPECT_TRUE (args[" p2" ].empty ());
51
63
EXPECT_EQ (args[" p3" ].value (), " p3" );
@@ -55,9 +67,9 @@ TEST_F(params_0, req_only)
55
67
56
68
TEST_F (params_0, opt_1)
57
69
{
58
- auto [argc, argv] = to_argcv ({ " pgm" , " p1" , " p2" , " p3" , " p5" }) ;
70
+ auto p = argcv{ " pgm" , " p1" , " p2" , " p3" , " p5" } ;
59
71
60
- EXPECT_NO_THROW ({ args.parse (argc, argv); });
72
+ EXPECT_NO_THROW ({ args.parse (p. argc (), p. argv () ); });
61
73
EXPECT_EQ (args[" p1" ].value (), " p1" );
62
74
EXPECT_EQ (args[" p2" ].value (), " p2" );
63
75
EXPECT_EQ (args[" p3" ].value (), " p3" );
@@ -67,11 +79,9 @@ TEST_F(params_0, opt_1)
67
79
68
80
TEST_F (params_0, all)
69
81
{
70
- auto [argc, argv] = to_argcv ({
71
- " pgm" , " p1" , " p2" , " p3" , " p4" , " p5"
72
- });
82
+ auto p = argcv{" pgm" , " p1" , " p2" , " p3" , " p4" , " p5" };
73
83
74
- EXPECT_NO_THROW ({ args.parse (argc, argv); });
84
+ EXPECT_NO_THROW ({ args.parse (p. argc (), p. argv () ); });
75
85
EXPECT_EQ (args[" p1" ].value (), " p1" );
76
86
EXPECT_EQ (args[" p2" ].value (), " p2" );
77
87
EXPECT_EQ (args[" p3" ].value (), " p3" );
@@ -94,21 +104,21 @@ struct params_1 : public testing::Test
94
104
95
105
TEST_F (params_1, not_enough_0)
96
106
{
97
- auto [argc, argv] = to_argcv ({ " pgm" }) ;
98
- EXPECT_THROW ({ args.parse (argc, argv); }, pgm::missing_argument);
107
+ auto p = argcv{ " pgm" } ;
108
+ EXPECT_THROW ({ args.parse (p. argc (), p. argv () ); }, pgm::missing_argument);
99
109
}
100
110
101
111
TEST_F (params_1, not_enough_1)
102
112
{
103
- auto [argc, argv] = to_argcv ({ " pgm" , " p2" }) ;
104
- EXPECT_THROW ({ args.parse (argc, argv); }, pgm::missing_argument);
113
+ auto p = argcv{ " pgm" , " p2" } ;
114
+ EXPECT_THROW ({ args.parse (p. argc (), p. argv () ); }, pgm::missing_argument);
105
115
}
106
116
107
117
TEST_F (params_1, req_only)
108
118
{
109
- auto [argc, argv] = to_argcv ({ " pgm" , " p2" , " p4" }) ;
119
+ auto p = argcv{ " pgm" , " p2" , " p4" } ;
110
120
111
- EXPECT_NO_THROW ({ args.parse (argc, argv); });
121
+ EXPECT_NO_THROW ({ args.parse (p. argc (), p. argv () ); });
112
122
EXPECT_TRUE (args[" p1" ].empty ());
113
123
EXPECT_EQ (args[" p2" ].value (), " p2" );
114
124
EXPECT_TRUE (args[" p3" ].empty ());
@@ -118,9 +128,9 @@ TEST_F(params_1, req_only)
118
128
119
129
TEST_F (params_1, opt_1)
120
130
{
121
- auto [argc, argv] = to_argcv ({ " pgm" , " p1" , " p2" , " p4" }) ;
131
+ auto p = argcv{ " pgm" , " p1" , " p2" , " p4" } ;
122
132
123
- EXPECT_NO_THROW ({ args.parse (argc, argv); });
133
+ EXPECT_NO_THROW ({ args.parse (p. argc (), p. argv () ); });
124
134
EXPECT_EQ (args[" p1" ].value (), " p1" );
125
135
EXPECT_EQ (args[" p2" ].value (), " p2" );
126
136
EXPECT_TRUE (args[" p3" ].empty ());
@@ -130,9 +140,9 @@ TEST_F(params_1, opt_1)
130
140
131
141
TEST_F (params_1, opt_2)
132
142
{
133
- auto [argc, argv] = to_argcv ({ " pgm" , " p1" , " p2" , " p3" , " p4" }) ;
143
+ auto p = argcv{ " pgm" , " p1" , " p2" , " p3" , " p4" } ;
134
144
135
- EXPECT_NO_THROW ({ args.parse (argc, argv); });
145
+ EXPECT_NO_THROW ({ args.parse (p. argc (), p. argv () ); });
136
146
EXPECT_EQ (args[" p1" ].value (), " p1" );
137
147
EXPECT_EQ (args[" p2" ].value (), " p2" );
138
148
EXPECT_EQ (args[" p3" ].value (), " p3" );
@@ -142,11 +152,9 @@ TEST_F(params_1, opt_2)
142
152
143
153
TEST_F (params_1, all)
144
154
{
145
- auto [argc, argv] = to_argcv ({
146
- " pgm" , " p1" , " p2" , " p3" , " p4" , " p5"
147
- });
155
+ auto p = argcv{" pgm" , " p1" , " p2" , " p3" , " p4" , " p5" };
148
156
149
- EXPECT_NO_THROW ({ args.parse (argc, argv); });
157
+ EXPECT_NO_THROW ({ args.parse (p. argc (), p. argv () ); });
150
158
EXPECT_EQ (args[" p1" ].value (), " p1" );
151
159
EXPECT_EQ (args[" p2" ].value (), " p2" );
152
160
EXPECT_EQ (args[" p3" ].value (), " p3" );
@@ -156,34 +164,30 @@ TEST_F(params_1, all)
156
164
157
165
TEST_F (params_1, mul_1)
158
166
{
159
- auto [argc, argv] = to_argcv ({
160
- " pgm" , " p1.0" , " p1.1" , " p2" , " p3" , " p4" , " p5"
161
- });
167
+ auto p = argcv{" pgm" , " p1.0" , " p1.1" , " p2" , " p3" , " p4" , " p5" };
162
168
163
- EXPECT_NO_THROW ({ args.parse (argc, argv); });
164
- EXPECT_EQ (args[" p1" ].count (), 2 );
169
+ EXPECT_NO_THROW ({ args.parse (p. argc (), p. argv () ); });
170
+ EXPECT_EQ (args[" p1" ].count ( ), 2 );
165
171
EXPECT_EQ (args[" p1" ].value (0 ), " p1.0" );
166
172
EXPECT_EQ (args[" p1" ].value (1 ), " p1.1" );
167
- EXPECT_EQ (args[" p2" ].value (), " p2" );
168
- EXPECT_EQ (args[" p3" ].value (), " p3" );
169
- EXPECT_EQ (args[" p4" ].value (), " p4" );
170
- EXPECT_EQ (args[" p5" ].value (), " p5" );
173
+ EXPECT_EQ (args[" p2" ].value ( ), " p2" );
174
+ EXPECT_EQ (args[" p3" ].value ( ), " p3" );
175
+ EXPECT_EQ (args[" p4" ].value ( ), " p4" );
176
+ EXPECT_EQ (args[" p5" ].value ( ), " p5" );
171
177
}
172
178
173
179
TEST_F (params_1, mul_3)
174
180
{
175
- auto [argc, argv] = to_argcv ({
176
- " pgm" , " p1.0" , " p1.1" , " p1.2" , " p1.3" , " p2" , " p3" , " p4" , " p5"
177
- });
181
+ auto p = argcv{" pgm" , " p1.0" , " p1.1" , " p1.2" , " p1.3" , " p2" , " p3" , " p4" , " p5" };
178
182
179
- EXPECT_NO_THROW ({ args.parse (argc, argv); });
180
- EXPECT_EQ (args[" p1" ].count (), 4 );
183
+ EXPECT_NO_THROW ({ args.parse (p. argc (), p. argv () ); });
184
+ EXPECT_EQ (args[" p1" ].count ( ), 4 );
181
185
EXPECT_EQ (args[" p1" ].value (0 ), " p1.0" );
182
186
EXPECT_EQ (args[" p1" ].value (1 ), " p1.1" );
183
187
EXPECT_EQ (args[" p1" ].value (2 ), " p1.2" );
184
188
EXPECT_EQ (args[" p1" ].value (3 ), " p1.3" );
185
- EXPECT_EQ (args[" p2" ].value (), " p2" );
186
- EXPECT_EQ (args[" p3" ].value (), " p3" );
187
- EXPECT_EQ (args[" p4" ].value (), " p4" );
188
- EXPECT_EQ (args[" p5" ].value (), " p5" );
189
+ EXPECT_EQ (args[" p2" ].value ( ), " p2" );
190
+ EXPECT_EQ (args[" p3" ].value ( ), " p3" );
191
+ EXPECT_EQ (args[" p4" ].value ( ), " p4" );
192
+ EXPECT_EQ (args[" p5" ].value ( ), " p5" );
189
193
}
0 commit comments