" Test for joining lines.

func Test_join_with_count()
  new
  call setline(1, ['one', 'two', 'three', 'four'])
  normal J
  call assert_equal('one two', getline(1))
  %del
  call setline(1, ['one', 'two', 'three', 'four'])
  normal 10J
  call assert_equal('one two three four', getline(1))

  call setline(1, ['one', '', 'two'])
  normal J
  call assert_equal('one', getline(1))

  call setline(1, ['one', ' ', 'two'])
  normal J
  call assert_equal('one', getline(1))

  call setline(1, ['one', '', '', 'two'])
  normal JJ
  call assert_equal('one', getline(1))

  call setline(1, ['one', ' ', ' ', 'two'])
  normal JJ
  call assert_equal('one', getline(1))

  call setline(1, ['one', '', '', 'two'])
  normal 2J
  call assert_equal('one', getline(1))

  quit!
endfunc

" Tests for setting the '[,'] marks when joining lines.
func Test_join_marks()
  enew
  call append(0, [
	      \ "\t\tO sodales, ludite, vos qui",
	      \ "attamen consulite per voster honur. Tua pulchra " .
	      \ "facies me fay planszer milies",
	      \ "",
	      \ "This line.",
	      \ "Should be joined with the next line",
	      \ "and with this line"])

  normal gg0gqj
  call assert_equal([0, 1, 1, 0], getpos("'["))
  call assert_equal([0, 2, 1, 0], getpos("']"))

  /^This line/;'}-join
  call assert_equal([0, 4, 11, 0], getpos("'["))
  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

  " Expected output
  let expected =<< trim [DATA]
    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
  [DATA]

  call assert_equal(expected, getline(1, '$'))

  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

  " Expected output
  let expected =<< trim [DATA]
    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

  [DATA]

  call assert_equal(expected, getline(1, '$'))

  enew!
  call append(0, text)
  normal gg

  set cpoptions-=j
  set nojoinspaces
  set compatible

  normal JjJjJjJjJjJjJjJjJjJjJjJjJjJ
  normal j4Jy3l$pjdG

  " Expected output
  let expected =<< trim [DATA]
    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
  [DATA]

  call assert_equal(expected, getline(1, '$'))

  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>"

  " Expected output
  let expected =<< trim [CODE]
    {
    /* 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();
    }
  [CODE]

  call assert_equal(expected, getline(1, '$'))

  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>"

  " Expected output
  let expected =<< trim [CODE]
    {
    /* 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.
    }
  [CODE]

  call assert_equal(expected, getline(1, '$'))
  close!
endfunc

func Test_join_lines()
  new
  call setline(1, ['a', 'b', '', 'c', 'd'])
  %join
  call assert_equal('a b c d', getline(1))
  call setline(1, ['a', 'b', '', 'c', 'd'])
  normal 5J
  call assert_equal('a b c d', getline(1))
  call setline(1, ['a', 'b', 'c'])
  2,2join
  call assert_equal(['a', 'b', 'c'], getline(1, '$'))
  call assert_equal(2, line('.'))
  2join
  call assert_equal(['a', 'b c'], getline(1, '$'))
  bwipe!
endfunc

" vim: shiftwidth=2 sts=2 expandtab
