eina_slice: fix multi-byte find function, add tests.
authorGustavo Sverzut Barbieri <barbieri@profusion.mobi>
Tue, 23 Aug 2016 21:41:20 +0000 (18:41 -0300)
committerGustavo Sverzut Barbieri <barbieri@profusion.mobi>
Tue, 23 Aug 2016 23:17:13 +0000 (20:17 -0300)
src/lib/eina/eina_inline_slice.x
src/tests/eina/eina_test_slice.c

index 27cca37..2f272ad 100644 (file)
@@ -155,13 +155,13 @@ eina_slice_find(const Eina_Slice slice, const Eina_Slice needle)
    if (slice.len == 0) return NULL;
    if (needle.len == 0) return NULL;
    if (slice.len < needle.len) return NULL;
-   if (slice.len == 1) return eina_slice_strchr(slice, needle.bytes[0]);
+   if (needle.len == 1) return eina_slice_strchr(slice, needle.bytes[0]);
    if ((slice.len == needle.len) &&
        (memcmp(slice.mem, needle.mem, needle.len) == 0))
      return slice.mem;
 
    s.mem = slice.mem;
-   s.len = slice.len - needle.len;
+   s.len = slice.len - (needle.len - 1);
 
    c = needle.bytes[0];
    n.mem = (const void *)(needle.bytes + 1);
index ca73e73..5634ed4 100644 (file)
@@ -209,6 +209,59 @@ START_TEST(eina_test_slice_print)
 }
 END_TEST
 
+START_TEST(eina_test_slice_find)
+{
+    Eina_Slice slice = EINA_SLICE_STR_LITERAL("abcdef");
+    const char *p;
+
+    p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("a"));
+    fail_if(p == NULL);
+    ck_assert_str_eq(p, (const char *)slice.bytes);
+
+    p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("ab"));
+    fail_if(p == NULL);
+    ck_assert_str_eq(p, (const char *)slice.bytes);
+
+    p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("abc"));
+    fail_if(p == NULL);
+    ck_assert_str_eq(p, (const char *)slice.bytes);
+
+    p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("f"));
+    fail_if(p == NULL);
+    ck_assert_str_eq(p, (const char *)slice.bytes + strlen("abcde"));
+
+    p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("ef"));
+    fail_if(p == NULL);
+    ck_assert_str_eq(p, (const char *)slice.bytes + strlen("abcd"));
+
+    p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("def"));
+    fail_if(p == NULL);
+    ck_assert_str_eq(p, (const char *)slice.bytes + strlen("abc"));
+
+    p = eina_slice_find(slice, slice);
+    fail_if(p == NULL);
+    ck_assert_str_eq(p, (const char *)slice.bytes);
+
+    p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("x"));
+    fail_unless(p == NULL);
+
+    p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("xyz"));
+    fail_unless(p == NULL);
+
+    p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("xa"));
+    fail_unless(p == NULL);
+
+    p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("xb"));
+    fail_unless(p == NULL);
+
+    p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("abcdefgh"));
+    fail_unless(p == NULL);
+
+    p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL(""));
+    fail_unless(p == NULL);
+}
+END_TEST
+
 void
 eina_test_slice(TCase *tc)
 {
@@ -216,4 +269,5 @@ eina_test_slice(TCase *tc)
    tcase_add_test(tc, eina_test_slice_ro);
    tcase_add_test(tc, eina_test_slice_rw);
    tcase_add_test(tc, eina_test_slice_print);
+   tcase_add_test(tc, eina_test_slice_find);
 }