1*01826a49SYabin Cui /*
2*01826a49SYabin Cui * Copyright (c) Meta Platforms, Inc. and affiliates.
3*01826a49SYabin Cui * All rights reserved.
4*01826a49SYabin Cui *
5*01826a49SYabin Cui * This source code is licensed under both the BSD-style license (found in the
6*01826a49SYabin Cui * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7*01826a49SYabin Cui * in the COPYING file in the root directory of this source tree).
8*01826a49SYabin Cui */
9*01826a49SYabin Cui #include "Options.h"
10*01826a49SYabin Cui
11*01826a49SYabin Cui #include <array>
12*01826a49SYabin Cui #include <gtest/gtest.h>
13*01826a49SYabin Cui
14*01826a49SYabin Cui using namespace pzstd;
15*01826a49SYabin Cui
16*01826a49SYabin Cui namespace pzstd {
operator ==(const Options & lhs,const Options & rhs)17*01826a49SYabin Cui bool operator==(const Options &lhs, const Options &rhs) {
18*01826a49SYabin Cui return lhs.numThreads == rhs.numThreads &&
19*01826a49SYabin Cui lhs.maxWindowLog == rhs.maxWindowLog &&
20*01826a49SYabin Cui lhs.compressionLevel == rhs.compressionLevel &&
21*01826a49SYabin Cui lhs.decompress == rhs.decompress && lhs.inputFiles == rhs.inputFiles &&
22*01826a49SYabin Cui lhs.outputFile == rhs.outputFile && lhs.overwrite == rhs.overwrite &&
23*01826a49SYabin Cui lhs.keepSource == rhs.keepSource && lhs.writeMode == rhs.writeMode &&
24*01826a49SYabin Cui lhs.checksum == rhs.checksum && lhs.verbosity == rhs.verbosity;
25*01826a49SYabin Cui }
26*01826a49SYabin Cui
operator <<(std::ostream & out,const Options & opt)27*01826a49SYabin Cui std::ostream &operator<<(std::ostream &out, const Options &opt) {
28*01826a49SYabin Cui out << "{";
29*01826a49SYabin Cui {
30*01826a49SYabin Cui out << "\n\t"
31*01826a49SYabin Cui << "numThreads: " << opt.numThreads;
32*01826a49SYabin Cui out << ",\n\t"
33*01826a49SYabin Cui << "maxWindowLog: " << opt.maxWindowLog;
34*01826a49SYabin Cui out << ",\n\t"
35*01826a49SYabin Cui << "compressionLevel: " << opt.compressionLevel;
36*01826a49SYabin Cui out << ",\n\t"
37*01826a49SYabin Cui << "decompress: " << opt.decompress;
38*01826a49SYabin Cui out << ",\n\t"
39*01826a49SYabin Cui << "inputFiles: {";
40*01826a49SYabin Cui {
41*01826a49SYabin Cui bool first = true;
42*01826a49SYabin Cui for (const auto &file : opt.inputFiles) {
43*01826a49SYabin Cui if (!first) {
44*01826a49SYabin Cui out << ",";
45*01826a49SYabin Cui }
46*01826a49SYabin Cui first = false;
47*01826a49SYabin Cui out << "\n\t\t" << file;
48*01826a49SYabin Cui }
49*01826a49SYabin Cui }
50*01826a49SYabin Cui out << "\n\t}";
51*01826a49SYabin Cui out << ",\n\t"
52*01826a49SYabin Cui << "outputFile: " << opt.outputFile;
53*01826a49SYabin Cui out << ",\n\t"
54*01826a49SYabin Cui << "overwrite: " << opt.overwrite;
55*01826a49SYabin Cui out << ",\n\t"
56*01826a49SYabin Cui << "keepSource: " << opt.keepSource;
57*01826a49SYabin Cui out << ",\n\t"
58*01826a49SYabin Cui << "writeMode: " << static_cast<int>(opt.writeMode);
59*01826a49SYabin Cui out << ",\n\t"
60*01826a49SYabin Cui << "checksum: " << opt.checksum;
61*01826a49SYabin Cui out << ",\n\t"
62*01826a49SYabin Cui << "verbosity: " << opt.verbosity;
63*01826a49SYabin Cui }
64*01826a49SYabin Cui out << "\n}";
65*01826a49SYabin Cui return out;
66*01826a49SYabin Cui }
67*01826a49SYabin Cui }
68*01826a49SYabin Cui
69*01826a49SYabin Cui namespace {
70*01826a49SYabin Cui #ifdef _WIN32
71*01826a49SYabin Cui const char nullOutput[] = "nul";
72*01826a49SYabin Cui #else
73*01826a49SYabin Cui const char nullOutput[] = "/dev/null";
74*01826a49SYabin Cui #endif
75*01826a49SYabin Cui
76*01826a49SYabin Cui constexpr auto autoMode = Options::WriteMode::Auto;
77*01826a49SYabin Cui } // anonymous namespace
78*01826a49SYabin Cui
79*01826a49SYabin Cui #define EXPECT_SUCCESS(...) EXPECT_EQ(Options::Status::Success, __VA_ARGS__)
80*01826a49SYabin Cui #define EXPECT_FAILURE(...) EXPECT_EQ(Options::Status::Failure, __VA_ARGS__)
81*01826a49SYabin Cui #define EXPECT_MESSAGE(...) EXPECT_EQ(Options::Status::Message, __VA_ARGS__)
82*01826a49SYabin Cui
83*01826a49SYabin Cui template <typename... Args>
makeArray(Args...args)84*01826a49SYabin Cui std::array<const char *, sizeof...(Args) + 1> makeArray(Args... args) {
85*01826a49SYabin Cui return {{nullptr, args...}};
86*01826a49SYabin Cui }
87*01826a49SYabin Cui
TEST(Options,ValidInputs)88*01826a49SYabin Cui TEST(Options, ValidInputs) {
89*01826a49SYabin Cui {
90*01826a49SYabin Cui Options options;
91*01826a49SYabin Cui auto args = makeArray("--processes", "5", "-o", "x", "y", "-f");
92*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
93*01826a49SYabin Cui Options expected = {5, 23, 3, false, {"y"}, "x",
94*01826a49SYabin Cui true, true, autoMode, true, 2};
95*01826a49SYabin Cui EXPECT_EQ(expected, options);
96*01826a49SYabin Cui }
97*01826a49SYabin Cui {
98*01826a49SYabin Cui Options options;
99*01826a49SYabin Cui auto args = makeArray("-p", "1", "input", "-19");
100*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
101*01826a49SYabin Cui Options expected = {1, 23, 19, false, {"input"}, "",
102*01826a49SYabin Cui false, true, autoMode, true, 2};
103*01826a49SYabin Cui EXPECT_EQ(expected, options);
104*01826a49SYabin Cui }
105*01826a49SYabin Cui {
106*01826a49SYabin Cui Options options;
107*01826a49SYabin Cui auto args =
108*01826a49SYabin Cui makeArray("--ultra", "-22", "-p", "1", "-o", "x", "-d", "x.zst", "-f");
109*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
110*01826a49SYabin Cui Options expected = {1, 0, 22, true, {"x.zst"}, "x",
111*01826a49SYabin Cui true, true, autoMode, true, 2};
112*01826a49SYabin Cui EXPECT_EQ(expected, options);
113*01826a49SYabin Cui }
114*01826a49SYabin Cui {
115*01826a49SYabin Cui Options options;
116*01826a49SYabin Cui auto args = makeArray("--processes", "100", "hello.zst", "--decompress",
117*01826a49SYabin Cui "--force");
118*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
119*01826a49SYabin Cui Options expected = {100, 23, 3, true, {"hello.zst"}, "", true,
120*01826a49SYabin Cui true, autoMode, true, 2};
121*01826a49SYabin Cui EXPECT_EQ(expected, options);
122*01826a49SYabin Cui }
123*01826a49SYabin Cui {
124*01826a49SYabin Cui Options options;
125*01826a49SYabin Cui auto args = makeArray("x", "-dp", "1", "-c");
126*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
127*01826a49SYabin Cui Options expected = {1, 23, 3, true, {"x"}, "-",
128*01826a49SYabin Cui false, true, autoMode, true, 2};
129*01826a49SYabin Cui EXPECT_EQ(expected, options);
130*01826a49SYabin Cui }
131*01826a49SYabin Cui {
132*01826a49SYabin Cui Options options;
133*01826a49SYabin Cui auto args = makeArray("x", "-dp", "1", "--stdout");
134*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
135*01826a49SYabin Cui Options expected = {1, 23, 3, true, {"x"}, "-",
136*01826a49SYabin Cui false, true, autoMode, true, 2};
137*01826a49SYabin Cui EXPECT_EQ(expected, options);
138*01826a49SYabin Cui }
139*01826a49SYabin Cui {
140*01826a49SYabin Cui Options options;
141*01826a49SYabin Cui auto args = makeArray("-p", "1", "x", "-5", "-fo", "-", "--ultra", "-d");
142*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
143*01826a49SYabin Cui Options expected = {1, 0, 5, true, {"x"}, "-",
144*01826a49SYabin Cui true, true, autoMode, true, 2};
145*01826a49SYabin Cui EXPECT_EQ(expected, options);
146*01826a49SYabin Cui }
147*01826a49SYabin Cui {
148*01826a49SYabin Cui Options options;
149*01826a49SYabin Cui auto args = makeArray("silesia.tar", "-o", "silesia.tar.pzstd", "-p", "2");
150*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
151*01826a49SYabin Cui Options expected = {2,
152*01826a49SYabin Cui 23,
153*01826a49SYabin Cui 3,
154*01826a49SYabin Cui false,
155*01826a49SYabin Cui {"silesia.tar"},
156*01826a49SYabin Cui "silesia.tar.pzstd",
157*01826a49SYabin Cui false,
158*01826a49SYabin Cui true,
159*01826a49SYabin Cui autoMode,
160*01826a49SYabin Cui true,
161*01826a49SYabin Cui 2};
162*01826a49SYabin Cui EXPECT_EQ(expected, options);
163*01826a49SYabin Cui }
164*01826a49SYabin Cui {
165*01826a49SYabin Cui Options options;
166*01826a49SYabin Cui auto args = makeArray("x", "-p", "1");
167*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
168*01826a49SYabin Cui }
169*01826a49SYabin Cui {
170*01826a49SYabin Cui Options options;
171*01826a49SYabin Cui auto args = makeArray("x", "-p", "1");
172*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
173*01826a49SYabin Cui }
174*01826a49SYabin Cui }
175*01826a49SYabin Cui
TEST(Options,GetOutputFile)176*01826a49SYabin Cui TEST(Options, GetOutputFile) {
177*01826a49SYabin Cui {
178*01826a49SYabin Cui Options options;
179*01826a49SYabin Cui auto args = makeArray("x");
180*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
181*01826a49SYabin Cui EXPECT_EQ("x.zst", options.getOutputFile(options.inputFiles[0]));
182*01826a49SYabin Cui }
183*01826a49SYabin Cui {
184*01826a49SYabin Cui Options options;
185*01826a49SYabin Cui auto args = makeArray("x", "y", "-o", nullOutput);
186*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
187*01826a49SYabin Cui EXPECT_EQ(nullOutput, options.getOutputFile(options.inputFiles[0]));
188*01826a49SYabin Cui }
189*01826a49SYabin Cui {
190*01826a49SYabin Cui Options options;
191*01826a49SYabin Cui auto args = makeArray("x.zst", "-do", nullOutput);
192*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
193*01826a49SYabin Cui EXPECT_EQ(nullOutput, options.getOutputFile(options.inputFiles[0]));
194*01826a49SYabin Cui }
195*01826a49SYabin Cui {
196*01826a49SYabin Cui Options options;
197*01826a49SYabin Cui auto args = makeArray("x.zst", "-d");
198*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
199*01826a49SYabin Cui EXPECT_EQ("x", options.getOutputFile(options.inputFiles[0]));
200*01826a49SYabin Cui }
201*01826a49SYabin Cui {
202*01826a49SYabin Cui Options options;
203*01826a49SYabin Cui auto args = makeArray("xzst", "-d");
204*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
205*01826a49SYabin Cui EXPECT_EQ("", options.getOutputFile(options.inputFiles[0]));
206*01826a49SYabin Cui }
207*01826a49SYabin Cui {
208*01826a49SYabin Cui Options options;
209*01826a49SYabin Cui auto args = makeArray("xzst", "-doxx");
210*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
211*01826a49SYabin Cui EXPECT_EQ("xx", options.getOutputFile(options.inputFiles[0]));
212*01826a49SYabin Cui }
213*01826a49SYabin Cui }
214*01826a49SYabin Cui
TEST(Options,MultipleFiles)215*01826a49SYabin Cui TEST(Options, MultipleFiles) {
216*01826a49SYabin Cui {
217*01826a49SYabin Cui Options options;
218*01826a49SYabin Cui auto args = makeArray("x", "y", "z");
219*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
220*01826a49SYabin Cui Options expected;
221*01826a49SYabin Cui expected.inputFiles = {"x", "y", "z"};
222*01826a49SYabin Cui expected.verbosity = 1;
223*01826a49SYabin Cui EXPECT_EQ(expected, options);
224*01826a49SYabin Cui }
225*01826a49SYabin Cui {
226*01826a49SYabin Cui Options options;
227*01826a49SYabin Cui auto args = makeArray("x", "y", "z", "-o", nullOutput);
228*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
229*01826a49SYabin Cui Options expected;
230*01826a49SYabin Cui expected.inputFiles = {"x", "y", "z"};
231*01826a49SYabin Cui expected.outputFile = nullOutput;
232*01826a49SYabin Cui expected.verbosity = 1;
233*01826a49SYabin Cui EXPECT_EQ(expected, options);
234*01826a49SYabin Cui }
235*01826a49SYabin Cui {
236*01826a49SYabin Cui Options options;
237*01826a49SYabin Cui auto args = makeArray("x", "y", "-o-");
238*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
239*01826a49SYabin Cui }
240*01826a49SYabin Cui {
241*01826a49SYabin Cui Options options;
242*01826a49SYabin Cui auto args = makeArray("x", "y", "-o", "file");
243*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
244*01826a49SYabin Cui }
245*01826a49SYabin Cui {
246*01826a49SYabin Cui Options options;
247*01826a49SYabin Cui auto args = makeArray("-qqvd12qp4", "-f", "x", "--", "--rm", "-c");
248*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
249*01826a49SYabin Cui Options expected = {4, 23, 12, true, {"x", "--rm", "-c"},
250*01826a49SYabin Cui "", true, true, autoMode, true,
251*01826a49SYabin Cui 0};
252*01826a49SYabin Cui EXPECT_EQ(expected, options);
253*01826a49SYabin Cui }
254*01826a49SYabin Cui }
255*01826a49SYabin Cui
TEST(Options,NumThreads)256*01826a49SYabin Cui TEST(Options, NumThreads) {
257*01826a49SYabin Cui {
258*01826a49SYabin Cui Options options;
259*01826a49SYabin Cui auto args = makeArray("x", "-dfo", "-");
260*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
261*01826a49SYabin Cui }
262*01826a49SYabin Cui {
263*01826a49SYabin Cui Options options;
264*01826a49SYabin Cui auto args = makeArray("x", "-p", "0", "-fo", "-");
265*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
266*01826a49SYabin Cui }
267*01826a49SYabin Cui {
268*01826a49SYabin Cui Options options;
269*01826a49SYabin Cui auto args = makeArray("-f", "-p", "-o", "-");
270*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
271*01826a49SYabin Cui }
272*01826a49SYabin Cui }
273*01826a49SYabin Cui
TEST(Options,BadCompressionLevel)274*01826a49SYabin Cui TEST(Options, BadCompressionLevel) {
275*01826a49SYabin Cui {
276*01826a49SYabin Cui Options options;
277*01826a49SYabin Cui auto args = makeArray("x", "-20");
278*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
279*01826a49SYabin Cui }
280*01826a49SYabin Cui {
281*01826a49SYabin Cui Options options;
282*01826a49SYabin Cui auto args = makeArray("x", "--ultra", "-23");
283*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
284*01826a49SYabin Cui }
285*01826a49SYabin Cui {
286*01826a49SYabin Cui Options options;
287*01826a49SYabin Cui auto args = makeArray("x", "--1"); // negative 1?
288*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
289*01826a49SYabin Cui }
290*01826a49SYabin Cui }
291*01826a49SYabin Cui
TEST(Options,InvalidOption)292*01826a49SYabin Cui TEST(Options, InvalidOption) {
293*01826a49SYabin Cui {
294*01826a49SYabin Cui Options options;
295*01826a49SYabin Cui auto args = makeArray("x", "-x");
296*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
297*01826a49SYabin Cui }
298*01826a49SYabin Cui }
299*01826a49SYabin Cui
TEST(Options,BadOutputFile)300*01826a49SYabin Cui TEST(Options, BadOutputFile) {
301*01826a49SYabin Cui {
302*01826a49SYabin Cui Options options;
303*01826a49SYabin Cui auto args = makeArray("notzst", "-d", "-p", "1");
304*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
305*01826a49SYabin Cui EXPECT_EQ("", options.getOutputFile(options.inputFiles.front()));
306*01826a49SYabin Cui }
307*01826a49SYabin Cui }
308*01826a49SYabin Cui
TEST(Options,BadOptionsWithArguments)309*01826a49SYabin Cui TEST(Options, BadOptionsWithArguments) {
310*01826a49SYabin Cui {
311*01826a49SYabin Cui Options options;
312*01826a49SYabin Cui auto args = makeArray("x", "-pf");
313*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
314*01826a49SYabin Cui }
315*01826a49SYabin Cui {
316*01826a49SYabin Cui Options options;
317*01826a49SYabin Cui auto args = makeArray("x", "-p", "10f");
318*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
319*01826a49SYabin Cui }
320*01826a49SYabin Cui {
321*01826a49SYabin Cui Options options;
322*01826a49SYabin Cui auto args = makeArray("x", "-p");
323*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
324*01826a49SYabin Cui }
325*01826a49SYabin Cui {
326*01826a49SYabin Cui Options options;
327*01826a49SYabin Cui auto args = makeArray("x", "-o");
328*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
329*01826a49SYabin Cui }
330*01826a49SYabin Cui {
331*01826a49SYabin Cui Options options;
332*01826a49SYabin Cui auto args = makeArray("x", "-o");
333*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
334*01826a49SYabin Cui }
335*01826a49SYabin Cui }
336*01826a49SYabin Cui
TEST(Options,KeepSource)337*01826a49SYabin Cui TEST(Options, KeepSource) {
338*01826a49SYabin Cui {
339*01826a49SYabin Cui Options options;
340*01826a49SYabin Cui auto args = makeArray("x", "--rm", "-k");
341*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
342*01826a49SYabin Cui EXPECT_EQ(true, options.keepSource);
343*01826a49SYabin Cui }
344*01826a49SYabin Cui {
345*01826a49SYabin Cui Options options;
346*01826a49SYabin Cui auto args = makeArray("x", "--rm", "--keep");
347*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
348*01826a49SYabin Cui EXPECT_EQ(true, options.keepSource);
349*01826a49SYabin Cui }
350*01826a49SYabin Cui {
351*01826a49SYabin Cui Options options;
352*01826a49SYabin Cui auto args = makeArray("x");
353*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
354*01826a49SYabin Cui EXPECT_EQ(true, options.keepSource);
355*01826a49SYabin Cui }
356*01826a49SYabin Cui {
357*01826a49SYabin Cui Options options;
358*01826a49SYabin Cui auto args = makeArray("x", "--rm");
359*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
360*01826a49SYabin Cui EXPECT_EQ(false, options.keepSource);
361*01826a49SYabin Cui }
362*01826a49SYabin Cui }
363*01826a49SYabin Cui
TEST(Options,Verbosity)364*01826a49SYabin Cui TEST(Options, Verbosity) {
365*01826a49SYabin Cui {
366*01826a49SYabin Cui Options options;
367*01826a49SYabin Cui auto args = makeArray("x");
368*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
369*01826a49SYabin Cui EXPECT_EQ(2, options.verbosity);
370*01826a49SYabin Cui }
371*01826a49SYabin Cui {
372*01826a49SYabin Cui Options options;
373*01826a49SYabin Cui auto args = makeArray("--quiet", "-qq", "x");
374*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
375*01826a49SYabin Cui EXPECT_EQ(-1, options.verbosity);
376*01826a49SYabin Cui }
377*01826a49SYabin Cui {
378*01826a49SYabin Cui Options options;
379*01826a49SYabin Cui auto args = makeArray("x", "y");
380*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
381*01826a49SYabin Cui EXPECT_EQ(1, options.verbosity);
382*01826a49SYabin Cui }
383*01826a49SYabin Cui {
384*01826a49SYabin Cui Options options;
385*01826a49SYabin Cui auto args = makeArray("--", "x", "y");
386*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
387*01826a49SYabin Cui EXPECT_EQ(1, options.verbosity);
388*01826a49SYabin Cui }
389*01826a49SYabin Cui {
390*01826a49SYabin Cui Options options;
391*01826a49SYabin Cui auto args = makeArray("-qv", "x", "y");
392*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
393*01826a49SYabin Cui EXPECT_EQ(1, options.verbosity);
394*01826a49SYabin Cui }
395*01826a49SYabin Cui {
396*01826a49SYabin Cui Options options;
397*01826a49SYabin Cui auto args = makeArray("-v", "x", "y");
398*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
399*01826a49SYabin Cui EXPECT_EQ(3, options.verbosity);
400*01826a49SYabin Cui }
401*01826a49SYabin Cui {
402*01826a49SYabin Cui Options options;
403*01826a49SYabin Cui auto args = makeArray("-v", "x");
404*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
405*01826a49SYabin Cui EXPECT_EQ(3, options.verbosity);
406*01826a49SYabin Cui }
407*01826a49SYabin Cui }
408*01826a49SYabin Cui
TEST(Options,TestMode)409*01826a49SYabin Cui TEST(Options, TestMode) {
410*01826a49SYabin Cui {
411*01826a49SYabin Cui Options options;
412*01826a49SYabin Cui auto args = makeArray("x", "-t");
413*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
414*01826a49SYabin Cui EXPECT_EQ(true, options.keepSource);
415*01826a49SYabin Cui EXPECT_EQ(true, options.decompress);
416*01826a49SYabin Cui EXPECT_EQ(nullOutput, options.outputFile);
417*01826a49SYabin Cui }
418*01826a49SYabin Cui {
419*01826a49SYabin Cui Options options;
420*01826a49SYabin Cui auto args = makeArray("x", "--test", "--rm", "-ohello");
421*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
422*01826a49SYabin Cui EXPECT_EQ(true, options.keepSource);
423*01826a49SYabin Cui EXPECT_EQ(true, options.decompress);
424*01826a49SYabin Cui EXPECT_EQ(nullOutput, options.outputFile);
425*01826a49SYabin Cui }
426*01826a49SYabin Cui }
427*01826a49SYabin Cui
TEST(Options,Checksum)428*01826a49SYabin Cui TEST(Options, Checksum) {
429*01826a49SYabin Cui {
430*01826a49SYabin Cui Options options;
431*01826a49SYabin Cui auto args = makeArray("x.zst", "--no-check", "-Cd");
432*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
433*01826a49SYabin Cui EXPECT_EQ(true, options.checksum);
434*01826a49SYabin Cui }
435*01826a49SYabin Cui {
436*01826a49SYabin Cui Options options;
437*01826a49SYabin Cui auto args = makeArray("x");
438*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
439*01826a49SYabin Cui EXPECT_EQ(true, options.checksum);
440*01826a49SYabin Cui }
441*01826a49SYabin Cui {
442*01826a49SYabin Cui Options options;
443*01826a49SYabin Cui auto args = makeArray("x", "--no-check", "--check");
444*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
445*01826a49SYabin Cui EXPECT_EQ(true, options.checksum);
446*01826a49SYabin Cui }
447*01826a49SYabin Cui {
448*01826a49SYabin Cui Options options;
449*01826a49SYabin Cui auto args = makeArray("x", "--no-check");
450*01826a49SYabin Cui EXPECT_SUCCESS(options.parse(args.size(), args.data()));
451*01826a49SYabin Cui EXPECT_EQ(false, options.checksum);
452*01826a49SYabin Cui }
453*01826a49SYabin Cui }
454*01826a49SYabin Cui
TEST(Options,InputFiles)455*01826a49SYabin Cui TEST(Options, InputFiles) {
456*01826a49SYabin Cui {
457*01826a49SYabin Cui Options options;
458*01826a49SYabin Cui auto args = makeArray("-cd");
459*01826a49SYabin Cui options.parse(args.size(), args.data());
460*01826a49SYabin Cui EXPECT_EQ(1, options.inputFiles.size());
461*01826a49SYabin Cui EXPECT_EQ("-", options.inputFiles[0]);
462*01826a49SYabin Cui EXPECT_EQ("-", options.outputFile);
463*01826a49SYabin Cui }
464*01826a49SYabin Cui {
465*01826a49SYabin Cui Options options;
466*01826a49SYabin Cui auto args = makeArray();
467*01826a49SYabin Cui options.parse(args.size(), args.data());
468*01826a49SYabin Cui EXPECT_EQ(1, options.inputFiles.size());
469*01826a49SYabin Cui EXPECT_EQ("-", options.inputFiles[0]);
470*01826a49SYabin Cui EXPECT_EQ("-", options.outputFile);
471*01826a49SYabin Cui }
472*01826a49SYabin Cui {
473*01826a49SYabin Cui Options options;
474*01826a49SYabin Cui auto args = makeArray("-d");
475*01826a49SYabin Cui options.parse(args.size(), args.data());
476*01826a49SYabin Cui EXPECT_EQ(1, options.inputFiles.size());
477*01826a49SYabin Cui EXPECT_EQ("-", options.inputFiles[0]);
478*01826a49SYabin Cui EXPECT_EQ("-", options.outputFile);
479*01826a49SYabin Cui }
480*01826a49SYabin Cui {
481*01826a49SYabin Cui Options options;
482*01826a49SYabin Cui auto args = makeArray("x", "-");
483*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
484*01826a49SYabin Cui }
485*01826a49SYabin Cui }
486*01826a49SYabin Cui
TEST(Options,InvalidOptions)487*01826a49SYabin Cui TEST(Options, InvalidOptions) {
488*01826a49SYabin Cui {
489*01826a49SYabin Cui Options options;
490*01826a49SYabin Cui auto args = makeArray("-ibasdf");
491*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
492*01826a49SYabin Cui }
493*01826a49SYabin Cui {
494*01826a49SYabin Cui Options options;
495*01826a49SYabin Cui auto args = makeArray("- ");
496*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
497*01826a49SYabin Cui }
498*01826a49SYabin Cui {
499*01826a49SYabin Cui Options options;
500*01826a49SYabin Cui auto args = makeArray("-n15");
501*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
502*01826a49SYabin Cui }
503*01826a49SYabin Cui {
504*01826a49SYabin Cui Options options;
505*01826a49SYabin Cui auto args = makeArray("-0", "x");
506*01826a49SYabin Cui EXPECT_FAILURE(options.parse(args.size(), args.data()));
507*01826a49SYabin Cui }
508*01826a49SYabin Cui }
509*01826a49SYabin Cui
TEST(Options,Extras)510*01826a49SYabin Cui TEST(Options, Extras) {
511*01826a49SYabin Cui {
512*01826a49SYabin Cui Options options;
513*01826a49SYabin Cui auto args = makeArray("-h");
514*01826a49SYabin Cui EXPECT_MESSAGE(options.parse(args.size(), args.data()));
515*01826a49SYabin Cui }
516*01826a49SYabin Cui {
517*01826a49SYabin Cui Options options;
518*01826a49SYabin Cui auto args = makeArray("-H");
519*01826a49SYabin Cui EXPECT_MESSAGE(options.parse(args.size(), args.data()));
520*01826a49SYabin Cui }
521*01826a49SYabin Cui {
522*01826a49SYabin Cui Options options;
523*01826a49SYabin Cui auto args = makeArray("-V");
524*01826a49SYabin Cui EXPECT_MESSAGE(options.parse(args.size(), args.data()));
525*01826a49SYabin Cui }
526*01826a49SYabin Cui {
527*01826a49SYabin Cui Options options;
528*01826a49SYabin Cui auto args = makeArray("--help");
529*01826a49SYabin Cui EXPECT_MESSAGE(options.parse(args.size(), args.data()));
530*01826a49SYabin Cui }
531*01826a49SYabin Cui {
532*01826a49SYabin Cui Options options;
533*01826a49SYabin Cui auto args = makeArray("--version");
534*01826a49SYabin Cui EXPECT_MESSAGE(options.parse(args.size(), args.data()));
535*01826a49SYabin Cui }
536*01826a49SYabin Cui }
537