changeset 15504:247511eadb7a v8.1.0760

patch 8.1.0760: no proper test for using 'termencoding' commit https://github.com/vim/vim/commit/617d7ef0462e86ec946d8932e4d157e65bbc9aa8 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Jan 17 13:04:30 2019 +0100 patch 8.1.0760: no proper test for using 'termencoding' Problem: No proper test for using 'termencoding'. Solution: Add a screendump test. Fix using double width characters in a screendump.
author Bram Moolenaar <Bram@vim.org>
date Thu, 17 Jan 2019 13:15:07 +0100
parents 65eb414db805
children 181490db95f9
files src/terminal.c src/testdir/Make_all.mak src/testdir/dumps/Test_tenc_euc_jp_01.dump src/testdir/test_termencoding.vim src/version.c
diffstat 5 files changed, 110 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -4031,7 +4031,6 @@ f_term_dumpwrite(typval_T *argvars, typv
 		    if (cell.width == 2)
 		    {
 			fputs("*", fd);
-			++pos.col;
 		    }
 		    else
 			fputs("+", fd);
@@ -4062,6 +4061,9 @@ f_term_dumpwrite(typval_T *argvars, typv
 
 		prev_cell = cell;
 	    }
+
+	    if (cell.width == 2)
+		++pos.col;
 	}
 	if (repeat > 0)
 	    fprintf(fd, "@%d", repeat);
@@ -4103,6 +4105,7 @@ read_dump_file(FILE *fd, VTermPos *curso
     char_u	    *prev_char = NULL;
     int		    attr = 0;
     cellattr_T	    cell;
+    cellattr_T	    empty_cell;
     term_T	    *term = curbuf->b_term;
     int		    max_cells = 0;
     int		    start_row = term->tl_scrollback.ga_len;
@@ -4110,6 +4113,7 @@ read_dump_file(FILE *fd, VTermPos *curso
     ga_init2(&ga_text, 1, 90);
     ga_init2(&ga_cell, sizeof(cellattr_T), 90);
     vim_memset(&cell, 0, sizeof(cell));
+    vim_memset(&empty_cell, 0, sizeof(empty_cell));
     cursor_pos->row = -1;
     cursor_pos->col = -1;
 
@@ -4208,66 +4212,68 @@ read_dump_file(FILE *fd, VTermPos *curso
 			c = fgetc(fd);
 		    }
 		    hl2vtermAttr(attr, &cell);
+
+		    /* is_bg == 0: fg, is_bg == 1: bg */
+		    for (is_bg = 0; is_bg <= 1; ++is_bg)
+		    {
+			if (c == '&')
+			{
+			    /* use same color as previous cell */
+			    c = fgetc(fd);
+			}
+			else if (c == '#')
+			{
+			    int red, green, blue, index = 0;
+
+			    c = fgetc(fd);
+			    red = hex2nr(c);
+			    c = fgetc(fd);
+			    red = (red << 4) + hex2nr(c);
+			    c = fgetc(fd);
+			    green = hex2nr(c);
+			    c = fgetc(fd);
+			    green = (green << 4) + hex2nr(c);
+			    c = fgetc(fd);
+			    blue = hex2nr(c);
+			    c = fgetc(fd);
+			    blue = (blue << 4) + hex2nr(c);
+			    c = fgetc(fd);
+			    if (!isdigit(c))
+				dump_is_corrupt(&ga_text);
+			    while (isdigit(c))
+			    {
+				index = index * 10 + (c - '0');
+				c = fgetc(fd);
+			    }
+
+			    if (is_bg)
+			    {
+				cell.bg.red = red;
+				cell.bg.green = green;
+				cell.bg.blue = blue;
+				cell.bg.ansi_index = index;
+			    }
+			    else
+			    {
+				cell.fg.red = red;
+				cell.fg.green = green;
+				cell.fg.blue = blue;
+				cell.fg.ansi_index = index;
+			    }
+			}
+			else
+			    dump_is_corrupt(&ga_text);
+		    }
 		}
 		else
 		    dump_is_corrupt(&ga_text);
-
-		/* is_bg == 0: fg, is_bg == 1: bg */
-		for (is_bg = 0; is_bg <= 1; ++is_bg)
-		{
-		    if (c == '&')
-		    {
-			/* use same color as previous cell */
-			c = fgetc(fd);
-		    }
-		    else if (c == '#')
-		    {
-			int red, green, blue, index = 0;
-
-			c = fgetc(fd);
-			red = hex2nr(c);
-			c = fgetc(fd);
-			red = (red << 4) + hex2nr(c);
-			c = fgetc(fd);
-			green = hex2nr(c);
-			c = fgetc(fd);
-			green = (green << 4) + hex2nr(c);
-			c = fgetc(fd);
-			blue = hex2nr(c);
-			c = fgetc(fd);
-			blue = (blue << 4) + hex2nr(c);
-			c = fgetc(fd);
-			if (!isdigit(c))
-			    dump_is_corrupt(&ga_text);
-			while (isdigit(c))
-			{
-			    index = index * 10 + (c - '0');
-			    c = fgetc(fd);
-			}
-
-			if (is_bg)
-			{
-			    cell.bg.red = red;
-			    cell.bg.green = green;
-			    cell.bg.blue = blue;
-			    cell.bg.ansi_index = index;
-			}
-			else
-			{
-			    cell.fg.red = red;
-			    cell.fg.green = green;
-			    cell.fg.blue = blue;
-			    cell.fg.ansi_index = index;
-			}
-		    }
-		    else
-			dump_is_corrupt(&ga_text);
-		}
 	    }
 	    else
 		dump_is_corrupt(&ga_text);
 
 	    append_cell(&ga_cell, &cell);
