1
0
Fork 0
arangodb/UnitTests/string-buffer-test.c

340 lines
7.7 KiB
C

#include "../BasicsC/string-buffer.h"
#include <assert.h>
#include <string.h>
#include <stdio.h>
/*
* 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;
}