2 * CUnit - A Unit testing framework library for C.
3 * Copyright (C) 2001 Anil Kumar
5 * This library is open source software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
21 #include "stringbuf_test.h"
22 #define SHOW_ME_VAPPEND_PRINTF
23 #include "../lib/libcitadel.h"
27 * Stolen from wc_printf; we need to test that other printf too...
29 static void TEST_StrBufAppendPrintf(StrBuf *WBuf, const char *format,...)
36 va_start(arg_ptr, format);
37 StrBufVAppendPrintf(WBuf, format, arg_ptr);
41 static void TestRevalidateStrBuf(StrBuf *Buf)
43 CU_ASSERT(strlen(ChrPtr(Buf)) == StrLength(Buf));
47 static void TestCreateBuf(void)
55 CU_ASSERT(Buf != NULL);
58 Buf = NewStrBufPlain(ChrPtr(NULL), StrLength(NULL));
59 CU_ASSERT(Buf != NULL);
62 /* make it alloc a bigger buffer... */
63 Buf = NewStrBufPlain(NULL, SIZ);
64 CU_ASSERT(Buf != NULL);
68 Buf = NewStrBufDup(NULL);
69 CU_ASSERT(Buf != NULL);
70 StrBufPlain(Buf, "abc", -1);
71 TestRevalidateStrBuf(Buf);
72 StrBufPlain(Buf, HKEY("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"));
73 TestRevalidateStrBuf(Buf);
79 CU_ASSERT(Buf == NULL);
80 Buf = NewStrBufPlain(HKEY("ABC"));
81 TestRevalidateStrBuf(Buf);
82 CU_ASSERT(StrLength(Buf) == 3);
83 CU_ASSERT_NSTRING_EQUAL("ABC", ChrPtr(Buf), 3);
86 for (i=0; i< 500; i ++)
88 StrBufAppendBufPlain(Buf, HKEY("ABC"), 0);
90 CU_ASSERT(StrLength(Buf) == len);
92 StrBufShrinkToFit(Buf, 1);
94 CU_ASSERT(StrLength(Buf) == 0);
95 ReAdjustEmptyBuf(Buf, 1, 1);
96 TestRevalidateStrBuf(Buf);
98 CU_ASSERT(Buf == NULL);
100 Buf = NewStrBufPlain(HKEY("ABC"));
101 TestRevalidateStrBuf(Buf);
102 len = StrLength(Buf);
103 for (i=0; i< 500; i ++)
105 StrBufAppendPrintf(Buf, "%s", "ABC");
107 CU_ASSERT(StrLength(Buf) == len);
109 TestRevalidateStrBuf(Buf);
110 StrBufShrinkToFit(Buf, 1);
111 TestRevalidateStrBuf(Buf);
115 Buf = NewStrBufPlain(HKEY("ABC"));
116 Buf2 = NewStrBufPlain(HKEY("------"));
117 TestRevalidateStrBuf(Buf);
118 len = StrLength(Buf);
119 for (i=0; i< 50; i ++)
121 StrBufPrintf(Buf, "%s", ChrPtr(Buf2));
122 CU_ASSERT(StrLength(Buf) == StrLength(Buf2));
124 StrBufAppendBufPlain(Buf2, HKEY("ABCDEFG"), 0);
126 TestRevalidateStrBuf(Buf);
127 StrBufShrinkToFit(Buf, 1);
128 TestRevalidateStrBuf(Buf);
133 Buf = NewStrBufPlain(HKEY("ABC"));
134 TestRevalidateStrBuf(Buf);
135 len = StrLength(Buf);
136 for (i=0; i< 500; i ++)
138 TEST_StrBufAppendPrintf(Buf, "%s", "ABC");
140 CU_ASSERT(StrLength(Buf) == len);
142 TestRevalidateStrBuf(Buf);
143 StrBufShrinkToFit(Buf, 1);
144 TestRevalidateStrBuf(Buf);
147 Buf2 = NewStrBufDup(Buf);
148 CU_ASSERT(StrLength(Buf) == StrLength(Buf2));
150 CU_ASSERT_NSTRING_EQUAL(ChrPtr(Buf2), ChrPtr(Buf), StrLength(Buf2));
152 CU_ASSERT(StrBufIsNumber(Buf) == 0);
155 CU_ASSERT(StrLength(Buf2) == 0);
158 CU_ASSERT(StrLength(Buf) == 0);
162 CU_ASSERT(Buf2 != NULL);
165 CU_ASSERT(Buf == NULL);
172 static void TestBufNumbers(void)
181 Buf3 = NewStrBufPlain(HKEY("abcd"));
182 Buf = NewStrBufPlain(HKEY("123456"));
183 CU_ASSERT(StrBufIsNumber(Buf) == 1);
184 CU_ASSERT(StrBufIsNumber(NULL) == 0);
185 CU_ASSERT(StrBufIsNumber(Buf2) == 0);
186 CU_ASSERT(StrBufIsNumber(Buf3) == 0);
188 CU_ASSERT(StrTol(Buf) == 123456);
189 CU_ASSERT(StrTol(NULL) == 0);
190 CU_ASSERT(StrTol(Buf2) == 0);
192 CU_ASSERT(StrToi(Buf) == 123456);
193 CU_ASSERT(StrToi(NULL) == 0);
194 CU_ASSERT(StrToi(Buf2) == 0);
195 ch = SmashStrBuf(NULL);
196 CU_ASSERT(ch == NULL);
198 ch = SmashStrBuf(&Buf);
199 CU_ASSERT(strlen(ch) == i);
205 static void TestStrBufPeek(void)
210 Buf = NewStrBufPlain(HKEY("0123456"));
213 CU_ASSERT(StrBufPeek(NULL, pch + 4, -1, 'A') == -1);
215 CU_ASSERT(StrBufPeek(Buf, pch + 4, -1, 'A') == 4);
216 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf), "0123A56");
218 CU_ASSERT(StrBufPeek(Buf, pch - 1, -1, 'A') == -1);
219 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf), "0123A56");
221 CU_ASSERT(StrBufPeek(Buf, pch + 10, -1, 'A') == -1);
222 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf), "0123A56");
224 CU_ASSERT(StrBufPeek(Buf, NULL, -1, 'A') == -1);
225 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf), "0123A56");
227 CU_ASSERT(StrBufPeek(Buf, NULL, 10, 'A') == -1);
228 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf), "0123A56");
230 CU_ASSERT(StrBufPeek(Buf, NULL, 5, 'A') == 5);
231 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf), "0123AA6");
235 static void TestBufStringManipulation(void)
238 StrBuf *dest = NewStrBuf ();
239 StrBuf *Buf = NewStrBufPlain(HKEY("1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"));
241 StrBufSub(dest, Buf, -5, i);
242 len = StrLength(Buf);
243 for (i = 0; i < len + 10; i++)
245 StrBufSub(dest, Buf, 5, i);
248 CU_ASSERT(StrLength(dest) == i);
252 CU_ASSERT(StrLength(dest) == len - 5);
257 StrBufSub(dest, Buf, -5, 200);
259 StrBufCutLeft(Buf, 5);
260 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf),"67890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890");
261 CU_ASSERT(StrLength(Buf) == 95);
263 StrBufCutRight(Buf, 5);
264 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf),"678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345");
265 CU_ASSERT(StrLength(Buf) == 90);
267 StrBufCutAt(Buf, 80, NULL);
268 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf),"67890123456789012345678901234567890123456789012345678901234567890123456789012345");
269 CU_ASSERT(StrLength(Buf) == 80);
271 StrBufCutAt(Buf, -1, ChrPtr(Buf) + 70);
272 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf),"6789012345678901234567890123456789012345678901234567890123456789012345");
273 CU_ASSERT(StrLength(Buf) == 70);
276 StrBufCutAt(Buf, 0, ChrPtr(Buf) + 60);
277 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf),"678901234567890123456789012345678901234567890123456789012345");
278 CU_ASSERT(StrLength(Buf) == 60);
280 StrBufCutAt(Buf, 0, ChrPtr(Buf) + 70);
281 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf),"678901234567890123456789012345678901234567890123456789012345");
282 CU_ASSERT(StrLength(Buf) == 60);
284 StrBufCutAt(Buf, 70, NULL);
285 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf),"678901234567890123456789012345678901234567890123456789012345");
286 CU_ASSERT(StrLength(Buf) == 60);
289 StrBufCutLeft(Buf, 70);
290 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf),"");
291 CU_ASSERT(StrLength(Buf) == 0);
293 StrBufPlain(Buf, HKEY("678901234567890123456789012345678901234567890123456789012345"));
294 StrBufCutRight(Buf, 70);
295 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf),"");
296 CU_ASSERT(StrLength(Buf) == 0);
301 Buf = NewStrBufPlain(HKEY(" \tabc\t "));
303 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf),"abc");
304 CU_ASSERT(StrLength(Buf) == 3);
309 StrBufPlain(Buf, HKEY("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"));
312 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf), "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
315 StrBufLowerCase(NULL);
317 StrBufLowerCase(Buf);
318 StrBufPlain(Buf, HKEY("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"));
319 StrBufLowerCase(Buf);
321 CU_ASSERT_STRING_EQUAL(ChrPtr(Buf), "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789");
328 static void NextTokenizerIterateBuf(StrBuf *Buf, int NTokens)
331 const char *pCh = NULL;
333 long CountTokens = 0;
334 long HaveNextToken = 0;
335 long HaveNextTokenF = 0;
337 TestRevalidateStrBuf(Buf);
338 FoundTokens = StrBufNum_tokens(Buf, ',');
340 printf("\n\nTemplate: >%s< %d, %ld\n",
345 CU_ASSERT(FoundTokens == NTokens);
348 while (HaveNextToken = StrBufHaveNextToken(Buf, &pCh),
349 HaveNextTokenF = StrBufExtract_NextToken(Buf2, Buf, &pCh, ','),
350 (HaveNextTokenF>= 0))
354 if (!Quiet) printf("Token: >%s< >%s< %ld:%ld\n",
356 ((pCh != NULL) && (pCh != StrBufNOTNULL))? pCh : "N/A",
359 TestRevalidateStrBuf(Buf2);
361 CU_ASSERT(HaveNextToken == (HaveNextTokenF >= 0));
363 CU_ASSERT(CountTokens <= NTokens);
365 CU_ASSERT(HaveNextToken == (HaveNextTokenF >= 0));
371 static void TestNextTokenizer_EndWithEmpty(void)
375 Buf = NewStrBufPlain(HKEY("abc,abc, 1, ,,"));
376 NextTokenizerIterateBuf(Buf, 6);
380 static void TestNextTokenizer_StartWithEmpty(void)
384 Buf = NewStrBufPlain(HKEY(",cde,abc, 1, ,,bbb"));
385 NextTokenizerIterateBuf(Buf, 7);
389 static void TestNextTokenizer_Empty(void)
393 Buf = NewStrBufPlain(HKEY(""));
394 NextTokenizerIterateBuf(Buf, 0);
398 static void TestNextTokenizer_TwoEmpty(void)
402 Buf = NewStrBufPlain(HKEY(","));
403 NextTokenizerIterateBuf(Buf, 2);
407 static void TestNextTokenizer_One(void)
411 Buf = NewStrBufPlain(HKEY("one"));
412 NextTokenizerIterateBuf(Buf, 1);
416 static void TestNextTokenizer_Sequence(void)
419 char *teststring = "40:24524,24662,24673,27869:27935,28393,28426,31247:31258,31731,31749,31761,31778,31782,31801:31803,31813,31904,31915,33708,33935,34619,34672,34720:34723,34766,34835,37594,38854,39235,39942,40030,40142,40520,40815,40907,41201,41578,41781,41954,42292,43110,43565,43801,43998,44180,44241,44295,44401,44561,44635,44798,44861,44946,45022,45137:45148,45166,45179,45707,47114,47141:47157,47194,47314,47349,47386,47489,47496,47534:47543,54460,54601,54637:54652";
420 Buf = NewStrBufPlain(teststring, -1);
421 NextTokenizerIterateBuf(Buf, 67);
427 static void NextLineterateBuf(StrBuf *Buf, int NLines)
430 const char *pCh = NULL;
432 StrBuf *ConcatenatedLines;
433 long CountTokens = 0;
435 TestRevalidateStrBuf(Buf);
437 OneLine = NewStrBuf();
438 ConcatenatedLines = NewStrBuf();
440 if (!Quiet) printf("\n");
442 if (StrLength(Buf) > 0)
445 n = StrBufSipLine(OneLine, Buf, &pCh);
449 if (!Quiet) printf("Line: >%s< >%s<\n",
451 ((pCh != NULL) && (pCh != StrBufNOTNULL))? pCh : "N/A");
452 TestRevalidateStrBuf(OneLine);
453 CU_ASSERT(CountTokens <= NLines);
454 StrBufAppendBuf(ConcatenatedLines, OneLine, 0);
456 if ((pCh == StrBufNOTNULL) &&
457 (*(ChrPtr(Buf) + StrLength(Buf) - 1) != '\n'))
461 StrBufAppendBufPlain(ConcatenatedLines, HKEY("\n"), 0);
464 while ((pCh != StrBufNOTNULL) &&
468 if (!Quiet) printf("\n\nTemplate: >%s<\n", ChrPtr(Buf));
469 if (!Quiet) printf("\n\nAfter: >%s<\n", ChrPtr(ConcatenatedLines));
470 CU_ASSERT_NSTRING_EQUAL(ChrPtr(ConcatenatedLines),
474 FreeStrBuf(&OneLine);
475 FreeStrBuf(&ConcatenatedLines);
479 static void TestNextLine_Empty(void)
483 Buf = NewStrBufPlain(HKEY(""));
484 NextLineterateBuf(Buf, 0);
489 static void TestNextLine_OneLine(void)
493 Buf = NewStrBufPlain(HKEY("abc\n"));
494 NextLineterateBuf(Buf, 1);
499 static void TestNextLine_TwoLinesMissingCR(void)
503 Buf = NewStrBufPlain(HKEY("abc\ncde"));
504 NextLineterateBuf(Buf, 2);
509 static void TestNextLine_twolines(void)
513 Buf = NewStrBufPlain(HKEY("abc\ncde\n"));
514 NextLineterateBuf(Buf, 2);
518 static void TestNextLine_LongLine(void)
522 Buf = NewStrBufPlain(HKEY("abcde\n1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n"));
523 NextLineterateBuf(Buf, 2);
528 static void TestStrBufRemove_token_NotThere(void)
530 // StrBuf *Test = NewStrBufPlain(HKEY(" 127.0.0.1"));
531 StrBuf *Test = NewStrBufPlain(HKEY(" 10.122.44.30, 10.122.44.30"));
532 StrBufRemove_token(Test, 0, ',');
533 TestRevalidateStrBuf(Test);
538 static void TestStrBufUrlescAppend(void)
540 const char *expect = "%20%2B%23%26%3B%60%27%7C%2A%3F%2D%7E%3C%3E%5E%28%29%5B%5D%7B%7D%2F%24%22%5C";
541 StrBuf *In = NewStrBufPlain(HKEY( " +#&;`'|*?-~<>^()[]{}/$\"\\"));
542 StrBuf *Out = NewStrBuf();
544 StrBufUrlescAppend (Out, In, NULL);
545 if (!Quiet) printf ("%s<\n%s<\n%s\n", ChrPtr(In), ChrPtr(Out), expect);
546 CU_ASSERT_STRING_EQUAL(ChrPtr(Out), expect);
552 Some samples from the original...
553 CU_ASSERT_EQUAL(10, 10);
554 CU_ASSERT_EQUAL(0, -0);
555 CU_ASSERT_EQUAL(-12, -12);
556 CU_ASSERT_NOT_EQUAL(10, 11);
557 CU_ASSERT_NOT_EQUAL(0, -1);
558 CU_ASSERT_NOT_EQUAL(-12, -11);
559 CU_ASSERT_PTR_EQUAL((void*)0x100, (void*)0x100);
560 CU_ASSERT_PTR_NOT_EQUAL((void*)0x100, (void*)0x101);
561 CU_ASSERT_PTR_NULL(NULL);
562 CU_ASSERT_PTR_NULL(0x0);
563 CU_ASSERT_PTR_NOT_NULL((void*)0x23);
564 CU_ASSERT_STRING_EQUAL(str1, str2);
565 CU_ASSERT_STRING_NOT_EQUAL(str1, str2);
566 CU_ASSERT_NSTRING_EQUAL(str1, str2, strlen(str1));
567 CU_ASSERT_NSTRING_EQUAL(str1, str1, strlen(str1));
568 CU_ASSERT_NSTRING_EQUAL(str1, str1, strlen(str1) + 1);
569 CU_ASSERT_NSTRING_NOT_EQUAL(str1, str2, 3);
570 CU_ASSERT_NSTRING_NOT_EQUAL(str1, str3, strlen(str1) + 1);
571 CU_ASSERT_DOUBLE_EQUAL(10, 10.0001, 0.0001);
572 CU_ASSERT_DOUBLE_EQUAL(10, 10.0001, -0.0001);
573 CU_ASSERT_DOUBLE_EQUAL(-10, -10.0001, 0.0001);
574 CU_ASSERT_DOUBLE_EQUAL(-10, -10.0001, -0.0001);
575 CU_ASSERT_DOUBLE_NOT_EQUAL(10, 10.001, 0.0001);
576 CU_ASSERT_DOUBLE_NOT_EQUAL(10, 10.001, -0.0001);
577 CU_ASSERT_DOUBLE_NOT_EQUAL(-10, -10.001, 0.0001);
578 CU_ASSERT_DOUBLE_NOT_EQUAL(-10, -10.001, -0.0001);
585 static void AddStrBufSimpleTests(void)
587 CU_pSuite pGroup = NULL;
588 CU_pTest pTest = NULL;
590 pGroup = CU_add_suite("TestStringBufSimpleAppenders", NULL, NULL);
591 pTest = CU_add_test(pGroup, "testCreateBuf", TestCreateBuf);
592 pTest = CU_add_test(pGroup, "TestBufNumbers", TestBufNumbers);
593 pTest = CU_add_test(pGroup, "TestStrBufPeek", TestStrBufPeek);
594 pTest = CU_add_test(pGroup, "TestBufStringManipulation", TestBufStringManipulation);
597 pGroup = CU_add_suite("TestStringTokenizer", NULL, NULL);
598 pTest = CU_add_test(pGroup, "testNextTokenizer_EndWithEmpty", TestNextTokenizer_EndWithEmpty);
599 pTest = CU_add_test(pGroup, "testNextTokenizer_StartWithEmpty", TestNextTokenizer_StartWithEmpty);
600 pTest = CU_add_test(pGroup, "testNextTokenizer_StartWithEmpty", TestNextTokenizer_StartWithEmpty);
601 pTest = CU_add_test(pGroup, "testNextTokenizer_Empty", TestNextTokenizer_Empty);
602 pTest = CU_add_test(pGroup, "testNextTokenizer_TwoEmpty", TestNextTokenizer_TwoEmpty);
603 pTest = CU_add_test(pGroup, "testNextTokenizer_One", TestNextTokenizer_One);
604 pTest = CU_add_test(pGroup, "testNextTokenizer_Sequence", TestNextTokenizer_Sequence);
607 pGroup = CU_add_suite("TestStrBufSipLine", NULL, NULL);
608 pTest = CU_add_test(pGroup, "TestNextLine_Empty", TestNextLine_Empty);
609 pTest = CU_add_test(pGroup, "TestNextLine_OneLine", TestNextLine_OneLine);
610 pTest = CU_add_test(pGroup, "TestNextLine_TwoLinesMissingCR", TestNextLine_TwoLinesMissingCR);
611 pTest = CU_add_test(pGroup, "TestNextLine_twolines", TestNextLine_twolines);
612 pTest = CU_add_test(pGroup, "TestNextLine_LongLine", TestNextLine_LongLine);
614 pGroup = CU_add_suite("TestStrBufRemove_token", NULL, NULL);
615 pTest = CU_add_test(pGroup, "TestStrBufRemove_token_NotThere", TestStrBufRemove_token_NotThere);
617 pGroup = CU_add_suite("TestStrBuf_escapers", NULL, NULL);
618 pTest = CU_add_test(pGroup, "TestStrBufUrlescAppend", TestStrBufUrlescAppend);
622 int main(int argc, char* argv[])
625 setvbuf(stdout, NULL, _IONBF, 0);
628 CU_BOOL Run = CU_FALSE ;
631 Quiet = 1; // todo: -q ;-)
632 // for (i=0; i< 100000; i++) {
633 CU_set_output_filename("TestAutomated");
634 if (CU_initialize_registry()) {
635 printf("\nInitialize of test Registry failed.");
639 AddStrBufSimpleTests();
641 if (CU_TRUE == Run) {
642 //CU_console_run_tests();
643 printf("\nTests completed with return value %d.\n", CU_basic_run_tests());
645 ///CU_automated_run_tests();
648 CU_cleanup_registry();