eval_spec.lua 27 KB

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