eval_spec.lua 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796
  1. -- Test for various eval features.
  2. local t = require('test.testutil')
  3. local n = require('test.functional.testnvim')()
  4. local assert_alive = n.assert_alive
  5. local feed, insert, source = n.feed, n.insert, n.source
  6. local clear, command, expect = n.clear, n.command, n.expect
  7. local eq, eval, write_file = t.eq, n.eval, t.write_file
  8. local poke_eventloop = n.poke_eventloop
  9. local exc_exec = n.exc_exec
  10. local dedent = t.dedent
  11. describe('eval', function()
  12. setup(function()
  13. write_file(
  14. 'test_eval_setup.vim',
  15. [[
  16. set noswapfile
  17. lang C
  18. fun AppendRegContents(reg)
  19. call AppendRegParts(a:reg, getregtype(a:reg), getreg(a:reg), string(getreg(a:reg, 0, 1)), getreg(a:reg, 1), string(getreg(a:reg, 1, 1)))
  20. endfun
  21. fun AppendRegParts(reg, type, cont, strcont, cont1, strcont1)
  22. call append('$', printf('%s: type %s; value: %s (%s), expr: %s (%s)', a:reg, a:type, a:cont, a:strcont, a:cont1, a:strcont1))
  23. endfun
  24. command -nargs=? AR :call AppendRegContents(<q-args>)
  25. fun SetReg(...)
  26. call call('setreg', a:000)
  27. call append('$', printf('{{{2 setreg(%s)', string(a:000)[1:-2]))
  28. call AppendRegContents(a:1)
  29. if a:1 isnot# '='
  30. execute "silent normal! Go==\n==\e\"".a:1."P"
  31. endif
  32. endfun
  33. ]]
  34. )
  35. end)
  36. before_each(clear)
  37. teardown(function()
  38. os.remove('test_eval_setup.vim')
  39. end)
  40. it(':let', function()
  41. command('so test_eval_setup.vim')
  42. command([[let @" = 'abc']])
  43. command('AR "')
  44. command([[let @" = "abc\n"]])
  45. source('AR "')
  46. command([[let @" = "abc\<C-m>"]])
  47. command('AR "')
  48. command([[let @= = '"abc"']])
  49. command('AR =')
  50. expect([[
  51. ": type v; value: abc (['abc']), expr: abc (['abc'])
  52. ": type V; value: abc]] .. "\000 (['abc']), expr: abc\000" .. [[ (['abc'])
  53. ": type V; value: abc]] .. "\r\000 (['abc\r']), expr: abc\r\000 (['abc\r" .. [['])
  54. =: type v; value: abc (['abc']), expr: "abc" (['"abc"'])]])
  55. end)
  56. it('basic setreg() tests', function()
  57. command('so test_eval_setup.vim')
  58. insert('{{{1 Basic setreg tests')
  59. command([[call SetReg('a', 'abcA', 'c')]])
  60. command([[call SetReg('b', 'abcB', 'v')]])
  61. command([[call SetReg('c', 'abcC', 'l')]])
  62. command([[call SetReg('d', 'abcD', 'V')]])
  63. command([[call SetReg('e', 'abcE', 'b')]])
  64. command([[call SetReg('f', 'abcF', "\<C-v>")]])
  65. command([[call SetReg('g', 'abcG', 'b10')]])
  66. command([[call SetReg('h', 'abcH', "\<C-v>10")]])
  67. command([[call SetReg('I', 'abcI')]])
  68. feed('Go{{{1 Appending single lines with setreg()<esc>')
  69. poke_eventloop()
  70. command([[call SetReg('A', 'abcAc', 'c')]])
  71. command([[call SetReg('A', 'abcAl', 'l')]])
  72. command([[call SetReg('A', 'abcAc2','c')]])
  73. command([[call SetReg('b', 'abcBc', 'ca')]])
  74. command([[call SetReg('b', 'abcBb', 'ba')]])
  75. command([[call SetReg('b', 'abcBc2','ca')]])
  76. command([[call SetReg('b', 'abcBb2','b50a')]])
  77. command([[call SetReg('C', 'abcCl', 'l')]])
  78. command([[call SetReg('C', 'abcCc', 'c')]])
  79. command([[call SetReg('D', 'abcDb', 'b')]])
  80. command([[call SetReg('E', 'abcEb', 'b')]])
  81. command([[call SetReg('E', 'abcEl', 'l')]])
  82. command([[call SetReg('F', 'abcFc', 'c')]])
  83. expect([[
  84. {{{1 Basic setreg tests
  85. {{{2 setreg('a', 'abcA', 'c')
  86. a: type v; value: abcA (['abcA']), expr: abcA (['abcA'])
  87. ==
  88. =abcA=
  89. {{{2 setreg('b', 'abcB', 'v')
  90. b: type v; value: abcB (['abcB']), expr: abcB (['abcB'])
  91. ==
  92. =abcB=
  93. {{{2 setreg('c', 'abcC', 'l')
  94. c: type V; value: abcC]] .. "\000 (['abcC']), expr: abcC\000" .. [[ (['abcC'])
  95. ==
  96. abcC
  97. ==
  98. {{{2 setreg('d', 'abcD', 'V')
  99. d: type V; value: abcD]] .. "\000 (['abcD']), expr: abcD\000" .. [[ (['abcD'])
  100. ==
  101. abcD
  102. ==
  103. {{{2 setreg('e', 'abcE', 'b')
  104. e: type ]] .. '\022' .. [[4; value: abcE (['abcE']), expr: abcE (['abcE'])
  105. ==
  106. =abcE=
  107. {{{2 setreg('f', 'abcF', ']] .. '\022' .. [[')
  108. f: type ]] .. '\022' .. [[4; value: abcF (['abcF']), expr: abcF (['abcF'])
  109. ==
  110. =abcF=
  111. {{{2 setreg('g', 'abcG', 'b10')
  112. g: type ]] .. '\022' .. [[10; value: abcG (['abcG']), expr: abcG (['abcG'])
  113. ==
  114. =abcG =
  115. {{{2 setreg('h', 'abcH', ']] .. '\022' .. [[10')
  116. h: type ]] .. '\022' .. [[10; value: abcH (['abcH']), expr: abcH (['abcH'])
  117. ==
  118. =abcH =
  119. {{{2 setreg('I', 'abcI')
  120. I: type v; value: abcI (['abcI']), expr: abcI (['abcI'])
  121. ==
  122. =abcI=
  123. {{{1 Appending single lines with setreg()
  124. {{{2 setreg('A', 'abcAc', 'c')
  125. A: type v; value: abcAabcAc (['abcAabcAc']), expr: abcAabcAc (['abcAabcAc'])
  126. ==
  127. =abcAabcAc=
  128. {{{2 setreg('A', 'abcAl', 'l')
  129. A: type V; value: abcAabcAcabcAl]] .. "\000 (['abcAabcAcabcAl']), expr: abcAabcAcabcAl\000" .. [[ (['abcAabcAcabcAl'])
  130. ==
  131. abcAabcAcabcAl
  132. ==
  133. {{{2 setreg('A', 'abcAc2', 'c')
  134. A: type v; value: abcAabcAcabcAl]] .. "\000abcAc2 (['abcAabcAcabcAl', 'abcAc2']), expr: abcAabcAcabcAl\000" .. [[abcAc2 (['abcAabcAcabcAl', 'abcAc2'])
  135. ==
  136. =abcAabcAcabcAl
  137. abcAc2=
  138. {{{2 setreg('b', 'abcBc', 'ca')
  139. b: type v; value: abcBabcBc (['abcBabcBc']), expr: abcBabcBc (['abcBabcBc'])
  140. ==
  141. =abcBabcBc=
  142. {{{2 setreg('b', 'abcBb', 'ba')
  143. b: type ]] .. '\022' .. [[5; value: abcBabcBcabcBb (['abcBabcBcabcBb']), expr: abcBabcBcabcBb (['abcBabcBcabcBb'])
  144. ==
  145. =abcBabcBcabcBb=
  146. {{{2 setreg('b', 'abcBc2', 'ca')
  147. b: type v; value: abcBabcBcabcBb]] .. "\000abcBc2 (['abcBabcBcabcBb', 'abcBc2']), expr: abcBabcBcabcBb\000" .. [[abcBc2 (['abcBabcBcabcBb', 'abcBc2'])
  148. ==
  149. =abcBabcBcabcBb
  150. abcBc2=
  151. {{{2 setreg('b', 'abcBb2', 'b50a')
  152. b: type ]] .. "\02250; value: abcBabcBcabcBb\000abcBc2abcBb2 (['abcBabcBcabcBb', 'abcBc2abcBb2']), expr: abcBabcBcabcBb\000" .. [[abcBc2abcBb2 (['abcBabcBcabcBb', 'abcBc2abcBb2'])
  153. ==
  154. =abcBabcBcabcBb =
  155. abcBc2abcBb2
  156. {{{2 setreg('C', 'abcCl', 'l')
  157. C: type V; value: abcC]] .. "\000abcCl\000 (['abcC', 'abcCl']), expr: abcC\000abcCl\000" .. [[ (['abcC', 'abcCl'])
  158. ==
  159. abcC
  160. abcCl
  161. ==
  162. {{{2 setreg('C', 'abcCc', 'c')
  163. C: type v; value: abcC]] .. "\000abcCl\000abcCc (['abcC', 'abcCl', 'abcCc']), expr: abcC\000abcCl\000" .. [[abcCc (['abcC', 'abcCl', 'abcCc'])
  164. ==
  165. =abcC
  166. abcCl
  167. abcCc=
  168. {{{2 setreg('D', 'abcDb', 'b')
  169. D: type ]] .. "\0225; value: abcD\000abcDb (['abcD', 'abcDb']), expr: abcD\000" .. [[abcDb (['abcD', 'abcDb'])
  170. ==
  171. =abcD =
  172. abcDb
  173. {{{2 setreg('E', 'abcEb', 'b')
  174. E: type ]] .. "\0225; value: abcE\000abcEb (['abcE', 'abcEb']), expr: abcE\000" .. [[abcEb (['abcE', 'abcEb'])
  175. ==
  176. =abcE =
  177. abcEb
  178. {{{2 setreg('E', 'abcEl', 'l')
  179. E: type V; value: abcE]] .. "\000abcEb\000abcEl\000 (['abcE', 'abcEb', 'abcEl']), expr: abcE\000abcEb\000abcEl\000" .. [[ (['abcE', 'abcEb', 'abcEl'])
  180. ==
  181. abcE
  182. abcEb
  183. abcEl
  184. ==
  185. {{{2 setreg('F', 'abcFc', 'c')
  186. F: type v; value: abcF]] .. "\000abcFc (['abcF', 'abcFc']), expr: abcF\000" .. [[abcFc (['abcF', 'abcFc'])
  187. ==
  188. =abcF
  189. abcFc=]])
  190. end)
  191. -- luacheck: ignore 611 (Line contains only whitespace)
  192. it('appending NL with setreg()', function()
  193. command('so test_eval_setup.vim')
  194. command([[call setreg('a', 'abcA2', 'c')]])
  195. command([[call setreg('b', 'abcB2', 'v')]])
  196. command([[call setreg('c', 'abcC2', 'l')]])
  197. command([[call setreg('d', 'abcD2', 'V')]])
  198. command([[call setreg('e', 'abcE2', 'b')]])
  199. command([[call setreg('f', 'abcF2', "\<C-v>")]])
  200. -- These registers where set like this in the old test_eval.in but never
  201. -- copied to the output buffer with SetReg(). They do not appear in
  202. -- test_eval.ok. Therefore they are commented out.
  203. --execute([[call setreg('g', 'abcG2', 'b10')]])
  204. --execute([[call setreg('h', 'abcH2', "\<C-v>10")]])
  205. --execute([[call setreg('I', 'abcI2')]])
  206. command([[call SetReg('A', "\n")]])
  207. command([[call SetReg('B', "\n", 'c')]])
  208. command([[call SetReg('C', "\n")]])
  209. command([[call SetReg('D', "\n", 'l')]])
  210. command([[call SetReg('E', "\n")]])
  211. command([[call SetReg('F', "\n", 'b')]])
  212. command("$put ='.'")
  213. expect([[
  214. {{{2 setreg('A', ']] .. '\000' .. [[')
  215. A: type V; value: abcA2]] .. "\000 (['abcA2']), expr: abcA2\000" .. [[ (['abcA2'])
  216. ==
  217. abcA2
  218. ==
  219. {{{2 setreg('B', ']] .. '\000' .. [[', 'c')
  220. B: type v; value: abcB2]] .. "\000 (['abcB2', '']), expr: abcB2\000" .. [[ (['abcB2', ''])
  221. ==
  222. =abcB2
  223. =
  224. {{{2 setreg('C', ']] .. '\000' .. [[')
  225. C: type V; value: abcC2]] .. "\000\000 (['abcC2', '']), expr: abcC2\000\000" .. [[ (['abcC2', ''])
  226. ==
  227. abcC2
  228. ==
  229. {{{2 setreg('D', ']] .. '\000' .. [[', 'l')
  230. D: type V; value: abcD2]] .. "\000\000 (['abcD2', '']), expr: abcD2\000\000" .. [[ (['abcD2', ''])
  231. ==
  232. abcD2
  233. ==
  234. {{{2 setreg('E', ']] .. '\000' .. [[')
  235. E: type V; value: abcE2]] .. "\000\000 (['abcE2', '']), expr: abcE2\000\000" .. [[ (['abcE2', ''])
  236. ==
  237. abcE2
  238. ==
  239. {{{2 setreg('F', ']] .. '\000' .. [[', 'b')
  240. F: type ]] .. "\0220; value: abcF2\000 (['abcF2', '']), expr: abcF2\000" .. [[ (['abcF2', ''])
  241. ==
  242. =abcF2=
  243. .]])
  244. end)
  245. it('setting and appending list with setreg()', function()
  246. command('so test_eval_setup.vim')
  247. command([[$put ='{{{1 Setting lists with setreg()']])
  248. command([=[call SetReg('a', ['abcA3'], 'c')]=])
  249. command([=[call SetReg('b', ['abcB3'], 'l')]=])
  250. command([=[call SetReg('c', ['abcC3'], 'b')]=])
  251. command([=[call SetReg('d', ['abcD3'])]=])
  252. command([=[call SetReg('e', [1, 2, 'abc', 3])]=])
  253. command([=[call SetReg('f', [1, 2, 3])]=])
  254. command([[$put ='{{{1 Appending lists with setreg()']])
  255. command([=[call SetReg('A', ['abcA3c'], 'c')]=])
  256. command([=[call SetReg('b', ['abcB3l'], 'la')]=])
  257. command([=[call SetReg('C', ['abcC3b'], 'lb')]=])
  258. command([=[call SetReg('D', ['abcD32'])]=])
  259. command([=[call SetReg('A', ['abcA32'])]=])
  260. command([=[call SetReg('B', ['abcB3c'], 'c')]=])
  261. command([=[call SetReg('C', ['abcC3l'], 'l')]=])
  262. command([=[call SetReg('D', ['abcD3b'], 'b')]=])
  263. expect([[
  264. {{{1 Setting lists with setreg()
  265. {{{2 setreg('a', ['abcA3'], 'c')
  266. a: type v; value: abcA3 (['abcA3']), expr: abcA3 (['abcA3'])
  267. ==
  268. =abcA3=
  269. {{{2 setreg('b', ['abcB3'], 'l')
  270. b: type V; value: abcB3]] .. "\000 (['abcB3']), expr: abcB3\000" .. [[ (['abcB3'])
  271. ==
  272. abcB3
  273. ==
  274. {{{2 setreg('c', ['abcC3'], 'b')
  275. c: type ]] .. '\022' .. [[5; value: abcC3 (['abcC3']), expr: abcC3 (['abcC3'])
  276. ==
  277. =abcC3=
  278. {{{2 setreg('d', ['abcD3'])
  279. d: type V; value: abcD3]] .. "\000 (['abcD3']), expr: abcD3\000" .. [[ (['abcD3'])
  280. ==
  281. abcD3
  282. ==
  283. {{{2 setreg('e', [1, 2, 'abc', 3])
  284. e: type V; value: 1]] .. "\0002\000abc\0003\000 (['1', '2', 'abc', '3']), expr: 1\0002\000abc\0003\000" .. [[ (['1', '2', 'abc', '3'])
  285. ==
  286. 1
  287. 2
  288. abc
  289. 3
  290. ==
  291. {{{2 setreg('f', [1, 2, 3])
  292. f: type V; value: 1]] .. "\0002\0003\000 (['1', '2', '3']), expr: 1\0002\0003\000" .. [[ (['1', '2', '3'])
  293. ==
  294. 1
  295. 2
  296. 3
  297. ==
  298. {{{1 Appending lists with setreg()
  299. {{{2 setreg('A', ['abcA3c'], 'c')
  300. A: type v; value: abcA3]] .. "\000abcA3c (['abcA3', 'abcA3c']), expr: abcA3\000" .. [[abcA3c (['abcA3', 'abcA3c'])
  301. ==
  302. =abcA3
  303. abcA3c=
  304. {{{2 setreg('b', ['abcB3l'], 'la')
  305. b: type V; value: abcB3]] .. "\000abcB3l\000 (['abcB3', 'abcB3l']), expr: abcB3\000abcB3l\000" .. [[ (['abcB3', 'abcB3l'])
  306. ==
  307. abcB3
  308. abcB3l
  309. ==
  310. {{{2 setreg('C', ['abcC3b'], 'lb')
  311. C: type ]] .. "\0226; value: abcC3\000abcC3b (['abcC3', 'abcC3b']), expr: abcC3\000" .. [[abcC3b (['abcC3', 'abcC3b'])
  312. ==
  313. =abcC3 =
  314. abcC3b
  315. {{{2 setreg('D', ['abcD32'])
  316. D: type V; value: abcD3]] .. "\000abcD32\000 (['abcD3', 'abcD32']), expr: abcD3\000abcD32\000" .. [[ (['abcD3', 'abcD32'])
  317. ==
  318. abcD3
  319. abcD32
  320. ==
  321. {{{2 setreg('A', ['abcA32'])
  322. A: type V; value: abcA3]] .. "\000abcA3c\000abcA32\000 (['abcA3', 'abcA3c', 'abcA32']), expr: abcA3\000abcA3c\000abcA32\000" .. [[ (['abcA3', 'abcA3c', 'abcA32'])
  323. ==
  324. abcA3
  325. abcA3c
  326. abcA32
  327. ==
  328. {{{2 setreg('B', ['abcB3c'], 'c')
  329. B: type v; value: abcB3]] .. "\000abcB3l\000abcB3c (['abcB3', 'abcB3l', 'abcB3c']), expr: abcB3\000abcB3l\000" .. [[abcB3c (['abcB3', 'abcB3l', 'abcB3c'])
  330. ==
  331. =abcB3
  332. abcB3l
  333. abcB3c=
  334. {{{2 setreg('C', ['abcC3l'], 'l')
  335. C: type V; value: abcC3]] .. "\000abcC3b\000abcC3l\000 (['abcC3', 'abcC3b', 'abcC3l']), expr: abcC3\000abcC3b\000abcC3l\000" .. [[ (['abcC3', 'abcC3b', 'abcC3l'])
  336. ==
  337. abcC3
  338. abcC3b
  339. abcC3l
  340. ==
  341. {{{2 setreg('D', ['abcD3b'], 'b')
  342. D: type ]] .. "\0226; value: abcD3\000abcD32\000abcD3b (['abcD3', 'abcD32', 'abcD3b']), expr: abcD3\000abcD32\000" .. [[abcD3b (['abcD3', 'abcD32', 'abcD3b'])
  343. ==
  344. =abcD3 =
  345. abcD32
  346. abcD3b]])
  347. -- From now on we delete the buffer contents after each expect() to make
  348. -- the next expect() easier to write. This is necessary because null
  349. -- bytes on a line by itself don't play well together with the dedent
  350. -- function used in expect().
  351. command('%delete')
  352. command([[$put ='{{{1 Appending lists with NL with setreg()']])
  353. command([=[call SetReg('A', ["\n", 'abcA3l2'], 'l')]=])
  354. expect(
  355. '\n'
  356. .. '{{{1 Appending lists with NL with setreg()\n'
  357. .. "{{{2 setreg('A', ['\000', 'abcA3l2'], 'l')\n"
  358. .. "A: type V; value: abcA3\000abcA3c\000abcA32\000\000\000abcA3l2\000 (['abcA3', 'abcA3c', 'abcA32', '\000', 'abcA3l2']), expr: abcA3\000abcA3c\000abcA32\000\000\000abcA3l2\000 (['abcA3', 'abcA3c', 'abcA32', '\000', 'abcA3l2'])\n"
  359. .. '==\n'
  360. .. 'abcA3\n'
  361. .. 'abcA3c\n'
  362. .. 'abcA32\n'
  363. .. '\000\n'
  364. .. 'abcA3l2\n'
  365. .. '=='
  366. )
  367. command('%delete')
  368. command([=[call SetReg('B', ["\n", 'abcB3c2'], 'c')]=])
  369. expect(
  370. '\n'
  371. .. "{{{2 setreg('B', ['\000', 'abcB3c2'], 'c')\n"
  372. .. "B: type v; value: abcB3\000abcB3l\000abcB3c\000\000\000abcB3c2 (['abcB3', 'abcB3l', 'abcB3c', '\000', 'abcB3c2']), expr: abcB3\000abcB3l\000abcB3c\000\000\000abcB3c2 (['abcB3', 'abcB3l', 'abcB3c', '\000', 'abcB3c2'])\n"
  373. .. '==\n'
  374. .. '=abcB3\n'
  375. .. 'abcB3l\n'
  376. .. 'abcB3c\n'
  377. .. '\000\n'
  378. .. 'abcB3c2='
  379. )
  380. command('%delete')
  381. command([=[call SetReg('C', ["\n", 'abcC3b2'], 'b')]=])
  382. expect(
  383. '\n'
  384. .. "{{{2 setreg('C', ['\000', 'abcC3b2'], 'b')\n"
  385. .. "C: type \0227; value: abcC3\000abcC3b\000abcC3l\000\000\000abcC3b2 (['abcC3', 'abcC3b', 'abcC3l', '\000', 'abcC3b2']), expr: abcC3\000abcC3b\000abcC3l\000\000\000abcC3b2 (['abcC3', 'abcC3b', 'abcC3l', '\000', 'abcC3b2'])\n"
  386. .. '==\n'
  387. .. '=abcC3 =\n'
  388. .. ' abcC3b\n'
  389. .. ' abcC3l\n'
  390. .. ' \000\n'
  391. .. ' abcC3b2'
  392. )
  393. command('%delete')
  394. command([=[call SetReg('D', ["\n", 'abcD3b50'],'b50')]=])
  395. expect(
  396. '\n'
  397. .. "{{{2 setreg('D', ['\000', 'abcD3b50'], 'b50')\n"
  398. .. "D: type \02250; value: abcD3\000abcD32\000abcD3b\000\000\000abcD3b50 (['abcD3', 'abcD32', 'abcD3b', '\000', 'abcD3b50']), expr: abcD3\000abcD32\000abcD3b\000\000\000abcD3b50 (['abcD3', 'abcD32', 'abcD3b', '\000', 'abcD3b50'])\n"
  399. .. '==\n'
  400. .. '=abcD3 =\n'
  401. .. ' abcD32\n'
  402. .. ' abcD3b\n'
  403. .. ' \000\n'
  404. .. ' abcD3b50'
  405. )
  406. end)
  407. -- The tests for setting lists with NLs are split into separate it() blocks
  408. -- to make the expect() calls easier to write. Otherwise the null byte can
  409. -- make trouble on a line on its own.
  410. it('setting lists with NLs with setreg(), part 1', function()
  411. command('so test_eval_setup.vim')
  412. command(
  413. [=[call SetReg('a', ['abcA4-0', "\n", "abcA4-2\n", "\nabcA4-3", "abcA4-4\nabcA4-4-2"])]=]
  414. )
  415. expect(
  416. '\n'
  417. .. "{{{2 setreg('a', ['abcA4-0', '\000', 'abcA4-2\000', '\000abcA4-3', 'abcA4-4\000abcA4-4-2'])\n"
  418. .. "a: type V; value: abcA4-0\000\000\000abcA4-2\000\000\000abcA4-3\000abcA4-4\000abcA4-4-2\000 (['abcA4-0', '\000', 'abcA4-2\000', '\000abcA4-3', 'abcA4-4\000abcA4-4-2']), expr: abcA4-0\000\000\000abcA4-2\000\000\000abcA4-3\000abcA4-4\000abcA4-4-2\000 (['abcA4-0', '\000', 'abcA4-2\000', '\000abcA4-3', 'abcA4-4\000abcA4-4-2'])\n"
  419. .. '==\n'
  420. .. 'abcA4-0\n'
  421. .. '\000\n'
  422. .. 'abcA4-2\000\n'
  423. .. '\000abcA4-3\n'
  424. .. 'abcA4-4\000abcA4-4-2\n'
  425. .. '=='
  426. )
  427. end)
  428. it('setting lists with NLs with setreg(), part 2', function()
  429. command('so test_eval_setup.vim')
  430. command(
  431. [=[call SetReg('b', ['abcB4c-0', "\n", "abcB4c-2\n", "\nabcB4c-3", "abcB4c-4\nabcB4c-4-2"], 'c')]=]
  432. )
  433. expect(
  434. '\n'
  435. .. "{{{2 setreg('b', ['abcB4c-0', '\000', 'abcB4c-2\000', '\000abcB4c-3', 'abcB4c-4\000abcB4c-4-2'], 'c')\n"
  436. .. "b: type v; value: abcB4c-0\000\000\000abcB4c-2\000\000\000abcB4c-3\000abcB4c-4\000abcB4c-4-2 (['abcB4c-0', '\000', 'abcB4c-2\000', '\000abcB4c-3', 'abcB4c-4\000abcB4c-4-2']), expr: abcB4c-0\000\000\000abcB4c-2\000\000\000abcB4c-3\000abcB4c-4\000abcB4c-4-2 (['abcB4c-0', '\000', 'abcB4c-2\000', '\000abcB4c-3', 'abcB4c-4\000abcB4c-4-2'])\n"
  437. .. '==\n'
  438. .. '=abcB4c-0\n'
  439. .. '\000\n'
  440. .. 'abcB4c-2\000\n'
  441. .. '\000abcB4c-3\n'
  442. .. 'abcB4c-4\000abcB4c-4-2='
  443. )
  444. end)
  445. it('setting lists with NLs with setreg(), part 3', function()
  446. command('so test_eval_setup.vim')
  447. command(
  448. [=[call SetReg('c', ['abcC4l-0', "\n", "abcC4l-2\n", "\nabcC4l-3", "abcC4l-4\nabcC4l-4-2"], 'l')]=]
  449. )
  450. expect(
  451. '\n'
  452. .. "{{{2 setreg('c', ['abcC4l-0', '\000', 'abcC4l-2\000', '\000abcC4l-3', 'abcC4l-4\000abcC4l-4-2'], 'l')\n"
  453. .. "c: type V; value: abcC4l-0\000\000\000abcC4l-2\000\000\000abcC4l-3\000abcC4l-4\000abcC4l-4-2\000 (['abcC4l-0', '\000', 'abcC4l-2\000', '\000abcC4l-3', 'abcC4l-4\000abcC4l-4-2']), expr: abcC4l-0\000\000\000abcC4l-2\000\000\000abcC4l-3\000abcC4l-4\000abcC4l-4-2\000 (['abcC4l-0', '\000', 'abcC4l-2\000', '\000abcC4l-3', 'abcC4l-4\000abcC4l-4-2'])\n"
  454. .. '==\n'
  455. .. 'abcC4l-0\n'
  456. .. '\000\n'
  457. .. 'abcC4l-2\000\n'
  458. .. '\000abcC4l-3\n'
  459. .. 'abcC4l-4\000abcC4l-4-2\n'
  460. .. '=='
  461. )
  462. end)
  463. it('setting lists with NLs with setreg(), part 4', function()
  464. command('so test_eval_setup.vim')
  465. command(
  466. [=[call SetReg('d', ['abcD4b-0', "\n", "abcD4b-2\n", "\nabcD4b-3", "abcD4b-4\nabcD4b-4-2"], 'b')]=]
  467. )
  468. expect(
  469. '\n'
  470. .. "{{{2 setreg('d', ['abcD4b-0', '\000', 'abcD4b-2\000', '\000abcD4b-3', 'abcD4b-4\000abcD4b-4-2'], 'b')\n"
  471. .. "d: type \02219; value: abcD4b-0\000\000\000abcD4b-2\000\000\000abcD4b-3\000abcD4b-4\000abcD4b-4-2 (['abcD4b-0', '\000', 'abcD4b-2\000', '\000abcD4b-3', 'abcD4b-4\000abcD4b-4-2']), expr: abcD4b-0\000\000\000abcD4b-2\000\000\000abcD4b-3\000abcD4b-4\000abcD4b-4-2 (['abcD4b-0', '\000', 'abcD4b-2\000', '\000abcD4b-3', 'abcD4b-4\000abcD4b-4-2'])\n"
  472. .. '==\n'
  473. .. '=abcD4b-0 =\n'
  474. .. ' \000\n'
  475. .. ' abcD4b-2\000\n'
  476. .. ' \000abcD4b-3\n'
  477. .. ' abcD4b-4\000abcD4b-4-2'
  478. )
  479. end)
  480. it('setting lists with NLs with setreg(), part 5', function()
  481. command('so test_eval_setup.vim')
  482. command(
  483. [=[call SetReg('e', ['abcE4b10-0', "\n", "abcE4b10-2\n", "\nabcE4b10-3", "abcE4b10-4\nabcE4b10-4-2"], 'b10')]=]
  484. )
  485. expect(
  486. '\n'
  487. .. "{{{2 setreg('e', ['abcE4b10-0', '\000', 'abcE4b10-2\000', '\000abcE4b10-3', 'abcE4b10-4\000abcE4b10-4-2'], 'b10')\n"
  488. .. "e: type \02210; value: abcE4b10-0\000\000\000abcE4b10-2\000\000\000abcE4b10-3\000abcE4b10-4\000abcE4b10-4-2 (['abcE4b10-0', '\000', 'abcE4b10-2\000', '\000abcE4b10-3', 'abcE4b10-4\000abcE4b10-4-2']), expr: abcE4b10-0\000\000\000abcE4b10-2\000\000\000abcE4b10-3\000abcE4b10-4\000abcE4b10-4-2 (['abcE4b10-0', '\000', 'abcE4b10-2\000', '\000abcE4b10-3', 'abcE4b10-4\000abcE4b10-4-2'])\n"
  489. .. '==\n'
  490. .. '=abcE4b10-0=\n'
  491. .. ' \000\n'
  492. .. ' abcE4b10-2\000\n'
  493. .. ' \000abcE4b10-3\n'
  494. .. ' abcE4b10-4\000abcE4b10-4-2'
  495. )
  496. end)
  497. it('getreg("a",1,1) returns a valid list when "a is unset', function()
  498. -- Precondition: "a is actually unset and "0 is nonempty
  499. eq('', eval("getregtype('a')"))
  500. eq('', eval("getreg('a')"))
  501. command("call setreg('0','text')")
  502. -- This used to return a NULL list
  503. -- which setreg didn't handle
  504. command("let x = getreg('a',1,1)")
  505. command("call setreg('0',x)")
  506. -- nvim didn't crash and "0 was emptied
  507. assert_alive()
  508. eq({}, eval("getreg('0',1,1)"))
  509. -- x is a mutable list
  510. command('let y = x')
  511. eq({}, eval('y'))
  512. command("call add(x, 'item')")
  513. eq({ 'item' }, eval('y'))
  514. end)
  515. it('sets the unnamed register when the "u" option is passed to setreg', function()
  516. command("call setreg('a','a reg', 'cu')")
  517. eq('a reg', eval('@"'))
  518. command("call setreg('b','b reg', 'cu')")
  519. eq('b reg', eval('@"'))
  520. command("call setreg('c','c reg', 'c')")
  521. eq('b reg', eval('@"'))
  522. end)
  523. it('search and expressions', function()
  524. command('so test_eval_setup.vim')
  525. command([=[call SetReg('/', ['abc/'])]=])
  526. command([=[call SetReg('/', ["abc/\n"])]=])
  527. command([=[call SetReg('=', ['"abc/"'])]=])
  528. command([=[call SetReg('=', ["\"abc/\n\""])]=])
  529. expect(
  530. [[
  531. {{{2 setreg('/', ['abc/'])
  532. /: type v; value: abc/ (['abc/']), expr: abc/ (['abc/'])
  533. ==
  534. =abc/=
  535. {{{2 setreg('/', ['abc/]]
  536. .. '\000'
  537. .. [['])
  538. /: type v; value: abc/]]
  539. .. "\000 (['abc/\000']), expr: abc/\000 (['abc/\000"
  540. .. [['])
  541. ==
  542. =abc/]]
  543. .. '\000'
  544. .. [[=
  545. {{{2 setreg('=', ['"abc/"'])
  546. =: type v; value: abc/ (['abc/']), expr: "abc/" (['"abc/"'])
  547. {{{2 setreg('=', ['"abc/]]
  548. .. '\000'
  549. .. [["'])
  550. =: type v; value: abc/]]
  551. .. "\000 (['abc/\000"
  552. .. [[']), expr: "abc/]]
  553. .. '\000'
  554. .. [[" (['"abc/]]
  555. .. '\000'
  556. .. [["'])]]
  557. )
  558. end)
  559. describe('system clipboard', function()
  560. before_each(function()
  561. command('let &runtimepath = "test/functional/fixtures,".&runtimepath')
  562. command('call getreg("*")') -- force load of provider
  563. end)
  564. it('works', function()
  565. insert([[
  566. Some first line (this text was at the top of the old test_eval.in).
  567. Note: system clipboard is saved, changed and restored.
  568. clipboard contents
  569. something else]])
  570. command('so test_eval_setup.vim')
  571. -- Save and restore system clipboard.
  572. command("let _clipreg = ['*', getreg('*'), getregtype('*')]")
  573. command('let _clipopt = &cb')
  574. command("let &cb='unnamed'")
  575. command('5y')
  576. command('AR *')
  577. command('tabdo :windo :echo "hi"')
  578. command('6y')
  579. command('AR *')
  580. command('let &cb=_clipopt')
  581. command("call call('setreg', _clipreg)")
  582. expect(
  583. [[
  584. Some first line (this text was at the top of the old test_eval.in).
  585. Note: system clipboard is saved, changed and restored.
  586. clipboard contents
  587. something else
  588. *: type V; value: clipboard contents]]
  589. .. '\00'
  590. .. [[ (['clipboard contents']), expr: clipboard contents]]
  591. .. '\00'
  592. .. [[ (['clipboard contents'])
  593. *: type V; value: something else]]
  594. .. '\00'
  595. .. [[ (['something else']), expr: something else]]
  596. .. '\00'
  597. .. [[ (['something else'])]]
  598. )
  599. end)
  600. end)
  601. it('errors', function()
  602. source([[
  603. fun ErrExe(str)
  604. call append('$', 'Executing '.a:str)
  605. try
  606. execute a:str
  607. catch
  608. $put =v:exception
  609. endtry
  610. endfun]])
  611. command([[call ErrExe('call setreg()')]])
  612. command([[call ErrExe('call setreg(1)')]])
  613. command([[call ErrExe('call setreg(1, 2, 3, 4)')]])
  614. command([=[call ErrExe('call setreg([], 2)')]=])
  615. command([=[call ErrExe('call setreg(1, 2, [])')]=])
  616. command([=[call ErrExe('call setreg("/", ["1", "2"])')]=])
  617. command([=[call ErrExe('call setreg("=", ["1", "2"])')]=])
  618. command([=[call ErrExe('call setreg(1, ["", "", [], ""])')]=])
  619. expect([[
  620. Executing call setreg()
  621. Vim(call):E119: Not enough arguments for function: setreg
  622. Executing call setreg(1)
  623. Vim(call):E119: Not enough arguments for function: setreg
  624. Executing call setreg(1, 2, 3, 4)
  625. Vim(call):E118: Too many arguments for function: setreg
  626. Executing call setreg([], 2)
  627. Vim(call):E730: Using a List as a String
  628. Executing call setreg(1, 2, [])
  629. Vim(call):E730: Using a List as a String
  630. Executing call setreg("/", ["1", "2"])
  631. Vim(call):E883: Search pattern and expression register may not contain two or more lines
  632. Executing call setreg("=", ["1", "2"])
  633. Vim(call):E883: Search pattern and expression register may not contain two or more lines
  634. Executing call setreg(1, ["", "", [], ""])
  635. Vim(call):E730: Using a List as a String]])
  636. end)
  637. it('function name not starting with a capital', function()
  638. eq(
  639. 'Vim(function):E128: Function name must start with a capital or "s:": g:test()\\nendfunction',
  640. exc_exec(dedent([[
  641. function! g:test()
  642. endfunction]]))
  643. )
  644. end)
  645. it('Function name followed by #', function()
  646. eq(
  647. 'Vim(function):E128: Function name must start with a capital or "s:": test2() "#\\nendfunction',
  648. exc_exec(dedent([[
  649. function! test2() "#
  650. endfunction]]))
  651. )
  652. end)
  653. it('function name includes a colon', function()
  654. eq(
  655. 'Vim(function):E884: Function name cannot contain a colon: b:test()\\nendfunction',
  656. exc_exec(dedent([[
  657. function! b:test()
  658. endfunction]]))
  659. )
  660. end)
  661. it('function name starting with/without "g:", buffer-local funcref', function()
  662. command([[
  663. function! g:Foo(n)
  664. $put ='called Foo(' . a:n . ')'
  665. endfunction
  666. ]])
  667. command("let b:my_func = function('Foo')")
  668. command('call b:my_func(1)')
  669. command('echo g:Foo(2)')
  670. command('echo Foo(3)')
  671. expect([[
  672. called Foo(1)
  673. called Foo(2)
  674. called Foo(3)]])
  675. end)
  676. it('script-local function used in Funcref must exist', function()
  677. source([[
  678. " Vim script used in test_eval.in. Needed for script-local function.
  679. func s:Testje()
  680. return "foo"
  681. endfunc
  682. let Bar = function('s:Testje')
  683. $put ='s:Testje exists: ' . exists('s:Testje')
  684. $put ='func s:Testje exists: ' . exists('*s:Testje')
  685. $put ='Bar exists: ' . exists('Bar')
  686. $put ='func Bar exists: ' . exists('*Bar')
  687. ]])
  688. expect([[
  689. s:Testje exists: 0
  690. func s:Testje exists: 1
  691. Bar exists: 1
  692. func Bar exists: 1]])
  693. end)
  694. it("using $ instead of '$' must give an error", function()
  695. eq(
  696. 'Vim(call):E116: Invalid arguments for function append',
  697. exc_exec('call append($, "foobar")')
  698. )
  699. end)
  700. it('getcurpos/setpos', function()
  701. insert([[
  702. 012345678
  703. 012345678
  704. start:]])
  705. command('/^012345678')
  706. feed('6l')
  707. poke_eventloop()
  708. command('let sp = getcurpos()')
  709. feed('0')
  710. poke_eventloop()
  711. command("call setpos('.', sp)")
  712. feed('jyl')
  713. poke_eventloop()
  714. command('$put')
  715. expect([[
  716. 012345678
  717. 012345678
  718. start:
  719. 6]])
  720. end)
  721. it('substring and variable name', function()
  722. command("let str = 'abcdef'")
  723. command('let n = 3')
  724. eq('def', eval('str[n:]'))
  725. eq('abcd', eval('str[:n]'))
  726. eq('d', eval('str[n:n]'))
  727. command('unlet n')
  728. command('let nn = 3')
  729. eq('def', eval('str[nn:]'))
  730. eq('abcd', eval('str[:nn]'))
  731. eq('d', eval('str[nn:nn]'))
  732. command('unlet nn')
  733. command('let b:nn = 4')
  734. eq('ef', eval('str[b:nn:]'))
  735. eq('abcde', eval('str[:b:nn]'))
  736. eq('e', eval('str[b:nn:b:nn]'))
  737. end)
  738. end)