summaryrefslogtreecommitdiffstats
path: root/src/testdir/test_paste.vim
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/testdir/test_paste.vim338
1 files changed, 338 insertions, 0 deletions
diff --git a/src/testdir/test_paste.vim b/src/testdir/test_paste.vim
new file mode 100644
index 0000000..d079f48
--- /dev/null
+++ b/src/testdir/test_paste.vim
@@ -0,0 +1,338 @@
+" Tests for bracketed paste and other forms of pasting.
+
+" Bracketed paste only works with "xterm". Not in GUI or Windows console.
+source check.vim
+source term_util.vim
+CheckNotMSWindows
+CheckNotGui
+
+set term=xterm
+
+source shared.vim
+
+func Test_paste_normal_mode()
+ new
+ " In first column text is inserted
+ call setline(1, ['a', 'b', 'c'])
+ call cursor(2, 1)
+ call feedkeys("\<Esc>[200~foo\<CR>bar\<Esc>[201~", 'xt')
+ call assert_equal('foo', getline(2))
+ call assert_equal('barb', getline(3))
+ call assert_equal('c', getline(4))
+
+ " When repeating text is appended
+ normal .
+ call assert_equal('barfoo', getline(3))
+ call assert_equal('barb', getline(4))
+ call assert_equal('c', getline(5))
+ bwipe!
+
+ " In second column text is appended
+ call setline(1, ['a', 'bbb', 'c'])
+ call cursor(2, 2)
+ call feedkeys("\<Esc>[200~foo\<CR>bar\<Esc>[201~", 'xt')
+ call assert_equal('bbfoo', getline(2))
+ call assert_equal('barb', getline(3))
+ call assert_equal('c', getline(4))
+
+ " In last column text is appended
+ call setline(1, ['a', 'bbb', 'c'])
+ call cursor(2, 3)
+ call feedkeys("\<Esc>[200~foo\<CR>bar\<Esc>[201~", 'xt')
+ call assert_equal('bbbfoo', getline(2))
+ call assert_equal('bar', getline(3))
+ call assert_equal('c', getline(4))
+endfunc
+
+func Test_paste_insert_mode()
+ new
+ call setline(1, ['a', 'b', 'c'])
+ 2
+ call feedkeys("i\<Esc>[200~foo\<CR>bar\<Esc>[201~ done\<Esc>", 'xt')
+ call assert_equal('foo', getline(2))
+ call assert_equal('bar doneb', getline(3))
+ call assert_equal('c', getline(4))
+
+ normal .
+ call assert_equal('bar donfoo', getline(3))
+ call assert_equal('bar doneeb', getline(4))
+ call assert_equal('c', getline(5))
+
+ set ai et tw=10
+ call setline(1, ['a', ' b', 'c'])
+ 2
+ call feedkeys("A\<Esc>[200~foo\<CR> bar bar bar\<Esc>[201~\<Esc>", 'xt')
+ call assert_equal(' bfoo', getline(2))
+ call assert_equal(' bar bar bar', getline(3))
+ call assert_equal('c', getline(4))
+
+ set ai& et& tw=0
+ bwipe!
+endfunc
+
+func Test_paste_clipboard()
+ CheckFeature clipboard_working
+
+ let @+ = "nasty\<Esc>:!ls\<CR>command"
+ new
+ exe "normal i\<C-R>+\<Esc>"
+ call assert_equal("nasty\<Esc>:!ls\<CR>command", getline(1))
+ bwipe!
+endfunc
+
+" bracketed paste in command line
+func Test_paste_cmdline()
+ call feedkeys(":a\<Esc>[200~foo\<CR>bar\<Esc>[201~b\<Home>\"\<CR>", 'xt')
+ call assert_equal("\"afoo\<CR>barb", getreg(':'))
+endfunc
+
+" bracketed paste in Ex-mode
+func Test_paste_ex_mode()
+ unlet! foo
+ call feedkeys("Qlet foo=\"\<Esc>[200~foo\<CR>bar\<Esc>[201~\"\<CR>vi\<CR>", 'xt')
+ call assert_equal("foo\rbar", foo)
+
+ " pasting more than 40 bytes
+ exe "norm Q\<PasteStart>0000000000000000000000000000000000000000000000000000000000000000000000\<C-C>"
+endfunc
+
+func Test_paste_onechar()
+ new
+ let @f='abc'
+ call feedkeys("i\<C-R>\<Esc>[200~foo\<CR>bar\<Esc>[201~", 'xt')
+ call assert_equal("abc", getline(1))
+ close!
+endfunc
+
+func Test_paste_visual_mode()
+ new
+ call setline(1, 'here are some words')
+ call feedkeys("0fsve\<Esc>[200~more\<Esc>[201~", 'xt')
+ call assert_equal('here are more words', getline(1))
+ call assert_equal('some', getreg('-'))
+ normal! u
+ call assert_equal('here are some words', getline(1))
+ exe "normal! \<C-R>"
+ call assert_equal('here are more words', getline(1))
+
+ " include last char in the line
+ call feedkeys("0fwve\<Esc>[200~noises\<Esc>[201~", 'xt')
+ call assert_equal('here are more noises', getline(1))
+ call assert_equal('words', getreg('-'))
+ normal! u
+ call assert_equal('here are more words', getline(1))
+ exe "normal! \<C-R>"
+ call assert_equal('here are more noises', getline(1))
+
+ " exclude last char in the line
+ call setline(1, 'some words!')
+ call feedkeys("0fwve\<Esc>[200~noises\<Esc>[201~", 'xt')
+ call assert_equal('some noises!', getline(1))
+ call assert_equal('words', getreg('-'))
+ normal! u
+ call assert_equal('some words!', getline(1))
+ exe "normal! \<C-R>"
+ call assert_equal('some noises!', getline(1))
+
+ " multi-line selection
+ call setline(1, ['some words', 'and more'])
+ call feedkeys("0fwvj0fd\<Esc>[200~letters\<Esc>[201~", 'xt')
+ call assert_equal('some letters more', getline(1))
+ call assert_equal("words\nand", getreg('1'))
+ normal! u
+ call assert_equal(['some words', 'and more'], getline(1, 2))
+ exe "normal! \<C-R>"
+ call assert_equal('some letters more', getline(1))
+
+ " linewise non-last line, cursor at start of line
+ call setline(1, ['some words', 'and more'])
+ call feedkeys("0V\<Esc>[200~letters\<Esc>[201~", 'xt')
+ call assert_equal('lettersand more', getline(1))
+ call assert_equal("some words\n", getreg('1'))
+ normal! u
+ call assert_equal(['some words', 'and more'], getline(1, 2))
+ exe "normal! \<C-R>"
+ call assert_equal('lettersand more', getline(1))
+
+ " linewise non-last line, cursor in the middle of line
+ call setline(1, ['some words', 'and more'])
+ call feedkeys("0fwV\<Esc>[200~letters\<Esc>[201~", 'xt')
+ call assert_equal('lettersand more', getline(1))
+ call assert_equal("some words\n", getreg('1'))
+ normal! u
+ call assert_equal(['some words', 'and more'], getline(1, 2))
+ exe "normal! \<C-R>"
+ call assert_equal('lettersand more', getline(1))
+
+ " linewise last line
+ call setline(1, ['some words', 'and more'])
+ call feedkeys("j0V\<Esc>[200~letters\<Esc>[201~", 'xt')
+ call assert_equal(['some words', 'letters'], getline(1, 2))
+ call assert_equal("and more\n", getreg('1'))
+ normal! u
+ call assert_equal(['some words', 'and more'], getline(1, 2))
+ exe "normal! \<C-R>"
+ call assert_equal(['some words', 'letters'], getline(1, 2))
+
+ bwipe!
+endfunc
+
+func CheckCopyPaste()
+ call setline(1, ['copy this', ''])
+ normal 1G0"*y$
+ normal j"*p
+ call assert_equal('copy this', getline(2))
+endfunc
+
+func Test_xrestore()
+ CheckFeature xterm_clipboard
+ let g:test_is_flaky = 1
+
+ let display = $DISPLAY
+ new
+ call CheckCopyPaste()
+
+ xrestore
+ call CheckCopyPaste()
+
+ exe "xrestore " .. display
+ call CheckCopyPaste()
+
+ bwipe!
+endfunc
+
+" Test for 'pastetoggle'
+func Test_pastetoggle()
+ new
+ set pastetoggle=<F4>
+ set nopaste
+ call feedkeys("iHello\<F4>", 'xt')
+ call assert_true(&paste)
+ 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
+
+func Test_pastetoggle_timeout_no_typed_after_mapped()
+ CheckRunVimInTerminal
+
+ let lines =<< trim END
+ set pastetoggle=abc
+ set ttimeoutlen=10000
+ imap d a
+ END
+ call writefile(lines, 'Xpastetoggle_no_typed_after_mapped.vim', 'D')
+ let buf = RunVimInTerminal('-S Xpastetoggle_no_typed_after_mapped.vim', #{rows: 8})
+ call TermWait(buf)
+ call term_sendkeys(buf, ":call feedkeys('id', 't')\<CR>")
+ call term_wait(buf, 200)
+ call term_sendkeys(buf, 'bc')
+ " 'ttimeoutlen' should NOT apply
+ call WaitForAssert({-> assert_match('^-- INSERT --', term_getline(buf, 8))})
+
+ call StopVimInTerminal(buf)
+endfunc
+
+func Test_pastetoggle_timeout_typed_after_mapped()
+ CheckRunVimInTerminal
+
+ let lines =<< trim END
+ set pastetoggle=abc
+ set ttimeoutlen=10000
+ imap d a
+ END
+ call writefile(lines, 'Xpastetoggle_typed_after_mapped.vim', 'D')
+ let buf = RunVimInTerminal('-S Xpastetoggle_typed_after_mapped.vim', #{rows: 8})
+ call TermWait(buf)
+ call term_sendkeys(buf, ":call feedkeys('idb', 't')\<CR>")
+ call term_wait(buf, 200)
+ call term_sendkeys(buf, 'c')
+ " 'ttimeoutlen' should apply
+ call WaitForAssert({-> assert_match('^-- INSERT (paste) --', term_getline(buf, 8))})
+
+ call StopVimInTerminal(buf)
+endfunc
+
+func Test_pastetoggle_timeout_typed_after_noremap()
+ CheckRunVimInTerminal
+
+ let lines =<< trim END
+ set pastetoggle=abc
+ set ttimeoutlen=10000
+ inoremap d a
+ END
+ call writefile(lines, 'Xpastetoggle_typed_after_noremap.vim', 'D')
+ let buf = RunVimInTerminal('-S Xpastetoggle_typed_after_noremap.vim', #{rows: 8})
+ call TermWait(buf)
+ call term_sendkeys(buf, ":call feedkeys('idb', 't')\<CR>")
+ call term_wait(buf, 200)
+ call term_sendkeys(buf, 'c')
+ " 'ttimeoutlen' should apply
+ call WaitForAssert({-> assert_match('^-- INSERT (paste) --', term_getline(buf, 8))})
+
+ call StopVimInTerminal(buf)
+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