changeset 34920:841f951ffd5e v9.1.0319

patch 9.1.0319: Using heredoc in string not tested with :execute Commit: https://github.com/vim/vim/commit/3d93630605df60e8de5a38918eaff62165b42382 Author: zeertzjq <zeertzjq@outlook.com> Date: Sun Apr 14 18:49:56 2024 +0200 patch 9.1.0319: Using heredoc in string not tested with :execute Problem: Using heredoc in string not tested with :execute. Solution: Test with both :execute and execute() (zeertzjq). closes: #14546 Signed-off-by: zeertzjq <zeertzjq@outlook.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Sun, 14 Apr 2024 19:00:12 +0200
parents 6d4f434b2251
children 1647d22ace0e
files src/testdir/test_let.vim src/version.c
diffstat 2 files changed, 29 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_let.vim
+++ b/src/testdir/test_let.vim
@@ -722,31 +722,33 @@ END
   LINES
   call v9.CheckScriptFailure(lines, 'E15:')
 
-  " Test for using heredoc in a single string using execute()
-  call assert_equal("\n['one', 'two']",
-    \ execute("let x =<< trim END\n  one\n  two\nEND\necho x"))
-  call assert_equal("\n['one', '  two']",
-    \ execute("let x =<< trim END\n  one\n    two\nEND\necho x"))
-  call assert_equal("\n['one', 'two']",
-    \ execute("  let x =<< trim END\n    one\n    two\n  END\necho x"))
-  call assert_equal("\n['one', '  two']",
-    \ execute("  let x =<< trim END\n    one\n      two\n  END\necho x"))
-  call assert_equal("\n['  one', '  two']",
-    \ execute("let x =<< END\n  one\n  two\nEND\necho x"))
-  call assert_equal("\n['one', 'two']",
-    \ execute("let x =<< END\none\ntwo\nEND\necho x"))
-  call assert_equal("\n['one', 'two']",
-    \ execute("let x =<< END \" comment\none\ntwo\nEND\necho x"))
-  let cmd = 'execute("let x =<< END\n  one\n  two\necho x")'
-  call assert_fails(cmd, "E990: Missing end marker 'END'")
-  let cmd = 'execute("let x =<<\n  one\n  two\necho x")'
-  call assert_fails(cmd, "E172: Missing marker")
-  let cmd = 'execute("let x =<< trim\n  one\n  two\necho x")'
-  call assert_fails(cmd, "E172: Missing marker")
-  let cmd = 'execute("let x =<< end\n  one\n  two\nend\necho x")'
-  call assert_fails(cmd, "E221: Marker cannot start with lower case letter")
-  let cmd = 'execute("let x =<< eval END\n  one\n  two{y}\nEND\necho x")'
-  call assert_fails(cmd, 'E121: Undefined variable: y')
+  " Test for using heredoc in a single string using :execute or execute()
+  for [cmd, res] in items({
+      \ "let x =<< trim END\n  one\n  two\nEND": ['one', 'two'],
+      \ "let x =<< trim END\n  one\n    two\nEND": ['one', '  two'],
+      \ "  let x =<< trim END\n    one\n    two\n  END": ['one', 'two'],
+      \ "  let x =<< trim END\n    one\n      two\n  END": ['one', '  two'],
+      \ "let x =<< END\n  one\n  two\nEND": ['  one', '  two'],
+      \ "let x =<< END\none\ntwo\nEND": ['one', 'two'],
+      \ "let x =<< END \" comment\none\ntwo\nEND": ['one', 'two'],
+      \ })
+    execute cmd
+    call assert_equal(res, x)
+    unlet x
+    call assert_equal($"\n{string(res)}", execute($"{cmd}\necho x"))
+    unlet x
+  endfor
+  for [cmd, err] in items({
+      \ "let x =<<\none\ntwo": "E172:",
+      \ "let x =<< trim\n  one\n  two": "E172:",
+      \ "let x =<< end\none\ntwo\nend": "E221:",
+      \ "let x =<< END\none\ntwo": "E990: Missing end marker 'END'",
+      \ "let x =<< END !\none\ntwo\nEND": "E488: Trailing characters:  !",
+      \ "let x =<< eval END\none\ntwo{y}\nEND": "E121: Undefined variable: y",
+      \ })
+    call assert_fails('execute cmd', err)
+    call assert_fails('call execute(cmd)', err)
+  endfor
 
   " skipped heredoc
   if 0
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    319,
+/**/
     318,
 /**/
     317,