patch 8.2.2994: various code is not fully tested

Problem:    Various code is not fully tested.
Solution:   Add a few more tests. (Yegappan Lakshmanan, closes #8378)
diff --git a/src/testdir/test_excmd.vim b/src/testdir/test_excmd.vim
index de82b5b..514a4cf 100644
--- a/src/testdir/test_excmd.vim
+++ b/src/testdir/test_excmd.vim
@@ -596,7 +596,7 @@
   " some options cannot be changed in a sandbox
   call assert_fails('set exrc', 'E48:')
   call assert_fails('set cdpath', 'E48:')
-  if has('xim')
+  if has('xim') && has('gui_gtk')
     call assert_fails('set imstyle', 'E48:')
   endif
 endfunc
diff --git a/src/testdir/test_mapping.vim b/src/testdir/test_mapping.vim
index 7fcd806..a447ba3 100644
--- a/src/testdir/test_mapping.vim
+++ b/src/testdir/test_mapping.vim
@@ -485,6 +485,11 @@
   call assert_equal(['n  ,k            <Nop>'],
         \ execute('nmap ,k')->trim()->split("\n"))
 
+  " map with space at the beginning
+  exe "nmap \<C-V> w <Nop>"
+  call assert_equal(['n  <Space>w      <Nop>'],
+        \ execute("nmap \<C-V> w")->trim()->split("\n"))
+
   nmapclear
 endfunc
 
@@ -1411,4 +1416,19 @@
   bwipe!
 endfunc
 
+" Test for abbreviations with 'latin1' encoding
+func Test_abbreviate_latin1_encoding()
+  set encoding=latin1
+  call assert_fails('abbr ab#$c ABC', 'E474:')
+  new
+  iabbr <buffer> #i #include
+  iabbr <buffer> ## #enddef
+  exe "normal i#i\<C-]>"
+  call assert_equal('#include', getline(1))
+  exe "normal 0Di##\<C-]>"
+  call assert_equal('#enddef', getline(1))
+  %bw!
+  set encoding=utf-8
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/testdir/test_modeline.vim b/src/testdir/test_modeline.vim
index 2618d30..19c99b5 100644
--- a/src/testdir/test_modeline.vim
+++ b/src/testdir/test_modeline.vim
@@ -334,4 +334,30 @@
   call delete('Xmodeline')
 endfunc
 
+" Test for the 'modeline' default value in compatible and non-compatible modes
+" for root and non-root accounts
+func Test_modeline_default()
+  set compatible
+  call assert_false(&modeline)
+  set nocompatible
+  call assert_equal(IsRoot() ? 0 : 1, &modeline)
+  set compatible&vi
+  call assert_false(&modeline)
+  set compatible&vim
+  call assert_equal(IsRoot() ? 0 : 1, &modeline)
+  set compatible& modeline&
+endfunc
+
+" Some options cannot be set from the modeline when 'diff' option is set
+func Test_modeline_diff_buffer()
+  call writefile(['vim: diff foldmethod=marker wrap'], 'Xfile')
+  set foldmethod& nowrap
+  new Xfile
+  call assert_equal('manual', &foldmethod)
+  call assert_false(&wrap)
+  set wrap&
+  call delete('Xfile')
+  bw
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim
index 2f64d12..2d87920 100644
--- a/src/testdir/test_options.vim
+++ b/src/testdir/test_options.vim
@@ -1160,4 +1160,21 @@
   set cmdheight&
 endfunc
 
+" To specify a control character as a option value, '^' can be used
+func Test_opt_control_char()
+  set wildchar=^v
+  call assert_equal("\<C-V>", nr2char(&wildchar))
+  set wildcharm=^r
+  call assert_equal("\<C-R>", nr2char(&wildcharm))
+  " Bug: This doesn't work for the 'cedit' and 'termwinkey' options
+  set wildchar& wildcharm&
+endfunc
+
+" Test for the 'errorbells' option
+func Test_opt_errorbells()
+  set errorbells
+  call assert_beeps('s/a1b2/x1y2/')
+  set noerrorbells
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/testdir/test_paste.vim b/src/testdir/test_paste.vim
index df732f1..ef35cec 100644
--- a/src/testdir/test_paste.vim
+++ b/src/testdir/test_paste.vim
@@ -159,8 +159,68 @@
   call feedkeys("i\<F4>", 'xt')
   call assert_false(&paste)
   call assert_equal('Hello', getline(1))
+  " command-line completion for 'pastetoggle' value
+  call feedkeys(":set pastetoggle=\<Tab>\<C-B>\"\<CR>", 'xt')
+  call assert_equal('"set pastetoggle=<F4>', @:)
   set pastetoggle&
   bwipe!
 endfunc
 
+" Test for restoring option values when 'paste' is disabled
+func Test_paste_opt_restore()
+  set autoindent expandtab ruler showmatch
+  if has('rightleft')
+    set revins hkmap
+  endif
+  set smarttab softtabstop=3 textwidth=27 wrapmargin=12
+  if has('vartabs')
+    set varsofttabstop=10,20
+  endif
+
+  " enabling 'paste' should reset the above options
+  set paste
+  call assert_false(&autoindent)
+  call assert_false(&expandtab)
+  if has('rightleft')
+    call assert_false(&revins)
+    call assert_false(&hkmap)
+  endif
+  call assert_false(&ruler)
+  call assert_false(&showmatch)
+  call assert_false(&smarttab)
+  call assert_equal(0, &softtabstop)
+  call assert_equal(0, &textwidth)
+  call assert_equal(0, &wrapmargin)
+  if has('vartabs')
+    call assert_equal('', &varsofttabstop)
+  endif
+
+  " disabling 'paste' should restore the option values
+  set nopaste
+  call assert_true(&autoindent)
+  call assert_true(&expandtab)
+  if has('rightleft')
+    call assert_true(&revins)
+    call assert_true(&hkmap)
+  endif
+  call assert_true(&ruler)
+  call assert_true(&showmatch)
+  call assert_true(&smarttab)
+  call assert_equal(3, &softtabstop)
+  call assert_equal(27, &textwidth)
+  call assert_equal(12, &wrapmargin)
+  if has('vartabs')
+    call assert_equal('10,20', &varsofttabstop)
+  endif
+
+  set autoindent& expandtab& ruler& showmatch&
+  if has('rightleft')
+    set revins& hkmap&
+  endif
+  set smarttab& softtabstop& textwidth& wrapmargin&
+  if has('vartabs')
+    set varsofttabstop&
+  endif
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab