diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2013-12-10 14:12:48 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2014-01-31 08:46:34 +0800 |
commit | 485680a5bfeb952fd652a59efcce35636d6aec00 (patch) | |
tree | 8f3f09ede88b8e60eb5a19a5a29de4e83451934e /test/lib/test-fold.c | |
parent | 5a271400e9b5396cb90258b7582fe7ac6bcc2230 (diff) | |
download | petitboot-485680a5bfeb952fd652a59efcce35636d6aec00.zip petitboot-485680a5bfeb952fd652a59efcce35636d6aec00.tar.gz |
lib/fold: Add text fold utility
We want to fold help text into the ncurses UI, so add a little module to
split text into lines.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'test/lib/test-fold.c')
-rw-r--r-- | test/lib/test-fold.c | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/test/lib/test-fold.c b/test/lib/test-fold.c new file mode 100644 index 0000000..1f58fdf --- /dev/null +++ b/test/lib/test-fold.c @@ -0,0 +1,157 @@ + +#include <stdlib.h> +#include <string.h> +#include <assert.h> + +#include <fold/fold.h> +#include <list/list.h> +#include <talloc/talloc.h> + +struct line { + const char *buf; + unsigned int len; + struct list_item list; +}; + +struct ctx { + struct list lines; +}; + +struct test { + const char *in; + unsigned int linelen; + const char *out[]; +}; + +/* split on newline boundaries, no actual folding */ +struct test test_split = { + .in = "Lorem ipsum dolor\nsit amet,\nconsectetuer\n", + .linelen = 20, + .out = { + "Lorem ipsum dolor", + "sit amet,", + "consectetuer", + "", + NULL, + }, +}; + +/* fold a long line */ +struct test test_fold_line = { + .in = "Lorem ipsum dolor sit amet, consectetuer adipiscing " + "elit, sed diam nonummy nibh euismod tincidunt ut " + "laoreet dolore magna aliquam erat volutpat.", + .linelen = 20, + .out = { + "Lorem ipsum dolor", + "sit amet,", + "consectetuer", + "adipiscing elit,", + "sed diam nonummy", + "nibh euismod", + "tincidunt ut", + "laoreet dolore", + "magna aliquam erat", + "volutpat.", + NULL + }, +}; + +/* break a word */ +struct test test_break = { + .in = "Lorem ipsum dolor sit amet, consectetuer", + .linelen = 10, + .out = { + "Lorem", + "ipsum", + "dolor sit", + "amet,", + "consectetu", + "er", + NULL + }, +}; + +static struct test *tests[] = { + &test_split, &test_fold_line, &test_break, +}; + +static void __attribute__((noreturn)) fail(struct ctx *ctx, + struct test *test, const char *msg) +{ + struct line *line; + int i; + + fprintf(stderr, "%s\n", msg); + fprintf(stderr, "input:\n%s\n", test->in); + + fprintf(stderr, "expected:\n"); + for (i = 0; test->out[i]; i++) + fprintf(stderr, " '%s'\n", test->out[i]); + + fprintf(stderr, "actual:\n"); + list_for_each_entry(&ctx->lines, line, list) { + char *buf = talloc_strndup(ctx, line->buf, line->len); + fprintf(stderr, " '%s'\n", buf); + talloc_free(buf); + } + + exit(EXIT_FAILURE); +} + +static int fold_line_cb(void *arg, const char *start, int len) +{ + struct ctx *ctx = arg; + struct line *line; + + line = talloc(ctx, struct line); + line->buf = start; + line->len = len; + list_add_tail(&ctx->lines, &line->list); + + return 0; +} + +static void run_test(struct test *test) +{ + struct line *line; + struct ctx *ctx; + int i; + + ctx = talloc(NULL, struct ctx); + list_init(&ctx->lines); + fold_text(test->in, test->linelen, fold_line_cb, ctx); + + i = 0; + list_for_each_entry(&ctx->lines, line, list) { + if (!test->out[i]) + fail(ctx, test, + "fold_text returned more lines than expected"); + + if (line->len > test->linelen) + fail(ctx, test, "line too long"); + + if (line->len != strlen(test->out[i])) + fail(ctx, test, "line lengths differ"); + + if (strncmp(line->buf, test->out[i], line->len)) + fail(ctx, test, "line data differs"); + + i++; + } + + if (test->out[i]) + fail(ctx, test, "fold_text returned fewer lines than expected"); + + talloc_free(ctx); +} + +int main(void) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(tests); i++) + run_test(tests[i]); + + return EXIT_SUCCESS; +} |