VirtualBox

vbox的更動 17141 路徑 trunk/src/VBox/Runtime/testcase


忽略:
時間撮記:
2009-2-25 下午05:09:22 (16 年 以前)
作者:
vboxsync
訊息:

IPRT: Added support for short option lists (ls -latrT4). This fixes a bug in the short option without values, where we didn't check that the following char was the string terminator.

檔案:
修改 1 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/Runtime/testcase/tstGetOpt.cpp

    r17100 r17141  
    4141    int cErrors = 0;
    4242    RTR3Init();
     43    RTPrintf("tstGetOpt: TESTING...\n");
    4344
    4445    RTGETOPTSTATE GetState;
    4546    RTGETOPTUNION Val;
    4647#define CHECK(expr)  do { if (!(expr)) { RTPrintf("tstGetOpt: error line %d (iNext=%d): %s\n", __LINE__, GetState.iNext, #expr); cErrors++; } } while (0)
     48#define CHECK2(expr, fmt) \
     49    do { \
     50        if (!(expr)) { \
     51            RTPrintf("tstGetOpt: error line %d (iNext=%d): %s\n", __LINE__, GetState.iNext, #expr); \
     52            RTPrintf fmt; \
     53            cErrors++; \
     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));
    4759
    4860#define CHECK_GETOPT(expr, chRet, iInc) \
    4961    do { \
    5062        const int iPrev = GetState.iNext; \
    51         CHECK((expr) == (chRet)); \
    52         CHECK(GetState.iNext == (iInc) + iPrev); \
     63        const int rc = (expr); \
     64        CHECK2(rc == (chRet), ("got %d, expected %d\n", rc, (chRet))); \
     65        CHECK2(GetState.iNext == (iInc) + iPrev, ("iNext=%d expected %d\n", GetState.iNext, (iInc) + iPrev)); \
    5366        GetState.iNext = (iInc) + iPrev; \
    5467    } while (0)
    5568
     69
     70
    5671    /*
    57      * Simple.
     72     * The basics.
    5873     */
    5974    static const RTGETOPTDEF s_aOpts2[] =
     
    6479        { NULL,                 'q', RTGETOPT_REQ_NOTHING },
    6580        { "--quiet",            384, RTGETOPT_REQ_NOTHING },
    66         { "-startvm",           385, RTGETOPT_REQ_NOTHING },
     81        { "-novalue",           385, RTGETOPT_REQ_NOTHING },
     82        { "-startvm",           386, RTGETOPT_REQ_STRING },
     83        { "nodash",             387, RTGETOPT_REQ_NOTHING },
     84        { "nodashval",          388, RTGETOPT_REQ_STRING },
    6785    };
    6886
     
    7189        "-s",               "string1",
    7290        "--optwithstring",  "string2",
     91
    7392        "-i",               "-42",
    7493        "-i:-42",
     
    7695        "-i:",              "-42",
    7796        "-i=",              "-42",
     97
    7898        "--optwithint",     "42",
    7999        "--optwithint:42",
     
    81101        "--optwithint:",    "42",
    82102        "--optwithint=",    "42",
     103
    83104        "-v",
    84105        "--verbose",
    85106        "-q",
    86107        "--quiet",
    87         "-startvm",
     108
     109        "-novalue",
     110        "-startvm",         "myvm",
     111
     112        "nodash",
     113        "nodashval",        "string3",
     114
    88115        "filename1",
    89116        "-q",
    90117        "filename2",
     118
     119        "-vqi999",
    91120        NULL
    92121    };
     
    125154
    126155    CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'v', 1);
    127     CHECK(Val.pDef == &s_aOpts2[2]);
     156    CHECK_pDef(s_aOpts2, 2);
    128157    CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'v', 1);
    129     CHECK(Val.pDef == &s_aOpts2[2]);
     158    CHECK_pDef(s_aOpts2, 2);
     159
    130160    CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'q', 1);
    131     CHECK(Val.pDef == &s_aOpts2[3]);
     161    CHECK_pDef(s_aOpts2, 3);
    132162    CHECK_GETOPT(RTGetOpt(&GetState, &Val), 384, 1);
    133     CHECK(Val.pDef == &s_aOpts2[4]);
     163    CHECK_pDef(s_aOpts2, 4);
     164
     165    /* -novalue / -startvm (single dash long options) */
    134166    CHECK_GETOPT(RTGetOpt(&GetState, &Val), 385, 1);
    135     CHECK(Val.pDef == &s_aOpts2[5]);
    136 
     167    CHECK_pDef(s_aOpts2, 5);
     168    CHECK_GETOPT(RTGetOpt(&GetState, &Val), 386, 2);
     169    CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "myvm"));
     170
     171    /* no-dash options */
     172    CHECK_GETOPT(RTGetOpt(&GetState, &Val), 387, 1);
     173    CHECK_pDef(s_aOpts2, 7);
     174    CHECK_GETOPT(RTGetOpt(&GetState, &Val), 388, 2);
     175    CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "string3"));
     176
     177    /* non-option, option, non-option  */
    137178    CHECK_GETOPT(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1);
    138179    CHECK(Val.psz && !strcmp(Val.psz, "filename1"));
    139180    CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'q', 1);
    140     CHECK(Val.pDef == &s_aOpts2[3]);
     181    CHECK_pDef(s_aOpts2, 3);
    141182    CHECK_GETOPT(RTGetOpt(&GetState, &Val), VINF_GETOPT_NOT_OPTION, 1);
    142183    CHECK(Val.psz && !strcmp(Val.psz, "filename2"));
    143184
     185    /* compress short options */
     186    CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'v', 0);
     187    CHECK_pDef(s_aOpts2, 2);
     188    CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'q', 0);
     189    CHECK_pDef(s_aOpts2, 3);
     190    CHECK_GETOPT(RTGetOpt(&GetState, &Val), 'i', 1);
     191    CHECK(Val.i32 == 999);
     192
     193    /* the end */
    144194    CHECK_GETOPT(RTGetOpt(&GetState, &Val), 0, 0);
    145195    CHECK(Val.pDef == NULL);
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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