| #include "../../unity/unity.h" |
| #include <stdlib.h> |
| #include <string.h> |
|
|
| |
| |
| |
| |
| |
| |
|
|
| |
| static struct line* helper_alloc_line(void) { |
| struct line* l = (struct line*)malloc(sizeof(struct line)); |
| if (l) { |
| memset(l, 0, sizeof(*l)); |
| } |
| return l; |
| } |
|
|
| |
| |
| |
| static struct buffer_record* helper_alloc_buf(struct line* line_start, struct line** out_orig_curr_line) { |
| struct buffer_record* b = (struct buffer_record*)malloc(sizeof(struct buffer_record)); |
| if (b) { |
| memset(b, 0, sizeof(*b)); |
| b->line_start = line_start; |
| struct line* bogus_curr = helper_alloc_line(); |
| b->curr_line = bogus_curr; |
| b->next = (struct buffer_record*)0x1; |
| if (out_orig_curr_line) { |
| *out_orig_curr_line = bogus_curr; |
| } |
| } |
| return b; |
| } |
|
|
| |
| |
| |
| static void helper_free_chain(struct buffer_record* start) { |
| while (start) { |
| struct buffer_record* n = start->next; |
| if (start->line_start) { |
| free(start->line_start); |
| } |
| free(start); |
| start = n; |
| } |
| } |
|
|
| |
| void setUp(void) { |
| |
| head = NULL; |
| } |
|
|
| void tearDown(void) { |
| |
| if (head) { |
| helper_free_chain(head); |
| head = NULL; |
| } |
| } |
|
|
| |
| |
| void test_save_buffer_initial_insert_sets_head_and_fields(void) { |
| struct line* l1 = helper_alloc_line(); |
| TEST_ASSERT_NOT_NULL(l1); |
|
|
| struct line* orig_curr = NULL; |
| struct buffer_record* buf = helper_alloc_buf(l1, &orig_curr); |
| TEST_ASSERT_NOT_NULL(buf); |
| TEST_ASSERT_NOT_NULL(orig_curr); |
|
|
| |
| struct buffer_record* garbage_next = (struct buffer_record*)malloc(sizeof(struct buffer_record)); |
| TEST_ASSERT_NOT_NULL(garbage_next); |
| memset(garbage_next, 0, sizeof(*garbage_next)); |
| buf->next = garbage_next; |
|
|
| TEST_ASSERT_NULL(head); |
|
|
| save_buffer(buf); |
|
|
| TEST_ASSERT_EQUAL_PTR(buf, head); |
| TEST_ASSERT_EQUAL_PTR(buf->line_start, buf->curr_line); |
| TEST_ASSERT_NULL(buf->next); |
|
|
| |
| free(orig_curr); |
| free(garbage_next); |
| helper_free_chain(head); |
| head = NULL; |
| } |
|
|
| |
| void test_save_buffer_appends_to_single_element_list(void) { |
| |
| struct line* l_head = helper_alloc_line(); |
| struct line* orig_curr_head = NULL; |
| struct buffer_record* buf_head = helper_alloc_buf(l_head, &orig_curr_head); |
| TEST_ASSERT_NOT_NULL(buf_head); |
|
|
| |
| save_buffer(buf_head); |
| TEST_ASSERT_EQUAL_PTR(buf_head, head); |
| TEST_ASSERT_EQUAL_PTR(buf_head->line_start, buf_head->curr_line); |
| TEST_ASSERT_NULL(buf_head->next); |
|
|
| |
| struct line* l_new = helper_alloc_line(); |
| struct line* orig_curr_new = NULL; |
| struct buffer_record* buf_new = helper_alloc_buf(l_new, &orig_curr_new); |
| TEST_ASSERT_NOT_NULL(buf_new); |
|
|
| |
| save_buffer(buf_new); |
|
|
| TEST_ASSERT_EQUAL_PTR(buf_head, head); |
| TEST_ASSERT_EQUAL_PTR(buf_new, buf_head->next); |
| TEST_ASSERT_NULL(buf_new->next); |
| TEST_ASSERT_EQUAL_PTR(buf_new->line_start, buf_new->curr_line); |
|
|
| |
| TEST_ASSERT_EQUAL_PTR(buf_head->line_start, buf_head->curr_line); |
|
|
| |
| free(orig_curr_head); |
| free(orig_curr_new); |
| helper_free_chain(head); |
| head = NULL; |
| } |
|
|
| |
| void test_save_buffer_appends_to_multi_element_list(void) { |
| |
| struct line* la = helper_alloc_line(); |
| struct line* lb = helper_alloc_line(); |
| struct line* orig_curr_a = NULL; |
| struct line* orig_curr_b = NULL; |
| struct buffer_record* A = helper_alloc_buf(la, &orig_curr_a); |
| struct buffer_record* B = helper_alloc_buf(lb, &orig_curr_b); |
| TEST_ASSERT_NOT_NULL(A); |
| TEST_ASSERT_NOT_NULL(B); |
|
|
| |
| save_buffer(A); |
| save_buffer(B); |
|
|
| TEST_ASSERT_EQUAL_PTR(A, head); |
| TEST_ASSERT_EQUAL_PTR(B, A->next); |
| TEST_ASSERT_NULL(B->next); |
|
|
| |
| struct line* lc = helper_alloc_line(); |
| struct line* orig_curr_c = NULL; |
| struct buffer_record* C = helper_alloc_buf(lc, &orig_curr_c); |
| TEST_ASSERT_NOT_NULL(C); |
|
|
| |
| struct line* B_curr_before = B->curr_line; |
|
|
| save_buffer(C); |
|
|
| |
| TEST_ASSERT_EQUAL_PTR(A, head); |
| TEST_ASSERT_EQUAL_PTR(B, A->next); |
| TEST_ASSERT_EQUAL_PTR(C, B->next); |
| TEST_ASSERT_NULL(C->next); |
|
|
| |
| TEST_ASSERT_EQUAL_PTR(C->line_start, C->curr_line); |
|
|
| |
| TEST_ASSERT_EQUAL_PTR(B_curr_before, B->curr_line); |
|
|
| |
| free(orig_curr_a); |
| free(orig_curr_b); |
| free(orig_curr_c); |
| helper_free_chain(head); |
| head = NULL; |
| } |
|
|
| |
| void test_save_buffer_multiple_appends_sequence(void) { |
| struct line* l1 = helper_alloc_line(); |
| struct line* l2 = helper_alloc_line(); |
| struct line* l3 = helper_alloc_line(); |
| struct line* oc1 = NULL; |
| struct line* oc2 = NULL; |
| struct line* oc3 = NULL; |
| struct buffer_record* b1 = helper_alloc_buf(l1, &oc1); |
| struct buffer_record* b2 = helper_alloc_buf(l2, &oc2); |
| struct buffer_record* b3 = helper_alloc_buf(l3, &oc3); |
|
|
| save_buffer(b1); |
| save_buffer(b2); |
| save_buffer(b3); |
|
|
| TEST_ASSERT_EQUAL_PTR(b1, head); |
| TEST_ASSERT_EQUAL_PTR(b2, b1->next); |
| TEST_ASSERT_EQUAL_PTR(b3, b2->next); |
| TEST_ASSERT_NULL(b3->next); |
|
|
| TEST_ASSERT_EQUAL_PTR(b1->line_start, b1->curr_line); |
| TEST_ASSERT_EQUAL_PTR(b2->line_start, b2->curr_line); |
| TEST_ASSERT_EQUAL_PTR(b3->line_start, b3->curr_line); |
|
|
| free(oc1); |
| free(oc2); |
| free(oc3); |
| helper_free_chain(head); |
| head = NULL; |
| } |
|
|
| int main(void) { |
| UNITY_BEGIN(); |
| RUN_TEST(test_save_buffer_initial_insert_sets_head_and_fields); |
| RUN_TEST(test_save_buffer_appends_to_single_element_list); |
| RUN_TEST(test_save_buffer_appends_to_multi_element_list); |
| RUN_TEST(test_save_buffer_multiple_appends_sequence); |
| return UNITY_END(); |
| } |