VirtualBox

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

Last change on this file since 27123 was 26486, checked in by vboxsync, 15 years ago

tstGetOpt -> tstRTGetOpt.

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