summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWill Storey <will@summercat.com>2017-08-27 21:25:59 -0700
committerJérémie Courrèges-Anglas <jca@wxcvbn.org>2017-09-17 19:00:45 +0200
commit12da3db72c3bc1e6ea67f7d172dd638ab5039824 (patch)
tree6b35bf6aa7381e0a65bffe96a28648b34166ceae
parent1b4c4842050368854698402e79f2c021c33dd6d8 (diff)
downloadratpoison-12da3db72c3bc1e6ea67f7d172dd638ab5039824.zip
Add a test program to exercise concat_width()
This program can be run using `make check`. In order to do this, you will need to run `autogen.sh` again.
-rw-r--r--.gitignore2
-rw-r--r--src/Makefile.am11
-rw-r--r--src/format.c100
3 files changed, 113 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index f256246..a053d16 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,8 @@ ratpoison-*.tar.gz
ratpoison-*.tar.gz.sig
ratpoison-*.tar.xz
ratpoison-*.tar.xz.sig
+src/format_test
+src/format_test.trs
TAGS
/doc/version.texi
/doc/stamp-vti
diff --git a/src/Makefile.am b/src/Makefile.am
index bc27439..7f4a673 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -75,3 +75,14 @@ ratpoison_SOURCES = actions.c \
if HAVE_XRANDR
ratpoison_SOURCES += xrandr.c xrandr.h
endif
+
+TESTS = format_test
+
+check_PROGRAMS = format_test
+
+format_test_SOURCES = actions.c bar.c completions.c editor.c events.c format.c \
+ frame.c globals.c group.c history.c hook.c input.c \
+ linkedlist.c manage.c number.c sbuf.c screen.c split.c \
+ window.c xrandr.c
+format_test_CPPFLAGS = $(AM_CPPFLAGS) -DRUN_FORMAT_TEST
+format_test_LDADD = $(ratpoison_LDADD)
diff --git a/src/format.c b/src/format.c
index db903e3..f9d0ed4 100644
--- a/src/format.c
+++ b/src/format.c
@@ -321,3 +321,103 @@ fmt_pid (rp_window_elem *elem, struct sbuf *buf)
else
sbuf_concat (buf, "?");
}
+
+#ifdef RUN_FORMAT_TEST
+
+#include <assert.h>
+#include <locale.h>
+
+void rtp_test_concat_width(void);
+
+int main(void)
+{
+ /* We need to set up locale information for multibyte functions to work
+ correctly. */
+ setlocale(LC_ALL, "");
+
+ rtp_test_concat_width();
+ return 0;
+}
+
+void rtp_test_concat_width(void)
+{
+ struct sbuf *buf = NULL;
+
+ /* Zero length string, no limit. */
+
+ buf = sbuf_new(0);
+ concat_width(buf, "", -1);
+ assert(strcmp(sbuf_get(buf), "") == 0);
+ sbuf_free(buf);
+
+ /* Zero length string, non-zero limit. */
+
+ buf = sbuf_new(0);
+ concat_width(buf, "", 5);
+ assert(strcmp(sbuf_get(buf), "") == 0);
+ sbuf_free(buf);
+
+ /* ASCII string, no limit. */
+
+ buf = sbuf_new(0);
+ concat_width(buf, "hi there", -1);
+ assert(strcmp(sbuf_get(buf), "hi there") == 0);
+ concat_width(buf, " you", -1);
+ assert(strcmp(sbuf_get(buf), "hi there you") == 0);
+ sbuf_free(buf);
+
+ /* ASCII string, non-zero limit, truncated. */
+
+ buf = sbuf_new(0);
+ concat_width(buf, "hi there", 4);
+ assert(strcmp(sbuf_get(buf), "hi t") == 0);
+ sbuf_free(buf);
+
+ /* ASCII string, non-zero limit, not truncated. */
+
+ buf = sbuf_new(0);
+ concat_width(buf, "hi", 4);
+ assert(strcmp(sbuf_get(buf), "hi") == 0);
+ sbuf_free(buf);
+
+ /* UTF-8 string, no limit. */
+
+ buf = sbuf_new(0);
+ /* 0xe2 0x84 0xa2 is U+2122, the trademark symbol. */
+ concat_width(buf, "hi \xe2\x84\xa2 there", -1);
+ assert(strcmp(sbuf_get(buf), "hi \xe2\x84\xa2 there") == 0);
+ sbuf_free(buf);
+
+ /* UTF-8 string, non-zero limit, truncated at an okay spot counting either
+ by bytes or by characters. */
+
+ buf = sbuf_new(0);
+ concat_width(buf, "hi \xe2\x84\xa2 there you", 11);
+ assert(strcmp(sbuf_get(buf), "hi \xe2\x84\xa2 there ") == 0);
+ sbuf_free(buf);
+
+ /* UTF-8 string, non-zero limit, truncated such that if the limit were in
+ bytes that we would cut in the middle of a character. */
+
+ buf = sbuf_new(0);
+ concat_width(buf, "hi \xe2\x84\xa2 there you", 5);
+ assert(strcmp(sbuf_get(buf), "hi \xe2\x84\xa2 ") == 0);
+ sbuf_free(buf);
+
+ /* UTF-8 string, non-zero limit, not truncated. */
+
+ buf = sbuf_new(0);
+ concat_width(buf, "hi \xe2\x84\xa2 there you", 20);
+ assert(strcmp(sbuf_get(buf), "hi \xe2\x84\xa2 there you") == 0);
+ sbuf_free(buf);
+
+ /* Invalid character. */
+
+ buf = sbuf_new(0);
+ /* This is an invalid UTF-8 sequence. It's missing 0xa2. */
+ concat_width(buf, "hi \xe2\x84 there you", 20);
+ assert(strcmp(sbuf_get(buf), "hi ") == 0);
+ sbuf_free(buf);
+}
+
+#endif