tstIprtMiniString.cpp revision e4cbbb034d1f2226fea95d81d1918ca2cf139e5c
6c6531128b39093daeac902a8705c0bdf15b31ccvboxsync * IPRT Testcase - RTCString.
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync * Copyright (C) 2006-2010 Oracle Corporation
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync * available from http://www.virtualbox.org. This file is free software;
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync * you can redistribute it and/or modify it under the terms of the GNU
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync * General Public License (GPL) as published by the Free Software
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync * The contents of this file may alternatively be used under the terms
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync * of the Common Development and Distribution License Version 1.0
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync * VirtualBox OSE distribution, in which case the provisions of the
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync * CDDL are applicable instead of those of the GPL.
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync * You may elect to license modified versions of this file under the
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync * terms and conditions of either the GPL or the CDDL or both.
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync/*******************************************************************************
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync* Header Files *
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync*******************************************************************************/
e39f7584900a350071fb8aa0997caa99cf2cc5eevboxsyncstatic void test1Hlp1(const char *pszExpect, const char *pszFormat, ...)
e39f7584900a350071fb8aa0997caa99cf2cc5eevboxsync RTTESTI_CHECK_MSG(strTst.equals(pszExpect), ("strTst='%s' expected='%s'\n", strTst.c_str(), pszExpect));
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTestFailed(hTest, "%d: FAILED %s, got \"%s\"", __LINE__, #expr, value); \
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync } while (0)
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTestFailed(hTest, "%d: FAILED %s, got \"%d\"", __LINE__, #expr, expr); \
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync } while (0)
5aa387de314d2023440cf16f117ce71072ab0a49vboxsync RTTestIFailed("line %u: expected \"%s\" got \"%s\"", __LINE__, szExpect, (Str).c_str()); \
5aa387de314d2023440cf16f117ce71072ab0a49vboxsync } while (0)
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync // 123456789a
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync CHECK_DUMP(morebytes == "newstring 123456", morebytes.c_str());
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync CHECK_DUMP(third == "newstring 123456", morebytes.c_str() );
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync CHECK(third.length() == morebytes.length()); // must not have changed
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync for (int i = 0; i < 100; ++i)
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync copy2.reserve(50); // should be ignored after 50 loops
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync for (int i = 0; i < 100; ++i)
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync copy2.reserve(50); // should be ignored after 50 loops
2c6b53161df23f161a60f267109f53ec6d4807f3vboxsync /* printf */
2c6b53161df23f161a60f267109f53ec6d4807f3vboxsync CHECK(StrFmt.printf("%s-%s-%d", "abc", "def", 42).equals("abc-def-42"));
e39f7584900a350071fb8aa0997caa99cf2cc5eevboxsync test1Hlp1("abc-42-def", "%s-%d-%s", "abc", 42, "def");
5aa387de314d2023440cf16f117ce71072ab0a49vboxsync /* substring constructors */
e23f032178340da346f06df66a051517dfb416b2vboxsync /* substr() and substrCP() functions */
e23f032178340da346f06df66a051517dfb416b2vboxsync /* now let's have some non-ASCII to chew on */
e23f032178340da346f06df66a051517dfb416b2vboxsync // 13 codepoints, but 15 bytes (excluding null terminator);
e23f032178340da346f06df66a051517dfb416b2vboxsync // "ß" and "ä" consume two bytes each
e23f032178340da346f06df66a051517dfb416b2vboxsync CHECK_EQUAL(strTest.substr(6, 2), "ß"); // UTF-8 "ß" consumes two bytes
e23f032178340da346f06df66a051517dfb416b2vboxsync CHECK_EQUAL(strTest.substr(8), "äbcdef"); // UTF-8 "ß" consumes two bytes
e23f032178340da346f06df66a051517dfb416b2vboxsync CHECK_EQUAL(strTest.substr(8, 3), "äb"); // UTF-8 "ä" consumes two bytes
8880495bbb1df290f0806bf43298e658cfcb547cvboxsync /* and check cooperation with find() */
7f0bf7fc186a9b0de66702f6d1e44fcad695b73dvboxsync /* split */
64fee3f73de7a63db0b27a93be05cd635a149d14vboxsync RTCList<RTCString> spList1 = RTCString("##abcdef##abcdef####abcdef##").split("##", RTCString::RemoveEmptyParts);
64fee3f73de7a63db0b27a93be05cd635a149d14vboxsync RTCList<RTCString> spList2 = RTCString("##abcdef##abcdef####abcdef##").split("##", RTCString::KeepEmptyParts);
64fee3f73de7a63db0b27a93be05cd635a149d14vboxsync RTCList<RTCString> spList3 = RTCString().split("##", RTCString::KeepEmptyParts);
64fee3f73de7a63db0b27a93be05cd635a149d14vboxsync RTCList<RTCString> spList4 = RTCString().split("");
64fee3f73de7a63db0b27a93be05cd635a149d14vboxsync RTCList<RTCString> spList5 = RTCString("abcdef").split("");
7f0bf7fc186a9b0de66702f6d1e44fcad695b73dvboxsync RTTESTI_CHECK(strTest == "abcdefabcdefabcdefabcdefabcdef");
7f0bf7fc186a9b0de66702f6d1e44fcad695b73dvboxsync RTTESTI_CHECK(strTest == "abcdef##abcdef##abcdef##abcdef##abcdef");
8d9b740ca730fa821b892864cfa398ec0577b42bvboxsync /* special constructor and assignment arguments */
8d9b740ca730fa821b892864cfa398ec0577b42bvboxsync for (unsigned i = 0; i < 2; i++)
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsyncstatic int mymemcmp(const char *psz1, const char *psz2, size_t cch)
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTestIFailed("off=%#x psz1=%.*Rhxs psz2=%.*Rhxs\n", off,
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTestSub(hTest, "UTF-8 upper/lower encoding assumption");
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTESTI_CHECK(strlen((str1).c_str()) == (str1).length()); \
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTESTI_CHECK((str1).length() == (str2).length()); \
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTESTI_CHECK(mymemcmp((str1).c_str(), (str2).c_str(), (str2).length() + 1) == 0); \
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync } while (0)
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync /* Collect all upper and lower case code points. */
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTESTI_CHECK_MSG(uc < 0xd800 || (uc > 0xdfff && uc != 0xfffe && uc != 0xffff), ("%#x\n", uc));
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTESTI_CHECK_MSG(uc < 0xd800 || (uc > 0xdfff && uc != 0xfffe && uc != 0xffff), ("%#x\n", uc));
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTESTI_CHECK(strlen(strLower.c_str()) == strLower.length());
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTESTI_CHECK(strlen(strUpper.c_str()) == strUpper.length());
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync /* Fold each code point in the lower case string and check that it encodes
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync into the same or less number of bytes. */
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTESTI_CHECK_RC_BREAK(RTStrGetCpEx(&pszCur, &ucLower), VINF_SUCCESS);
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync const char *pszDstEnd = RTStrPutCp(szDst, ucUpper);
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync ("ucLower=%#x %u bytes; ucUpper=%#x %u bytes\n",
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync /* roundtrip stability */
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTESTI_CHECK_MSG(ucUpper2 == ucUpper, ("ucUpper2=%#x ucUpper=%#x\n", ucUpper2, ucUpper));
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTESTI_CHECK_MSG(ucUpper3 == ucUpper, ("ucUpper3=%#x ucUpper=%#x\n", ucUpper3, ucUpper));
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync ("ucLower2=%#x %u bytes; ucUpper=%#x %u bytes\n",
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTESTI_CHECK(strlen(strUpper2.c_str()) == strUpper2.length());
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTESTI_CHECK_MSG(cch == strUpper2.length(), ("cch=%u length()=%u\n", cch, strUpper2.length()));
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync /* the toUpper method shall do the same thing. */
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync /* Ditto for the upper case string. */
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTESTI_CHECK_RC_BREAK(RTStrGetCpEx(&pszCur, &ucUpper), VINF_SUCCESS);
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync const char *pszDstEnd = RTStrPutCp(szDst, ucLower);
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync ("ucUpper=%#x %u bytes; ucLower=%#x %u bytes\n",
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync /* roundtrip stability */
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTESTI_CHECK_MSG(ucLower2 == ucLower, ("ucLower2=%#x ucLower=%#x\n", ucLower2, ucLower));
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTESTI_CHECK_MSG(ucLower3 == ucLower, ("ucLower3=%#x ucLower=%#x\n", ucLower3, ucLower));
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync ("ucUpper2=%#x %u bytes; ucLower=%#x %u bytes\n",
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTESTI_CHECK(strlen(strLower2.c_str()) == strLower2.length());
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTTESTI_CHECK_MSG(cch == strLower2.length(), ("cch=%u length()=%u\n", cch, strLower2.length()));
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync /* Checks of folding stability when nothing shall change. */
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync strTmp = strUpper2; CHECK_EQUAL(strTmp, strUpper2);
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync strTmp = strLower2; CHECK_EQUAL(strTmp, strLower2);
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync /* Check folding stability for roundtrips. */
da95d7e90deb739a4313283fc4b2e23d8f9ce8d6vboxsync RTEXITCODE rcExit = RTTestInitAndCreate("tstIprtMiniString", &hTest);