xref: /aosp_15_r20/external/zstd/contrib/pzstd/test/OptionsTest.cpp (revision 01826a4963a0d8a59bc3812d29bdf0fb76416722)
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