From 76424950e373d3b04ac3dd13019151bfba3e8423 Mon Sep 17 00:00:00 2001 From: sumuel Date: Mon, 17 Aug 2026 20:44:55 +0000 Subject: Add the files --- tests/strbuf.c | 1144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1144 insertions(+) create mode 100644 tests/strbuf.c (limited to 'tests/strbuf.c') diff --git a/tests/strbuf.c b/tests/strbuf.c new file mode 100644 index 0000000..12ceac3 --- /dev/null +++ b/tests/strbuf.c @@ -0,0 +1,1144 @@ +#include "common/FFstrbuf.h" +#include "common/textModifier.h" + +#include +#include +#include +#include + +noreturn static void testFailed(const FFstrbuf* strbuf, const char* expression, int lineNo) { + fputs(FASTFETCH_TEXT_MODIFIER_ERROR, stderr); + fprintf(stderr, "[%d] %s, strbuf:", lineNo, expression); + ffStrbufWriteTo(strbuf, stderr); + fputs(FASTFETCH_TEXT_MODIFIER_RESET, stderr); + fputc('\n', stderr); + exit(1); +} + +#define VERIFY(expression) \ + if (!(expression)) testFailed(&strbuf, #expression, __LINE__) + +int shouldNotBeCalled(int c) { + (void) c; + exit(1); +} + +int main(void) { + FFstrbuf strbuf; + + // destroy 0 + ffStrbufInit(&strbuf); + ffStrbufDestroy(&strbuf); + + // initA + + ffStrbufInit(&strbuf); + + VERIFY(strbuf.chars[0] == 0); + VERIFY(strbuf.allocated == 0); + VERIFY(strbuf.length == 0); + + VERIFY(!ffStrbufStartsWithC(&strbuf, '0')); + VERIFY(!ffStrbufEndsWithC(&strbuf, '0')); + VERIFY(!ffStrbufStartsWithS(&strbuf, "0")); + VERIFY(!ffStrbufEndsWithS(&strbuf, "0")); + VERIFY(ffStrbufCountC(&strbuf, '0') == 0); + + // Ensure following functions work with non-allocated string + ffStrbufAppendS(&strbuf, ""); + ffStrbufAppendF(&strbuf, "%s", ""); + ffStrbufAppendTransformS(&strbuf, "", shouldNotBeCalled); + ffStrbufPrependS(&strbuf, ""); + ffStrbufTrim(&strbuf, ' '); + + VERIFY(strbuf.chars[0] == 0); + VERIFY(strbuf.allocated == 0); + VERIFY(strbuf.length == 0); + + // append(N)C + + ffStrbufAppendC(&strbuf, '1'); + VERIFY(ffStrbufEqualS(&strbuf, "1")); + VERIFY(strbuf.allocated >= 1); + ffStrbufAppendNC(&strbuf, 5, '2'); + VERIFY(ffStrbufEqualS(&strbuf, "122222")); + VERIFY(strbuf.allocated >= 6); + ffStrbufClear(&strbuf); + + // appendS + + ffStrbufAppendS(&strbuf, "12345"); + ffStrbufAppendS(&strbuf, NULL); + + VERIFY(strbuf.length == 5); + VERIFY(strbuf.allocated >= 6); + VERIFY(ffStrbufEqualS(&strbuf, "12345")); + + // appendNS + + ffStrbufAppendNS(&strbuf, 4, "67890"); + ffStrbufAppendNS(&strbuf, 0, NULL); + + VERIFY(strbuf.length == 9); + VERIFY(strbuf.allocated >= 10); + VERIFY(ffStrbufEqualS(&strbuf, "123456789")); + + // appendS long + + ffStrbufAppendS(&strbuf, "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"); + VERIFY(strbuf.length == 109); + VERIFY(strbuf.allocated >= 110); + VERIFY(strbuf.chars[strbuf.length] == 0); + + // substr + + VERIFY(ffStrbufSubstrBefore(&strbuf, 9)); + VERIFY(strbuf.length == 9); + VERIFY(strbuf.allocated >= 110); + VERIFY(strbuf.chars[strbuf.length] == 0); + VERIFY(ffStrbufEqualS(&strbuf, "123456789")); + + VERIFY(!ffStrbufSubstrBeforeFirstC(&strbuf, '0')); + VERIFY(!ffStrbufSubstrBeforeLastC(&strbuf, '0')); + VERIFY(!ffStrbufSubstrAfterFirstC(&strbuf, '0')); + VERIFY(!ffStrbufSubstrAfterLastC(&strbuf, '0')); + VERIFY(ffStrbufEqualS(&strbuf, "123456789")); + + VERIFY(ffStrbufSubstrBeforeFirstC(&strbuf, '9')); + VERIFY(ffStrbufSubstrBeforeLastC(&strbuf, '8')); + VERIFY(ffStrbufSubstrAfterFirstC(&strbuf, '1')); + VERIFY(ffStrbufSubstrAfterLastC(&strbuf, '2')); + VERIFY(ffStrbufEqualS(&strbuf, "34567")); + + ffStrbufSetS(&strbuf, "123456789"); + + // startsWithC + + VERIFY(ffStrbufStartsWithC(&strbuf, '1')); + VERIFY(!ffStrbufStartsWithC(&strbuf, '2')); + + // startsWithS + + VERIFY(ffStrbufStartsWithS(&strbuf, "123")); + VERIFY(ffStrbufStartsWithS(&strbuf, "123456789")); + VERIFY(!ffStrbufStartsWithS(&strbuf, "1234567890123")); + + // endsWithC + VERIFY(ffStrbufEndsWithC(&strbuf, '9')); + VERIFY(!ffStrbufEndsWithC(&strbuf, '1')); + + // endsWithS + + VERIFY(ffStrbufEndsWithS(&strbuf, "789")); + VERIFY(ffStrbufEndsWithS(&strbuf, "123456789")); + VERIFY(!ffStrbufEndsWithS(&strbuf, "1234567890123")); + + // toNumber + + VERIFY(ffStrbufToDouble(&strbuf, -DBL_MAX) == 123456789.0); + VERIFY(ffStrbufToUInt(&strbuf, 999) == 123456789); + + // countC + + VERIFY(ffStrbufCountC(&strbuf, '1') == 1); + VERIFY(ffStrbufCountC(&strbuf, '0') == 0); + + // removeS + + ffStrbufRemoveS(&strbuf, "78"); + + VERIFY(strbuf.length == 7); + VERIFY(strcmp(strbuf.chars, "1234569") == 0); + + // removeStrings + + ffStrbufRemoveStrings(&strbuf, 3, (const char*[]) { "23", "45", "9" }); + + VERIFY(strbuf.length == 2); + VERIFY(strcmp(strbuf.chars, "16") == 0); + + // PrependS + + ffStrbufPrependS(&strbuf, "123"); + ffStrbufPrependS(&strbuf, NULL); + + VERIFY(strbuf.length == 5); + VERIFY(strcmp(strbuf.chars, "12316") == 0); + + // indexC + VERIFY(ffStrbufFirstIndexC(&strbuf, '1') == 0); + VERIFY(ffStrbufNextIndexC(&strbuf, 1, '1') == 3); + VERIFY(ffStrbufNextIndexC(&strbuf, 4, '1') == 5); + VERIFY(ffStrbufLastIndexC(&strbuf, '1') == 3); + VERIFY(ffStrbufPreviousIndexC(&strbuf, 2, '1') == 0); + VERIFY(ffStrbufPreviousIndexC(&strbuf, 0, '1') == 0); + VERIFY(ffStrbufPreviousIndexC(&strbuf, 0, '2') == 5); + + // indexS + VERIFY(ffStrbufFirstIndexS(&strbuf, "12316") == 0); + VERIFY(ffStrbufNextIndexS(&strbuf, 1, "1") == 3); + VERIFY(ffStrbufNextIndexS(&strbuf, 4, "1") == 5); + + // ignCase + ffStrbufSetS(&strbuf, "AbCdEfG"); + + VERIFY(ffStrbufIgnCaseCompS(&strbuf, "aBcDeFg") == 0); + VERIFY(ffStrbufStartsWithIgnCaseS(&strbuf, "ABCD")); + VERIFY(ffStrbufEndsWithIgnCaseS(&strbuf, "defg")); + VERIFY(!ffStrbufStartsWithIgnCaseS(&strbuf, "aBcDeFgH")); + VERIFY(!ffStrbufEndsWithIgnCaseS(&strbuf, "0aBcDeFg")); + + // ensure + ffStrbufEnsureEndsWithC(&strbuf, '$'); + VERIFY(ffStrbufEqualS(&strbuf, "AbCdEfG$")); + ffStrbufEnsureEndsWithC(&strbuf, '$'); + VERIFY(ffStrbufEqualS(&strbuf, "AbCdEfG$")); + + // trimRight + ffStrbufTrimRight(&strbuf, '$'); + VERIFY(ffStrbufEqualS(&strbuf, "AbCdEfG")); + ffStrbufTrimRight(&strbuf, '$'); + VERIFY(ffStrbufEqualS(&strbuf, "AbCdEfG")); + + // clear + ffStrbufClear(&strbuf); + VERIFY(strbuf.allocated > 0); + VERIFY(strbuf.length == 0); + VERIFY(strbuf.chars && strbuf.chars[0] == 0); + + // Destroy + + ffStrbufDestroy(&strbuf); + + VERIFY(strbuf.allocated == 0); + VERIFY(strbuf.length == 0); + VERIFY(strbuf.chars && strbuf.chars[0] == 0); + + // initA + ffStrbufInitA(&strbuf, 32); + + VERIFY(strbuf.allocated == 32); + VERIFY(strbuf.length == 0); + VERIFY(strbuf.chars && strbuf.chars[0] == 0); + + // appendF + ffStrbufAppendF(&strbuf, "%s", "1234567890123456789012345678901"); + VERIFY(strbuf.allocated == 32); + VERIFY(ffStrbufEqualS(&strbuf, "1234567890123456789012345678901")); + + ffStrbufDestroy(&strbuf); + + // initMoveS + { + char* heapStr = strdup("1234567890"); + ffStrbufInitMoveS(&strbuf, heapStr); + VERIFY(ffStrbufEqualS(&strbuf, "1234567890")); + VERIFY(strbuf.allocated >= 11); + ffStrbufDestroy(&strbuf); + } + + // initF + ffStrbufInitF(&strbuf, "%s", "1234567890123456789012345678901"); + VERIFY(strbuf.allocated >= 32); + VERIFY(ffStrbufEqualS(&strbuf, "1234567890123456789012345678901")); + + // containC + VERIFY(ffStrbufContainC(&strbuf, '1')); + VERIFY(!ffStrbufContainC(&strbuf, '-')); + + // replaceAllC + ffStrbufReplaceAllC(&strbuf, '1', '-'); + VERIFY(ffStrbufEqualS(&strbuf, "-234567890-234567890-234567890-")); + ffStrbufReplaceAllC(&strbuf, '1', '-'); + VERIFY(ffStrbufEqualS(&strbuf, "-234567890-234567890-234567890-")); + + // trim + ffStrbufTrim(&strbuf, '-'); + VERIFY(ffStrbufEqualS(&strbuf, "234567890-234567890-234567890")); + + ffStrbufDestroy(&strbuf); + + // ffStrbufCreateS + { + FF_STRBUF_AUTO_DESTROY testCreate = ffStrbufCreateS("TEST"); + VERIFY(ffStrbufEqualS(&testCreate, "TEST")); + } + + // ffStrbufCreateStatic + ffStrbufInitStatic(&strbuf, "TEST"); + VERIFY(ffStrbufEqualS(&strbuf, "TEST")); + VERIFY(strbuf.length == 4); + VERIFY(strbuf.allocated == 0); + + ffStrbufDestroy(&strbuf); + VERIFY(strbuf.length == 0); + VERIFY(strbuf.allocated == 0); + + // ffStrbufCreateStatic / Allocate + ffStrbufInitStatic(&strbuf, "TEST"); + ffStrbufEnsureFree(&strbuf, 0); + VERIFY(ffStrbufEqualS(&strbuf, "TEST")); + VERIFY(strbuf.length == 4); + VERIFY(strbuf.allocated > 0); + + // ffStrbufCreateStatic / Append + ffStrbufInitStatic(&strbuf, "TEST"); + ffStrbufAppendS(&strbuf, "_TEST"); + VERIFY(ffStrbufEqualS(&strbuf, "TEST_TEST")); + VERIFY(strbuf.length == 9); + VERIFY(strbuf.allocated >= 10); + ffStrbufAppendC(&strbuf, '_'); + VERIFY(ffStrbufEqualS(&strbuf, "TEST_TEST_")); + ffStrbufDestroy(&strbuf); + VERIFY(strbuf.length == 0); + VERIFY(strbuf.allocated == 0); + + // ffStrbufCreateStatic / Prepend + ffStrbufInitStatic(&strbuf, "TEST"); + ffStrbufPrependS(&strbuf, "TEST_"); + VERIFY(ffStrbufEqualS(&strbuf, "TEST_TEST")); + VERIFY(strbuf.length == 9); + VERIFY(strbuf.allocated >= 10); + ffStrbufPrependC(&strbuf, '_'); + VERIFY(ffStrbufEqualS(&strbuf, "_TEST_TEST")); + ffStrbufDestroy(&strbuf); + VERIFY(strbuf.length == 0); + VERIFY(strbuf.allocated == 0); + + // ffStrbufCreateStatic / Clear + ffStrbufInitStatic(&strbuf, "TEST"); + ffStrbufClear(&strbuf); + VERIFY(strbuf.length == 0); + VERIFY(strbuf.allocated == 0); + ffStrbufDestroy(&strbuf); + + // ffStrbufCreateStatic / Set + ffStrbufInitStatic(&strbuf, "TEST"); // static + ffStrbufSetStatic(&strbuf, "test"); + VERIFY(ffStrbufEqualS(&strbuf, "test")); + VERIFY(strbuf.length == 4); + VERIFY(strbuf.allocated == 0); + ffStrbufDestroy(&strbuf); + + // ffStrbufCreateStatic / Set + ffStrbufInitS(&strbuf, "TEST"); // allocated + ffStrbufSetStatic(&strbuf, "test"); + VERIFY(ffStrbufEqualS(&strbuf, "test")); + VERIFY(strbuf.length == 4); + VERIFY(strbuf.allocated == 0); + ffStrbufDestroy(&strbuf); + + // ffStrbufCreateStatic / TrimL + ffStrbufInitStatic(&strbuf, "_TEST_"); + ffStrbufTrimLeft(&strbuf, '_'); + VERIFY(ffStrbufEqualS(&strbuf, "TEST_")); + VERIFY(strbuf.length == 5); + VERIFY(strbuf.allocated == 0); + ffStrbufDestroy(&strbuf); + + // ffStrbufCreateStatic / TrimR + ffStrbufInitStatic(&strbuf, "_TEST_"); + ffStrbufTrimRight(&strbuf, ' '); + VERIFY(strbuf.allocated == 0); + VERIFY(ffStrbufEqualS(&strbuf, "_TEST_")); + ffStrbufTrimRight(&strbuf, '_'); + VERIFY(ffStrbufEqualS(&strbuf, "_TEST")); + VERIFY(strbuf.length == 5); + VERIFY(strbuf.allocated > 0); + ffStrbufDestroy(&strbuf); + + // ffStrbufCreateStatic / Substr + ffStrbufInitStatic(&strbuf, "__TEST__"); + VERIFY(ffStrbufRemoveSubstr(&strbuf, 0, 6)); + VERIFY(ffStrbufEqualS(&strbuf, "__")); + VERIFY(strbuf.length == 2); + VERIFY(strbuf.allocated > 0); + ffStrbufDestroy(&strbuf); + + // ffStrbufCreateStatic / Substr + ffStrbufInitStatic(&strbuf, "__TEST__"); + VERIFY(ffStrbufRemoveSubstr(&strbuf, 2, 8)); + VERIFY(ffStrbufEqualS(&strbuf, "__")); + VERIFY(strbuf.length == 2); + VERIFY(strbuf.allocated > 0); + ffStrbufDestroy(&strbuf); + + // ffStrbufCreateStatic / Substr + ffStrbufInitStatic(&strbuf, "__TEST__"); + VERIFY(ffStrbufRemoveSubstr(&strbuf, 2, 6)); + VERIFY(ffStrbufEqualS(&strbuf, "____")); + VERIFY(strbuf.length == 4); + VERIFY(strbuf.allocated > 0); + ffStrbufDestroy(&strbuf); + + // ffStrbufCreateStatic / ReplaceAllC + ffStrbufInitStatic(&strbuf, "__TEST__"); + ffStrbufReplaceAllC(&strbuf, '_', '-'); + VERIFY(ffStrbufEqualS(&strbuf, "--TEST--")); + VERIFY(strbuf.length == 8); + VERIFY(strbuf.allocated > 0); + ffStrbufDestroy(&strbuf); + + // ffStrbufCreateStatic / TrimSpace + ffStrbufInitStatic(&strbuf, "\n TEST\n "); + ffStrbufTrimSpace(&strbuf); + VERIFY(strbuf.length == 4); + VERIFY(strbuf.allocated > 0); + VERIFY(ffStrbufEqualS(&strbuf, "TEST")); + ffStrbufDestroy(&strbuf); + + // ffStrbufCreate / TrimSpace + ffStrbufInitS(&strbuf, "\n TEST\n "); + ffStrbufTrimSpace(&strbuf); + VERIFY(strbuf.length == 4); + VERIFY(strbuf.allocated > 0); + VERIFY(ffStrbufEqualS(&strbuf, "TEST")); + ffStrbufDestroy(&strbuf); + + // ffStrbufEnsureFixedLengthFree / empty buffer + ffStrbufInit(&strbuf); + ffStrbufEnsureFixedLengthFree(&strbuf, 10); + VERIFY(strbuf.length == 0); + VERIFY(strbuf.allocated == 11); + ffStrbufDestroy(&strbuf); + ffStrbufInitA(&strbuf, 10); + ffStrbufEnsureFixedLengthFree(&strbuf, 10); + VERIFY(strbuf.length == 0); + VERIFY(strbuf.allocated == 11); + ffStrbufEnsureFixedLengthFree(&strbuf, 12); + VERIFY(strbuf.length == 0); + VERIFY(strbuf.allocated == 13); + ffStrbufDestroy(&strbuf); + + // ffStrbufEnsureFixedLengthFree / empty buffer with zero free length + ffStrbufInit(&strbuf); + ffStrbufEnsureFixedLengthFree(&strbuf, 0); + VERIFY(strbuf.length == 0); + VERIFY(strbuf.allocated == 0); + ffStrbufDestroy(&strbuf); + + // ffStrbufEnsureFixedLengthFree / empty buffer but oldFree >= newFree + ffStrbufInitA(&strbuf, 11); + ffStrbufEnsureFixedLengthFree(&strbuf, 10); + VERIFY(strbuf.length == 0); + VERIFY(strbuf.allocated == 11); + ffStrbufDestroy(&strbuf); + ffStrbufInitA(&strbuf, 12); + ffStrbufEnsureFixedLengthFree(&strbuf, 10); + VERIFY(strbuf.length == 0); + VERIFY(strbuf.allocated == 12); + ffStrbufDestroy(&strbuf); + + // ffStrbufEnsureFixedLengthFree / non empty buffer + ffStrbufAppendF(&strbuf, "%s", "1234567890"); + VERIFY(strbuf.length == 10); + VERIFY(strbuf.allocated == 32); + ffStrbufEnsureFixedLengthFree(&strbuf, 0); + VERIFY(strbuf.length == 10); + VERIFY(strbuf.allocated == 32); + ffStrbufEnsureFixedLengthFree(&strbuf, 20); // less than oldFree (=21) + VERIFY(strbuf.length == 10); + VERIFY(strbuf.allocated == 32); + ffStrbufEnsureFixedLengthFree(&strbuf, 21); // equal to oldFree (=21) + VERIFY(strbuf.length == 10); + VERIFY(strbuf.allocated == 32); + ffStrbufEnsureFixedLengthFree(&strbuf, 22); // greater than oldFree (=21) + VERIFY(strbuf.length == 10); + VERIFY(strbuf.allocated == 33); + ffStrbufDestroy(&strbuf); + + // ffStrbufEnsureFixedLengthFree / static buffer + ffStrbufInitStatic(&strbuf, "__TEST__"); + VERIFY(strbuf.length > 0); + VERIFY(strbuf.allocated == 0); + ffStrbufEnsureFixedLengthFree(&strbuf, 10); + VERIFY(strbuf.length == strlen("__TEST__")); + VERIFY(strbuf.allocated == strlen("__TEST__") + 1 + 10); + VERIFY(ffStrbufEqualS(&strbuf, "__TEST__")); + ffStrbufDestroy(&strbuf); + + // ffStrbufInsertNC + ffStrbufInitStatic(&strbuf, "123456"); + ffStrbufInsertNC(&strbuf, 0, 2, 'A'); + VERIFY(ffStrbufEqualS(&strbuf, "AA123456")); + ffStrbufInsertNC(&strbuf, 4, 2, 'B'); + VERIFY(ffStrbufEqualS(&strbuf, "AA12BB3456")); + ffStrbufInsertNC(&strbuf, strbuf.length, 2, 'C'); + VERIFY(ffStrbufEqualS(&strbuf, "AA12BB3456CC")); + ffStrbufInsertNC(&strbuf, 999, 2, 'D'); + VERIFY(ffStrbufEqualS(&strbuf, "AA12BB3456CCDD")); + ffStrbufDestroy(&strbuf); + + // smallest allocation test + { + FF_STRBUF_AUTO_DESTROY strbuf1 = ffStrbufCreateA(10); + VERIFY(strbuf1.allocated == 10); + ffStrbufEnsureFree(&strbuf1, 16); + VERIFY(strbuf1.allocated == 32); + + FF_STRBUF_AUTO_DESTROY strbuf2 = ffStrbufCreate(); + VERIFY(strbuf2.allocated == 0); + ffStrbufEnsureFree(&strbuf2, 16); + VERIFY(strbuf2.allocated == 32); + } + + { + int i = 0; + char* lineptr = NULL; + size_t n = 0; + const char* text = "Processor\t: ARMv7\nprocessor\t: 0\nBogoMIPS\t: 38.00\n\nprocessor\t: 1\nBogoMIPS\t: 38.00"; + ffStrbufSetS(&strbuf, text); + + while (ffStrbufGetline(&lineptr, &n, &strbuf)) { + ++i; + switch (i) { + case 1: + VERIFY(strcmp(lineptr, "Processor\t: ARMv7") == 0); + VERIFY(n == strlen("Processor\t: ARMv7")); + break; + case 2: + VERIFY(strcmp(lineptr, "processor\t: 0") == 0); + VERIFY(n == strlen("processor\t: 0")); + break; + case 3: + VERIFY(strcmp(lineptr, "BogoMIPS\t: 38.00") == 0); + VERIFY(n == strlen("BogoMIPS\t: 38.00")); + break; + case 4: + VERIFY(strcmp(lineptr, "") == 0); + VERIFY(n == 0); + break; + case 5: + VERIFY(strcmp(lineptr, "processor\t: 1") == 0); + VERIFY(n == strlen("processor\t: 1")); + break; + case 6: + VERIFY(strcmp(lineptr, "BogoMIPS\t: 38.00") == 0); + VERIFY(n == strlen("BogoMIPS\t: 38.00")); + break; + default: + VERIFY(false); + break; + } + } + VERIFY(ffStrbufEqualS(&strbuf, text)); + VERIFY(*lineptr == '\0'); + VERIFY(i == 6); + + lineptr = NULL; + n = 0; + i = 0; + text = "\n"; + ffStrbufSetS(&strbuf, text); + while (ffStrbufGetline(&lineptr, &n, &strbuf)) { + ++i; + switch (i) { + case 1: + VERIFY(strcmp(lineptr, "") == 0); + VERIFY(n == 0); + break; + default: + VERIFY(false); + break; + } + } + VERIFY(ffStrbufEqualS(&strbuf, text)); + VERIFY(*lineptr == '\0'); + VERIFY(i == 1); + + lineptr = NULL; + n = 0; + i = 0; + text = "abcd"; + ffStrbufSetS(&strbuf, text); + while (ffStrbufGetline(&lineptr, &n, &strbuf)) { + ++i; + switch (i) { + case 1: + VERIFY(strcmp(lineptr, "abcd") == 0); + VERIFY(n == strlen("abcd")); + break; + default: + VERIFY(false); + break; + } + } + VERIFY(ffStrbufEqualS(&strbuf, text)); + VERIFY(*lineptr == '\0'); + VERIFY(i == 1); + + lineptr = NULL; + n = 0; + i = 0; + text = ""; + ffStrbufSetS(&strbuf, text); + while (ffStrbufGetline(&lineptr, &n, &strbuf)) { + ++i; + VERIFY(false); + } + + VERIFY(ffStrbufEqualS(&strbuf, text)); + VERIFY(*lineptr == '\0'); + VERIFY(i == 0); + } + + ffStrbufSetS(&strbuf, "Hello World"); + VERIFY(ffStrbufRemoveDupWhitespaces(&strbuf) == false); + VERIFY(strcmp(strbuf.chars, "Hello World") == 0); + + ffStrbufSetS(&strbuf, "Hello World"); + VERIFY(ffStrbufRemoveDupWhitespaces(&strbuf) == true); + VERIFY(strcmp(strbuf.chars, "Hello World") == 0); + + ffStrbufSetS(&strbuf, " Hello World "); + VERIFY(ffStrbufRemoveDupWhitespaces(&strbuf) == true); + VERIFY(strcmp(strbuf.chars, " Hello World ") == 0); + + ffStrbufSetS(&strbuf, " Hello World "); + VERIFY(ffStrbufRemoveDupWhitespaces(&strbuf) == true); + VERIFY(strcmp(strbuf.chars, " Hello World ") == 0); + + ffStrbufSetS(&strbuf, " "); + VERIFY(ffStrbufRemoveDupWhitespaces(&strbuf) == true); + VERIFY(strcmp(strbuf.chars, " ") == 0); + + ffStrbufClear(&strbuf); + VERIFY(ffStrbufRemoveDupWhitespaces(&strbuf) == false); + VERIFY(strcmp(strbuf.chars, "") == 0); + + ffStrbufSetStatic(&strbuf, " "); + VERIFY(ffStrbufRemoveDupWhitespaces(&strbuf) == false); + VERIFY(strcmp(strbuf.chars, " ") == 0); + + { + ffStrbufSetStatic(&strbuf, "abcdef"); + FF_STRBUF_AUTO_DESTROY newStr = ffStrbufCreateCopy(&strbuf); + VERIFY(newStr.allocated == 0); + VERIFY(newStr.chars == strbuf.chars); + } + + { + ffStrbufSetStatic(&strbuf, "abcdef"); + FF_STRBUF_AUTO_DESTROY newStr = ffStrbufCreateS("123456"); + ffStrbufSet(&newStr, &strbuf); + VERIFY(newStr.allocated == 0); + VERIFY(newStr.chars == strbuf.chars); + VERIFY(ffStrbufEqualS(&newStr, "abcdef")); + } + + { + ffStrbufClear(&strbuf); + FF_STRBUF_AUTO_DESTROY newStr = ffStrbufCreateS("123456"); + uint32_t oldAlloc = newStr.allocated; + VERIFY(oldAlloc > newStr.length); + ffStrbufSet(&newStr, &strbuf); + VERIFY(newStr.allocated == oldAlloc); + VERIFY(newStr.chars != strbuf.chars); + VERIFY(ffStrbufEqualS(&newStr, "")); + } + + { + ffStrbufSetStatic(&strbuf, "abcdefghijkl"); + FF_STRBUF_AUTO_DESTROY newStr = ffStrbufCreateS("123456"); + ffStrbufSet(&newStr, &strbuf); + VERIFY(newStr.allocated == 0); + VERIFY(newStr.chars == strbuf.chars); + VERIFY(ffStrbufEqualS(&newStr, "abcdefghijkl")); + } + + { + ffStrbufClear(&strbuf); + FF_STRBUF_AUTO_DESTROY newStr = ffStrbufCreateCopy(&strbuf); + VERIFY(newStr.allocated == 0); + VERIFY(newStr.chars == strbuf.chars); + VERIFY(newStr.chars[0] == '\0'); + } + + { + ffStrbufClear(&strbuf); + FF_STRBUF_AUTO_DESTROY newStr = ffStrbufCreateS("123456"); + ffStrbufSet(&newStr, &strbuf); + VERIFY(newStr.allocated > 0); + VERIFY(newStr.chars != strbuf.chars); + VERIFY(ffStrbufEqualS(&newStr, "")); + } + + { + ffStrbufSetStatic(&strbuf, "abc"); + VERIFY(ffStrbufMatchSeparatedS(&strbuf, "abc:def:ghi", ' ') == false); + VERIFY(ffStrbufMatchSeparatedS(&strbuf, "abc:def:ghi", ':') == true); + VERIFY(ffStrbufMatchSeparatedS(&strbuf, "def:ghi", ' ') == false); + VERIFY(ffStrbufMatchSeparatedS(&strbuf, "def:ghi", ':') == false); + VERIFY(ffStrbufMatchSeparatedS(&strbuf, "def", ':') == false); + VERIFY(ffStrbufMatchSeparatedS(&strbuf, "abc", ':') == true); + VERIFY(ffStrbufMatchSeparatedS(&strbuf, "", ' ') == false); + VERIFY(ffStrbufMatchSeparatedS(&strbuf, ":abc:", ':') == true); + VERIFY(ffStrbufMatchSeparatedS(&strbuf, "abc:", ':') == true); + VERIFY(ffStrbufMatchSeparatedS(&strbuf, ":abc", ':') == true); + VERIFY(ffStrbufMatchSeparatedS(&strbuf, ":ABC", ':') == false); + VERIFY(ffStrbufMatchSeparatedS(&strbuf, ":abcdef", ':') == false); + } + + { + ffStrbufSetStatic(&strbuf, "ABC"); + VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, "abc:def:ghi", ' ') == false); + VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, "abc:def:ghi", ':') == true); + VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, "def:ghi", ' ') == false); + VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, "def:ghi", ':') == false); + VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, "def", ':') == false); + VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, "abc", ':') == true); + VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, "", ' ') == false); + VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, ":abc:", ':') == true); + VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, "abc:", ':') == true); + VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, ":abc", ':') == true); + VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, ":ABC", ':') == true); + VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, ":abcdef", ':') == false); + } + + { + ffStrbufSetStatic(&strbuf, "abc:def:ghi"); + VERIFY(ffStrbufSeparatedContainS(&strbuf, "abc", ' ') == false); + VERIFY(ffStrbufSeparatedContainS(&strbuf, "abc", ':') == true); + VERIFY(ffStrbufSeparatedContainS(&strbuf, "def", ' ') == false); + VERIFY(ffStrbufSeparatedContainS(&strbuf, "def", ':') == true); + VERIFY(ffStrbufSeparatedContainS(&strbuf, "DEF", ':') == false); + VERIFY(ffStrbufSeparatedContainS(&strbuf, "a", ':') == false); + VERIFY(ffStrbufSeparatedContainS(&strbuf, "e", ':') == false); + VERIFY(ffStrbufSeparatedContainS(&strbuf, "i", ':') == false); + } + + { + ffStrbufSetStatic(&strbuf, "ABC:DEF:GHI"); + VERIFY(ffStrbufSeparatedContainIgnCaseS(&strbuf, "abc", ' ') == false); + VERIFY(ffStrbufSeparatedContainIgnCaseS(&strbuf, "abc", ':') == true); + VERIFY(ffStrbufSeparatedContainIgnCaseS(&strbuf, "def", ' ') == false); + VERIFY(ffStrbufSeparatedContainIgnCaseS(&strbuf, "def", ':') == true); + VERIFY(ffStrbufSeparatedContainIgnCaseS(&strbuf, "DEF", ':') == true); + VERIFY(ffStrbufSeparatedContainIgnCaseS(&strbuf, "a", ':') == false); + VERIFY(ffStrbufSeparatedContainIgnCaseS(&strbuf, "e", ':') == false); + VERIFY(ffStrbufSeparatedContainIgnCaseS(&strbuf, "i", ':') == false); + } + + { + ffStrbufSetStatic(&strbuf, "abc"); + ffStrbufSubstr(&strbuf, 0, 1); // start, end + VERIFY(ffStrbufEqualS(&strbuf, "a")); + + ffStrbufSetStatic(&strbuf, "abc"); + ffStrbufSubstr(&strbuf, 1, 1); + VERIFY(ffStrbufEqualS(&strbuf, "")); + + ffStrbufSetStatic(&strbuf, "abc"); + ffStrbufSubstr(&strbuf, 2, 1); + VERIFY(ffStrbufEqualS(&strbuf, "")); + + ffStrbufSetStatic(&strbuf, "abc"); + ffStrbufSubstr(&strbuf, 2, 3); + VERIFY(ffStrbufEqualS(&strbuf, "c")); + + ffStrbufSetStatic(&strbuf, "abc"); + ffStrbufSubstr(&strbuf, 0, 3); + VERIFY(ffStrbufEqualS(&strbuf, "abc")); + } + + { + ffStrbufSetS(&strbuf, "abc"); + ffStrbufSubstr(&strbuf, 0, 1); // start, end + VERIFY(ffStrbufEqualS(&strbuf, "a")); + + ffStrbufSetS(&strbuf, "abc"); + ffStrbufSubstr(&strbuf, 1, 1); + VERIFY(ffStrbufEqualS(&strbuf, "")); + + ffStrbufSetS(&strbuf, "abc"); + ffStrbufSubstr(&strbuf, 2, 1); + VERIFY(ffStrbufEqualS(&strbuf, "")); + + ffStrbufSetS(&strbuf, "abc"); + ffStrbufSubstr(&strbuf, 2, 3); + VERIFY(ffStrbufEqualS(&strbuf, "c")); + + ffStrbufSetS(&strbuf, "abc"); + ffStrbufSubstr(&strbuf, 0, 3); + VERIFY(ffStrbufEqualS(&strbuf, "abc")); + + ffStrbufDestroy(&strbuf); + } + + { + ffStrbufAppendUtf32CodePoint(&strbuf, 0x6587); + ffStrbufAppendUtf32CodePoint(&strbuf, 0x6cc9); + ffStrbufAppendUtf32CodePoint(&strbuf, 0x9a7f); + VERIFY(ffStrbufEqualS(&strbuf, u8"文泉驿")); + + ffStrbufDestroy(&strbuf); + } + + { + ffStrbufAppendSInt(&strbuf, 1234567890); + VERIFY(ffStrbufEqualS(&strbuf, "1234567890")); + + ffStrbufClear(&strbuf); + ffStrbufAppendSInt(&strbuf, -1234567890); + VERIFY(ffStrbufEqualS(&strbuf, "-1234567890")); + + ffStrbufClear(&strbuf); + ffStrbufAppendSInt(&strbuf, 0); + VERIFY(ffStrbufEqualS(&strbuf, "0")); + + ffStrbufClear(&strbuf); + ffStrbufAppendUInt(&strbuf, 1234567890); + VERIFY(ffStrbufEqualS(&strbuf, "1234567890")); + + ffStrbufClear(&strbuf); + ffStrbufAppendUInt(&strbuf, 0); + VERIFY(ffStrbufEqualS(&strbuf, "0")); + + ffStrbufDestroy(&strbuf); + } + + { + ffStrbufAppendDouble(&strbuf, 120.0, 0, true); + VERIFY(ffStrbufEqualS(&strbuf, "120")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.0, 1, true); + VERIFY(ffStrbufEqualS(&strbuf, "120.0")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.0, 5, true); + VERIFY(ffStrbufEqualS(&strbuf, "120.00000")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.123456789, 5, true); + VERIFY(ffStrbufEqualS(&strbuf, "120.12346")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.888888, 0, true); + VERIFY(ffStrbufEqualS(&strbuf, "121")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.999999, 2, true); + VERIFY(ffStrbufEqualS(&strbuf, "121.00")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.123456789, 0, true); + VERIFY(ffStrbufEqualS(&strbuf, "120")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.123456789, -1, true); + VERIFY(ffStrbufEqualS(&strbuf, "120.123456789")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.123, 5, true); + VERIFY(ffStrbufEqualS(&strbuf, "120.12300")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.0, 0, true); + VERIFY(ffStrbufEqualS(&strbuf, "-120")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.0, 1, true); + VERIFY(ffStrbufEqualS(&strbuf, "-120.0")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.0, 5, true); + VERIFY(ffStrbufEqualS(&strbuf, "-120.00000")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.123456789, 5, true); + VERIFY(ffStrbufEqualS(&strbuf, "-120.12346")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.123456789, 0, true); + VERIFY(ffStrbufEqualS(&strbuf, "-120")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.123456789, -1, true); + VERIFY(ffStrbufEqualS(&strbuf, "-120.123456789")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.123, 5, true); + VERIFY(ffStrbufEqualS(&strbuf, "-120.12300")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.888888, 0, true); + VERIFY(ffStrbufEqualS(&strbuf, "-121")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.999999, 2, true); + VERIFY(ffStrbufEqualS(&strbuf, "-121.00")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 1.2345e50, 1, true); + VERIFY(ffStrbufEqualS(&strbuf, "1.2345e50")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -1.2345e50, 1, true); + VERIFY(ffStrbufEqualS(&strbuf, "-1.2345e50")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 1.2345e50, 0, true); + VERIFY(ffStrbufEqualS(&strbuf, "1.2345e50")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -1.2345e50, 0, true); + VERIFY(ffStrbufEqualS(&strbuf, "-1.2345e50")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 1.2345e50, -1, true); + VERIFY(ffStrbufEqualS(&strbuf, "1.2345e50")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -1.2345e50, -1, true); + VERIFY(ffStrbufEqualS(&strbuf, "-1.2345e50")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 1.2345e20, 1, true); + VERIFY(ffStrbufEqualS(&strbuf, "123450000000000000000.0")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -1.2345e20, 1, true); + VERIFY(ffStrbufEqualS(&strbuf, "-123450000000000000000.0")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, +0.0, 0, true); + VERIFY(ffStrbufEqualS(&strbuf, "0")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -0.0, 0, true); + VERIFY(ffStrbufEqualS(&strbuf, "-0")); + + ffStrbufDestroy(&strbuf); + } + + { + ffStrbufAppendDouble(&strbuf, 120.0, 0, false); + VERIFY(ffStrbufEqualS(&strbuf, "120")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.0, 1, false); + VERIFY(ffStrbufEqualS(&strbuf, "120")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.0, 5, false); + VERIFY(ffStrbufEqualS(&strbuf, "120")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.123456789, 5, false); + VERIFY(ffStrbufEqualS(&strbuf, "120.12346")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.888888, 0, false); + VERIFY(ffStrbufEqualS(&strbuf, "121")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.999999, 2, false); + VERIFY(ffStrbufEqualS(&strbuf, "121")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.123456789, 0, false); + VERIFY(ffStrbufEqualS(&strbuf, "120")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.123456789, -1, false); + VERIFY(ffStrbufEqualS(&strbuf, "120.123456789")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.123, 5, false); + VERIFY(ffStrbufEqualS(&strbuf, "120.123")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.0, 0, false); + VERIFY(ffStrbufEqualS(&strbuf, "-120")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.0, 1, false); + VERIFY(ffStrbufEqualS(&strbuf, "-120")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.0, 5, false); + VERIFY(ffStrbufEqualS(&strbuf, "-120")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.123456789, 5, false); + VERIFY(ffStrbufEqualS(&strbuf, "-120.12346")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.123456789, 0, false); + VERIFY(ffStrbufEqualS(&strbuf, "-120")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.123456789, -1, false); + VERIFY(ffStrbufEqualS(&strbuf, "-120.123456789")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.123, 5, false); + VERIFY(ffStrbufEqualS(&strbuf, "-120.123")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.888888, 0, false); + VERIFY(ffStrbufEqualS(&strbuf, "-121")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.999999, 2, false); + VERIFY(ffStrbufEqualS(&strbuf, "-121")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 1.2345e50, 1, false); + VERIFY(ffStrbufEqualS(&strbuf, "1.2345e50")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -1.2345e50, 1, false); + VERIFY(ffStrbufEqualS(&strbuf, "-1.2345e50")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 1.2345e50, 0, false); + VERIFY(ffStrbufEqualS(&strbuf, "1.2345e50")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -1.2345e50, 0, false); + VERIFY(ffStrbufEqualS(&strbuf, "-1.2345e50")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 1.2345e50, -1, false); + VERIFY(ffStrbufEqualS(&strbuf, "1.2345e50")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -1.2345e50, -1, false); + VERIFY(ffStrbufEqualS(&strbuf, "-1.2345e50")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 1.2345e20, 1, false); + VERIFY(ffStrbufEqualS(&strbuf, "123450000000000000000")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -1.2345e20, 1, false); + VERIFY(ffStrbufEqualS(&strbuf, "-123450000000000000000")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, +0.0, 0, false); + VERIFY(ffStrbufEqualS(&strbuf, "0")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -0.0, 0, false); + VERIFY(ffStrbufEqualS(&strbuf, "-0")); + + ffStrbufDestroy(&strbuf); + } + + // decode hex escape sequences + { + ffStrbufSetS(&strbuf, "Basic\\x20data\\x20partition"); + VERIFY(ffStrbufDecodeHexEscapeSequences(&strbuf) == true); + VERIFY(ffStrbufEqualS(&strbuf, "Basic data partition")); + + ffStrbufSetS(&strbuf, "\\x41\\x42\\x43"); + VERIFY(ffStrbufDecodeHexEscapeSequences(&strbuf) == true); + VERIFY(ffStrbufEqualS(&strbuf, "ABC")); + + ffStrbufSetS(&strbuf, "abc\\x4"); + VERIFY(ffStrbufDecodeHexEscapeSequences(&strbuf) == false); + VERIFY(ffStrbufEqualS(&strbuf, "abc\\x4")); + + ffStrbufSetS(&strbuf, "abc\\xZZ"); + VERIFY(ffStrbufDecodeHexEscapeSequences(&strbuf) == false); + VERIFY(ffStrbufEqualS(&strbuf, "abc\\xZZ")); + + ffStrbufSetS(&strbuf, "abc\\x2G"); + VERIFY(ffStrbufDecodeHexEscapeSequences(&strbuf) == false); + VERIFY(ffStrbufEqualS(&strbuf, "abc\\x2G")); + } + + // setS + ffStrbufInitStatic(&strbuf, "STATIC"); + ffStrbufSetS(&strbuf, "DYNAMIC"); + VERIFY(ffStrbufEqualS(&strbuf, "DYNAMIC")); + VERIFY(strbuf.allocated > 0); + ffStrbufDestroy(&strbuf); + + ffStrbufInit(&strbuf); + ffStrbufSetS(&strbuf, ""); + VERIFY(ffStrbufEqualS(&strbuf, "")); + VERIFY(strbuf.allocated == 0); + ffStrbufDestroy(&strbuf); + + ffStrbufInitStatic(&strbuf, "STATIC"); + ffStrbufSetS(&strbuf, ""); + VERIFY(ffStrbufEqualS(&strbuf, "")); + VERIFY(strbuf.allocated == 0); + ffStrbufDestroy(&strbuf); + + ffStrbufInitStatic(&strbuf, "STATIC"); + ffStrbufSetStatic(&strbuf, ""); + VERIFY(ffStrbufEqualS(&strbuf, "")); + VERIFY(strbuf.allocated == 0); + ffStrbufDestroy(&strbuf); + + ffStrbufInitS(&strbuf, "DYNAMIC"); + ffStrbufSetStatic(&strbuf, ""); + VERIFY(ffStrbufEqualS(&strbuf, "")); + VERIFY(strbuf.allocated == 0); + ffStrbufDestroy(&strbuf); + + ffStrbufInitS(&strbuf, "DYNAMIC"); + ffStrbufSetS(&strbuf, "ANOTHER DYNAMIC"); + VERIFY(ffStrbufEqualS(&strbuf, "ANOTHER DYNAMIC")); + VERIFY(strbuf.allocated > 0); + ffStrbufDestroy(&strbuf); + + ffStrbufInit(&strbuf); + ffStrbufSetStatic(&strbuf, ""); + VERIFY(ffStrbufEqualS(&strbuf, "")); + VERIFY(strbuf.allocated == 0); + ffStrbufDestroy(&strbuf); + + // set + ffStrbufInitStatic(&strbuf, "STATIC"); + { + FF_STRBUF_AUTO_DESTROY other = ffStrbufCreateS("DYNAMIC"); + ffStrbufSet(&strbuf, &other); + } + VERIFY(ffStrbufEqualS(&strbuf, "DYNAMIC")); + VERIFY(strbuf.allocated > 0); + ffStrbufDestroy(&strbuf); + + ffStrbufInit(&strbuf); + { + FF_STRBUF_AUTO_DESTROY other = ffStrbufCreateS(""); + ffStrbufSet(&strbuf, &other); + } + VERIFY(ffStrbufEqualS(&strbuf, "")); + VERIFY(strbuf.allocated == 0); + ffStrbufDestroy(&strbuf); + + ffStrbufInitStatic(&strbuf, "STATIC"); + { + FF_STRBUF_AUTO_DESTROY other = ffStrbufCreateS(""); + ffStrbufSet(&strbuf, &other); + } + VERIFY(ffStrbufEqualS(&strbuf, "")); + VERIFY(strbuf.allocated == 0); + ffStrbufDestroy(&strbuf); + + ffStrbufInitS(&strbuf, "DYNAMIC"); + { + FF_STRBUF_AUTO_DESTROY other = ffStrbufCreateS(""); + ffStrbufSet(&strbuf, &other); + } + VERIFY(ffStrbufEqualS(&strbuf, "")); + VERIFY(strbuf.allocated > 0); + ffStrbufDestroy(&strbuf); + + ffStrbufInitS(&strbuf, "DYNAMIC"); + { + FF_STRBUF_AUTO_DESTROY other = ffStrbufCreateStatic("STATIC"); + ffStrbufSet(&strbuf, &other); + } + VERIFY(ffStrbufEqualS(&strbuf, "STATIC")); + VERIFY(strbuf.allocated == 0); + ffStrbufDestroy(&strbuf); + + // Success + puts("\e[32mAll tests passed!" FASTFETCH_TEXT_MODIFIER_RESET); +} -- cgit v1.2.3