From 6ef644b07d711c1bb0af18bfcd981e2d18b9470e Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Thu, 29 Aug 2024 15:07:01 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=9F=E5=88=97push=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=98=9F=E5=88=97=E8=8A=82=E7=82=B9new?= =?UTF-8?q?=E5=87=BD=E6=95=B0=EF=BC=8C=E6=96=B9=E4=BE=BF=E5=90=8E=E7=BB=AD?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84=EF=BC=88?= =?UTF-8?q?=E6=9A=82=E6=9C=AA=E8=B0=83=E7=94=A8=EF=BC=8C=E7=AD=89=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95=E5=87=BD=E6=95=B0=E5=86=99=E5=A5=BD?= =?UTF-8?q?=E5=90=8E=EF=BC=89=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/queue.c | 33 ++++++++++++++++++++++++++++++-- test/test_queue.c | 48 ++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 76 insertions(+), 5 deletions(-) diff --git a/src/queue.c b/src/queue.c index 050b6ed..da0d515 100644 --- a/src/queue.c +++ b/src/queue.c @@ -10,6 +10,30 @@ */ #include "queue.h" +static struct _queue_node * queue_node_new(void* obj, uint32_t obj_size) +{ + void * obj_new = malloc(obj_size); + if (obj_new == NULL) + { + goto done; + } + memmove(obj_new, obj, obj_size); + + struct _queue_node* node_new = (struct _queue_node*)malloc(sizeof(struct _queue_node)); + if(node_new == NULL) + { + goto done1; + } + node_new->obj = obj_new; + node_new->next = NULL; + + return node_new; +done1: + free(obj_new); +done: + return NULL; +} + bool queue_push(struct _queue* self, void* obj) { assert(self != NULL); @@ -18,14 +42,14 @@ bool queue_push(struct _queue* self, void* obj) void * obj_new = malloc(self->_obj_size); if (obj_new == NULL) { - return false; + goto done; } memmove(obj_new, obj, self->_obj_size); struct _queue_node* node_new = (struct _queue_node*)malloc(sizeof(struct _queue_node)); if(node_new == NULL) { - return false; + goto done1; } node_new->obj = obj_new; node_new->next = NULL; @@ -41,7 +65,12 @@ bool queue_push(struct _queue* self, void* obj) self->_back = node_new; } self->_size++; + return true; +done1: + free(obj_new); +done: + return false; } bool queue_pop(struct _queue* self, void* obj) diff --git a/test/test_queue.c b/test/test_queue.c index d8990e8..74440aa 100644 --- a/test/test_queue.c +++ b/test/test_queue.c @@ -40,10 +40,9 @@ static void test_queue_init(void) TEST_ASSERT_FALSE(queue_init2(queue, 0, 1)); TEST_ASSERT_FALSE(queue_init2(queue, sizeof(int), 0)); queue_free(&queue); - - queue_init2(queue, sizeof(int), 1); } + static void test_queue_push(void) { int temp = 0; @@ -59,13 +58,55 @@ static void test_queue_push(void) for(i = 0; i < len; i++) { TEST_ASSERT_TRUE(queue->push(queue, &data[i])); + TEST_ASSERT_EQUAL_INT(i + 1, queue->size(queue)); + + TEST_ASSERT_TRUE(queue->front(queue, &temp)); + TEST_ASSERT_EQUAL_INT(data[0], temp); + + TEST_ASSERT_TRUE(queue->back(queue, &temp)); + TEST_ASSERT_EQUAL_INT(data[i], temp); } queue_free(&queue); // ------------------------------ queue = queue_new(); - queue_init2(queue, sizeof(int), 10); + queue_init2(queue, sizeof(int), len); + for(i = 0; i < len; i++) + { + TEST_ASSERT_TRUE(queue->push(queue, &data[i])); + TEST_ASSERT_EQUAL_INT(i + 1, queue->size(queue)); + TEST_ASSERT_TRUE(queue->front(queue, &temp)); + TEST_ASSERT_EQUAL_INT(data[0], temp); + + TEST_ASSERT_TRUE(queue->back(queue, &temp)); + TEST_ASSERT_EQUAL_INT(data[i], temp); + } + queue_free(&queue); + + // ------------------------------ + // if capacity is less than data len + uint32_t capacity = len - 1; + queue = queue_new(); + queue_init2(queue, sizeof(int), capacity); + for(i = 0; i < len; i++) + { + if(i == capacity - 1) + { + TEST_ASSERT_TRUE(queue->push(queue, &data[i])); + TEST_ASSERT_EQUAL_INT(i + 1, queue->size(queue)); + + TEST_ASSERT_TRUE(queue->front(queue, &temp)); + TEST_ASSERT_EQUAL_INT(data[0], temp); + + TEST_ASSERT_TRUE(queue->back(queue, &temp)); + TEST_ASSERT_EQUAL_INT(data[i], temp); + } + else + { + + } + } queue_free(&queue); } @@ -313,6 +354,7 @@ void test_queue(void) // TEST_MESSAGE("----- test_queue -----"); RUN_TEST(test_queue_new); RUN_TEST(test_queue_init); + RUN_TEST(test_queue_push); RUN_TEST(test_queue_num); RUN_TEST(test_queue_struct);