diff options
author | Will Storey <will@summercat.com> | 2017-08-27 21:25:59 -0700 |
---|---|---|
committer | Jérémie Courrèges-Anglas <jca@wxcvbn.org> | 2017-09-17 19:00:45 +0200 |
commit | 12da3db72c3bc1e6ea67f7d172dd638ab5039824 (patch) | |
tree | 6b35bf6aa7381e0a65bffe96a28648b34166ceae /src/format.c | |
parent | 1b4c4842050368854698402e79f2c021c33dd6d8 (diff) | |
download | ratpoison-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.
Diffstat (limited to 'src/format.c')
-rw-r--r-- | src/format.c | 100 |
1 files changed, 100 insertions, 0 deletions
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 |