patch 8.1.1331: test 29 is old style

Problem:    Test 29 is old style.
Solution:   Turn it into a new style test. (Yegappan Lakshmanan, closes #4370)
diff --git a/src/Makefile b/src/Makefile
index e50438c..b6dfe75 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2179,7 +2179,7 @@
 test1 \
 	test_eval \
 	test3 \
-	test29 test30 test37 test39 \
+	test30 test37 test39 \
 	test42 test44 test48 test49 \
 	test52 test59 \
 	test64 test69 \
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index 7dc7e36..f9f2b65 100644
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -14,7 +14,6 @@
 # Tests that run on all systems.
 SCRIPTS_ALL = \
 	test3.out \
-	test29.out \
 	test37.out \
 	test39.out \
 	test42.out \
diff --git a/src/testdir/Make_vms.mms b/src/testdir/Make_vms.mms
index d72b9da..8217cc3 100644
--- a/src/testdir/Make_vms.mms
+++ b/src/testdir/Make_vms.mms
@@ -74,7 +74,6 @@
 .SUFFIXES : .out .in
 
 SCRIPT = test1.out test3.out \
-       test29.out \
        test30.out test37.out test39.out \
        test42.out test44.out test48.out test49.out \
        test64.out test69.out \
diff --git a/src/testdir/test29.in b/src/testdir/test29.in
deleted file mode 100644
index 366a551..0000000
--- a/src/testdir/test29.in
+++ /dev/null
Binary files differ
diff --git a/src/testdir/test29.ok b/src/testdir/test29.ok
deleted file mode 100644
index 9dc07ed..0000000
--- a/src/testdir/test29.ok
+++ /dev/null
@@ -1,97 +0,0 @@
-asdfasdf. asdf
-asdfasdf. asdf
-asdfasdf.  asdf
-asdfasdf.	asdf
-asdfasdf. 	asdf
-asdfasdf.	 asdf
-asdfasdf.		asdf
-asdfasdf asdf
-asdfasdf asdf
-asdfasdf  asdf
-asdfasdf	asdf
-asdfasdf	 asdf
-asdfasdf 	asdf
-asdfasdf		asdf
-zx cvn. as dfg? hjkl iop! ert ernop
-zx cvn. as dfg? hjkl iop! ert ernop
-
-asdfasdf.  asdf
-asdfasdf.  asdf
-asdfasdf.  asdf
-asdfasdf.	asdf
-asdfasdf. 	asdf
-asdfasdf.	 asdf
-asdfasdf.		asdf
-asdfasdf asdf
-asdfasdf asdf
-asdfasdf  asdf
-asdfasdf	asdf
-asdfasdf	 asdf
-asdfasdf 	asdf
-asdfasdf		asdf
-zx cvn.  as dfg?  hjkl iop!  ert  enop
-zx cvn.  as dfg? hjkl iop! ert ernop
-
-asdfasdf.  asdf
-asdfasdf.  asdf
-asdfasdf.  asdf
-asdfasdf.	asdf
-asdfasdf. 	asdf
-asdfasdf.	 asdf
-asdfasdf.		asdf
-asdfasdf asdf
-asdfasdf asdf
-asdfasdf  asdf
-asdfasdf	asdf
-asdfasdf	 asdf
-asdfasdf 	asdf
-asdfasdf		asdf
-zx cvn.  as dfg? hjkl iop! ert  a
-
-
-{
-/* Make sure the previous comment leader is not removed. */
-/* Make sure the previous comment leader is not removed. */
-// Should the next comment leader be left alone? Yes.
-// Should the next comment leader be left alone? Yes.
-/* Here the comment leader should be left intact. */ // And so should this one.
-/* Here the comment leader should be left intact. */ // And so should this one.
-if (condition) // Remove the next comment leader! OK, I will.
-    action();
-if (condition) // Remove the next comment leader! OK, I will.
-    action();
-}
-
-1 this shouldn't be deleted
-2 this shouldn't be deleted
-3 this shouldn't be deleted
-4 this should be deleted3
-
-6 this shouldn't be deleted vim5
-7 this shouldn't be deleted vim6
-8 this shouldn't be deleted (not touched yet) vim7
-
-
-{
-/* Make sure the previous comment leader is not removed.  */
-/* Make sure the previous comment leader is not removed.  */
-/* List: item1 foo bar baz foo bar baz item2 foo bar baz foo bar baz */
-/* List: item1 foo bar baz foo bar baz item2 foo bar baz foo bar baz */
-// Should the next comment leader be left alone?  Yes.
-// Should the next comment leader be left alone?  Yes.
-/* Here the comment leader should be left intact. */ // And so should this one.
-/* Here the comment leader should be left intact. */ // And so should this one.
-if (condition) // Remove the next comment leader!  OK, I will.
-    action();
-if (condition) // Remove the next comment leader!  OK, I will.
-    action();
-int i = 7 /* foo *// 3 // comment
- ;
-int i = 7 /* foo *// 3 // comment
- ;
-># Note that the last character of the ending comment leader (left angle bracket) is a comment leader itself. Make sure that this comment leader is not removed from the next line #< < On this line a new comment is opened which spans 2 lines. This comment should retain its comment leader.
-># Note that the last character of the ending comment leader (left angle bracket) is a comment leader itself. Make sure that this comment leader is not removed from the next line #< < On this line a new comment is opened which spans 2 lines. This comment should retain its comment leader.
-
-Some code!// Make sure backspacing does not remove this comment leader.
-}
-
diff --git a/src/testdir/test_backspace_opt.vim b/src/testdir/test_backspace_opt.vim
index fd81f42..e6ea0bc 100644
--- a/src/testdir/test_backspace_opt.vim
+++ b/src/testdir/test_backspace_opt.vim
@@ -56,4 +56,55 @@
   set nocompatible viminfo+=nviminfo
 endfunc
 
+" Test with backspace set to the non-compatible setting
+func Test_backspace_ctrl_u()
+  new
+  call append(0,  [
+        \ "1 this shouldn't be deleted",
+        \ "2 this shouldn't be deleted",
+        \ "3 this shouldn't be deleted",
+        \ "4 this should be deleted",
+        \ "5 this shouldn't be deleted",
+        \ "6 this shouldn't be deleted",
+        \ "7 this shouldn't be deleted",
+        \ "8 this shouldn't be deleted (not touched yet)"])
+  call cursor(2, 1)
+
+  set compatible
+  set backspace=2
+
+  exe "normal Avim1\<C-U>\<Esc>\<CR>"
+  exe "normal Avim2\<C-G>u\<C-U>\<Esc>\<CR>"
+
+  set cpo-=<
+  inoremap <c-u> <left><c-u>
+  exe "normal Avim3\<C-U>\<Esc>\<CR>"
+  iunmap <c-u>
+  exe "normal Avim4\<C-U>\<C-U>\<Esc>\<CR>"
+
+  " Test with backspace set to the compatible setting
+  set backspace= visualbell
+  exe "normal A vim5\<Esc>A\<C-U>\<C-U>\<Esc>\<CR>"
+  exe "normal A vim6\<Esc>Azwei\<C-G>u\<C-U>\<Esc>\<CR>"
+
+  inoremap <c-u> <left><c-u>
+  exe "normal A vim7\<C-U>\<C-U>\<Esc>\<CR>"
+
+  call assert_equal([
+        \ "1 this shouldn't be deleted",
+        \ "2 this shouldn't be deleted",
+        \ "3 this shouldn't be deleted",
+        \ "4 this should be deleted3",
+        \ "",
+        \ "6 this shouldn't be deleted vim5",
+        \ "7 this shouldn't be deleted vim6",
+        \ "8 this shouldn't be deleted (not touched yet) vim7",
+        \ ""], getline(1, '$'))
+
+  set compatible&vim
+  set visualbell&vim
+  set backspace&vim
+  close!
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/testdir/test_join.vim b/src/testdir/test_join.vim
index 1c97414..e5ef41e 100644
--- a/src/testdir/test_join.vim
+++ b/src/testdir/test_join.vim
@@ -33,3 +33,391 @@
   call assert_equal([0, 4, 67, 0], getpos("']"))
   enew!
 endfunc
+
+" Test for joining lines and marks in them
+"   in compatible and nocompatible modes
+"   and with 'joinspaces' set or not
+"   and with 'cpoptions' flag 'j' set or not
+func Test_join_spaces_marks()
+  new
+  " Text used for the test
+  insert
+asdfasdf.
+asdf
+asdfasdf. 
+asdf
+asdfasdf.  
+asdf
+asdfasdf.	
+asdf
+asdfasdf. 	
+asdf
+asdfasdf.	 
+asdf
+asdfasdf.		
+asdf
+asdfasdf
+asdf
+asdfasdf 
+asdf
+asdfasdf  
+asdf
+asdfasdf	
+asdf
+asdfasdf	 
+asdf
+asdfasdf 	
+asdf
+asdfasdf		
+asdf
+zx cvn.
+as dfg?
+hjkl iop!
+ert
+zx cvn.
+as dfg?
+hjkl iop!
+ert
+.
+  let text = getline(1, '$')
+  normal gg
+
+  set nojoinspaces
+  set cpoptions-=j
+  normal JjJjJjJjJjJjJjJjJjJjJjJjJjJ
+  normal j05lmx
+  normal 2j06lmy
+  normal 2k4Jy3l$p
+  normal `xyl$p
+  normal `yy2l$p
+
+  set cpoptions+=j
+  normal j05lmx
+  normal 2j06lmy
+  normal 2k4Jy3l$p
+  normal `xyl$p
+  normal `yy2l$p
+
+  normal G
+  let last_line = line('$')
+
+  " Expected output
+  append
+asdfasdf. asdf
+asdfasdf. asdf
+asdfasdf.  asdf
+asdfasdf.	asdf
+asdfasdf. 	asdf
+asdfasdf.	 asdf
+asdfasdf.		asdf
+asdfasdf asdf
+asdfasdf asdf
+asdfasdf  asdf
+asdfasdf	asdf
+asdfasdf	 asdf
+asdfasdf 	asdf
+asdfasdf		asdf
+zx cvn. as dfg? hjkl iop! ert ernop
+zx cvn. as dfg? hjkl iop! ert ernop
+.
+
+  call assert_equal(getline(last_line + 1, '$'), getline(1, last_line))
+
+  enew!
+  call append(0, text)
+  normal gg
+
+  set cpoptions-=j
+  set joinspaces
+  normal JjJjJjJjJjJjJjJjJjJjJjJjJjJ
+  normal j05lmx
+  normal 2j06lmy
+  normal 2k4Jy3l$p
+  normal `xyl$p
+  normal `yy2l$p
+
+  set cpoptions+=j
+  normal j05lmx
+  normal 2j06lmy
+  normal 2k4Jy3l$p
+  normal `xyl$p
+  normal `yy2l$p
+
+  normal G
+  let last_line = line('$')
+
+  " Expected output
+  append
+asdfasdf.  asdf
+asdfasdf.  asdf
+asdfasdf.  asdf
+asdfasdf.	asdf
+asdfasdf. 	asdf
+asdfasdf.	 asdf
+asdfasdf.		asdf
+asdfasdf asdf
+asdfasdf asdf
+asdfasdf  asdf
+asdfasdf	asdf
+asdfasdf	 asdf
+asdfasdf 	asdf
+asdfasdf		asdf
+zx cvn.  as dfg?  hjkl iop!  ert  enop
+zx cvn.  as dfg? hjkl iop! ert ernop
+
+.
+
+  call assert_equal(getline(last_line + 1, '$'), getline(1, last_line))
+
+  enew!
+  call append(0, text)
+  normal gg
+
+  set cpoptions-=j
+  set nojoinspaces
+  set compatible
+
+  normal JjJjJjJjJjJjJjJjJjJjJjJjJjJ
+  normal j4Jy3l$pjdG
+
+  normal G
+  let last_line = line('$')
+
+  " Expected output
+  append
+asdfasdf.  asdf
+asdfasdf.  asdf
+asdfasdf.  asdf
+asdfasdf.	asdf
+asdfasdf. 	asdf
+asdfasdf.	 asdf
+asdfasdf.		asdf
+asdfasdf asdf
+asdfasdf asdf
+asdfasdf  asdf
+asdfasdf	asdf
+asdfasdf	 asdf
+asdfasdf 	asdf
+asdfasdf		asdf
+zx cvn.  as dfg? hjkl iop! ert  a
+.
+
+  call assert_equal(getline(last_line + 1, '$'), getline(1, last_line))
+
+  set nocompatible
+  set cpoptions&vim
+  set joinspaces&vim
+  close!
+endfunc
+
+" Test for joining lines with comments
+func Test_join_lines_with_comments()
+  new
+
+  " Text used by the test
+  insert
+{
+
+/*
+* Make sure the previous comment leader is not removed.
+*/
+
+/*
+* Make sure the previous comment leader is not removed.
+*/
+
+// Should the next comment leader be left alone?
+// Yes.
+
+// Should the next comment leader be left alone?
+// Yes.
+
+/* Here the comment leader should be left intact. */
+// And so should this one.
+
+/* Here the comment leader should be left intact. */
+// And so should this one.
+
+if (condition) // Remove the next comment leader!
+// OK, I will.
+action();
+
+if (condition) // Remove the next comment leader!
+// OK, I will.
+action();
+}
+.
+
+  call cursor(2, 1)
+  set comments=s1:/*,mb:*,ex:*/,://
+  set nojoinspaces fo=j
+  set backspace=eol,start
+
+  .,+3join
+  exe "normal j4J\<CR>"
+  .,+2join
+  exe "normal j3J\<CR>"
+  .,+2join
+  exe "normal j3J\<CR>"
+  .,+2join
+  exe "normal jj3J\<CR>"
+
+  normal G
+  let last_line = line('$')
+
+  " Expected output
+  append
+{
+/* Make sure the previous comment leader is not removed. */
+/* Make sure the previous comment leader is not removed. */
+// Should the next comment leader be left alone? Yes.
+// Should the next comment leader be left alone? Yes.
+/* Here the comment leader should be left intact. */ // And so should this one.
+/* Here the comment leader should be left intact. */ // And so should this one.
+if (condition) // Remove the next comment leader! OK, I will.
+action();
+if (condition) // Remove the next comment leader! OK, I will.
+action();
+}
+.
+
+  call assert_equal(getline(last_line + 1, '$'), getline(1, last_line))
+
+  set comments&vim
+  set joinspaces&vim
+  set fo&vim
+  set backspace&vim
+  close!
+endfunc
+
+" Test for joining lines with different comment leaders
+func Test_join_comments_2()
+  new
+
+  insert
+{
+
+/*
+ * Make sure the previous comment leader is not removed.
+ */
+
+/*
+ * Make sure the previous comment leader is not removed.
+ */
+
+/* List:
+ * - item1
+ *   foo bar baz
+ *   foo bar baz
+ * - item2
+ *   foo bar baz
+ *   foo bar baz
+ */
+
+/* List:
+ * - item1
+ *   foo bar baz
+ *   foo bar baz
+ * - item2
+ *   foo bar baz
+ *   foo bar baz
+ */
+
+// Should the next comment leader be left alone?
+// Yes.
+
+// Should the next comment leader be left alone?
+// Yes.
+
+/* Here the comment leader should be left intact. */
+// And so should this one.
+
+/* Here the comment leader should be left intact. */
+// And so should this one.
+
+if (condition) // Remove the next comment leader!
+               // OK, I will.
+    action();
+
+if (condition) // Remove the next comment leader!
+               // OK, I will.
+    action();
+
+int i = 7 /* foo *// 3
+ // comment
+ ;
+
+int i = 7 /* foo *// 3
+ // comment
+ ;
+
+># Note that the last character of the ending comment leader (left angle
+ # bracket) is a comment leader itself. Make sure that this comment leader is
+ # not removed from the next line #<
+< On this line a new comment is opened which spans 2 lines. This comment should
+< retain its comment leader.
+
+># Note that the last character of the ending comment leader (left angle
+ # bracket) is a comment leader itself. Make sure that this comment leader is
+ # not removed from the next line #<
+< On this line a new comment is opened which spans 2 lines. This comment should
+< retain its comment leader.
+
+}
+.
+
+  call cursor(2, 1)
+  set comments=sO:*\ -,mO:*\ \ ,exO:*/
+  set comments+=s1:/*,mb:*,ex:*/,://
+  set comments+=s1:>#,mb:#,ex:#<,:<
+  set cpoptions-=j joinspaces fo=j
+  set backspace=eol,start
+
+  .,+3join
+  exe "normal j4J\<CR>"
+  .,+8join
+  exe "normal j9J\<CR>"
+  .,+2join
+  exe "normal j3J\<CR>"
+  .,+2join
+  exe "normal j3J\<CR>"
+  .,+2join
+  exe "normal jj3J\<CR>j"
+  .,+2join
+  exe "normal jj3J\<CR>j"
+  .,+5join
+  exe "normal j6J\<CR>"
+  exe "normal oSome code!\<CR>// Make sure backspacing does not remove this comment leader.\<Esc>0i\<C-H>\<Esc>"
+
+  normal G
+  let last_line = line('$')
+
+  " Expected output
+  append
+{
+/* Make sure the previous comment leader is not removed.  */
+/* Make sure the previous comment leader is not removed.  */
+/* List: item1 foo bar baz foo bar baz item2 foo bar baz foo bar baz */
+/* List: item1 foo bar baz foo bar baz item2 foo bar baz foo bar baz */
+// Should the next comment leader be left alone?  Yes.
+// Should the next comment leader be left alone?  Yes.
+/* Here the comment leader should be left intact. */ // And so should this one.
+/* Here the comment leader should be left intact. */ // And so should this one.
+if (condition) // Remove the next comment leader!  OK, I will.
+    action();
+if (condition) // Remove the next comment leader!  OK, I will.
+    action();
+int i = 7 /* foo *// 3 // comment
+ ;
+int i = 7 /* foo *// 3 // comment
+ ;
+># Note that the last character of the ending comment leader (left angle bracket) is a comment leader itself. Make sure that this comment leader is not removed from the next line #< < On this line a new comment is opened which spans 2 lines. This comment should retain its comment leader.
+># Note that the last character of the ending comment leader (left angle bracket) is a comment leader itself. Make sure that this comment leader is not removed from the next line #< < On this line a new comment is opened which spans 2 lines. This comment should retain its comment leader.
+
+Some code!// Make sure backspacing does not remove this comment leader.
+}
+.
+
+  call assert_equal(getline(last_line + 1, '$'), getline(1, last_line))
+  close!
+endfunc
diff --git a/src/version.c b/src/version.c
index 9ce9ab4..c862363 100644
--- a/src/version.c
+++ b/src/version.c
@@ -768,6 +768,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1331,
+/**/
     1330,
 /**/
     1329,