VirtualBox

Ignore:
Timestamp:
Apr 7, 2013 7:03:00 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
84819
Message:

IPRT: A Study in Paths - Chapter 2: The splitting of a path into component strings.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/testcase/tstRTPath.cpp

    r45391 r45394  
    3939
    4040
    41 static void testParser(RTTEST hTest)
     41static void testParserAndSplitter(RTTEST hTest)
    4242{
    43     RTTestSub(hTest, "RTPathParse");
    44 
    4543    static struct
    4644    {
     
    5351    } const s_aTests[] =
    5452    {
     53        { 2,  5,  5,  "/bin/",            RTPATH_PROP_ROOT_SLASH | RTPATH_PROP_ABSOLUTE | RTPATH_PROP_DIR_SLASH,                                                RTPATH_STR_F_STYLE_UNIX },
    5554        { 2, 13,  9,  "C:/Config.sys",    RTPATH_PROP_VOLUME | RTPATH_PROP_ROOT_SLASH | RTPATH_PROP_ABSOLUTE | RTPATH_PROP_FILENAME | RTPATH_PROP_SUFFIX,       RTPATH_STR_F_STYLE_DOS },
    5655        { 2, 13, 10,  "C://Config.sys",   RTPATH_PROP_VOLUME | RTPATH_PROP_ROOT_SLASH | RTPATH_PROP_ABSOLUTE | RTPATH_PROP_FILENAME | RTPATH_PROP_SUFFIX | RTPATH_PROP_EXTRA_SLASHES, RTPATH_STR_F_STYLE_DOS },
     
    6564        { 1,  1,  1,  "/",                RTPATH_PROP_ROOT_SLASH | RTPATH_PROP_ABSOLUTE,                                                                        RTPATH_STR_F_STYLE_UNIX },
    6665        { 2,  4,  4,  "/bin",             RTPATH_PROP_ROOT_SLASH | RTPATH_PROP_ABSOLUTE | RTPATH_PROP_FILENAME,                                                 RTPATH_STR_F_STYLE_UNIX },
    67         { 2,  4,  5,  "/bin/",            RTPATH_PROP_ROOT_SLASH | RTPATH_PROP_ABSOLUTE | RTPATH_PROP_DIR_SLASH,                                                RTPATH_STR_F_STYLE_UNIX },
     66        { 2,  5,  5,  "/bin/",            RTPATH_PROP_ROOT_SLASH | RTPATH_PROP_ABSOLUTE | RTPATH_PROP_DIR_SLASH,                                                RTPATH_STR_F_STYLE_UNIX },
    6867        { 3,  7,  7,  "/bin/ls",          RTPATH_PROP_ROOT_SLASH | RTPATH_PROP_ABSOLUTE | RTPATH_PROP_FILENAME,                                                 RTPATH_STR_F_STYLE_UNIX },
    6968        { 3,  12, 7,  "/etc/rc.conf",     RTPATH_PROP_ROOT_SLASH | RTPATH_PROP_ABSOLUTE | RTPATH_PROP_FILENAME | RTPATH_PROP_SUFFIX,                            RTPATH_STR_F_STYLE_UNIX },
     
    7271        { 3,  6,  7,  "/.//bin",          RTPATH_PROP_ROOT_SLASH | RTPATH_PROP_ABSOLUTE | RTPATH_PROP_EXTRA_SLASHES | RTPATH_PROP_DOT_REFS | RTPATH_PROP_FILENAME, RTPATH_STR_F_STYLE_UNIX },
    7372        { 1,  3,  3,  "bin",              RTPATH_PROP_RELATIVE | RTPATH_PROP_FILENAME,                                                                          RTPATH_STR_F_STYLE_UNIX },
    74         { 1,  3,  4,  "bin/",             RTPATH_PROP_RELATIVE | RTPATH_PROP_DIR_SLASH,                                                                         RTPATH_STR_F_STYLE_UNIX },
    75         { 1,  3,  7,  "bin////",          RTPATH_PROP_RELATIVE | RTPATH_PROP_DIR_SLASH | RTPATH_PROP_EXTRA_SLASHES,                                             RTPATH_STR_F_STYLE_UNIX },
     73        { 1,  4,  4,  "bin/",             RTPATH_PROP_RELATIVE | RTPATH_PROP_DIR_SLASH,                                                                         RTPATH_STR_F_STYLE_UNIX },
     74        { 1,  4,  7,  "bin////",          RTPATH_PROP_RELATIVE | RTPATH_PROP_DIR_SLASH | RTPATH_PROP_EXTRA_SLASHES,                                             RTPATH_STR_F_STYLE_UNIX },
    7675        { 3, 10, 10,  "bin/../usr",       RTPATH_PROP_RELATIVE | RTPATH_PROP_DOTDOT_REFS | RTPATH_PROP_FILENAME,                                                RTPATH_STR_F_STYLE_UNIX },
    7776        { 4, 11, 11,  "/bin/../usr",      RTPATH_PROP_ROOT_SLASH | RTPATH_PROP_RELATIVE | RTPATH_PROP_DOTDOT_REFS | RTPATH_PROP_FILENAME,                       RTPATH_STR_F_STYLE_UNIX },
     
    9190    {
    9291        RTPATHPARSED    Parsed;
     92        RTPATHSPLIT     Split;
    9393        uint8_t         ab[4096];
    9494    } u;
    9595
     96    RTTestSub(hTest, "RTPathParse");
    9697    for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
    9798    {
     99        memset(&u, i & 1 ? 0xff : 0, sizeof(u));
    98100        int rc = RTPathParse(s_aTests[i].pszPath, &u.Parsed, sizeof(u), s_aTests[i].fFlags);
    99101        if (   rc != VINF_SUCCESS
     
    114116                                 s_aTests[i].offSuffix, u.Parsed.offSuffix,
    115117                                 s_aTests[i].cchPath,   u.Parsed.cchPath);
     118        }
     119    }
     120
     121    RTTestSub(hTest, "RTPathSplit");
     122    for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
     123    {
     124        memset(&u, i & 1 ? 0xff : 0, sizeof(u));
     125        int rc = RTPathSplit(s_aTests[i].pszPath, &u.Split, sizeof(u), s_aTests[i].fFlags);
     126        if (   rc != VINF_SUCCESS
     127            || s_aTests[i].cComps    != u.Split.cComps
     128            || s_aTests[i].fProps    != u.Split.fProps
     129            || s_aTests[i].cchPath   != u.Split.cchPath)
     130        {
     131            RTTestFailed(hTest, "i=%d rc=%Rrc %s", i, rc, s_aTests[i].pszPath);
     132            RTTestFailureDetails(hTest,
     133                                 "  cComps    %u, got %u\n"
     134                                 "  fProps    %#x, got %#x, xor=>%#x\n"
     135                                 "  cchPath   %u, got %u\n"
     136                                 ,
     137                                 s_aTests[i].cComps,    u.Split.cComps,
     138                                 s_aTests[i].fProps,    u.Split.fProps, s_aTests[i].fProps ^ u.Split.fProps,
     139                                 s_aTests[i].cchPath,   u.Split.cchPath);
     140        }
     141        else
     142        {
     143            RTTESTI_CHECK_MSG(*u.Split.pszSuffix == '\0' || *u.Split.pszSuffix == '.', ("%s", u.Split.pszSuffix));
     144            for (uint32_t idxComp = RTPATH_PROP_HAS_ROOT_SPEC(u.Split.fProps); idxComp < u.Split.cComps; idxComp++)
     145                if ( (s_aTests[i].fFlags & RTPATH_STR_F_STYLE_MASK) == RTPATH_STR_F_STYLE_DOS
     146                    ? strpbrk(u.Split.apszComps[idxComp], "/\\")
     147                    : strchr(u.Split.apszComps[idxComp], RTPATH_SLASH) )
     148                    RTTestFailed(hTest, "i=%d idxComp=%d '%s'", i, idxComp, u.Split.apszComps[idxComp]);
     149
     150            PRTPATHSPLIT pSplit = NULL;
     151            RTTESTI_CHECK_RC(rc = RTPathSplitA(s_aTests[i].pszPath, &pSplit, s_aTests[i].fFlags), VINF_SUCCESS);
     152            if (RT_SUCCESS(rc))
     153            {
     154                RTTESTI_CHECK(pSplit);
     155                RTTESTI_CHECK(pSplit->cComps   == u.Split.cComps);
     156                RTTESTI_CHECK(pSplit->fProps   == u.Split.fProps);
     157                RTTESTI_CHECK(pSplit->cchPath  == u.Split.cchPath);
     158                RTTESTI_CHECK(pSplit->cbNeeded == u.Split.cbNeeded);
     159                RTTESTI_CHECK(!strcmp(pSplit->pszSuffix, u.Split.pszSuffix));
     160                for (uint32_t idxComp = 0; idxComp < u.Split.cComps; idxComp++)
     161                    RTTESTI_CHECK(!strcmp(pSplit->apszComps[idxComp], pSplit->apszComps[idxComp]));
     162                RTPathSplitFree(pSplit);
     163            }
    116164        }
    117165    }
     
    702750    }
    703751
    704     testParser(hTest);
     752    testParserAndSplitter(hTest);
    705753
    706754    /*
Note: See TracChangeset for help on using the changeset viewer.

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