test-strfuncs.c revision 05c1d362cc69d18840d9c37b563f01ba25fc2634
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2009-2016 Dovecot authors, see the included COPYING file */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#include "test-lib.h"
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#include "array.h"
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstatic void test_p_strarray_dup(void)
af99ca825f4b7674ec6dd0269bbca665775205aaTimo Sirainen{
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen const char *input[][3] = {
b10c3f9ed997748fdbb03b9daadc8c31eed02120Timo Sirainen { NULL },
06fda713b84e857dbc3e80f401a54085c9b0ed16Timo Sirainen { "a", NULL },
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen { "foobar", NULL },
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen { "a", "foo", NULL }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen };
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen const char **ret;
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen unsigned int i, j;
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_begin("p_strarray_dup");
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen for (i = 0; i < N_ELEMENTS(input); i++) {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen ret = p_strarray_dup(default_pool, input[i]);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen for (j = 0; input[i][j] != NULL; j++) {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(input[i][j], ret[j]) == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(input[i][j] != ret[j]);
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen }
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen test_assert(ret[j] == NULL);
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen i_free(ret);
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen }
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen test_end();
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen}
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainenstatic void test_t_strsplit(void)
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen{
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen const char *const *args;
b10c3f9ed997748fdbb03b9daadc8c31eed02120Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_begin("t_strsplit");
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen /* empty string -> empty array. was this perhaps a mistake for the
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen API to do this originally?.. can't really change now anyway. */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen args = t_strsplit("", "\n");
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(args[0] == NULL);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen /* two empty strings */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen args = t_strsplit("\n", "\n");
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(args[0][0] == '\0');
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen test_assert(args[1][0] == '\0');
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen test_assert(args[2] == NULL);
b10c3f9ed997748fdbb03b9daadc8c31eed02120Timo Sirainen test_end();
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen}
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstatic void test_t_str_replace(void)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen{
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_begin("t_str_replace");
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_replace("foo", 'a', 'b'), "foo") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_replace("fooa", 'a', 'b'), "foob") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_replace("afooa", 'a', 'b'), "bfoob") == 0);
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen test_assert(strcmp(t_str_replace("", 'a', 'b'), "") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_replace("a", 'a', 'b'), "b") == 0);
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen test_assert(strcmp(t_str_replace("aaa", 'a', 'b'), "bbb") == 0);
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen test_assert(strcmp(t_str_replace("bbb", 'a', 'b'), "bbb") == 0);
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen test_assert(strcmp(t_str_replace("aba", 'a', 'b'), "bbb") == 0);
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen test_end();
a1d3ff734507eae5b46c0e75e7975344fe060771Timo Sirainen}
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstatic void test_t_str_trim(void)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen{
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_begin("t_str_trim");
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_trim("", " "), "") == 0);
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen test_assert(strcmp(t_str_trim(" ", " "), "") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_trim(" \t ", "\t "), "") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_trim("f \t ", "\t "), "f") == 0);
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen test_assert(strcmp(t_str_trim("foo", ""), "foo") == 0);
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen test_assert(strcmp(t_str_trim("foo", " "), "foo") == 0);
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen test_assert(strcmp(t_str_trim("foo ", " "), "foo") == 0);
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen test_assert(strcmp(t_str_trim(" foo", " "), "foo") == 0);
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen test_assert(strcmp(t_str_trim(" foo ", " "), "foo") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_trim("\tfoo ", "\t "), "foo") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_trim(" \tfoo\t ", "\t "), "foo") == 0);
35ef661bd85c64834e3e34eeeb3c393b81108760Timo Sirainen test_assert(strcmp(t_str_trim("\r \tfoo\t \r", "\t \r"), "foo") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_trim("\r \tfoo foo\t \r", "\t \r"), "foo foo") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_trim("\tfoo\tfoo\t", "\t \r"), "foo\tfoo") == 0);
35ef661bd85c64834e3e34eeeb3c393b81108760Timo Sirainen test_end();
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen}
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstatic void test_t_str_ltrim(void)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen{
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_begin("t_str_ltrim");
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_ltrim("", " "), "") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_ltrim(" ", " "), "") == 0);
c39c3d8089fbdd8eb34646c25167aa4551064cf4Timo Sirainen test_assert(strcmp(t_str_ltrim(" \t ", "\t "), "") == 0);
c39c3d8089fbdd8eb34646c25167aa4551064cf4Timo Sirainen test_assert(strcmp(t_str_ltrim(" \t f", "\t "), "f") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_ltrim("foo", ""), "foo") == 0);
bd63b5b860658b01b1f46f26d406e1e4a9dc019aTimo Sirainen test_assert(strcmp(t_str_ltrim("foo", " "), "foo") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_ltrim("foo ", " "), "foo ") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_ltrim(" foo", " "), "foo") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_ltrim(" foo ", " "), "foo ") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_ltrim("\tfoo ", "\t "), "foo ") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_ltrim(" \tfoo\t ", "\t "), "foo\t ") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_ltrim("\r \tfoo\t \r", "\t \r"), "foo\t \r") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_ltrim("\r \tfoo foo\t \r", "\t \r"), "foo foo\t \r") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_ltrim("\tfoo\tfoo\t", "\t \r"), "foo\tfoo\t") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_end();
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen}
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstatic void test_t_str_rtrim(void)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen{
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_begin("t_str_rtrim");
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_rtrim("", " "), "") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_rtrim(" ", " "), "") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_rtrim(" \t ", "\t "), "") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_rtrim("f \t ", "\t "), "f") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_rtrim("foo", ""), "foo") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_rtrim("foo", " "), "foo") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_rtrim("foo ", " "), "foo") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_rtrim(" foo", " "), " foo") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_rtrim(" foo ", " "), " foo") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_rtrim("\tfoo ", "\t "), "\tfoo") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_rtrim(" \tfoo\t ", "\t "), " \tfoo") == 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen test_assert(strcmp(t_str_rtrim("\r \tfoo\t \r", "\t \r"), "\r \tfoo") == 0);
a1d3ff734507eae5b46c0e75e7975344fe060771Timo Sirainen test_assert(strcmp(t_str_rtrim("\r \tfoo foo\t \r", "\t \r"), "\r \tfoo foo") == 0);
a1d3ff734507eae5b46c0e75e7975344fe060771Timo Sirainen test_assert(strcmp(t_str_rtrim("\tfoo\tfoo\t", "\t \r"), "\tfoo\tfoo") == 0);
a1d3ff734507eae5b46c0e75e7975344fe060771Timo Sirainen test_end();
a1d3ff734507eae5b46c0e75e7975344fe060771Timo Sirainen}
a1d3ff734507eae5b46c0e75e7975344fe060771Timo Sirainen
a1d3ff734507eae5b46c0e75e7975344fe060771Timo Sirainenstatic const char *const test_strarray_input[] = {
a1d3ff734507eae5b46c0e75e7975344fe060771Timo Sirainen "", "hello", "world", "", "yay", "", NULL
a1d3ff734507eae5b46c0e75e7975344fe060771Timo Sirainen};
a1d3ff734507eae5b46c0e75e7975344fe060771Timo Sirainenstatic struct {
a1d3ff734507eae5b46c0e75e7975344fe060771Timo Sirainen const char *separator;
a1d3ff734507eae5b46c0e75e7975344fe060771Timo Sirainen const char *output;
a1d3ff734507eae5b46c0e75e7975344fe060771Timo Sirainen} test_strarray_outputs[] = {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen { "", "helloworldyay" },
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen /* FIXME: v2.3 - test_output should have separator in the beginning */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen { " ", "hello world yay " },
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen { "!-?", "hello!-?world!-?!-?yay!-?" }
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen};
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstatic void test_t_strarray_join(void)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen{
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen const char *null = NULL;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen unsigned int i;
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen test_begin("t_strarray_join()");
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen /* empty array -> empty string */
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen test_assert(strcmp(t_strarray_join(&null, " "), "") == 0);
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen for (i = 0; i < N_ELEMENTS(test_strarray_outputs); i++) {
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen test_assert_idx(strcmp(t_strarray_join(test_strarray_input,
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen test_strarray_outputs[i].separator),
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen test_strarray_outputs[i].output) == 0, i);
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen }
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen test_end();
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen}
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainenstatic void test_p_array_const_string_join(void)
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen{
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen ARRAY_TYPE(const_string) arr;
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen unsigned int i;
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen char *res;
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen
29fc8f1dc678f9698363181ea599e6db105ea50fTimo Sirainen test_begin("p_array_const_string_join()");
29fc8f1dc678f9698363181ea599e6db105ea50fTimo Sirainen
29fc8f1dc678f9698363181ea599e6db105ea50fTimo Sirainen i_array_init(&arr, 2);
29fc8f1dc678f9698363181ea599e6db105ea50fTimo Sirainen /* empty array -> empty string */
29fc8f1dc678f9698363181ea599e6db105ea50fTimo Sirainen test_assert(strcmp(t_array_const_string_join(&arr, " "), "") == 0);
29fc8f1dc678f9698363181ea599e6db105ea50fTimo Sirainen
29fc8f1dc678f9698363181ea599e6db105ea50fTimo Sirainen array_append(&arr, test_strarray_input,
29fc8f1dc678f9698363181ea599e6db105ea50fTimo Sirainen str_array_length(test_strarray_input));
29fc8f1dc678f9698363181ea599e6db105ea50fTimo Sirainen for (i = 0; i < N_ELEMENTS(test_strarray_outputs); i++) {
29fc8f1dc678f9698363181ea599e6db105ea50fTimo Sirainen res = p_array_const_string_join(default_pool, &arr,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen test_strarray_outputs[i].separator);
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen test_assert_idx(strcmp(res, test_strarray_outputs[i].output) == 0, i);
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen i_free(res);
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen array_free(&arr);
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen test_end();
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen}
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen
44ef49403ac7bddac84a1e322d170ed53cd37c95Timo Sirainenvoid test_strfuncs(void)
44ef49403ac7bddac84a1e322d170ed53cd37c95Timo Sirainen{
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen test_p_strarray_dup();
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen test_t_strsplit();
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen test_t_str_replace();
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen test_t_str_trim();
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen test_t_str_ltrim();
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen test_t_str_rtrim();
29fc8f1dc678f9698363181ea599e6db105ea50fTimo Sirainen test_t_strarray_join();
29fc8f1dc678f9698363181ea599e6db105ea50fTimo Sirainen test_p_array_const_string_join();
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen}
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen