#include "../BasicsC/string-buffer.h" #include #include #include /* * gcc -g -I . -L . UnitTests/string-buffer-test.c -lavocado && ./a.out * from base dir. */ static int tst_tst_cnt; static int tst_err_cnt; #define STR "The quick brown fox jumped over the laxy dog" #define STRSTR STR STR #define TWNTYA "aaaaaaaaaaaaaaaaaaaa" #define ABC "ABCDEFGHIJKLMNOP" #define REP "REPDEFGHIJKLMNOP" #define AEP "AEPDEFGHIJKLMNOP" static cmp_int (int should, int is, char * name) { if (should != is) { printf("'%s' failed! should: %d is: %d\n", name, should, is); tst_err_cnt++; } tst_tst_cnt++; } static cmp_ptr (const char * should, const char * is, char * name) { if (should != is) { printf("'%s' failed! should: %p is: %p\n", name, should, is); tst_err_cnt++; } tst_tst_cnt++; } static cmp_str (char * should, char * is, size_t len, char * name) { if (strncmp(should, is, len)) { printf("'%s' failed! should: \n>>%s<< is: \n>>%s<<\n", name, should, is); tst_err_cnt++; } tst_tst_cnt++; } static cmp_bool (int value, char * name) { if (!value) { printf("'%s' failed! should be truish is: %d\n", name, value); tst_err_cnt++; } tst_tst_cnt++; } static void tst_str_append() { int l1, l2; TRI_string_buffer_t sb, sb2; TRI_InitStringBuffer(&sb); TRI_AppendStringStringBuffer(&sb, STR); TRI_AppendStringStringBuffer(&sb, STR); l1 = strnlen( STRSTR, 1024); l2 = strnlen( sb._buffer, 1024); cmp_int((int)l1, (int)l2, "basic append (len)"); cmp_str(STRSTR, sb._buffer, l1, "basic append (cmp)"); TRI_AppendString2StringBuffer(&sb, ABC, 3); // ABC ... Z l2 = strnlen( sb._buffer, 1024); cmp_str(STRSTR"ABC", sb._buffer, l2, "basic append 2 (cmp)"); TRI_ClearStringBuffer(&sb); TRI_AppendStringStringBuffer(&sb, STR); TRI_InitStringBuffer(&sb2); TRI_AppendStringStringBuffer(&sb2, STR); TRI_AppendStringBufferStringBuffer(&sb, &sb2); l2 = strnlen( sb._buffer, 1024); cmp_str(STRSTR, sb._buffer, l2, "basic append 3 (cmp)"); cmp_str(STR, sb2._buffer, l2, "basic append 4 (cmp)"); TRI_FreeStringBuffer(&sb); } static void tst_char_append() { int l1, l2, i; TRI_string_buffer_t sb; TRI_InitStringBuffer(&sb); for (i=0l; i!=20; ++i) { TRI_AppendCharStringBuffer(&sb, 'a'); } l1 = strnlen( TWNTYA, 1024); l2 = strnlen( sb._buffer, 1024); cmp_int((int)l1, (int)l2, "char append (len)"); cmp_str(TWNTYA, sb._buffer, l1, "char append (cmp)"); TRI_FreeStringBuffer(&sb); } static void tst_swp() { int l1, l2, i; TRI_string_buffer_t sb1, sb2; TRI_InitStringBuffer(&sb1); TRI_InitStringBuffer(&sb2); for (i=0l; i!=20; ++i) { TRI_AppendCharStringBuffer(&sb1, 'a'); } TRI_AppendStringStringBuffer(&sb2, STR); TRI_SwapStringBuffer(&sb1, &sb2); l1 = strnlen( TWNTYA, 1024); l2 = strnlen( STR, 1024); cmp_str(TWNTYA, sb2._buffer, l1, "swp test 1"); cmp_str(STR, sb1._buffer, l2, "swp test 2"); TRI_FreeStringBuffer(&sb1); TRI_FreeStringBuffer(&sb2); } static void tst_begin_end_empty_clear() { int l1, i; const char * ptr; TRI_string_buffer_t sb; TRI_InitStringBuffer(&sb); TRI_AppendStringStringBuffer(&sb, STR); ptr = TRI_BeginStringBuffer(&sb); cmp_ptr(sb._buffer, ptr, "begin test"); l1 = strnlen(STR, 1024); ptr = TRI_EndStringBuffer(&sb); cmp_ptr(sb._buffer+l1, ptr, "end test"); cmp_bool((int)!TRI_EmptyStringBuffer(&sb), "empty 1"); TRI_ClearStringBuffer(&sb); cmp_bool((int)TRI_EmptyStringBuffer(&sb), "empty 2"); TRI_FreeStringBuffer(&sb); } static void tst_cpy() { int l1, l2, i; TRI_string_buffer_t sb1, sb2; TRI_InitStringBuffer(&sb1); TRI_InitStringBuffer(&sb2); for (i=0l; i!=20; ++i) { TRI_AppendCharStringBuffer(&sb1, 'a'); } TRI_AppendStringStringBuffer(&sb2, STR); TRI_CopyStringBuffer(&sb1, &sb2); l1 = strnlen( STR, 1024); cmp_int(l1, strnlen(sb1._buffer, l1) , "copy (len)"); cmp_str(STR, sb2._buffer, l1, "cpy test 1"); cmp_str(STR, sb1._buffer, l1, "cpy test 2"); TRI_FreeStringBuffer(&sb1); TRI_FreeStringBuffer(&sb2); } #define Z_2_T "0123456789A" #define F_2_T "56789A" #define Z_2_F "012345" static void tst_erase_frnt() { int l; TRI_string_buffer_t sb; TRI_InitStringBuffer(&sb); TRI_AppendStringStringBuffer(&sb, Z_2_T); TRI_EraseFrontStringBuffer(&sb, 5); l = strnlen(sb._buffer, 1024); cmp_str(F_2_T, sb._buffer, l, "erase front"); TRI_EraseFrontStringBuffer(&sb, 15); cmp_bool(TRI_EmptyStringBuffer(&sb), "erase front2"); TRI_FreeStringBuffer(&sb); } static void tst_replace () { int l; TRI_string_buffer_t sb; TRI_string_buffer_t sb2; TRI_InitStringBuffer(&sb); TRI_AppendStringStringBuffer(&sb, ABC); TRI_ReplaceStringStringBuffer(&sb, "REP", 3); l = strnlen(sb._buffer, 1024); cmp_str(REP, sb._buffer, l, "replace1"); TRI_ReplaceStringStringBuffer(&sb, ABC, 1); l = strnlen(sb._buffer, 1024); cmp_str(AEP, sb._buffer, l, "replace2"); TRI_ClearStringBuffer(&sb); TRI_AppendStringStringBuffer(&sb, ABC); TRI_InitStringBuffer(&sb2); TRI_AppendStringStringBuffer(&sb2, "REP"); TRI_ReplaceStringBufferStringBuffer(&sb, &sb2); l = strnlen(sb._buffer, 1024); cmp_str(REP, sb._buffer, l, "replace stringbuffer 1"); // TRI_ClearStringBuffer(&sb2); // TRI_AppendStringStringBuffer(&sb2, ABC); // // TRI_ReplaceStringBufferStringBuffer(&sb, &sb2, 1); // l = strnlen(sb._buffer, 1024); // cmp_str(AEP, sb._buffer, l, "replace stringbuffer 2"); } #define ONETWOTHREE "123" void tst_smpl_utils () { // these are built on prev. tested building blocks... TRI_string_buffer_t sb; TRI_InitStringBuffer(&sb); TRI_AppendInteger3StringBuffer(&sb, 123); cmp_str(ONETWOTHREE, sb._buffer, 1024, "append int3"); TRI_ClearStringBuffer(&sb); TRI_AppendInteger3StringBuffer(&sb, 1234); cmp_str("234", sb._buffer, 1024, "append int3"); TRI_AppendDoubleStringBuffer(&sb, 12.0); cmp_str("23412", sb._buffer, 1024, "append int3"); TRI_AppendDoubleStringBuffer(&sb, -12.125); cmp_str("23412-12.125", sb._buffer, 1024, "append int3"); } static void tst_length () { TRI_string_buffer_t sb; TRI_InitStringBuffer(&sb); cmp_int(0, TRI_LengthStringBuffer(&sb), "length empty"); TRI_AppendStringStringBuffer(&sb, ONETWOTHREE); cmp_int(strlen(ONETWOTHREE), TRI_LengthStringBuffer(&sb), "length string"); TRI_AppendInt32StringBuffer(&sb, 123); cmp_int(strlen(ONETWOTHREE) + 3, TRI_LengthStringBuffer(&sb), "length integer"); } static void tst_timing () { size_t const repeats = 100; size_t const loop1 = 25 * 10000; size_t const loop2 = 200 * 10000; TRI_string_buffer_t sb; size_t i; size_t j; double t1 = TRI_microtime(); // integer for (j = 0; j < repeats; ++j) { TRI_InitStringBuffer(&sb); for (i = 0; i < loop1; ++i) { TRI_AppendInt32StringBuffer(&sb, 12345678); } cmp_int(loop1 * 8, TRI_LengthStringBuffer(&sb), "length integer"); TRI_DestroyStringBuffer(&sb); } t1 = TRI_microtime() - t1; printf("time for integer append: %f msec\n", t1 * 1000); // character t1 = TRI_microtime(); for (j = 0; j < repeats; ++j) { TRI_InitStringBuffer(&sb); for (i = 0; i < loop2; ++i) { TRI_AppendCharStringBuffer(&sb, 'A'); } cmp_int(loop2, TRI_LengthStringBuffer(&sb), "length character"); TRI_DestroyStringBuffer(&sb); } t1 = TRI_microtime() - t1; printf("time for character append: %f msec\n", t1 * 1000); } void tst_report () { printf("%d test run. %d failed.\n", tst_tst_cnt, tst_err_cnt); } int main () { tst_str_append(); tst_char_append(); tst_swp(); tst_begin_end_empty_clear(); tst_cpy(); tst_erase_frnt(); tst_replace(); tst_smpl_utils(); tst_length(); tst_timing(); tst_report(); return 0; }