From 485680a5bfeb952fd652a59efcce35636d6aec00 Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Tue, 10 Dec 2013 14:12:48 +0800 Subject: 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 --- test/lib/Makefile.am | 3 +- test/lib/test-fold.c | 157 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 test/lib/test-fold.c (limited to 'test') diff --git a/test/lib/Makefile.am b/test/lib/Makefile.am index ae6027f..ed570af 100644 --- a/test/lib/Makefile.am +++ b/test/lib/Makefile.am @@ -31,7 +31,8 @@ check_PROGRAMS = list-test \ test-process-async \ test-process-async-stdout \ test-process-parent-stdout \ - test-process-both + test-process-both \ + test-fold TESTS = $(check_PROGRAMS) 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 +#include +#include + +#include +#include +#include + +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; +} -- cgit v1.2.1