]> granicus.if.org Git - neomutt/commitdiff
test: improve test_mutt_buffer_printf()
authorRichard Russon <rich@flatcap.org>
Fri, 24 May 2019 22:24:04 +0000 (23:24 +0100)
committerRichard Russon <rich@flatcap.org>
Sun, 26 May 2019 16:16:51 +0000 (17:16 +0100)
mutt/buffer.c
test/buffer/mutt_buffer_printf.c

index c14d4fa16a79f27a69781bcf25d5630e6879670f..0ef3637d3323328ce9578d842af8c8b1997ec23c 100644 (file)
@@ -148,29 +148,23 @@ void mutt_buffer_free(struct Buffer **p)
  * @param fmt printf-style format string
  * @param ap  Arguments to be formatted
  * @retval num Characters written
+ * @retval 0   Error
  */
 static int buffer_printf(struct Buffer *buf, const char *fmt, va_list ap)
 {
-  if (!buf)
-    return 0;
+  if (!buf || !fmt)
+    return 0; /* LCOV_EXCL_LINE */
 
-  va_list ap_retry;
-  int len, blen, doff;
+  if (!buf->data || !buf->dptr || (buf->dsize < 128))
+    mutt_buffer_increase_size(buf, 128);
 
-  va_copy(ap_retry, ap);
+  int doff = buf->dptr - buf->data;
+  int blen = buf->dsize - doff;
 
-  if (!buf->dptr)
-    buf->dptr = buf->data;
+  va_list ap_retry;
+  va_copy(ap_retry, ap);
 
-  doff = buf->dptr - buf->data;
-  blen = buf->dsize - doff;
-  /* solaris 9 vsnprintf barfs when blen is 0 */
-  if (blen == 0)
-  {
-    blen = 128;
-    mutt_buffer_increase_size(buf, buf->dsize + blen);
-  }
-  len = vsnprintf(buf->dptr, blen, fmt, ap);
+  int len = vsnprintf(buf->dptr, blen, fmt, ap);
   if (len >= blen)
   {
     blen = ++len - blen;
@@ -193,6 +187,7 @@ static int buffer_printf(struct Buffer *buf, const char *fmt, va_list ap)
  * @param fmt printf-style format string
  * @param ... Arguments to be formatted
  * @retval num Characters written
+ * @retval -1  Error
  */
 int mutt_buffer_printf(struct Buffer *buf, const char *fmt, ...)
 {
index 34907d3370ef1c1ea906b5a709e2a6d2fcb1313c..ed8de9ee63909b451bad5db3626ee5d6c788eeea 100644 (file)
@@ -37,4 +37,75 @@ void test_mutt_buffer_printf(void)
     struct Buffer buf = { 0 };
     TEST_CHECK(mutt_buffer_printf(&buf, NULL) != 0);
   }
+
+  TEST_CASE("printf to an empty Buffer");
+
+  {
+    TEST_CASE("Empty");
+    struct Buffer *buf = mutt_buffer_new();
+    TEST_CHECK(mutt_buffer_printf(buf, "") == 0);
+    TEST_CHECK(strlen(mutt_b2s(buf)) == 0);
+    mutt_buffer_free(&buf);
+  }
+
+  {
+    TEST_CASE("Static");
+    const char *str = "apple";
+    struct Buffer *buf = mutt_buffer_new();
+    TEST_CHECK(mutt_buffer_printf(buf, str) == 5);
+    TEST_CHECK(strcmp(mutt_b2s(buf), str) == 0);
+    mutt_buffer_free(&buf);
+  }
+
+  {
+    TEST_CASE("Varargs");
+    const char *str = "apple";
+    const char *result = "app 1234567 3.1416";
+    struct Buffer *buf = mutt_buffer_new();
+    TEST_CHECK(mutt_buffer_printf(buf, "%.3s %ld %3.4f", str, 1234567, 3.141592654) == 18);
+    TEST_CHECK(strcmp(mutt_b2s(buf), result) == 0);
+    mutt_buffer_free(&buf);
+  }
+
+  TEST_CASE("printf to a non-empty Buffer");
+
+  {
+    TEST_CASE("Empty");
+    const char *str = "test";
+    struct Buffer *buf = mutt_buffer_from(str);
+    TEST_CHECK(mutt_buffer_printf(buf, "") == 0);
+    TEST_CHECK(strcmp(mutt_b2s(buf), "") == 0);
+    mutt_buffer_free(&buf);
+  }
+
+  {
+    TEST_CASE("Static");
+    const char *str = "apple";
+    struct Buffer *buf = mutt_buffer_from("test");
+    TEST_CHECK(mutt_buffer_printf(buf, str) == 5);
+    TEST_CHECK(strcmp(mutt_b2s(buf), str) == 0);
+    mutt_buffer_free(&buf);
+  }
+
+  {
+    TEST_CASE("Static big");
+    const char *str =
+        "apple banana cherry damson elderberry fig guava hawthorn ilama "
+        "jackfruit kumquat lemon mango nectarine olive papaya quince raspberry "
+        "strawberry tangerine ugli vanilla wolfberry xigua yew ziziphus";
+    struct Buffer *buf = mutt_buffer_from("test");
+    TEST_CHECK(mutt_buffer_printf(buf, str) == 195);
+    TEST_CHECK(strcmp(mutt_b2s(buf), str) == 0);
+    mutt_buffer_free(&buf);
+  }
+
+  {
+    TEST_CASE("Varargs");
+    const char *str = "apple";
+    const char *result = "app 1234567 3.1416";
+    struct Buffer *buf = mutt_buffer_from("test");
+    TEST_CHECK(mutt_buffer_printf(buf, "%.3s %ld %3.4f", str, 1234567, 3.141592654) == 18);
+    TEST_CHECK(strcmp(mutt_b2s(buf), result) == 0);
+    mutt_buffer_free(&buf);
+  }
 }