]> git.mdlowis.com Git - projs/libcds.git/commitdiff
str_erase implemented
authorMichael D. Lowis <mike.lowis@gentex.com>
Wed, 13 Aug 2014 17:34:52 +0000 (13:34 -0400)
committerMichael D. Lowis <mike.lowis@gentex.com>
Wed, 13 Aug 2014 17:34:52 +0000 (13:34 -0400)
source/string/str.c
tests/test_str.c

index 76ae599656473761595b5d896430096b9ec81b69..472edb9136827c75f47287c288f04cd336487796 100644 (file)
@@ -89,12 +89,22 @@ str_t* str_insert(str_t* p_str1, size_t index, str_t* p_str2)
     return p_newstr;
 }
 
+#include <stdio.h>
+
 str_t* str_erase(str_t* p_str, size_t start, size_t end)
 {
-    (void)p_str;
-    (void)start;
-    (void)end;
-    return NULL;
+    str_t* p_newstr = NULL;
+    size_t newsize  = 0;
+    size_t endbytes = 0;
+    assert(NULL != p_str);
+    assert(start <= end);
+    endbytes = (end >= p_str->size) ? 0 : (p_str->size - end);
+    newsize = start + endbytes;
+    p_newstr = (str_t*)mem_allocate(sizeof(str_t) + newsize, NULL);
+    memcpy(&(p_newstr->data[0]),     p_str->data,         start);
+    memcpy(&(p_newstr->data[start]), &(p_str->data[end]), endbytes);
+    p_newstr->data[newsize] = '\0';
+    return p_newstr;
 }
 
 str_t* str_substr(str_t* p_str, size_t start, size_t end)
index cf396871f4331d492c9ddafd92f0c516f0d280a5..a797da4ebdc4637d2d5c8638f5cc33ce94b2af6c 100644 (file)
@@ -170,8 +170,67 @@ TEST_SUITE(String) {
     }
 
     //-------------------------------------------------------------------------
-    // Test str_ function
+    // Test str_erase function
     //-------------------------------------------------------------------------
+    TEST(Verify_str_erase_should_erase_first_char)
+    {
+        str_t* p_str1 = str_new("abc");
+        str_t* p_str2 = str_erase(p_str1,0,1);
+        CHECK(p_str1 != p_str2);
+        CHECK(0 == strcmp(str_cstr(p_str2), "bc"));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_erase_should_erase_second_char)
+    {
+        str_t* p_str1 = str_new("abc");
+        str_t* p_str2 = str_erase(p_str1,1,2);
+        CHECK(p_str1 != p_str2);
+        CHECK(0 == strcmp(str_cstr(p_str2), "ac"));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_erase_should_erase_last)
+    {
+        str_t* p_str1 = str_new("abc");
+        str_t* p_str2 = str_erase(p_str1,2,3);
+        CHECK(p_str1 != p_str2);
+        CHECK(0 == strcmp(str_cstr(p_str2), "ab"));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_erase_nothing_when_out_of_bounds)
+    {
+        str_t* p_str1 = str_new("abc");
+        str_t* p_str2 = str_erase(p_str1,3,4);
+        CHECK(p_str1 != p_str2);
+        CHECK(0 == strcmp(str_cstr(p_str2), "abc"));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_erase_nothing_when_range_is_of_length_0)
+    {
+        str_t* p_str1 = str_new("abc");
+        str_t* p_str2 = str_erase(p_str1,1,1);
+        CHECK(p_str1 != p_str2);
+        CHECK(0 == strcmp(str_cstr(p_str2), "abc"));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_erase_everything)
+    {
+        str_t* p_str1 = str_new("abc");
+        str_t* p_str2 = str_erase(p_str1, 0, str_size(p_str1));
+        CHECK(p_str1 != p_str2);
+        CHECK(0 == strcmp(str_cstr(p_str2), ""));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
 
     //-------------------------------------------------------------------------
     // Test str_ function