mirror of https://gitee.com/bigwinds/arangodb
340 lines
7.7 KiB
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;
|
|
}
|
|
|