]> git.mdlowis.com Git - projs/libcds.git/commitdiff
Finished initial implementation of string module
authorMichael D. Lowis <mike@mdlowis.com>
Thu, 21 Aug 2014 03:18:41 +0000 (23:18 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Thu, 21 Aug 2014 03:18:41 +0000 (23:18 -0400)
source/string/str.c
tests/test_str.c

index 1c82cbbbdcca0e767a09a8c87427228b5d35e2bc..6703414fd537b9975a9e66a0ad3dbc0378f0a316 100644 (file)
@@ -84,7 +84,8 @@ str_t* str_insert(str_t* p_str1, size_t index, str_t* p_str2)
         memcpy(&(p_newstr->data[0]), p_str1->data, index);
         memcpy(&(p_newstr->data[index]), p_str2->data, p_str2->size);
         memcpy(&(p_newstr->data[index+p_str2->size]), &(p_str1->data[index]), p_str1->size-index);
-        p_newstr->data[p_str1->size + p_str2->size] = '\0';
+        p_newstr->size = p_str1->size + p_str2->size;
+        p_newstr->data[p_newstr->size] = '\0';
     }
     return p_newstr;
 }
@@ -125,15 +126,25 @@ int str_compare(str_t* p_str1, str_t* p_str2)
 
 size_t str_find(str_t* p_str1, str_t* p_str2)
 {
-    (void)p_str1;
-    (void)p_str2;
-    return 0;
+    size_t idx = -1;
+    for(size_t i = 0; i < p_str1->size; i++) {
+        if(0 == strncmp(&(p_str1->data[i]), p_str2->data, p_str2->size)) {
+            idx = i;
+            break;
+        }
+    }
+    return idx;
 }
 
 size_t str_rfind(str_t* p_str1, str_t* p_str2)
 {
-    (void)p_str1;
-    (void)p_str2;
-    return 0;
+    size_t idx = -1;
+    for(size_t i = p_str1->size; i > 0; i--) {
+        if(0 == strncmp(&(p_str1->data[i-1]), p_str2->data, p_str2->size)) {
+            idx = i-1;
+            break;
+        }
+    }
+    return idx;
 }
 
