VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstRTGetOpt.cpp@ 46474

Last change on this file since 46474 was 34542, checked in by vboxsync, 14 years ago

RTGetOpt: Made it a bit less understanding about spaces after the option/value separator (':' or '='). See defect #5320.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 22.5 KB
Line 
1/* $Id: tstRTGetOpt.cpp 34542 2010-11-30 22:57:21Z vboxsync $ */
2/** @file
3 * IPRT Testcase - RTGetOpt
4 */
5
6/*
7 * Copyright (C) 2007-2010 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27
28/*******************************************************************************
29* Header Files *
30*******************************************************************************/
31#include <iprt/net.h>
32#include <iprt/getopt.h>
33
34#include <iprt/err.h>
35#include <iprt/string.h>
36#include <iprt/test.h>
37
38
39int main()
40{
41 RTTEST hTest;
42 int rc = RTTestInitAndCreate("tstRTGetOpt", &hTest);
43 if (rc)
44 return rc;
45
46 RTGETOPTSTATE GetState;
47 RTGETOPTUNION Val;
48#define CHECK(expr) do { if (!(expr)) { RTTestIFailed("error line %d (iNext=%d): %s\n", __LINE__, GetState.iNext, #expr); } } while (0)
49#define CHECK2(expr, fmt) \
50 do { \
51 if (!(expr)) { \
52 RTTestIFailed("error line %d (iNext=%d): %s\n", __LINE__, GetState.iNext, #expr); \
53 RTTestIFailureDetails fmt; \
54 } \
55 } while (0)
56
57#define CHECK_pDef(paOpts, i) \
58 CHECK2(Val.pDef == &(paOpts)[(i)], ("Got #%d (%p) expected #%d\n", (int)(Val.pDef - &(paOpts)[0]), Val.pDef, i));
59
60#define CHECK_GETOPT(expr, chRet, iInc) \
61 do { \
62 const int iPrev = GetState.iNext; \
63 const int rcGetOpt = (expr); \
64 CHECK2(rcGetOpt == (chRet), ("got %d, expected %d\n", rcGetOpt, (chRet))); \
65 CHECK2(GetState.iNext == (iInc) + iPrev, ("iNext=%d expected %d\n", GetState.iNext, (iInc) + iPrev)); \
66 GetState.iNext = (iInc) + iPrev; \
67 } while (0)
68
69#define CHECK_GETOPT_STR(expr, chRet, iInc, str) \
70 do { \
71 const int iPrev = GetState.iNext; \
72 const int rcGetOpt = (expr); \
73 CHECK2(rcGetOpt == (chRet), ("got %d, expected %d\n", rcGetOpt, (chRet))); \
74 CHECK2(GetState.iNext == (iInc) + iPrev, ("iNext=%d expected %d\n", GetState.iNext, (iInc) + iPrev)); \
75 CHECK2(VALID_PTR(Val.psz) && !strcmp(Val.psz, (str)), ("got %s, expected %s\n", Val.psz, (str))); \
76 GetState.iNext = (iInc) + iPrev; \
77 } while (0)
78
79
80 /*
81 * The basics.
82 */
83 RTTestSub(hTest, "Basics");
84 static const RTGETOPTDEF s_aOpts2[] =
85 {
86 { "--optwithstring", 's', RTGETOPT_REQ_STRING },
87 { "--optwithint", 'i', RTGETOPT_REQ_INT32 },
88 { "--verbose", 'v', RTGETOPT_REQ_NOTHING },
89 { NULL, 'q', RTGETOPT_REQ_NOTHING },
90 { "--quiet", 384, RTGETOPT_REQ_NOTHING },
91 { "-novalue", 385, RTGETOPT_REQ_NOTHING },
92 { "-startvm", 386, RTGETOPT_REQ_STRING },
93 { "nodash", 387, RTGETOPT_REQ_NOTHING },
94 { "nodashval", 388, RTGETOPT_REQ_STRING },
95 { "--gateway", 'g', RTGETOPT_REQ_IPV4ADDR },
96 { "--mac", 'm', RTGETOPT_REQ_MACADDR },
97 { "--strindex", 400, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
98 { "strindex", 400, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
99 { "--intindex", 401, RTGETOPT_REQ_INT32 | RTGETOPT_FLAG_INDEX },
100 { "--macindex", 402, RTGETOPT_REQ_MACADDR | RTGETOPT_FLAG_INDEX },
101 { "--indexnovalue", 403, RTGETOPT_REQ_NOTHING | RTGETOPT_FLAG_INDEX },
102 { "--macindexnegative", 404, RTGETOPT_REQ_NOTHING },
103 { "--twovalues", 405, RTGETOPT_REQ_STRING },
104 { "--twovaluesindex", 406, RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_INDEX },
105 { "--threevalues", 407, RTGETOPT_REQ_UINT32 },
106 { "--boolean", 408, RTGETOPT_REQ_BOOL_ONOFF },
107 { "--booleanindex", 409, RTGETOPT_REQ_BOOL_ONOFF | RTGETOPT_FLAG_INDEX },
108 };
109
110 const char *argv2[] =
111 {
112 "-s", "string1",
113 "-sstring2",
114 "-s:string3",
115 "-s=string4",
116 "-s:",
117 "-s=",
118 "--optwithstring", "string5",
119 "--optwithstring:string6",
120 "--optwithstring=string7",
121 "--optwithstring:",
122 "--optwithstring=",
123
124 "-i", "-42",
125 "-i:-42",
126 "-i=-42",
127
128 "--optwithint", "42",
129 "--optwithint:42",
130 "--optwithint=42",
131
132 "-v",
133 "--verbose",
134 "-q",
135 "--quiet",
136
137 "-novalue",
138 "-startvm", "myvm",
139
140 "nodash",
141 "nodashval", "string9",
142
143 "filename1",
144 "-q",
145 "filename2",
146
147 "-vqi999",
148
149 "-g192.168.1.1",
150
151 "-m08:0:27:00:ab:f3",
152 "--mac:1:::::c",
153
154 "--strindex786", "string10",
155 "--strindex786:string11",
156 "--strindex786=string12",
157 "strindex687", "string13",
158 "strindex687:string14",
159 "strindex687=string15",
160 "strindex688:",
161 "strindex689=",
162 "--intindex137", "1000",
163 "--macindex138", "08:0:27:00:ab:f3",
164 "--indexnovalue1",
165 "--macindexnegative",
166
167 "--twovalues", "firstvalue", "secondvalue",
168 "--twovalues:firstvalue", "secondvalue",
169 "--twovaluesindex4", "1", "0xA",
170 "--twovaluesindex5=2", "0xB",
171 "--threevalues", "1", "0xC", "thirdvalue",
172
173 /* bool on/off */
174 "--boolean", "on",
175 "--boolean", "off",
176 "--boolean", "invalid",
177 "--booleanindex2", "on",
178 "--booleanindex7", "off",
179 "--booleanindex9", "invalid",
180
181 /* standard options */
182 "--help",
183 "-help",
184 "-?",
185 "-h",
186 "--version",
187 "-version",
188 "-V",
189
190 /* done */
191 NULL
192 };
193 int argc2 = (int)RT_ELEMENTS(argv2) - 1;
194
195 CHECK(RT_SUCCESS(RTGetOptInit(&GetState, argc2, (char **)argv2, &s_aOpts2[0], RT_ELEMENTS(s_aOpts2), 0, 0 /* fFlags */)));
196
197 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 's', 2);
198 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "string1"));
199 CHECK(GetState.uIndex == UINT32_MAX);
200 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 's', 1);
201 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "string2"));
202 CHECK(GetState.uIndex == UINT32_MAX);
203 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 's', 1);
204 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "string3"));
205 CHECK(GetState.uIndex == UINT32_MAX);
206 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 's', 1);
207 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "string4"));
208 CHECK(GetState.uIndex == UINT32_MAX);
209 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 's', 1);
210 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, ""));
211 CHECK(GetState.uIndex == UINT32_MAX);
212 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 's', 1);
213 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, ""));
214 CHECK(GetState.uIndex == UINT32_MAX);
215 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 's', 2);
216 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "string5"));
217 CHECK(GetState.uIndex == UINT32_MAX);
218 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 's', 1);
219 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "string6"));
220 CHECK(GetState.uIndex == UINT32_MAX);
221 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 's', 1);
222 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "string7"));
223 CHECK(GetState.uIndex == UINT32_MAX);
224 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 's', 1);
225 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, ""));
226 CHECK(GetState.uIndex == UINT32_MAX);
227 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 's', 1);
228 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, ""));
229 CHECK(GetState.uIndex == UINT32_MAX);
230
231 /* -i */
232 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 2);
233 CHECK(Val.i32 == -42);
234 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 1);
235 CHECK(Val.i32 == -42);
236 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 1);
237 CHECK(Val.i32 == -42);
238
239 /* --optwithint */
240 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 2);
241 CHECK(Val.i32 == 42);
242 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 1);
243 CHECK(Val.i32 == 42);
244 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 1);
245 CHECK(Val.i32 == 42);
246
247 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'v', 1);
248 CHECK_pDef(s_aOpts2, 2);
249 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'v', 1);
250 CHECK_pDef(s_aOpts2, 2);
251
252 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'q', 1);
253 CHECK_pDef(s_aOpts2, 3);
254 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 384, 1);
255 CHECK_pDef(s_aOpts2, 4);
256
257 /* -novalue / -startvm (single dash long options) */
258 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 385, 1);
259 CHECK_pDef(s_aOpts2, 5);
260 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 386, 2);
261 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "myvm"));
262
263 /* no-dash options */
264 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 387, 1);
265 CHECK_pDef(s_aOpts2, 7);
266 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 388, 2);
267 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "string9"));
268
269 /* non-option, option, non-option */
270 CHECK_GETOPT(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1);
271 CHECK(Val.psz && !strcmp(Val.psz, "filename1"));
272 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'q', 1);
273 CHECK_pDef(s_aOpts2, 3);
274 CHECK_GETOPT(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1);
275 CHECK(Val.psz && !strcmp(Val.psz, "filename2"));
276
277 /* compress short options */
278 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'v', 0);
279 CHECK_pDef(s_aOpts2, 2);
280 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'q', 0);
281 CHECK_pDef(s_aOpts2, 3);
282 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 1);
283 CHECK(Val.i32 == 999);
284
285 /* IPv4 */
286 RTTestSub(hTest, "RTGetOpt - IPv4");
287 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'g', 1);
288 CHECK(Val.IPv4Addr.u == RT_H2N_U32_C(RT_BSWAP_U32_C(RT_MAKE_U32_FROM_U8(192,168,1,1))));
289
290 /* Ethernet MAC address. */
291 RTTestSub(hTest, "RTGetOpt - MAC Address");
292 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'm', 1);
293 CHECK( Val.MacAddr.au8[0] == 0x08
294 && Val.MacAddr.au8[1] == 0x00
295 && Val.MacAddr.au8[2] == 0x27
296 && Val.MacAddr.au8[3] == 0x00
297 && Val.MacAddr.au8[4] == 0xab
298 && Val.MacAddr.au8[5] == 0xf3);
299 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'm', 1);
300 CHECK( Val.MacAddr.au8[0] == 0x01
301 && Val.MacAddr.au8[1] == 0x00
302 && Val.MacAddr.au8[2] == 0x00
303 && Val.MacAddr.au8[3] == 0x00
304 && Val.MacAddr.au8[4] == 0x00
305 && Val.MacAddr.au8[5] == 0x0c);
306
307 /* string with indexed argument */
308 RTTestSub(hTest, "RTGetOpt - Option w/ Index");
309 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 400, 2);
310 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "string10"));
311 CHECK(GetState.uIndex == 786);
312
313 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 400, 1);
314 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "string11"));
315 CHECK(GetState.uIndex == 786);
316
317 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 400, 1);
318 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "string12"));
319 CHECK(GetState.uIndex == 786);
320
321 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 400, 2);
322 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "string13"));
323 CHECK(GetState.uIndex == 687);
324
325 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 400, 1);
326 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "string14"));
327 CHECK(GetState.uIndex == 687);
328
329 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 400, 1);
330 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "string15"));
331 CHECK(GetState.uIndex == 687);
332
333 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 400, 1);
334 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, ""));
335 CHECK(GetState.uIndex == 688);
336
337 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 400, 1);
338 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, ""));
339 CHECK(GetState.uIndex == 689);
340
341 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 401, 2);
342 CHECK(Val.i32 == 1000);
343 CHECK(GetState.uIndex == 137);
344
345 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 402, 2);
346 CHECK( Val.MacAddr.au8[0] == 0x08
347 && Val.MacAddr.au8[1] == 0x00
348 && Val.MacAddr.au8[2] == 0x27
349 && Val.MacAddr.au8[3] == 0x00
350 && Val.MacAddr.au8[4] == 0xab
351 && Val.MacAddr.au8[5] == 0xf3);
352 CHECK(GetState.uIndex == 138);
353
354 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 403, 1);
355 CHECK(GetState.uIndex == 1);
356
357 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 404, 1);
358 CHECK(GetState.uIndex == UINT32_MAX);
359
360 /* RTGetOptFetchValue tests */
361 RTTestSub(hTest, "RTGetOptFetchValue");
362 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 405, 2);
363 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "firstvalue"));
364 CHECK(GetState.uIndex == UINT32_MAX);
365 CHECK_GETOPT(RTGetOptFetchValue(&GetState, &Val, RTGETOPT_REQ_STRING), VINF_SUCCESS, 1);
366 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "secondvalue"));
367 CHECK(GetState.uIndex == UINT32_MAX);
368
369 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 405, 1);
370 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "firstvalue"));
371 CHECK(GetState.uIndex == UINT32_MAX);
372 CHECK_GETOPT(RTGetOptFetchValue(&GetState, &Val, RTGETOPT_REQ_STRING), VINF_SUCCESS, 1);
373 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "secondvalue"));
374 CHECK(GetState.uIndex == UINT32_MAX);
375
376 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 406, 2);
377 CHECK(Val.u32 == 1);
378 CHECK(GetState.uIndex == 4);
379 CHECK_GETOPT(RTGetOptFetchValue(&GetState, &Val, RTGETOPT_REQ_UINT32), VINF_SUCCESS, 1);
380 CHECK(Val.u32 == 10);
381 CHECK(GetState.uIndex == 4);
382
383 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 406, 1);
384 CHECK(Val.u32 == 2);
385 CHECK(GetState.uIndex == 5);
386 CHECK_GETOPT(RTGetOptFetchValue(&GetState, &Val, RTGETOPT_REQ_UINT32), VINF_SUCCESS, 1);
387 CHECK(Val.u32 == 11);
388 CHECK(GetState.uIndex == 5);
389
390 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 407, 2);
391 CHECK(Val.u32 == 1);
392 CHECK(GetState.uIndex == UINT32_MAX);
393 CHECK_GETOPT(RTGetOptFetchValue(&GetState, &Val, RTGETOPT_REQ_UINT32), VINF_SUCCESS, 1);
394 CHECK(Val.u32 == 12);
395 CHECK(GetState.uIndex == UINT32_MAX);
396 CHECK_GETOPT(RTGetOptFetchValue(&GetState, &Val, RTGETOPT_REQ_STRING), VINF_SUCCESS, 1);
397 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "thirdvalue"));
398 CHECK(GetState.uIndex == UINT32_MAX);
399
400 /* bool on/off tests */
401 RTTestSub(hTest, "RTGetOpt - bool on/off");
402 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 408, 2);
403 CHECK(Val.f);
404 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 408, 2);
405 CHECK(!Val.f);
406 CHECK_GETOPT(RTGetOpt(&GetState, &Val), VERR_GETOPT_UNKNOWN_OPTION, 2);
407 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "invalid"));
408
409 /* bool on/off with indexed argument */
410 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 409, 2);
411 CHECK(Val.f);
412 CHECK(GetState.uIndex == 2);
413 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 409, 2);
414 CHECK(!Val.f);
415 CHECK(GetState.uIndex == 7);
416 CHECK_GETOPT(RTGetOpt(&GetState, &Val), VERR_GETOPT_UNKNOWN_OPTION, 2);
417 CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "invalid"));
418
419 /* standard options. */
420 RTTestSub(hTest, "Standard options");
421 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'h', 1);
422 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'h', 1);
423 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'h', 1);
424 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'h', 1);
425 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'V', 1);
426 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'V', 1);
427 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'V', 1);
428
429 /* the end */
430 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 0, 0);
431 CHECK(Val.pDef == NULL);
432 CHECK(argc2 == GetState.iNext);
433
434 /*
435 * Options first.
436 */
437 RTTestSub(hTest, "Options first");
438 const char *argv3[] =
439 {
440 "foo1",
441 "-s", "string1",
442 "foo2",
443 "--optwithstring", "string2",
444 "foo3",
445 "-i", "-42",
446 "foo4",
447 "-i:-42",
448 "-i=-42",
449 "foo5",
450 "foo6",
451 "foo7",
452 "-i:-42",
453 "-i=-42",
454 "foo8",
455 "--twovalues", "firstvalue", "secondvalue",
456 "foo9",
457 "--twovalues:firstvalue", "secondvalue",
458 "foo10",
459 "--",
460 "--optwithstring",
461 "foo11",
462 "foo12",
463
464 /* done */
465 NULL
466 };
467 int argc3 = (int)RT_ELEMENTS(argv3) - 1;
468
469 CHECK(RT_SUCCESS(RTGetOptInit(&GetState, argc3, (char **)argv3, &s_aOpts2[0], RT_ELEMENTS(s_aOpts2), 0,
470 RTGETOPTINIT_FLAGS_OPTS_FIRST)));
471
472 /* -s */
473 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), 's', 2, "string1");
474 CHECK(GetState.uIndex == UINT32_MAX);
475 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), 's', 2, "string2");
476 CHECK(GetState.uIndex == UINT32_MAX);
477
478 /* -i */
479 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 2);
480 CHECK(Val.i32 == -42);
481 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 1);
482 CHECK(Val.i32 == -42);
483 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 1);
484 CHECK(Val.i32 == -42);
485 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 1);
486 CHECK(Val.i32 == -42);
487 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 1);
488 CHECK(Val.i32 == -42);
489
490 /* --twovalues */
491 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), 405, 2, "firstvalue");
492 CHECK(GetState.uIndex == UINT32_MAX);
493 CHECK_GETOPT_STR(RTGetOptFetchValue(&GetState, &Val, RTGETOPT_REQ_STRING), VINF_SUCCESS, 1, "secondvalue");
494 CHECK(GetState.uIndex == UINT32_MAX);
495
496 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), 405, 1, "firstvalue");
497 CHECK(GetState.uIndex == UINT32_MAX);
498 CHECK_GETOPT_STR(RTGetOptFetchValue(&GetState, &Val, RTGETOPT_REQ_STRING), VINF_SUCCESS, 1, "secondvalue");
499 CHECK(GetState.uIndex == UINT32_MAX);
500
501 /* -- */
502 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 2, "foo1");
503 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo2");
504 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo3");
505 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo4");
506 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo5");
507 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo6");
508 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo7");
509 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo8");
510 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo9");
511 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo10");
512 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "--optwithstring");
513 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo11");
514 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo12");
515
516 /* the end */
517 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 0, 0);
518 CHECK(Val.pDef == NULL);
519 CHECK(argc3 == GetState.iNext);
520
521 /*
522 * Options first, part 2: No dash-dash.
523 */
524 const char *argv4[] =
525 {
526 "foo1",
527 "-s", "string1",
528 "foo2",
529 "--optwithstring", "string2",
530 "foo3",
531 "-i", "-42",
532 "foo4",
533 "-i:-42",
534 "-i=-42",
535 "foo5",
536 "foo6",
537 "foo7",
538 "-i:-42",
539 "-i=-42",
540 "foo8",
541 "--twovalues", "firstvalue", "secondvalue",
542 "foo9",
543 "--twovalues:firstvalue", "secondvalue",
544 "foo10",
545 "foo11",
546 "foo12",
547
548 /* done */
549 NULL
550 };
551 int argc4 = (int)RT_ELEMENTS(argv4) - 1;
552
553 CHECK(RT_SUCCESS(RTGetOptInit(&GetState, argc4, (char **)argv4, &s_aOpts2[0], RT_ELEMENTS(s_aOpts2), 0,
554 RTGETOPTINIT_FLAGS_OPTS_FIRST)));
555
556 /* -s */
557 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), 's', 2, "string1");
558 CHECK(GetState.uIndex == UINT32_MAX);
559 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), 's', 2, "string2");
560 CHECK(GetState.uIndex == UINT32_MAX);
561
562 /* -i */
563 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 2);
564 CHECK(Val.i32 == -42);
565 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 1);
566 CHECK(Val.i32 == -42);
567 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 1);
568 CHECK(Val.i32 == -42);
569 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 1);
570 CHECK(Val.i32 == -42);
571 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 1);
572 CHECK(Val.i32 == -42);
573
574 /* --twovalues */
575 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), 405, 2, "firstvalue");
576 CHECK(GetState.uIndex == UINT32_MAX);
577 CHECK_GETOPT_STR(RTGetOptFetchValue(&GetState, &Val, RTGETOPT_REQ_STRING), VINF_SUCCESS, 1, "secondvalue");
578 CHECK(GetState.uIndex == UINT32_MAX);
579
580 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), 405, 1, "firstvalue");
581 CHECK(GetState.uIndex == UINT32_MAX);
582 CHECK_GETOPT_STR(RTGetOptFetchValue(&GetState, &Val, RTGETOPT_REQ_STRING), VINF_SUCCESS, 1, "secondvalue");
583 CHECK(GetState.uIndex == UINT32_MAX);
584
585 /* -- */
586 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo1");
587 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo2");
588 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo3");
589 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo4");
590 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo5");
591 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo6");
592 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo7");
593 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo8");
594 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo9");
595 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo10");
596 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo11");
597 CHECK_GETOPT_STR(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1, "foo12");
598
599 /* the end */
600 CHECK_GETOPT(RTGetOpt(&GetState, &Val), 0, 0);
601 CHECK(Val.pDef == NULL);
602 CHECK(argc4 == GetState.iNext);
603
604
605
606 /*
607 * Summary.
608 */
609 return RTTestSummaryAndDestroy(hTest);
610}
611
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette