diff --git a/test/test_runner.c b/test/test_runner.c index 4554656..afd7e96 100644 --- a/test/test_runner.c +++ b/test/test_runner.c @@ -34,6 +34,7 @@ extern Suite *ticket_lock_suite(void); extern Suite *restart_counter_suite(void); extern Suite *iomux_suite(void); extern Suite *iomux_signal_suite(void); +extern Suite *string_suite(void); static suite_func suites[] = { bitvec_suite, @@ -62,7 +63,8 @@ static suite_func suites[] = { ticket_lock_suite, restart_counter_suite, iomux_suite, - iomux_signal_suite + iomux_signal_suite, + string_suite }; diff --git a/test/test_string.c b/test/test_string.c new file mode 100644 index 0000000..d573b42 --- /dev/null +++ b/test/test_string.c @@ -0,0 +1,198 @@ +#include +#include +#include +#include +#include "ucore/string.h" +#include "ucore/utils.h" + + +START_TEST (test_getfields) + + char str[] = "a;b;c"; + char *letters[5] = {NULL}; + + int rc = getfields(str, letters, 5, 0, ";"); + ck_assert_int_eq(rc, 3); + + + ck_assert_str_eq("a", letters[0]); + ck_assert_str_eq("b", letters[1]); + ck_assert_str_eq("c", letters[2]); + +END_TEST + +START_TEST (test_getfields_consecutive) + + char str[] = "a;;b;c;;;"; + char *letters[7] = {NULL}; + + int rc = getfields(str, letters, 5, 0, ";"); + ck_assert_int_eq(rc, 5); + + + // This result is rather silly, but it's + // how getfields works with mflag=0 + ck_assert_str_eq("a", letters[0]); + ck_assert_str_eq("", letters[1]); + ck_assert_str_eq("b", letters[2]); + ck_assert_str_eq("c", letters[3]); + ck_assert_str_eq(";;", letters[4]); + +END_TEST + +START_TEST (test_getfields_mflag) + char str[] = "a;b;c"; + char *letters[5] = {NULL}; + + int rc = getfields(str, letters, 5, 1, ";"); + ck_assert_int_eq(rc, 3); + + + ck_assert_str_eq("a", letters[0]); + ck_assert_str_eq("b", letters[1]); + ck_assert_str_eq("c", letters[2]); + +END_TEST + +START_TEST (test_getfields_consecutive_mflag) + + char str[] = "a;;b;c;;;"; + char *letters[7] = {NULL}; + + int rc = getfields(str, letters, 7, 1, ";"); + ck_assert_int_eq(rc, 3); + + + // This result is rather silly, but it's + // how getfields works with mflag=0 + ck_assert_str_eq("a", letters[0]); + ck_assert_str_eq("b", letters[1]); + ck_assert_str_eq("c", letters[2]); + +END_TEST + +START_TEST (test_getfields_too_many) + + char str[] = "a\r\nb\r\nc\r\nd\r\ne"; + char *letters[4] = {NULL}; + + int rc = getfields(str, letters, 4, 0, "\r\n"); + ck_assert_int_eq(rc, 4); + + // This result is rather silly, but it's + // how getfields works with mflag=0 + ck_assert_str_eq("a", letters[0]); + ck_assert_str_eq("", letters[1]); + ck_assert_str_eq("b", letters[2]); + ck_assert_str_eq("\nc\r\nd\r\ne", letters[3]); + +END_TEST + +START_TEST (test_getfields_too_many_mflag) + + char str[] = "a\r\nb\r\nc\r\nd\r\ne"; + char *letters[4] = {NULL}; + + int rc = getfields(str, letters, 4, 1, "\r\n"); + ck_assert_int_eq(rc, 4); + + ck_assert_str_eq("a", letters[0]); + ck_assert_str_eq("b", letters[1]); + ck_assert_str_eq("c", letters[2]); + ck_assert_str_eq("d\r\ne", letters[3]); + +END_TEST + +START_TEST (test_getfields_empty) + + char str[] = ""; + char *letters[4] = {NULL}; + + int rc = getfields(str, letters, 4, 0, ";\r\n"); + ck_assert_int_eq(rc, 1); + ck_assert_str_eq("", letters[0]); + + rc = getfields(str, letters, 4, 1, ";\r\n"); + ck_assert_int_eq(rc, 0); + + +END_TEST + +START_TEST (test_gettokens) + + char str[] = "a;b;c"; + char *letters[5] = {NULL}; + + int rc = gettokens(str, letters, 5,";"); + ck_assert_int_eq(rc, 3); + + + ck_assert_str_eq("a", letters[0]); + ck_assert_str_eq("b", letters[1]); + ck_assert_str_eq("c", letters[2]); + +END_TEST + +START_TEST (test_gettokens_consecutive) + + char str[] = "a;;;b;;c;"; + char *letters[5] = {NULL}; + + int rc = gettokens(str, letters, 5,";"); + ck_assert_int_eq(rc, 3); + + + ck_assert_str_eq("a", letters[0]); + ck_assert_str_eq("b", letters[1]); + ck_assert_str_eq("c", letters[2]); + +END_TEST + +START_TEST (test_gettokens_empty) + + char str[] = ""; + char *letters[5] = {NULL}; + + int rc = gettokens(str, letters, 5,";"); + ck_assert_int_eq(rc, 0); + +END_TEST + +START_TEST (test_gettokens_quotes) + + char str[] = "\"abc\";d;\"e \""; + char *letters[5] = {NULL}; + + int rc = gettokens(str, letters, 5,";"); + ck_assert_int_eq(rc, 3); + + ck_assert_str_eq("abc", letters[0]); + ck_assert_str_eq("d", letters[1]); + ck_assert_str_eq("e ", letters[2]); + +END_TEST + + +Suite *string_suite(void) +{ + Suite *s = suite_create("string"); + TCase *tc = tcase_create("string"); + + tcase_add_test(tc, test_getfields); + tcase_add_test(tc, test_getfields_consecutive); + tcase_add_test(tc, test_getfields_mflag); + tcase_add_test(tc, test_getfields_consecutive_mflag); + tcase_add_test(tc, test_getfields_too_many); + tcase_add_test(tc, test_getfields_too_many_mflag); + tcase_add_test(tc, test_getfields_empty); + + tcase_add_test(tc, test_gettokens); + tcase_add_test(tc, test_gettokens_consecutive); + tcase_add_test(tc, test_gettokens_empty); + tcase_add_test(tc, test_gettokens_quotes); + + suite_add_tcase(s, tc); + + return s; +} +