|
|
#include "../../unity/unity.h" |
|
|
#include <stdlib.h> |
|
|
#include <string.h> |
|
|
#include <stdio.h> |
|
|
|
|
|
void setUp(void) { |
|
|
|
|
|
} |
|
|
|
|
|
void tearDown(void) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
static struct line* alloc_zeroed_line(void) { |
|
|
struct line* l = (struct line*)malloc(sizeof(struct line)); |
|
|
TEST_ASSERT_NOT_NULL(l); |
|
|
memset(l, 0, sizeof(*l)); |
|
|
return l; |
|
|
} |
|
|
|
|
|
void test_freeline_null_pointer_ok(void) { |
|
|
|
|
|
freeline(NULL); |
|
|
|
|
|
TEST_ASSERT_TRUE(1); |
|
|
} |
|
|
|
|
|
void test_freeline_frees_and_nulls_members(void) { |
|
|
struct line* l = alloc_zeroed_line(); |
|
|
|
|
|
|
|
|
l->nfields = 3; |
|
|
l->nfields_allocated = 3; |
|
|
l->fields = (struct field*)malloc(sizeof(struct field) * 3); |
|
|
TEST_ASSERT_NOT_NULL(l->fields); |
|
|
|
|
|
|
|
|
for (int i = 0; i < 3; i++) { |
|
|
l->fields[i].beg = NULL; |
|
|
l->fields[i].len = 0; |
|
|
} |
|
|
|
|
|
l->buf.buffer = (char*)malloc(16); |
|
|
TEST_ASSERT_NOT_NULL(l->buf.buffer); |
|
|
memset(l->buf.buffer, 'X', 16); |
|
|
l->buf.length = 16; |
|
|
|
|
|
freeline(l); |
|
|
|
|
|
|
|
|
TEST_ASSERT_NULL(l->fields); |
|
|
TEST_ASSERT_NULL(l->buf.buffer); |
|
|
TEST_ASSERT_EQUAL_INT(3, (int)l->nfields); |
|
|
TEST_ASSERT_EQUAL_INT(3, (int)l->nfields_allocated); |
|
|
TEST_ASSERT_EQUAL_INT(16, (int)l->buf.length); |
|
|
|
|
|
free(l); |
|
|
} |
|
|
|
|
|
void test_freeline_idempotent_on_same_line(void) { |
|
|
struct line* l = alloc_zeroed_line(); |
|
|
|
|
|
l->fields = (struct field*)malloc(sizeof(struct field)); |
|
|
TEST_ASSERT_NOT_NULL(l->fields); |
|
|
l->nfields = 1; |
|
|
l->nfields_allocated = 1; |
|
|
|
|
|
l->buf.buffer = (char*)malloc(8); |
|
|
TEST_ASSERT_NOT_NULL(l->buf.buffer); |
|
|
memset(l->buf.buffer, 'Y', 8); |
|
|
l->buf.length = 8; |
|
|
|
|
|
|
|
|
freeline(l); |
|
|
TEST_ASSERT_NULL(l->fields); |
|
|
TEST_ASSERT_NULL(l->buf.buffer); |
|
|
|
|
|
|
|
|
freeline(l); |
|
|
TEST_ASSERT_NULL(l->fields); |
|
|
TEST_ASSERT_NULL(l->buf.buffer); |
|
|
|
|
|
free(l); |
|
|
} |
|
|
|
|
|
void test_freeline_only_fields_allocated(void) { |
|
|
struct line* l = alloc_zeroed_line(); |
|
|
|
|
|
l->fields = (struct field*)malloc(sizeof(struct field) * 2); |
|
|
TEST_ASSERT_NOT_NULL(l->fields); |
|
|
l->nfields = 2; |
|
|
l->nfields_allocated = 2; |
|
|
|
|
|
|
|
|
l->buf.buffer = NULL; |
|
|
l->buf.length = 5; |
|
|
|
|
|
freeline(l); |
|
|
|
|
|
TEST_ASSERT_NULL(l->fields); |
|
|
TEST_ASSERT_NULL(l->buf.buffer); |
|
|
TEST_ASSERT_EQUAL_INT(2, (int)l->nfields); |
|
|
TEST_ASSERT_EQUAL_INT(2, (int)l->nfields_allocated); |
|
|
TEST_ASSERT_EQUAL_INT(5, (int)l->buf.length); |
|
|
|
|
|
free(l); |
|
|
} |
|
|
|
|
|
void test_freeline_only_buffer_allocated(void) { |
|
|
struct line* l = alloc_zeroed_line(); |
|
|
|
|
|
l->fields = NULL; |
|
|
l->nfields = 0; |
|
|
l->nfields_allocated = 0; |
|
|
|
|
|
l->buf.buffer = (char*)malloc(32); |
|
|
TEST_ASSERT_NOT_NULL(l->buf.buffer); |
|
|
memset(l->buf.buffer, 'Z', 32); |
|
|
l->buf.length = 32; |
|
|
|
|
|
freeline(l); |
|
|
|
|
|
TEST_ASSERT_NULL(l->fields); |
|
|
TEST_ASSERT_NULL(l->buf.buffer); |
|
|
TEST_ASSERT_EQUAL_INT(0, (int)l->nfields); |
|
|
TEST_ASSERT_EQUAL_INT(0, (int)l->nfields_allocated); |
|
|
TEST_ASSERT_EQUAL_INT(32, (int)l->buf.length); |
|
|
|
|
|
free(l); |
|
|
} |
|
|
|
|
|
int main(void) { |
|
|
UNITY_BEGIN(); |
|
|
|
|
|
RUN_TEST(test_freeline_null_pointer_ok); |
|
|
RUN_TEST(test_freeline_frees_and_nulls_members); |
|
|
RUN_TEST(test_freeline_idempotent_on_same_line); |
|
|
RUN_TEST(test_freeline_only_fields_allocated); |
|
|
RUN_TEST(test_freeline_only_buffer_allocated); |
|
|
|
|
|
return UNITY_END(); |
|
|
} |