index 54e3e64166addecdc4ac98e00772c25e4d41b0a4..5b32f2c6d156db8c9f4e021f8304df1f1708a535 100644 (file)
@@ -17,6 +17,7 @@ TEST_SUITE(String) {
     {
         str_t* p_str = str_new("foo");
         CHECK(0 == strcmp(str_cstr(p_str), "foo"));
+        CHECK(3 == str_size(p_str));
         mem_release(p_str);
     }
 
@@ -77,6 +78,8 @@ TEST_SUITE(String) {
         CHECK(p_str1 != p_str2);
         CHECK(0 == strcmp(str_cstr(p_str1),"abc"));
         CHECK(0 == strcmp(str_cstr(p_str2),"abd"));
+        CHECK(3 == str_size(p_str1));
+        CHECK(3 == str_size(p_str2));
         mem_release(p_str1);
         mem_release(p_str2);
     }
@@ -93,6 +96,7 @@ TEST_SUITE(String) {
         CHECK(0 == strcmp(str_cstr(p_str1), "abc"));
         CHECK(0 == strcmp(str_cstr(p_str2), "def"));
         CHECK(0 == strcmp(str_cstr(p_str3), "abcdef"));
+        CHECK(6 == str_size(p_str3));
         mem_release(p_str1);
         mem_release(p_str2);
         mem_release(p_str3);
@@ -110,6 +114,7 @@ TEST_SUITE(String) {
         CHECK(0 == strcmp(str_cstr(p_str1), "abc"));
         CHECK(0 == strcmp(str_cstr(p_str2), "def"));
         CHECK(0 == strcmp(str_cstr(p_str3), "defabc"));
+        CHECK(6 == str_size(p_str3));
         mem_release(p_str1);
         mem_release(p_str2);
         mem_release(p_str3);
@@ -124,6 +129,7 @@ TEST_SUITE(String) {
         CHECK(0 == strcmp(str_cstr(p_str1), "abc"));
         CHECK(0 == strcmp(str_cstr(p_str2), "def"));
         CHECK(0 == strcmp(str_cstr(p_str3), "adefbc"));
+        CHECK(6 == str_size(p_str3));
         mem_release(p_str1);
         mem_release(p_str2);
         mem_release(p_str3);
@@ -138,6 +144,7 @@ TEST_SUITE(String) {
         CHECK(0 == strcmp(str_cstr(p_str1), "abc"));
         CHECK(0 == strcmp(str_cstr(p_str2), "def"));
         CHECK(0 == strcmp(str_cstr(p_str3), "abdefc"));
+        CHECK(6 == str_size(p_str3));
         mem_release(p_str1);
         mem_release(p_str2);
         mem_release(p_str3);
@@ -152,6 +159,7 @@ TEST_SUITE(String) {
         CHECK(0 == strcmp(str_cstr(p_str1), "abc"));
         CHECK(0 == strcmp(str_cstr(p_str2), "def"));
         CHECK(0 == strcmp(str_cstr(p_str3), "abcdef"));
+        CHECK(6 == str_size(p_str3));
         mem_release(p_str1);
         mem_release(p_str2);
         mem_release(p_str3);
@@ -239,18 +247,208 @@ TEST_SUITE(String) {
     }
 
     //-------------------------------------------------------------------------
-    // Test str_ function
+    // Test str_substr function
     //-------------------------------------------------------------------------
+    TEST(Verify_str_substr_should_return_a_copy_of_the_string)
+    {
+        str_t* p_str1 = str_new("abcdef");
+        str_t* p_str2 = str_substr(p_str1, 0, str_size(p_str1));
+        CHECK(p_str1 != p_str2);
+        CHECK(0 == str_compare(p_str1,p_str2));
+        CHECK(6 == str_size(p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_substr_should_return_index_1_to_the_end)
+    {
+        str_t* p_str1 = str_new("abcdef");
+        str_t* p_str2 = str_substr(p_str1, 1, str_size(p_str1));
+        CHECK(p_str1 != p_str2);
+        CHECK(0 == strcmp(str_cstr(p_str2), "bcdef"));
+        CHECK(5 == str_size(p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_substr_should_return_index_0_to_one_before_the_end)
+    {
+        str_t* p_str1 = str_new("abcdef");
+        str_t* p_str2 = str_substr(p_str1, 0, str_size(p_str1)-1);
+        CHECK(p_str1 != p_str2);
+        CHECK(0 == strcmp(str_cstr(p_str2), "abcde"));
+        CHECK(5 == str_size(p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_substr_should_return_index_1_to_3)
+    {
+        str_t* p_str1 = str_new("abcdef");
+        str_t* p_str2 = str_substr(p_str1, 1, 4);
+        CHECK(p_str1 != p_str2);
+        CHECK(0 == strcmp(str_cstr(p_str2), "bcd"));
+        CHECK(3 == str_size(p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_substr_should_return_index_1_to_2)
+    {
+        str_t* p_str1 = str_new("abcdef");
+        str_t* p_str2 = str_substr(p_str1, 1, 3);
+        CHECK(p_str1 != p_str2);
+        CHECK(0 == strcmp(str_cstr(p_str2), "bc"));
+        CHECK(2 == str_size(p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_substr_should_return_index_1_to_1)
+    {
+        str_t* p_str1 = str_new("abcdef");
+        str_t* p_str2 = str_substr(p_str1, 1, 2);
+        CHECK(p_str1 != p_str2);
+        CHECK(0 == strcmp(str_cstr(p_str2), "b"));
+        CHECK(1 == str_size(p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_substr_should_return_an_empty_string_for_a_range_of_0)
+    {
+        str_t* p_str1 = str_new("abcdef");
+        str_t* p_str2 = str_substr(p_str1, 1, 1);
+        CHECK(p_str1 != p_str2);
+        CHECK(0 == strcmp(str_cstr(p_str2), ""));
+        CHECK(0 == str_size(p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
 
     //-------------------------------------------------------------------------
-    // Test str_ function
+    // Test str_compare function
     //-------------------------------------------------------------------------
+    TEST(Verify_str_compare_should_return_0_on_match)
+    {
+        str_t* p_str1 = str_new("abc");
+        str_t* p_str2 = str_new("abc");
+        CHECK(0 == str_compare(p_str1, p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_compare_should_return_negative_1_on_mismatch)
+    {
+        str_t* p_str1 = str_new("abc");
+        str_t* p_str2 = str_new("abd");
+        CHECK(-1 == str_compare(p_str1, p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_compare_should_return_positive_1_on_mismatch)
+    {
+        str_t* p_str1 = str_new("abd");
+        str_t* p_str2 = str_new("abc");
+        CHECK(1 == str_compare(p_str1, p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
 
     //-------------------------------------------------------------------------
-    // Test str_ function
+    // Test str_find function
     //-------------------------------------------------------------------------
+    TEST(Verify_str_find_should_find_a_string_at_index_0)
+    {
+        str_t* p_str1 = str_new("abcdcba");
+        str_t* p_str2 = str_new("abc");
+        CHECK(0 == str_find(p_str1, p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_find_should_find_a_string_at_index_1)
+    {
+        str_t* p_str1 = str_new("abcdcba");
+        str_t* p_str2 = str_new("bcd");
+        CHECK(1 == str_find(p_str1, p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_find_should_find_a_string_in_the_middle)
+    {
+        str_t* p_str1 = str_new("abcdcba");
+        str_t* p_str2 = str_new("cdc");
+        CHECK(2 == str_find(p_str1, p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_find_should_find_a_string_1_from_the_end)
+    {
+        str_t* p_str1 = str_new("abcdcba");
+        str_t* p_str2 = str_new("dcb");
+        CHECK(3 == str_find(p_str1, p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_find_should_find_a_string_at_the_end)
+    {
+        str_t* p_str1 = str_new("abcdcba");
+        str_t* p_str2 = str_new("cba");
+        CHECK(4 == str_find(p_str1, p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
 
     //-------------------------------------------------------------------------
-    // Test str_ function
+    // Test str_rfind function
     //-------------------------------------------------------------------------
+    TEST(Verify_str_rfind_should_find_a_string_at_index_0)
+    {
+        str_t* p_str1 = str_new("abcdcba");
+        str_t* p_str2 = str_new("abc");
+        CHECK(0 == str_rfind(p_str1, p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_rfind_should_find_a_string_at_index_1)
+    {
+        str_t* p_str1 = str_new("abcdcba");
+        str_t* p_str2 = str_new("bcd");
+        CHECK(1 == str_rfind(p_str1, p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_rfind_should_find_a_string_in_the_middle)
+    {
+        str_t* p_str1 = str_new("abcdcba");
+        str_t* p_str2 = str_new("cdc");
+        CHECK(2 == str_rfind(p_str1, p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_rfind_should_find_a_string_1_from_the_end)
+    {
+        str_t* p_str1 = str_new("abcdcba");
+        str_t* p_str2 = str_new("dcb");
+        CHECK(3 == str_rfind(p_str1, p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
+
+    TEST(Verify_str_rfind_should_find_a_string_at_the_end)
+    {
+        str_t* p_str1 = str_new("abcdcba");
+        str_t* p_str2 = str_new("cba");
+        CHECK(4 == str_rfind(p_str1, p_str2));
+        mem_release(p_str1);
+        mem_release(p_str2);
+    }
 }