Skip to content

Commit 4b440c2

Browse files
Fix tests
Converting const char*[] to char*[] doesn't work with -O3.
1 parent 4e8eea8 commit 4b440c2

File tree

1 file changed

+55
-51
lines changed

1 file changed

+55
-51
lines changed

test/test_args.cpp

Lines changed: 55 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,25 @@
22
#include "pgm/args.hpp"
33

44
#include <gtest/gtest.h>
5-
#include <tuple>
5+
#include <string>
6+
#include <vector>
67

7-
template<int N>
8-
auto to_argcv(const char* const (&args)[N])
8+
struct argcv
99
{
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+
};
1224

1325
////////////////////////////////////////////////////////////////////////////////
1426
struct params_0 : testing::Test
@@ -25,27 +37,27 @@ struct params_0 : testing::Test
2537

2638
TEST_F(params_0, not_enough_0)
2739
{
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);
3042
}
3143

3244
TEST_F(params_0, not_enough_1)
3345
{
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);
3648
}
3749

3850
TEST_F(params_0, not_enough_2)
3951
{
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);
4254
}
4355

4456
TEST_F(params_0, req_only)
4557
{
46-
auto [argc, argv] = to_argcv({ "pgm", "p1", "p3", "p5" });
58+
auto p = argcv{"pgm", "p1", "p3", "p5"};
4759

48-
EXPECT_NO_THROW({ args.parse(argc, argv); });
60+
EXPECT_NO_THROW({ args.parse(p.argc(), p.argv()); });
4961
EXPECT_EQ (args["p1"].value(), "p1");
5062
EXPECT_TRUE(args["p2"].empty());
5163
EXPECT_EQ (args["p3"].value(), "p3");
@@ -55,9 +67,9 @@ TEST_F(params_0, req_only)
5567

5668
TEST_F(params_0, opt_1)
5769
{
58-
auto [argc, argv] = to_argcv({ "pgm", "p1", "p2", "p3", "p5" });
70+
auto p = argcv{"pgm", "p1", "p2", "p3", "p5"};
5971

60-
EXPECT_NO_THROW({ args.parse(argc, argv); });
72+
EXPECT_NO_THROW({ args.parse(p.argc(), p.argv()); });
6173
EXPECT_EQ (args["p1"].value(), "p1");
6274
EXPECT_EQ (args["p2"].value(), "p2");
6375
EXPECT_EQ (args["p3"].value(), "p3");
@@ -67,11 +79,9 @@ TEST_F(params_0, opt_1)
6779

6880
TEST_F(params_0, all)
6981
{
70-
auto [argc, argv] = to_argcv({
71-
"pgm", "p1", "p2", "p3", "p4", "p5"
72-
});
82+
auto p = argcv{"pgm", "p1", "p2", "p3", "p4", "p5"};
7383

74-
EXPECT_NO_THROW({ args.parse(argc, argv); });
84+
EXPECT_NO_THROW({ args.parse(p.argc(), p.argv()); });
7585
EXPECT_EQ(args["p1"].value(), "p1");
7686
EXPECT_EQ(args["p2"].value(), "p2");
7787
EXPECT_EQ(args["p3"].value(), "p3");
@@ -94,21 +104,21 @@ struct params_1 : public testing::Test
94104

95105
TEST_F(params_1, not_enough_0)
96106
{
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);
99109
}
100110

101111
TEST_F(params_1, not_enough_1)
102112
{
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);
105115
}
106116

107117
TEST_F(params_1, req_only)
108118
{
109-
auto [argc, argv] = to_argcv({ "pgm", "p2", "p4" });
119+
auto p = argcv{"pgm", "p2", "p4"};
110120

111-
EXPECT_NO_THROW({ args.parse(argc, argv); });
121+
EXPECT_NO_THROW({ args.parse(p.argc(), p.argv()); });
112122
EXPECT_TRUE(args["p1"].empty());
113123
EXPECT_EQ (args["p2"].value(), "p2");
114124
EXPECT_TRUE(args["p3"].empty());
@@ -118,9 +128,9 @@ TEST_F(params_1, req_only)
118128

119129
TEST_F(params_1, opt_1)
120130
{
121-
auto [argc, argv] = to_argcv({ "pgm", "p1", "p2", "p4" });
131+
auto p = argcv{"pgm", "p1", "p2", "p4"};
122132

123-
EXPECT_NO_THROW({ args.parse(argc, argv); });
133+
EXPECT_NO_THROW({ args.parse(p.argc(), p.argv()); });
124134
EXPECT_EQ (args["p1"].value(), "p1");
125135
EXPECT_EQ (args["p2"].value(), "p2");
126136
EXPECT_TRUE(args["p3"].empty());
@@ -130,9 +140,9 @@ TEST_F(params_1, opt_1)
130140

131141
TEST_F(params_1, opt_2)
132142
{
133-
auto [argc, argv] = to_argcv({ "pgm", "p1", "p2", "p3", "p4" });
143+
auto p = argcv{"pgm", "p1", "p2", "p3", "p4"};
134144

135-
EXPECT_NO_THROW({ args.parse(argc, argv); });
145+
EXPECT_NO_THROW({ args.parse(p.argc(), p.argv()); });
136146
EXPECT_EQ (args["p1"].value(), "p1");
137147
EXPECT_EQ (args["p2"].value(), "p2");
138148
EXPECT_EQ (args["p3"].value(), "p3");
@@ -142,11 +152,9 @@ TEST_F(params_1, opt_2)
142152

143153
TEST_F(params_1, all)
144154
{
145-
auto [argc, argv] = to_argcv({
146-
"pgm", "p1", "p2", "p3", "p4", "p5"
147-
});
155+
auto p = argcv{"pgm", "p1", "p2", "p3", "p4", "p5"};
148156

149-
EXPECT_NO_THROW({ args.parse(argc, argv); });
157+
EXPECT_NO_THROW({ args.parse(p.argc(), p.argv()); });
150158
EXPECT_EQ(args["p1"].value(), "p1");
151159
EXPECT_EQ(args["p2"].value(), "p2");
152160
EXPECT_EQ(args["p3"].value(), "p3");
@@ -156,34 +164,30 @@ TEST_F(params_1, all)
156164

157165
TEST_F(params_1, mul_1)
158166
{
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"};
162168

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);
165171
EXPECT_EQ(args["p1"].value(0), "p1.0");
166172
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");
171177
}
172178

173179
TEST_F(params_1, mul_3)
174180
{
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"};
178182

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);
181185
EXPECT_EQ(args["p1"].value(0), "p1.0");
182186
EXPECT_EQ(args["p1"].value(1), "p1.1");
183187
EXPECT_EQ(args["p1"].value(2), "p1.2");
184188
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");
189193
}

0 commit comments

Comments
 (0)