xref: /vim-8.2.3635/src/testdir/test_history.vim (revision ed37d9b3)
1" Tests for the history functions
2
3source check.vim
4CheckFeature cmdline_hist
5
6set history=7
7
8function History_Tests(hist)
9  " First clear the history
10  call histadd(a:hist, 'dummy')
11  call assert_true(histdel(a:hist))
12  call assert_equal(-1, histnr(a:hist))
13  call assert_equal('', histget(a:hist))
14
15  call assert_true('ls'->histadd(a:hist))
16  call assert_true(histadd(a:hist, 'buffers'))
17  call assert_equal('buffers', histget(a:hist))
18  call assert_equal('ls', histget(a:hist, -2))
19  call assert_equal('ls', histget(a:hist, 1))
20  call assert_equal('', histget(a:hist, 5))
21  call assert_equal('', histget(a:hist, -5))
22  call assert_equal(2, histnr(a:hist))
23  call assert_true(histdel(a:hist, 2))
24  call assert_false(a:hist->histdel(7))
25  call assert_equal(1, histnr(a:hist))
26  call assert_equal('ls', histget(a:hist, -1))
27
28  call assert_true(histadd(a:hist, 'buffers'))
29  call assert_true(histadd(a:hist, 'ls'))
30  call assert_equal('ls', a:hist->histget(-1))
31  call assert_equal(4, a:hist->histnr())
32
33  let a=execute('history ' . a:hist)
34  call assert_match("^\n      #  \\S* history\n      3  buffers\n>     4  ls$", a)
35  let a=execute('history all')
36  call assert_match("^\n      #  .* history\n      3  buffers\n>     4  ls", a)
37
38  if len(a:hist) > 0
39    let a=execute('history ' . a:hist . ' 2')
40    call assert_match("^\n      #  \\S* history$", a)
41    let a=execute('history ' . a:hist . ' 3')
42    call assert_match("^\n      #  \\S* history\n      3  buffers$", a)
43    let a=execute('history ' . a:hist . ' 4')
44    call assert_match("^\n      #  \\S* history\n>     4  ls$", a)
45    let a=execute('history ' . a:hist . ' 3,4')
46    call assert_match("^\n      #  \\S* history\n      3  buffers\n>     4  ls$", a)
47    let a=execute('history ' . a:hist . ' -1')
48    call assert_match("^\n      #  \\S* history\n>     4  ls$", a)
49    let a=execute('history ' . a:hist . ' -2')
50    call assert_match("^\n      #  \\S* history\n      3  buffers$", a)
51    let a=execute('history ' . a:hist . ' -2,')
52    call assert_match("^\n      #  \\S* history\n      3  buffers\n>     4  ls$", a)
53    let a=execute('history ' . a:hist . ' -3')
54    call assert_match("^\n      #  \\S* history$", a)
55  endif
56
57  " Test for removing entries matching a pattern
58  for i in range(1, 3)
59      call histadd(a:hist, 'text_' . i)
60  endfor
61  call assert_true(histdel(a:hist, 'text_\d\+'))
62  call assert_equal('ls', histget(a:hist, -1))
63
64  " Test for freeing the entire history list
65  for i in range(1, 7)
66      call histadd(a:hist, 'text_' . i)
67  endfor
68  call histdel(a:hist)
69  for i in range(1, 7)
70    call assert_equal('', histget(a:hist, i))
71    call assert_equal('', histget(a:hist, i - 7 - 1))
72  endfor
73
74  " Test for freeing an entry at the beginning of the history list
75  for i in range(1, 4)
76      call histadd(a:hist, 'text_' . i)
77  endfor
78  call histdel(a:hist, 1)
79  call assert_equal('', histget(a:hist, 1))
80  call assert_equal('text_4', histget(a:hist, 4))
81endfunction
82
83function Test_History()
84  for h in ['cmd', ':', '', 'search', '/', '?', 'expr', '=', 'input', '@', 'debug', '>']
85    call History_Tests(h)
86  endfor
87
88  " Negative tests
89  call assert_false(histdel('abc'))
90  call assert_equal('', histget('abc'))
91  call assert_fails('call histdel([])', 'E730:')
92  call assert_equal('', histget(10))
93  call assert_fails('call histget([])', 'E730:')
94  call assert_equal(-1, histnr('abc'))
95  call assert_fails('call histnr([])', 'E730:')
96  call assert_fails('history xyz', 'E488:')
97  call assert_fails('history ,abc', 'E488:')
98endfunction
99
100function Test_Search_history_window()
101  new
102  call setline(1, ['a', 'b', 'a', 'b'])
103  1
104  call feedkeys("/a\<CR>", 'xt')
105  call assert_equal('a', getline('.'))
106  1
107  call feedkeys("/b\<CR>", 'xt')
108  call assert_equal('b', getline('.'))
109  1
110  " select the previous /a command
111  call feedkeys("q/kk\<CR>", 'x!')
112  call assert_equal('a', getline('.'))
113  call assert_equal('a', @/)
114  bwipe!
115endfunc
116
117" Test for :history command option completion
118function Test_history_completion()
119  call feedkeys(":history \<C-A>\<C-B>\"\<CR>", 'tx')
120  call assert_equal('"history / : = > ? @ all cmd debug expr input search', @:)
121endfunc
122
123" Test for increasing the 'history' option value
124func Test_history_size()
125  let save_histsz = &history
126  set history=10
127  call histadd(':', 'ls')
128  call histdel(':')
129  for i in range(1, 5)
130    call histadd(':', 'cmd' .. i)
131  endfor
132  call assert_equal(5, histnr(':'))
133  call assert_equal('cmd5', histget(':', -1))
134
135  set history=15
136  for i in range(6, 10)
137    call histadd(':', 'cmd' .. i)
138  endfor
139  call assert_equal(10, histnr(':'))
140  call assert_equal('cmd1', histget(':', 1))
141  call assert_equal('cmd10', histget(':', -1))
142
143  set history=5
144  call histadd(':', 'abc')
145  call assert_equal('', histget(':', 6))
146  call assert_equal('', histget(':', 12))
147  call assert_equal('cmd7', histget(':', 7))
148  call assert_equal('abc', histget(':', -1))
149
150  " This test works only when the language is English
151  if v:lang == "C" || v:lang =~ '^[Ee]n'
152    set history=0
153    redir => v
154    call feedkeys(":history\<CR>", 'xt')
155    redir END
156    call assert_equal(["'history' option is zero"], split(v, "\n"))
157  endif
158
159  let &history=save_histsz
160endfunc
161
162" Test for recalling old search patterns in /
163func Test_history_search()
164  call histdel('/')
165  let g:pat = []
166  func SavePat()
167    call add(g:pat, getcmdline())
168    return ''
169  endfunc
170  cnoremap <F2> <C-\>eSavePat()<CR>
171  call histadd('/', 'pat1')
172  call histadd('/', 'pat2')
173  let @/ = ''
174  call feedkeys("/\<Up>\<F2>\<Up>\<F2>\<Down>\<Down>\<F2>\<Esc>", 'xt')
175  call assert_equal(['pat2', 'pat1', ''], g:pat)
176  cunmap <F2>
177  delfunc SavePat
178
179  " Search for a pattern that is not present in the history
180  call assert_beeps('call feedkeys("/a1b2\<Up>\<CR>", "xt")')
181
182  " Recall patterns with 'history' set to 0
183  set history=0
184  let @/ = 'abc'
185  let cmd = 'call feedkeys("/\<Up>\<Down>\<S-Up>\<S-Down>\<CR>", "xt")'
186  call assert_fails(cmd, 'E486:')
187  set history&
188
189  " Recall patterns till the end of history
190  set history=4
191  call histadd('/', 'pat')
192  call histdel('/')
193  call histadd('/', 'pat1')
194  call histadd('/', 'pat2')
195  call assert_beeps('call feedkeys("/\<Up>\<Up>\<Up>\<C-U>\<cr>", "xt")')
196  call assert_beeps('call feedkeys("/\<Down><cr>", "xt")')
197
198  " Test for wrapping around the history list
199  for i in range(3, 7)
200    call histadd('/', 'pat' .. i)
201  endfor
202  let upcmd = "\<up>\<up>\<up>\<up>\<up>"
203  let downcmd = "\<down>\<down>\<down>\<down>\<down>"
204  try
205    call feedkeys("/" .. upcmd .. "\<cr>", 'xt')
206  catch /E486:/
207  endtry
208  call assert_equal('pat4', @/)
209  try
210    call feedkeys("/" .. upcmd .. downcmd .. "\<cr>", 'xt')
211  catch /E486:/
212  endtry
213  call assert_equal('pat4', @/)
214
215  " Test for changing the search command separator in the history
216  call assert_fails('call feedkeys("/def/\<cr>", "xt")', 'E486:')
217  call assert_fails('call feedkeys("?\<up>\<cr>", "xt")', 'E486:')
218  call assert_equal('def?', histget('/', -1))
219
220  call assert_fails('call feedkeys("/ghi?\<cr>", "xt")', 'E486:')
221  call assert_fails('call feedkeys("?\<up>\<cr>", "xt")', 'E486:')
222  call assert_equal('ghi\?', histget('/', -1))
223
224  set history&
225endfunc
226
227" Test for making sure the key value is not stored in history
228func Test_history_crypt_key()
229  CheckFeature cryptv
230  call feedkeys(":set bs=2 key=abc ts=8\<CR>", 'xt')
231  call assert_equal('set bs=2 key= ts=8', histget(':'))
232  set key& bs& ts&
233endfunc
234
235" vim: shiftwidth=2 sts=2 expandtab
236