| #include "../../unity/unity.h" |
| #include <stdlib.h> |
| #include <string.h> |
| #include <stddef.h> |
|
|
| |
|
|
| static void verify_collapse(const char *input, |
| const unsigned char *expected, |
| size_t expected_len, |
| int expected_ret) |
| { |
| int r = collapse_escapes(input); |
| TEST_ASSERT_EQUAL_INT_MESSAGE(expected_ret, r, "Unexpected return value from collapse_escapes"); |
|
|
| TEST_ASSERT_NOT_NULL_MESSAGE(delims, "delims should not be NULL after collapse_escapes"); |
| TEST_ASSERT_TRUE_MESSAGE(delim_end >= delims, "delim_end should be >= delims"); |
|
|
| size_t actual_len = (size_t)(delim_end - delims); |
| TEST_ASSERT_EQUAL_size_t_MESSAGE(expected_len, actual_len, "Unexpected length of delims"); |
|
|
| if (expected_len > 0) |
| { |
| TEST_ASSERT_EQUAL_INT_MESSAGE(0, memcmp(delims, expected, expected_len), |
| "delims content does not match expected bytes"); |
| } |
|
|
| |
| free(delims); |
| delims = NULL; |
| delim_end = NULL; |
| } |
|
|
| void setUp(void) { |
| |
| } |
|
|
| void tearDown(void) { |
| |
| } |
|
|
| void test_collapse_escapes_basic_plain_copy(void) |
| { |
| const char *in = "abcDEF123"; |
| const unsigned char expected[] = {'a','b','c','D','E','F','1','2','3'}; |
| verify_collapse(in, expected, sizeof(expected), 0); |
| } |
|
|
| void test_collapse_escapes_standard_escapes(void) |
| { |
| const char *in = "\\t\\n\\r\\b\\v\\f\\\\"; |
| const unsigned char expected[] = {'\t','\n','\r','\b','\v','\f','\\'}; |
| verify_collapse(in, expected, sizeof(expected), 0); |
| } |
|
|
| void test_collapse_escapes_unknown_escape_literal(void) |
| { |
| const char *in = "A\\qy"; |
| const unsigned char expected[] = {'A','q','y'}; |
| verify_collapse(in, expected, sizeof(expected), 0); |
| } |
|
|
| void test_collapse_escapes_zero_sentinel_middle(void) |
| { |
| const char *in = "a\\0b"; |
| const unsigned char expected[] = {'a','\0','b'}; |
| verify_collapse(in, expected, sizeof(expected), 0); |
| } |
|
|
| void test_collapse_escapes_trailing_backslash_ignored_and_reports(void) |
| { |
| const char *in = "abc\\"; |
| const unsigned char expected[] = {'a','b','c'}; |
| verify_collapse(in, expected, sizeof(expected), 1); |
| } |
|
|
| void test_collapse_escapes_empty_input(void) |
| { |
| const char *in = ""; |
| const unsigned char expected[] = { }; |
| verify_collapse(in, expected, 0, 0); |
| } |
|
|
| void test_collapse_escapes_double_zero_then_digit(void) |
| { |
| const char *in = "\\00"; |
| const unsigned char expected[] = {'\0','0'}; |
| verify_collapse(in, expected, sizeof(expected), 0); |
| } |
|
|
| void test_collapse_escapes_mixed_sequence(void) |
| { |
| const char *in = "x\\ty\\nz\\rb\\fc\\\\d"; |
| const unsigned char expected[] = {'x','\t','y','\n','z','\r','b','\f','c','\\','d'}; |
| verify_collapse(in, expected, sizeof(expected), 0); |
| } |
|
|
| void test_collapse_escapes_only_zero_delims(void) |
| { |
| const char *in = "\\0\\0"; |
| const unsigned char expected[] = {'\0','\0'}; |
| verify_collapse(in, expected, sizeof(expected), 0); |
| } |
|
|
| void test_collapse_escapes_backslash_backslash(void) |
| { |
| const char *in = "\\\\"; |
| const unsigned char expected[] = {'\\'}; |
| verify_collapse(in, expected, sizeof(expected), 0); |
| } |
|
|
| int main(void) |
| { |
| UNITY_BEGIN(); |
| RUN_TEST(test_collapse_escapes_basic_plain_copy); |
| RUN_TEST(test_collapse_escapes_standard_escapes); |
| RUN_TEST(test_collapse_escapes_unknown_escape_literal); |
| RUN_TEST(test_collapse_escapes_zero_sentinel_middle); |
| RUN_TEST(test_collapse_escapes_trailing_backslash_ignored_and_reports); |
| RUN_TEST(test_collapse_escapes_empty_input); |
| RUN_TEST(test_collapse_escapes_double_zero_then_digit); |
| RUN_TEST(test_collapse_escapes_mixed_sequence); |
| RUN_TEST(test_collapse_escapes_only_zero_delims); |
| RUN_TEST(test_collapse_escapes_backslash_backslash); |
| return UNITY_END(); |
| } |