1
// TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2015 - TortoiseGit
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #include "CmdLineParser.h"
23 TEST(CCmdLineParser
, Null
)
25 CCmdLineParser
parser(nullptr);
26 EXPECT_FALSE(parser
.HasKey(L
"action"));
27 EXPECT_FALSE(parser
.HasVal(L
"action"));
28 EXPECT_EQ(nullptr, parser
.GetVal(L
"action"));
29 EXPECT_EQ(0, parser
.GetLongVal(L
"action"));
30 EXPECT_EQ(0, parser
.GetLongLongVal(L
"action"));
33 TEST(CCmdLineParser
, Empty
)
35 CCmdLineParser
parser(L
"");
36 EXPECT_FALSE(parser
.HasKey(L
"action"));
37 EXPECT_FALSE(parser
.HasVal(L
"action"));
38 EXPECT_EQ(nullptr, parser
.GetVal(L
"action"));
39 EXPECT_EQ(0, parser
.GetLongVal(L
"action"));
40 EXPECT_EQ(0, parser
.GetLongLongVal(L
"action"));
43 TEST(CCmdLineParser
, Text
)
45 CCmdLineParser
parser(L
"action");
46 EXPECT_FALSE(parser
.HasKey(L
"action"));
47 EXPECT_FALSE(parser
.HasVal(L
"action"));
48 EXPECT_EQ(nullptr, parser
.GetVal(L
"action"));
49 EXPECT_EQ(0, parser
.GetLongVal(L
"action"));
50 EXPECT_EQ(0, parser
.GetLongLongVal(L
"action"));
53 TEST(CCmdLineParser
, SingleSimpleArgValue
)
55 CString args
[] = { L
"/action", L
"-action" };
56 for (const CString
& arg
: args
)
58 CCmdLineParser
parser(arg
);
59 EXPECT_TRUE(parser
.HasKey(L
"action"));
60 EXPECT_FALSE(parser
.HasVal(L
"action"));
61 EXPECT_STREQ(L
"", parser
.GetVal(L
"action"));
62 EXPECT_EQ(0, parser
.GetLongVal(L
"action"));
63 EXPECT_EQ(0, parser
.GetLongLongVal(L
"action"));
67 TEST(CCmdLineParser
, PrefixSingleSimpleArgValue
)
69 CString args
[] = { L
"Something /action", L
"Something -action" };
70 for (const CString
& arg
: args
)
72 CCmdLineParser
parser(arg
);
73 EXPECT_TRUE(parser
.HasKey(L
"action"));
74 EXPECT_FALSE(parser
.HasVal(L
"action"));
75 EXPECT_STREQ(L
"", parser
.GetVal(L
"action"));
76 EXPECT_EQ(0, parser
.GetLongVal(L
"action"));
77 EXPECT_EQ(0, parser
.GetLongLongVal(L
"action"));
81 TEST(CCmdLineParser
, QuotedArgs
)
83 CString args
[] = { L
"\"/action\"", L
"\"-action\"", L
"/\"action\"", L
"/\"action\"" };
84 for (const CString
& arg
: args
)
86 CCmdLineParser
parser(arg
);
87 EXPECT_FALSE(parser
.HasKey(L
""));
88 EXPECT_FALSE(parser
.HasVal(L
""));
89 EXPECT_EQ(nullptr, parser
.GetVal(L
""));
90 EXPECT_FALSE(parser
.HasKey(L
"action"));
91 EXPECT_FALSE(parser
.HasVal(L
"action"));
92 EXPECT_EQ(nullptr, parser
.GetVal(L
"action"));
96 TEST(CCmdLineParser
, SingleSimpleArgStringValue
)
98 CString args
[] = { L
"/action:log", L
"/action log", L
"-action:log", L
"-action log" };
99 for (const CString
& arg
: args
)
101 CCmdLineParser
parser(arg
);
102 EXPECT_FALSE(parser
.HasKey(L
"log"));
103 EXPECT_FALSE(parser
.HasVal(L
"log"));
104 EXPECT_TRUE(parser
.HasKey(L
"action"));
105 EXPECT_TRUE(parser
.HasVal(L
"action"));
106 EXPECT_STREQ(L
"log", parser
.GetVal(L
"action"));
110 TEST(CCmdLineParser
, SingleArgStringSpaceValue
)
112 CString args
[] = { L
"/action:log 2", L
"/action log 2", L
"-action:log 2", L
"-action log 2" };
113 for (const CString
& arg
: args
)
115 CCmdLineParser
parser(arg
);
116 EXPECT_TRUE(parser
.HasKey(L
"action"));
117 EXPECT_TRUE(parser
.HasVal(L
"action"));
118 EXPECT_STREQ(L
"log", parser
.GetVal(L
"action"));
119 EXPECT_FALSE(parser
.HasKey(L
"log"));
120 EXPECT_FALSE(parser
.HasVal(L
"log"));
121 EXPECT_FALSE(parser
.HasKey(L
"2"));
122 EXPECT_FALSE(parser
.HasVal(L
"2"));
126 TEST(CCmdLineParser
, SingleArgStringSpaceValueQuoted
)
128 CString args
[] = { L
"/action:\"log 2\"", L
"/action \"log 2\"", L
"-action:\"log 2\"", L
"-action \"log 2\"" };
129 for (const CString
& arg
: args
)
131 CCmdLineParser
parser(arg
);
132 EXPECT_TRUE(parser
.HasKey(L
"action"));
133 EXPECT_TRUE(parser
.HasVal(L
"action"));
134 EXPECT_STREQ(L
"log 2", parser
.GetVal(L
"action"));
138 TEST(CCmdLineParser
, SingleArgStringValueQuoted
)
140 CString args
[] = { L
"/action:\"log\"", L
"/action \"log\"", L
"-action:\"log\"", L
"-action \"log\"" };
141 for (const CString
& arg
: args
)
143 CCmdLineParser
parser(arg
);
144 EXPECT_TRUE(parser
.HasKey(L
"action"));
145 EXPECT_TRUE(parser
.HasVal(L
"action"));
146 EXPECT_STREQ(L
"log", parser
.GetVal(L
"action"));
150 TEST(CCmdLineParser
, SingleArgStringValueQuote
)
152 CString args
[] = { L
"/action:l\"og", L
"/action l\"og", L
"-action:l\"og", L
"-action l\"og" };
153 for (const CString
& arg
: args
)
155 CCmdLineParser
parser(arg
);
156 EXPECT_TRUE(parser
.HasKey(L
"action"));
157 EXPECT_TRUE(parser
.HasVal(L
"action"));
158 EXPECT_STREQ(L
"l\"og", parser
.GetVal(L
"action"));
162 TEST(CCmdLineParser
, SingleArgStringValueQuoteAtEnd
)
164 CString args
[] = { L
"/action:log\"", L
"/action log\"", L
"-action:log\"", L
"-action log\"" };
165 for (const CString
& arg
: args
)
167 CCmdLineParser
parser(arg
);
168 EXPECT_TRUE(parser
.HasKey(L
"action"));
169 EXPECT_TRUE(parser
.HasVal(L
"action"));
170 EXPECT_STREQ(L
"log\"", parser
.GetVal(L
"action"));
174 TEST(CCmdLineParser
, SingleArgStringValueMultiQuote
)
176 CString args
[] = { L
"/action:l\"o\"g", L
"/action l\"o\"g", L
"-action:l\"o\"g", L
"-action l\"o\"g" };
177 for (const CString
& arg
: args
)
179 CCmdLineParser
parser(arg
);
180 EXPECT_TRUE(parser
.HasKey(L
"action"));
181 EXPECT_TRUE(parser
.HasVal(L
"action"));
182 EXPECT_STREQ(L
"l\"o\"g", parser
.GetVal(L
"action"));
186 TEST(CCmdLineParser
, SingleArgStringValueQuotedWithQuote
)
188 CString args
[] = { L
"/action:\"l\"o\"g\"", L
"/action \"l\"o\"g\"", L
"-action:\"l\"o\"g\"", L
"-action \"l\"o\"g\"" };
189 for (const CString
& arg
: args
)
191 CCmdLineParser
parser(arg
);
192 EXPECT_TRUE(parser
.HasKey(L
"action"));
193 EXPECT_TRUE(parser
.HasVal(L
"action"));
194 EXPECT_STREQ(L
"l", parser
.GetVal(L
"action"));
198 TEST(CCmdLineParser
, SingleArgStringEmptyValue
)
200 CString args
[] = { L
"/action:\"\"", L
"/action \"\"", L
"-action:\"\"", L
"-action \"\"" };
201 for (const CString
& arg
: args
)
203 CCmdLineParser
parser(arg
);
204 EXPECT_TRUE(parser
.HasKey(L
"action"));
205 EXPECT_FALSE(parser
.HasVal(L
"action"));
209 TEST(CCmdLineParser
, SingleArgNumberValue
)
211 CString args
[] = { L
"/action:10", L
"/action 10", L
"-action:10", L
"-action 10" };
212 for (const CString
& arg
: args
)
214 CCmdLineParser
parser(arg
);
215 EXPECT_TRUE(parser
.HasKey(L
"action"));
216 EXPECT_TRUE(parser
.HasVal(L
"action"));
217 EXPECT_STREQ(L
"10", parser
.GetVal(L
"action"));
218 EXPECT_EQ(10, parser
.GetLongVal(L
"action"));
219 EXPECT_EQ(10, parser
.GetLongLongVal(L
"action"));
223 TEST(CCmdLineParser
, SingleArgNumberValueQuoted
)
225 CString args
[] = { L
"/action:\"10\"", L
"/action \"10\"", L
"-action:\"10\"", L
"-action \"10\"" };
226 for (const CString
& arg
: args
)
228 CCmdLineParser
parser(arg
);
229 EXPECT_TRUE(parser
.HasKey(L
"action"));
230 EXPECT_TRUE(parser
.HasVal(L
"action"));
231 EXPECT_STREQ(L
"10", parser
.GetVal(L
"action"));
232 EXPECT_EQ(10, parser
.GetLongVal(L
"action"));
233 EXPECT_EQ(10, parser
.GetLongLongVal(L
"action"));
237 TEST(CCmdLineParser
, SingleArgNumberValuePrefix
)
239 CString args
[] = { L
"/action:010", L
"/action 010", L
"-action:010", L
"-action 010" };
240 for (const CString
& arg
: args
)
242 CCmdLineParser
parser(arg
);
243 EXPECT_TRUE(parser
.HasKey(L
"action"));
244 EXPECT_TRUE(parser
.HasVal(L
"action"));
245 EXPECT_STREQ(L
"010", parser
.GetVal(L
"action"));
246 EXPECT_EQ(10, parser
.GetLongVal(L
"action"));
247 EXPECT_EQ(10, parser
.GetLongLongVal(L
"action"));
251 TEST(CCmdLineParser
, SingleArgQuotedArg1
)
253 CString args
[] = { L
"/action:\"/test\"", L
"/action \"/test\"", L
"-action:\"/test\"", L
"-action \"/test\"" };
254 for (const CString
& arg
: args
)
256 CCmdLineParser
parser(arg
);
257 EXPECT_TRUE(parser
.HasKey(L
"action"));
258 EXPECT_TRUE(parser
.HasVal(L
"action"));
259 EXPECT_STREQ(L
"/test", parser
.GetVal(L
"action"));
263 TEST(CCmdLineParser
, SingleArgQuotedArg2
)
265 CString args
[] = { L
"/action:\"-test\"", L
"/action \"-test\"", L
"-action:\"-test\"", L
"-action \"-test\"" };
266 for (const CString
& arg
: args
)
268 CCmdLineParser
parser(arg
);
269 EXPECT_TRUE(parser
.HasKey(L
"action"));
270 EXPECT_TRUE(parser
.HasVal(L
"action"));
271 EXPECT_STREQ(L
"-test", parser
.GetVal(L
"action"));
275 TEST(CCmdLineParser
, SingleArgBrokenQuote
)
277 CString args
[] = { L
"/action:\"-test", L
"/action \"-test", L
"-action \"-test", L
"-action:\"-test" };
278 for (const CString
& arg
: args
)
280 CCmdLineParser
parser(arg
);
281 EXPECT_TRUE(parser
.HasKey(L
"action"));
282 EXPECT_TRUE(parser
.HasVal(L
"action"));
283 EXPECT_STREQ(L
"-test", parser
.GetVal(L
"action"));
287 TEST(CCmdLineParser
, SingleArgBrokenQuote2
)
289 CString args
[] = { L
"/action \"-test \"bla\"", L
"/action:\"-test \"bla\"", L
"-action \"-test \"bla\"", L
"-action:\"-test \"bla\"" };
290 for (const CString
& arg
: args
)
292 CCmdLineParser
parser(arg
);
293 EXPECT_TRUE(parser
.HasKey(L
"action"));
294 EXPECT_TRUE(parser
.HasVal(L
"action"));
295 EXPECT_STREQ(L
"-test ", parser
.GetVal(L
"action"));
299 TEST(CCmdLineParser
, SingleArgBrokenQuote3
)
301 CString args
[] = { L
"/action \"-test:\"bla\"", L
"/action:\"-test:\"bla\"", L
"-action \"-test:\"bla\"", L
"-action:\"-test:\"bla\"" };
302 for (const CString
& arg
: args
)
304 CCmdLineParser
parser(arg
);
305 EXPECT_TRUE(parser
.HasKey(L
"action"));
306 EXPECT_TRUE(parser
.HasVal(L
"action"));
307 EXPECT_STREQ(L
"-test:", parser
.GetVal(L
"action"));
311 TEST(CCmdLineParser
, MultiArgSimpleArgs
)
313 CString args
[] = { L
"/action /rev", L
"/action -rev", L
"-action -rev", L
"-action /rev" };
314 for (const CString
& arg
: args
)
316 CCmdLineParser
parser(arg
);
317 EXPECT_TRUE(parser
.HasKey(L
"action"));
318 EXPECT_FALSE(parser
.HasVal(L
"action"));
319 EXPECT_EQ(0, parser
.GetLongVal(L
"action"));
320 EXPECT_EQ(0, parser
.GetLongLongVal(L
"action"));
321 EXPECT_TRUE(parser
.HasKey(L
"rev"));
322 EXPECT_FALSE(parser
.HasVal(L
"rev"));
323 EXPECT_EQ(0, parser
.GetLongVal(L
"rev"));
324 EXPECT_EQ(0, parser
.GetLongLongVal(L
"rev"));
328 TEST(CCmdLineParser
, MultiArgSimpleArgsDoubleSpace
)
330 CString args
[] = { L
"/action /rev", L
"/action -rev", L
"-action -rev", L
"-action /rev" };
331 for (const CString
& arg
: args
)
333 CCmdLineParser
parser(arg
);
334 EXPECT_TRUE(parser
.HasKey(L
"action"));
335 EXPECT_FALSE(parser
.HasVal(L
"action"));
336 EXPECT_EQ(0, parser
.GetLongVal(L
"action"));
337 EXPECT_EQ(0, parser
.GetLongLongVal(L
"action"));
338 EXPECT_TRUE(parser
.HasKey(L
"rev"));
339 EXPECT_FALSE(parser
.HasVal(L
"rev"));
340 EXPECT_EQ(0, parser
.GetLongVal(L
"rev"));
341 EXPECT_EQ(0, parser
.GetLongLongVal(L
"rev"));
345 TEST(CCmdLineParser
, MultiArgMixedArgs1
)
347 CString args
[] = { L
"/action log /rev", L
"/action log -rev", L
"-action log -rev", L
"-action log /rev" };
348 for (const CString
& arg
: args
)
350 CCmdLineParser
parser(arg
);
351 EXPECT_TRUE(parser
.HasKey(L
"action"));
352 EXPECT_TRUE(parser
.HasVal(L
"action"));
353 EXPECT_STREQ(L
"log", parser
.GetVal(L
"action"));
354 EXPECT_TRUE(parser
.HasKey(L
"rev"));
355 EXPECT_FALSE(parser
.HasVal(L
"rev"));
356 EXPECT_EQ(0, parser
.GetLongVal(L
"rev"));
357 EXPECT_EQ(0, parser
.GetLongLongVal(L
"rev"));
361 TEST(CCmdLineParser
, MultiArgMixedArgs2
)
363 CString args
[] = { L
"/action /rev def", L
"/action -rev def", L
"-action -rev def", L
"-action /rev def" };
364 for (const CString
& arg
: args
)
366 CCmdLineParser
parser(arg
);
367 EXPECT_TRUE(parser
.HasKey(L
"action"));
368 EXPECT_FALSE(parser
.HasVal(L
"action"));
369 EXPECT_TRUE(parser
.HasKey(L
"rev"));
370 EXPECT_TRUE(parser
.HasVal(L
"rev"));
371 EXPECT_STREQ(L
"def", parser
.GetVal(L
"rev"));
375 TEST(CCmdLineParser
, MultiArgStringSpaceValue
)
377 CString args
[] = { L
"/action:log 2 /rev def", L
"/action log 2 -rev def", L
"-action:log 2 -rev def", L
"-action log 2 /rev def" };
378 for (const CString
& arg
: args
)
380 CCmdLineParser
parser(arg
);
381 EXPECT_TRUE(parser
.HasKey(L
"action"));
382 EXPECT_TRUE(parser
.HasVal(L
"action"));
383 EXPECT_STREQ(L
"log", parser
.GetVal(L
"action"));
384 EXPECT_FALSE(parser
.HasKey(L
"log"));
385 EXPECT_FALSE(parser
.HasVal(L
"log"));
386 EXPECT_FALSE(parser
.HasKey(L
"2"));
387 EXPECT_FALSE(parser
.HasVal(L
"2"));
388 EXPECT_TRUE(parser
.HasKey(L
"rev"));
389 EXPECT_TRUE(parser
.HasVal(L
"rev"));
390 EXPECT_STREQ(L
"def", parser
.GetVal(L
"rev"));
394 TEST(CCmdLineParser
, MultiArgStringSpaceValueQuoted
)
396 CString args
[] = { L
"/action:\"log 2\" /rev def", L
"/action \"log 2\" -rev def", L
"-action:\"log 2\" -rev def", L
"-action \"log 2\" /rev def" };
397 for (const CString
& arg
: args
)
399 CCmdLineParser
parser(arg
);
400 EXPECT_TRUE(parser
.HasKey(L
"action"));
401 EXPECT_TRUE(parser
.HasVal(L
"action"));
402 EXPECT_STREQ(L
"log 2", parser
.GetVal(L
"action"));
403 EXPECT_TRUE(parser
.HasKey(L
"rev"));
404 EXPECT_TRUE(parser
.HasVal(L
"rev"));
405 EXPECT_STREQ(L
"def", parser
.GetVal(L
"rev"));
409 TEST(CCmdLineParser
, MultiArgStringSpaceValueQuoted2
)
411 CString args
[] = { L
"/action:\" log 2 \" /rev def", L
"/action \" log 2 \" -rev def", L
"-action:\" log 2 \" -rev def", L
"-action \" log 2 \" /rev def" };
412 for (const CString
& arg
: args
)
414 CCmdLineParser
parser(arg
);
415 EXPECT_TRUE(parser
.HasKey(L
"action"));
416 EXPECT_TRUE(parser
.HasVal(L
"action"));
417 EXPECT_STREQ(L
" log 2 ", parser
.GetVal(L
"action"));
418 EXPECT_TRUE(parser
.HasKey(L
"rev"));
419 EXPECT_TRUE(parser
.HasVal(L
"rev"));
420 EXPECT_STREQ(L
"def", parser
.GetVal(L
"rev"));
424 TEST(CCmdLineParser
, MultiArgValueTwice
)
426 CString args
[] = { L
"/action:\"log\" /action:\"log2\"", L
"/action \"log\" /action \"log2\"", L
"-action:\"log\" -action:\"log2\"", L
"-action \"log\" -action \"log2\"" };
427 for (const CString
& arg
: args
)
429 CCmdLineParser
parser(arg
);
430 EXPECT_TRUE(parser
.HasKey(L
"action"));
431 EXPECT_TRUE(parser
.HasVal(L
"action"));
432 EXPECT_STREQ(L
"log", parser
.GetVal(L
"action"));
436 TEST(CCmdLineParser
, SingleArgPath
)
438 CString args
[] = { L
"/path:C:\\test", L
"/path C:\\test", L
"-path C:\\test", L
"-path C:\\test" };
439 for (const CString
& arg
: args
)
441 CCmdLineParser
parser(arg
);
442 EXPECT_TRUE(parser
.HasKey(L
"path"));
443 EXPECT_TRUE(parser
.HasVal(L
"path"));
444 EXPECT_STREQ(L
"C:\\test", parser
.GetVal(L
"path"));
448 TEST(CCmdLineParser
, SingleArgPathQuoted
)
450 CString args
[] = { L
"/path:\"C:\\test\"", L
"/path \"C:\\test\"", L
"-path \"C:\\test\"", L
"-path \"C:\\test\"" };
451 for (const CString
& arg
: args
)
453 CCmdLineParser
parser(arg
);
454 EXPECT_TRUE(parser
.HasKey(L
"path"));
455 EXPECT_TRUE(parser
.HasVal(L
"path"));
456 EXPECT_STREQ(L
"C:\\test", parser
.GetVal(L
"path"));
460 TEST(CCmdLineParser
, SingleArgUnixPath
)
462 CString args
[] = { L
"/path:C:/test", L
"/path C:/test", L
"-path C:/test", L
"-path C:/test" };
463 for (const CString
& arg
: args
)
465 CCmdLineParser
parser(arg
);
466 EXPECT_TRUE(parser
.HasKey(L
"path"));
467 EXPECT_TRUE(parser
.HasVal(L
"path"));
468 EXPECT_STREQ(L
"C:/test", parser
.GetVal(L
"path"));
469 EXPECT_FALSE(parser
.HasKey(L
"C"));
470 EXPECT_FALSE(parser
.HasKey(L
"C:"));
475 TEST(CCmdLineParser
, SingleArgUnixPathQuoted
)
477 CString args
[] = { L
"/path:\"C:/test\"", L
"/path \"C:/test\"", L
"-path \"C:/test\"", L
"-path \"C:/test\"" };
478 for (const CString
& arg
: args
)
480 CCmdLineParser
parser(arg
);
481 EXPECT_TRUE(parser
.HasKey(L
"path"));
482 EXPECT_TRUE(parser
.HasVal(L
"path"));
483 EXPECT_STREQ(L
"C:/test", parser
.GetVal(L
"path"));
484 EXPECT_FALSE(parser
.HasKey(L
"C"));
485 EXPECT_FALSE(parser
.HasKey(L
"C:"));