bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2012-2018 Dovecot authors, see the included COPYING file */
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen#include "test-lib.h"
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen#include "str.h"
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainenstatic void test_str_append(void)
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen{
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen string_t *str = t_str_new(32);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen string_t *str2 = t_str_new(32);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_begin("str_append_*()");
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_append(str, "foo");
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_append_c(str, '|');
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_append_c(str, '\0');
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_assert(str->used == 5 && memcmp(str_data(str), "foo|\0", 5) == 0);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_append(str2, "sec");
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_append_c(str2, '\0');
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_append(str2, "ond");
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_append_str(str, str2);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_assert(str->used == 5+7 && memcmp(str_data(str), "foo|\0sec\0ond", 5+7) == 0);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_end();
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen}
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainenstatic void test_str_c(void)
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen{
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen string_t *str;
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen unsigned int i, j;
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen test_begin("str_c()");
93ae7fcd39c6982f7e338adfe71139942d9bbad1Timo Sirainen str = t_str_new(0);
93ae7fcd39c6982f7e338adfe71139942d9bbad1Timo Sirainen T_BEGIN {
93ae7fcd39c6982f7e338adfe71139942d9bbad1Timo Sirainen (void)str_c(str);
93ae7fcd39c6982f7e338adfe71139942d9bbad1Timo Sirainen } T_END;
93ae7fcd39c6982f7e338adfe71139942d9bbad1Timo Sirainen
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen for (i = 0; i < 32; i++) T_BEGIN {
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen str = t_str_new(15);
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen for (j = 0; j < i; j++)
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen str_append_c(str, 'x');
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen T_BEGIN {
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen (void)str_c(str);
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen } T_END;
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen } T_END;
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen test_end();
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen}
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainenstatic void test_str_insert(void)
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen{
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen string_t *str = t_str_new(32);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_begin("str_insert()");
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_insert(str, 0, "foo");
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_insert(str, 3, ">");
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_insert(str, 3, "bar");
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_insert(str, 0, "<");
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_assert(str->used == 8 && memcmp(str_data(str), "<foobar>", 8) == 0);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_insert(str, 10, "!");
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_assert(str->used == 11 && memcmp(str_data(str), "<foobar>\0\0!", 11) == 0);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_end();
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen}
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainenstatic void test_str_delete(void)
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen{
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen string_t *str = t_str_new(32);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_begin("str_delete()");
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_delete(str, 0, 100);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_append(str, "123456");
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_delete(str, 0, 1);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_delete(str, 4, 1);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_delete(str, 1, 1);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_assert(str->used == 3 && memcmp(str_data(str), "245", 3) == 0);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_delete(str, 1, 2);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_assert(str->used == 1 && memcmp(str_data(str), "2", 1) == 0);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_append(str, "bar");
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_delete(str, 1, 100);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_assert(str->used == 1 && memcmp(str_data(str), "2", 1) == 0);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_end();
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen}
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainenstatic void test_str_append_n(void)
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen{
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen string_t *str = t_str_new(32);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_begin("str_append_n()");
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_append_n(str, "foo", 0);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_assert(str->used == 0);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_append_n(str, "\0foo", 4);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_assert(str->used == 0);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_append_n(str, "foo", 3);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_assert(str->used == 3 && memcmp(str_data(str), "foo", 3) == 0);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_truncate(str, 0);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_append_n(str, "foo", 2);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_assert(str->used == 2 && memcmp(str_data(str), "fo", 2) == 0);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_truncate(str, 0);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_append_n(str, "foo\0bar", 7);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_assert(str->used == 3 && memcmp(str_data(str), "foo", 3) == 0);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen str_truncate(str, 0);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_end();
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen}
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainenstatic void test_str_truncate(void)
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen{
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen string_t *str = t_str_new(8);
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen int i;
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen test_begin("str_truncate()");
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen str_append(str, "123456");
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen for (i = 100; i >= 6; i--) {
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen str_truncate(str, i);
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen test_assert_idx(str_len(str) == 6, i);
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen }
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen for (; i >= 0; i--) {
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen str_truncate(str, i);
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen test_assert_idx(str_len(str) == (unsigned int)i, i);
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen }
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen test_end();
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen}
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainenvoid test_str(void)
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen{
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_str_append();
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen test_str_c();
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_str_insert();
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_str_delete();
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen test_str_append_n();
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen test_str_truncate();
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen}