From 9d2429c027770a711aa6ea6be86545e7966ec1ba Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Fri, 9 Nov 2018 10:57:37 +0100 Subject: [PATCH 1/3] test line joining --- configure.ac | 1 + tests/Makefile.am | 6 ++- tests/fe-text/Makefile.am | 38 ++++++++++++++++ tests/fe-text/mock-irssi.c | 9 ++++ tests/fe-text/test-paste-join-multiline.c | 55 +++++++++++++++++++++++ 5 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 tests/fe-text/Makefile.am create mode 100644 tests/fe-text/mock-irssi.c create mode 100644 tests/fe-text/test-paste-join-multiline.c diff --git a/configure.ac b/configure.ac index 03e05847..49436bf1 100644 --- a/configure.ac +++ b/configure.ac @@ -732,6 +732,7 @@ scripts/examples/Makefile tests/Makefile tests/fe-common/Makefile tests/fe-common/core/Makefile +tests/fe-text/Makefile tests/irc/Makefile tests/irc/core/Makefile tests/irc/flood/Makefile diff --git a/tests/Makefile.am b/tests/Makefile.am index e16d190e..8713b38f 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1 +1,5 @@ -SUBDIRS = fe-common irc +if BUILD_TEXTUI +TEXTUI=fe-text +endif + +SUBDIRS = fe-common irc $(TEXTUI) diff --git a/tests/fe-text/Makefile.am b/tests/fe-text/Makefile.am new file mode 100644 index 00000000..38979e14 --- /dev/null +++ b/tests/fe-text/Makefile.am @@ -0,0 +1,38 @@ +include $(top_srcdir)/utils/glib-tap.mk + +PACKAGE_STRING=fe-text + +AM_CPPFLAGS = \ + -I$(top_srcdir)/src \ + -I$(top_srcdir)/src/core \ + -I$(top_srcdir)/src/fe-common/core \ + -I$(top_srcdir)/src/fe-text \ + $(GLIB_CFLAGS) + +test_programs = test-paste-join-multiline + +test_paste_join_multiline_CPPFLAGS = \ + $(AM_CPPFLAGS) + +# test_paste_join_multiline_DEPENDENCIES = + +test_paste_join_multiline_LDADD = \ + ../../src/fe-common/core/libfe_common_core.a \ + ../../src/core/libcore.a \ + ../../src/lib-config/libirssi_config.a \ + @PROG_LIBS@ \ + @TEXTUI_LIBS@ + + +test_paste_join_multiline_SOURCES = \ + ../../src/fe-text/gui-entry.c \ + ../../src/fe-text/mainwindows.c \ + ../../src/fe-text/term-terminfo.c \ + ../../src/fe-text/terminfo-core.c \ + ../../src/fe-text/term.c \ + ../../src/fe-text/textbuffer-view.c \ + ../../src/fe-text/textbuffer.c \ + ../../src/fe-text/gui-windows.c \ + ../../src/fe-text/gui-printtext.c \ + mock-irssi.c \ + test-paste-join-multiline.c diff --git a/tests/fe-text/mock-irssi.c b/tests/fe-text/mock-irssi.c new file mode 100644 index 00000000..d03c371d --- /dev/null +++ b/tests/fe-text/mock-irssi.c @@ -0,0 +1,9 @@ +void irssi_set_dirty(void) +{ +} + +void irssi_redraw(void) +{ +} + +int quitting = 0; diff --git a/tests/fe-text/test-paste-join-multiline.c b/tests/fe-text/test-paste-join-multiline.c new file mode 100644 index 00000000..53fd3708 --- /dev/null +++ b/tests/fe-text/test-paste-join-multiline.c @@ -0,0 +1,55 @@ +#include "common.h" +#include "gui-readline.c" + +typedef struct { + char const *const description; + char const *const input; + char const *const result; +} paste_join_multiline_test_case; + +static void test_paste_join_multiline(const paste_join_multiline_test_case *test); + +paste_join_multiline_test_case const paste_join_multiline_fixture[] = { + { + .description = "Lines should be joined, separator NL", + .input = " hello world\n how are you\n screen is narrow", + .result = " hello world how are you screen is narrow", + }, +}; + +int main(int argc, char **argv) +{ + int i; + + g_test_init(&argc, &argv, NULL); + + for (i = 0; i < G_N_ELEMENTS(paste_join_multiline_fixture); i++) { + char *name = g_strdup_printf("/test/paste_join_multiline/%d", i); + g_test_add_data_func(name, &paste_join_multiline_fixture[i], (GTestDataFunc)test_paste_join_multiline); + g_free(name); + } + +#if GLIB_CHECK_VERSION(2,38,0) + g_test_set_nonfatal_assertions(); +#endif + return g_test_run(); +} + +static void test_paste_join_multiline(const paste_join_multiline_test_case *test) +{ + char *resultstr; + GArray *buffer = g_array_new(FALSE, FALSE, sizeof(unichar)); + + g_test_message("Testing: %s", test->description); + + buffer->data = (char *) g_utf8_to_ucs4_fast(test->input, -1, (glong *) &buffer->len); + paste_buffer_join_lines(buffer); + resultstr = g_ucs4_to_utf8((unichar *) buffer->data, buffer->len, NULL, NULL, NULL); + + g_assert_cmpstr(resultstr, ==, test->result); + + g_free(resultstr); + g_array_free(buffer, TRUE); + + return; +} From 83e98da2ffa295723b10f63ec41211f70ea87153 Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Fri, 9 Nov 2018 11:05:52 +0100 Subject: [PATCH 2/3] add test for paste_join_multiline --- tests/fe-text/test-paste-join-multiline.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/tests/fe-text/test-paste-join-multiline.c b/tests/fe-text/test-paste-join-multiline.c index 53fd3708..778e19e9 100644 --- a/tests/fe-text/test-paste-join-multiline.c +++ b/tests/fe-text/test-paste-join-multiline.c @@ -12,8 +12,18 @@ static void test_paste_join_multiline(const paste_join_multiline_test_case *test paste_join_multiline_test_case const paste_join_multiline_fixture[] = { { .description = "Lines should be joined, separator NL", - .input = " hello world\n how are you\n screen is narrow", - .result = " hello world how are you screen is narrow", + .input = " A1\n B22\n C33", + .result = " A1 B22 C33", + }, + { + .description = "Lines should be joined, separator LF", + .input = " A1\r B22\r C33", + .result = " A1 B22 C33", + }, + { + .description = "Lines should be joined, white space should be skipped", + .input = " A1 \n B22 \n C33 ", + .result = " A1 B22 C33 ", }, }; @@ -37,10 +47,12 @@ int main(int argc, char **argv) static void test_paste_join_multiline(const paste_join_multiline_test_case *test) { - char *resultstr; + char *resultstr, *t1; GArray *buffer = g_array_new(FALSE, FALSE, sizeof(unichar)); g_test_message("Testing: %s", test->description); + g_test_message("INPUT: \"%s\"", (t1 = g_strescape(test->input, NULL))); + g_free(t1); buffer->data = (char *) g_utf8_to_ucs4_fast(test->input, -1, (glong *) &buffer->len); paste_buffer_join_lines(buffer); From c1fb9a840201131982f2c2e1ff8737436f495841 Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Fri, 9 Nov 2018 11:06:13 +0100 Subject: [PATCH 3/3] fix paste_join_multiline --- src/fe-text/gui-readline.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/fe-text/gui-readline.c b/src/fe-text/gui-readline.c index 88e827a7..1033339e 100644 --- a/src/fe-text/gui-readline.c +++ b/src/fe-text/gui-readline.c @@ -160,6 +160,7 @@ static void window_next_page(void) gui_window_scroll(active_win, get_scroll_count()); } +#define isnewline(x) ((x) == '\n' || (x) == '\r') static void paste_buffer_join_lines(GArray *buf) { unsigned int i, count, indent, line_len; @@ -199,7 +200,7 @@ static void paste_buffer_join_lines(GArray *buf) /* find the first beginning of indented line */ for (i = 1; i < buf->len; i++) { - if (arr[i-1] == '\n' && isblank(arr[i])) + if (isnewline(arr[i-1]) && isblank(arr[i])) break; } if (i == buf->len) @@ -226,7 +227,7 @@ static void paste_buffer_join_lines(GArray *buf) count = 0; } } - if (arr[i] == '\n') + if (isnewline(arr[i])) last_lf = TRUE; } @@ -236,11 +237,12 @@ static void paste_buffer_join_lines(GArray *buf) for (i = 0; i < buf->len; i++) { if (last_lf && isblank(arr[i])) { /* whitespace, ignore */ - } else if (arr[i] == '\n') { + } else if (isnewline(arr[i])) { if (!last_lf && i+1 != buf->len && isblank(arr[i+1])) { last_lf_pos = dest; - *dest++ = ' '; + if (i != 0 && !isblank(arr[i-1])) + *dest++ = ' '; } else { *dest++ = '\n'; /* double-LF */ line_len = 0; @@ -287,7 +289,7 @@ static void paste_send(void) /* first line has to be kludged kind of to get pasting in the middle of line right.. */ for (i = 0; i < paste_buffer->len; i++) { - if (arr[i] == '\r' || arr[i] == '\n') { + if (isnewline(arr[i])) { i++; break; } @@ -303,7 +305,7 @@ static void paste_send(void) /* rest of the lines */ str = g_string_new(NULL); for (; i < paste_buffer->len; i++) { - if (arr[i] == '\r' || arr[i] == '\n') { + if (isnewline(arr[i])) { paste_send_line(str->str); g_string_truncate(str, 0); } else if (active_entry->utf8) { @@ -769,7 +771,7 @@ static void paste_bracketed_end(int i, gboolean rest) last_char = g_array_index(paste_buffer, unichar, i - 1); - if (paste_line_count > 0 && last_char != '\n' && last_char != '\r') { + if (paste_line_count > 0 && !isnewline(last_char)) { /* there are newlines, but there's also stuff after the newline * adjust line count to reflect this */ paste_line_count++;