Remove always-true if-clause
[TortoiseGit.git] / test / UnitTests / CmdLineParserTest.cpp
blobfe7547b8cb35f6bce64a94d99d72b5ff53b03118
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.
20 #include "stdafx.h"
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:"));