File size: 3,984 Bytes
78d2150 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
#include "../../unity/unity.h"
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
/* collapse_escapes, delims, delim_end are available from the included program. */
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");
}
/* Clean up allocation performed by collapse_escapes (via xstrdup). */
free(delims);
delims = NULL;
delim_end = NULL;
}
void setUp(void) {
/* No setup needed */
}
void tearDown(void) {
/* No teardown needed */
}
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[] = { /* empty */ };
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();
} |