]> granicus.if.org Git - neomutt/commitdiff
test: improve test_mutt_str_inline_replace()
authorRichard Russon <rich@flatcap.org>
Sun, 26 May 2019 15:02:23 +0000 (16:02 +0100)
committerRichard Russon <rich@flatcap.org>
Sun, 26 May 2019 16:18:13 +0000 (17:18 +0100)
mutt/string.c
test/string/mutt_str_inline_replace.c

index 203007e201cdb9a10b76cd12dc1cfeafe699ebbe..d372fa87efd17c159e0f5180c26b0a0969274c4d 100644 (file)
@@ -1115,6 +1115,9 @@ bool mutt_str_inline_replace(char *buf, size_t buflen, size_t xlen, const char *
   size_t slen = mutt_str_strlen(buf + xlen);
   size_t rlen = mutt_str_strlen(rstr);
 
+  if ((slen + rlen) >= buflen)
+    return false;
+
   memmove(buf + rlen, buf + xlen, slen + 1);
   memmove(buf, rstr, rlen);
 
index 1c275e738f6d4bfda1211fa4ce7c7643f8a2d353..8fcebd148d2474b382d3a16e2fc91c4ea514c0d8 100644 (file)
 #include "config.h"
 #include "mutt/mutt.h"
 
+struct InlineReplaceTest
+{
+  const char *initial;
+  int replace_len;
+  const char *replace;
+  const char *expected;
+  bool success;
+};
+
 void test_mutt_str_inline_replace(void)
 {
   // bool mutt_str_inline_replace(char *buf, size_t buflen, size_t xlen, const char *rstr);
@@ -37,4 +46,36 @@ void test_mutt_str_inline_replace(void)
     char buf[32] = "banana";
     TEST_CHECK(mutt_str_inline_replace(buf, sizeof(buf), 2, NULL) == false);
   }
+
+  // clang-format off
+  struct InlineReplaceTest replace_tests[] =
+  {
+    { "XXXXbanana", 4, "",          "banana",        true,  },
+    { "XXXXbanana", 4, "OO",        "OObanana",      true,  },
+    { "XXXXbanana", 4, "OOOO",      "OOOObanana",    true,  },
+    { "XXXXbanana", 4, "OOOOOO",    "OOOOOObanana",  true,  },
+    { "XXXXbanana", 4, "OOOOOOO",   "OOOOOOObanana", true,  },
+    { "XXXXbanana", 4, "OOOOOOOO",  "OOOOOOOObanan", false, },
+    { "XXXXbanana", 4, "OOOOOOOOO", "OOOOOOOOObana", false, },
+  };
+  // clang-format on
+
+  {
+    char buf[14];
+    for (size_t i = 0; i < mutt_array_size(replace_tests); i++)
+    {
+      struct InlineReplaceTest *t = &replace_tests[i];
+      TEST_CASE_("'%s', %d, '%s'", t->initial, t->replace_len, t->replace);
+
+      memset(buf, 0, sizeof(buf));
+
+      strncpy(buf, t->initial, sizeof(buf));
+      bool result = mutt_str_inline_replace(buf, sizeof(buf), t->replace_len, t->replace);
+      TEST_CHECK(result == t->success);
+      if (result)
+        TEST_CHECK(strcmp(buf, t->expected) == 0);
+      else
+        TEST_CHECK(strcmp(buf, t->initial) == 0);
+    }
+  }
 }