1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
" Tests for put commands, e.g. ":put", "p", "gp", "P", "gP", etc.
func Test_put_block()
new
call feedkeys("i\<C-V>u2500\<CR>x\<ESC>", 'x')
call feedkeys("\<C-V>y", 'x')
call feedkeys("gg0p", 'x')
call assert_equal("\u2500x", getline(1))
bwipe!
endfunc
func Test_put_char_block()
new
call setline(1, ['Line 1', 'Line 2'])
f Xfile_put
" visually select both lines and put the cursor at the top of the visual
" selection and then put the buffer name over it
exe "norm! G0\<c-v>ke\"%p"
call assert_equal(['Xfile_put 1', 'Xfile_put 2'], getline(1,2))
bw!
endfunc
func Test_put_char_block2()
new
call setreg('a', ' one ', 'v')
call setline(1, ['Line 1', '', 'Line 3', ''])
" visually select the first 3 lines and put register a over it
exe "norm! ggl\<c-v>2j2l\"ap"
call assert_equal(['L one 1', '', 'L one 3', ''], getline(1, 4))
" clean up
bw!
endfunc
func Test_put_lines()
new
let a = [ getreg('a'), getregtype('a') ]
call setline(1, ['Line 1', 'Line2', 'Line 3', ''])
exe 'norm! gg"add"AddG""p'
call assert_equal(['Line 3', '', 'Line 1', 'Line2'], getline(1, '$'))
" clean up
bw!
eval a[0]->setreg('a', a[1])
endfunc
func Test_put_expr()
new
call setline(1, repeat(['A'], 6))
exec "1norm! \"=line('.')\<cr>p"
norm! j0.
norm! j0.
exec "4norm! \"=\<cr>P"
norm! j0.
norm! j0.
call assert_equal(['A1','A2','A3','4A','5A','6A'], getline(1, '$'))
bw!
endfunc
func Test_put_fails_when_nomodifiable()
new
setlocal nomodifiable
normal! yy
call assert_fails(':put', 'E21:')
call assert_fails(':put!', 'E21:')
call assert_fails(':normal! p', 'E21:')
call assert_fails(':normal! gp', 'E21:')
call assert_fails(':normal! P', 'E21:')
call assert_fails(':normal! gP', 'E21:')
if has('mouse')
set mouse=n
call assert_fails('execute "normal! \<MiddleMouse>"', 'E21:')
set mouse&
endif
bwipeout!
endfunc
" A bug was discovered where the Normal mode put commands (e.g., "p") would
" output duplicate error messages when invoked in a non-modifiable buffer.
func Test_put_p_errmsg_nodup()
new
setlocal nomodifiable
normal! yy
func Capture_p_error()
redir => s:p_err
normal! p
redir END
endfunc
silent! call Capture_p_error()
" Error message output within a function should be three lines (the function
" name, the line number, and the error message).
call assert_equal(3, count(s:p_err, "\n"))
delfunction Capture_p_error
bwipeout!
endfunc
func Test_put_p_indent_visual()
new
call setline(1, ['select this text', 'select that text'])
" yank "that" from the second line
normal 2Gwvey
" select "this" in the first line and put
normal k0wve[p
call assert_equal('select that text', getline(1))
call assert_equal('select that text', getline(2))
bwipe!
endfunc
" Test for deleting all the contents of a buffer with a put
func Test_put_visual_delete_all_lines()
new
call setline(1, ['one', 'two', 'three'])
let @r = ''
normal! VG"rgp
call assert_equal(1, line('$'))
close!
endfunc
func Test_gp_with_count_leaves_cursor_at_end()
new
call setline(1, '<---->')
call setreg('@', "foo\nbar", 'c')
normal 1G3|3gp
call assert_equal([0, 4, 4, 0], getpos("."))
call assert_equal(['<--foo', 'barfoo', 'barfoo', 'bar-->'], getline(1, '$'))
call assert_equal([0, 4, 3, 0], getpos("']"))
bwipe!
endfunc
func Test_very_large_count()
" FIXME: should actually check if sizeof(int) == sizeof(long)
CheckNotMSWindows
new
let @" = 'x'
call assert_fails('norm 44444444444444p', 'E1240:')
bwipe!
endfunc
" vim: shiftwidth=2 sts=2 expandtab
|