" Tests for 'backspace' settings

func Exec(expr)
  let str=''
  try
    exec a:expr
  catch /.*/
    let str=v:exception
  endtry
  return str
endfunc

func Test_backspace_option()
  set backspace=
  call assert_equal('', &backspace)
  set backspace=indent
  call assert_equal('indent', &backspace)
  set backspace=eol
  call assert_equal('eol', &backspace)
  set backspace=start
  call assert_equal('start', &backspace)
  set backspace=nostop
  call assert_equal('nostop', &backspace)
  " Add the value
  set backspace=
  set backspace=indent
  call assert_equal('indent', &backspace)
  set backspace+=eol
  call assert_equal('indent,eol', &backspace)
  set backspace+=start
  call assert_equal('indent,eol,start', &backspace)
  set backspace+=nostop
  call assert_equal('indent,eol,start,nostop', &backspace)
  " Delete the value
  set backspace-=nostop
  call assert_equal('indent,eol,start', &backspace)
  set backspace-=indent
  call assert_equal('eol,start', &backspace)
  set backspace-=start
  call assert_equal('eol', &backspace)
  set backspace-=eol
  call assert_equal('', &backspace)
  " Check the error
  call assert_equal(0, match(Exec('set backspace=ABC'), '.*E474'))
  call assert_equal(0, match(Exec('set backspace+=def'), '.*E474'))
  " NOTE: Vim doesn't check following error...
  "call assert_equal(0, match(Exec('set backspace-=ghi'), '.*E474'))

  " Check backwards compatibility with version 5.4 and earlier
  set backspace=0
  call assert_equal('0', &backspace)
  set backspace=1
  call assert_equal('1', &backspace)
  set backspace=2
  call assert_equal('2', &backspace)
  set backspace=3
  call assert_equal('3', &backspace)
  call assert_false(match(Exec('set backspace=4'), '.*E474'))
  call assert_false(match(Exec('set backspace=10'), '.*E474'))

  " Cleared when 'compatible' is set
  set compatible
  call assert_equal('', &backspace)
  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, '$'))

  " Reset values
  set compatible&vim
  set visualbell&vim
  set backspace&vim

  " Test new nostop option
  %d_
  let expected = "foo bar foobar"
  call setline(1, expected)
  call cursor(1, 8)
  exe ":norm! ianotherone\<c-u>"
  call assert_equal(expected, getline(1))
  call cursor(1, 8)
  exe ":norm! ianothertwo\<c-w>"
  call assert_equal(expected, getline(1))

  let content = getline(1)
  for value in ['indent,nostop', 'eol,nostop', 'indent,eol,nostop', 'indent,eol,start,nostop']
    exe ":set bs=".. value
    %d _
    call setline(1, content)
    let expected = " foobar"
    call cursor(1, 8)
    exe ":norm! ianotherone\<c-u>"
    call assert_equal(expected, getline(1), 'CTRL-U backspace value: '.. &bs)
    let expected = "foo  foobar"
    call setline(1, content)
    call cursor(1, 8)
    exe ":norm! ianothertwo\<c-w>"
    call assert_equal(expected, getline(1), 'CTRL-W backspace value: '.. &bs)
  endfor

  " Reset options
  set compatible&vim
  set visualbell&vim
  set backspace&vim
  close!
endfunc

" vim: shiftwidth=2 sts=2 expandtab