+	    if (cell.width == 2)
+		append_cell(&ga_cell, &empty_cell);
 	}
 	else if (c == '@')
 	{
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -243,6 +243,7 @@ NEW_TESTS = \
 	test_tagjump \
 	test_taglist \
 	test_tcl \
+	test_termencoding \
 	test_terminal \
 	test_terminal_fail \
 	test_textformat \
@@ -389,6 +390,7 @@ NEW_TESTS_RES = \
 	test_system.res \
 	test_tab.res \
 	test_tcl.res \
+	test_termencoding.res \
 	test_terminal.res \
 	test_terminal_fail.res \
 	test_textformat.res \
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_tenc_euc_jp_01.dump
@@ -0,0 +1,10 @@
+>E+0&#ffffff0|8|9|:| |バ*&|ッ|フ|ァ| +&|%|l|d| |の*&|変|更|は|保|存|さ|れ|て|い|ま|せ|ん| +&|(|!| |で*&|変|更|を|破|棄|)+&| @13
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|X+3#0000000&|e|u|c|_|j|p|.|t|x|t| @45|1|,|1| @11|A|l@1
+|E+0&&|8|3|:| |バ*&|ッ|フ|ァ|を|作|成|で|き|な|い|の|で|、|他|の|を|使|用|し|ま|す|.+&@2| @22
+|~+0#4040ff13&| @73
+|~| @73
+|[+1#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|5|2| @10|A|l@1
+| +0&&@74
new file mode 100644
--- /dev/null
+++ b/src/testdir/test_termencoding.vim
@@ -0,0 +1,37 @@
+" Test for setting 'encoding' to something else than the terminal uses, then
+" setting 'termencoding' to make it work.
+
+" This only works with "iconv".
+if !has('multi_byte') || !has('iconv')
+  finish
+endif
+
+source screendump.vim
+if !CanRunVimInTerminal()
+  finish
+endif
+
+" This Vim is running with 'encoding' "utf-8", the Vim in the terminal is
+" running with 'encoding' "euc-jp".  We need to make sure the text is in the
+" right encoding, this is a bit tricky.
+func Test_termencoding_euc_jp()
+  new
+  call setline(1, 'E89: バッファ %ld の変更は保存されていません (! で変更を破棄)')
+  write ++enc=euc-jp Xeuc_jp.txt
+  quit
+
+  call writefile([
+	\ 'set encoding=euc-jp',
+	\ 'set termencoding=utf-8',
+	\ 'scriptencoding utf-8',
+	\ 'exe "normal aE83: バッファを作成できないので、他のを使用します...\<Esc>"',
+	\ 'split Xeuc_jp.txt',
+	\ ], 'XTest_tenc_euc_jp')
+  let buf = RunVimInTerminal('-S XTest_tenc_euc_jp', {'rows': 10})
+  call VerifyScreenDump(buf, 'Test_tenc_euc_jp_01', {})
+
+  " clean up
+  call StopVimInTerminal(buf)
+  call delete('Xeuc_jp.txt')
+  call delete('XTest_tenc_euc_jp')
+endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -796,6 +796,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    760,
+/**/
     759,
 /**/
     758,