workflow.vader 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161
  1. Execute (plug#end() before plug#begin() should fail):
  2. redir => out
  3. silent! AssertEqual 0, plug#end()
  4. redir END
  5. Assert stridx(out, 'Call plug#begin() first') >= 0
  6. Execute (plug#begin() without path argument):
  7. call plug#begin()
  8. AssertEqual split(&rtp, ',')[0].'/plugged', g:plug_home
  9. unlet g:plug_home
  10. Execute (plug#begin() without path argument with empty &rtp):
  11. let save_rtp = &rtp
  12. set rtp=
  13. redir => out
  14. AssertEqual 0, plug#begin()
  15. redir END
  16. Assert stridx(out, 'Unable to determine plug home') >= 0
  17. let &rtp = save_rtp
  18. Execute (plug#begin(path)):
  19. let temp_plugged = tempname()
  20. call plug#begin(temp_plugged.'/')
  21. Assert g:plug_home !~ '[/\\]$', 'Trailing / should be stripped from g:plug_home'
  22. AssertEqual 0, len(g:plugs)
  23. AssertEqual temp_plugged, g:plug_home
  24. AssertEqual basertp, &rtp
  25. Execute (Subsequent plug#begin() calls will reuse g:plug_home):
  26. call plug#begin()
  27. AssertEqual temp_plugged, g:plug_home
  28. Execute (Test Plug command):
  29. ^ Git repo with branch (DEPRECATED. USE BRANCH OPTION)
  30. Plug 'junegunn/seoul256.vim', { 'branch': 'yes-t_co' }
  31. AssertEqual 'file:///tmp/junegunn/seoul256.vim', g:plugs['seoul256.vim'].uri
  32. AssertEqual join([temp_plugged, 'seoul256.vim/'], '/'), g:plugs['seoul256.vim'].dir
  33. AssertEqual 'yes-t_co', g:plugs['seoul256.vim'].branch
  34. Plug 'junegunn/seoul256.vim', { 'branch': 'no-t_co' } " Using branch option
  35. AssertEqual 'no-t_co', g:plugs['seoul256.vim'].branch
  36. ^ Git repo with tag (DEPRECATED. USE TAG OPTION)
  37. Plug 'junegunn/goyo.vim', '1.5.2'
  38. AssertEqual 'file:///tmp/junegunn/goyo.vim', g:plugs['goyo.vim'].uri
  39. AssertEqual join([temp_plugged, 'goyo.vim/'], '/'), g:plugs['goyo.vim'].dir
  40. AssertEqual '1.5.2', g:plugs['goyo.vim'].tag
  41. Plug 'junegunn/goyo.vim', { 'tag': '1.5.3' } " Using tag option
  42. AssertEqual '1.5.3', g:plugs['goyo.vim'].tag
  43. " Git URI
  44. Plug 'file:///tmp/jg/vim-emoji'
  45. AssertEqual 'file:///tmp/jg/vim-emoji', g:plugs['vim-emoji'].uri
  46. AssertEqual 'master', g:plugs['vim-emoji'].branch
  47. AssertEqual join([temp_plugged, 'vim-emoji/'], '/'), g:plugs['vim-emoji'].dir
  48. " vim-scripts/
  49. Plug 'beauty256'
  50. AssertEqual 'file:///tmp/vim-scripts/beauty256', g:plugs.beauty256.uri
  51. AssertEqual 'master', g:plugs.beauty256.branch
  52. AssertEqual 4, len(g:plugs)
  53. Execute (Plug command with dictionary option):
  54. Log string(g:plugs)
  55. Plug 'junegunn/seoul256.vim', { 'branch': 'no-t_co', 'rtp': '././' }
  56. AssertEqual join([temp_plugged, 'seoul256.vim/'], '/'), g:plugs['seoul256.vim'].dir
  57. AssertEqual '././', g:plugs['seoul256.vim'].rtp
  58. Log string(g:plugs)
  59. AssertEqual 4, len(g:plugs)
  60. Execute (PlugStatus before installation):
  61. PlugStatus
  62. AssertExpect 'Not found', 4
  63. q
  64. Execute (PlugClean before installation):
  65. PlugClean
  66. AssertExpect 'Already clean', 1
  67. q
  68. Execute (plug#end() updates &rtp):
  69. call plug#end()
  70. Assert len(&rtp) > len(basertp)
  71. AssertEqual first_rtp, split(&rtp, ',')[0]
  72. AssertEqual last_rtp, split(&rtp, ',')[-1]
  73. Execute (Yet, plugins are not available):
  74. Assert empty(globpath(&rtp, 'autoload/emoji.vim'))
  75. Execute (PlugInstall):
  76. PlugInstall
  77. q
  78. Execute (Plugin available after installation):
  79. Assert !empty(globpath(&rtp, 'autoload/emoji.vim'))
  80. Execute (PlugClean after installation):
  81. PlugClean
  82. AssertExpect 'Already clean', 1
  83. q
  84. Execute (PlugStatus after installation):
  85. PlugStatus
  86. Log getline(1, '$')
  87. AssertExpect 'OK', 4
  88. q
  89. Execute (PlugUpdate - tagged plugin should not fail (#174)):
  90. PlugUpdate goyo.vim
  91. Log getline(1, '$')
  92. AssertExpect '^- goyo.vim', 1
  93. q
  94. Execute (Change tag of goyo.vim):
  95. call plug#begin()
  96. Plug 'junegunn/goyo.vim', { 'tag': '9.9.9' }
  97. call plug#end()
  98. Execute (PlugStatus):
  99. call PlugStatusSorted()
  100. Expect:
  101. Invalid tag: 1.5.3 (expected: 9.9.9). Try PlugUpdate.
  102. Finished. 1 error(s).
  103. [=]
  104. x goyo.vim:
  105. Execute (Remove tag of goyo.vim):
  106. call plug#begin()
  107. Plug 'junegunn/goyo.vim'
  108. call plug#end()
  109. Execute (PlugStatus):
  110. call PlugStatusSorted()
  111. Expect:
  112. Invalid branch: HEAD (expected: master). Try PlugUpdate.
  113. Finished. 1 error(s).
  114. [=]
  115. x goyo.vim:
  116. Execute (PlugUpdate to set the right branch):
  117. PlugUpdate
  118. call PlugStatusSorted()
  119. Expect:
  120. - goyo.vim: OK
  121. Finished. 0 error(s).
  122. [=]
  123. Execute (Change branch of seoul256.vim):
  124. call plug#begin()
  125. Plug 'junegunn/seoul256.vim'
  126. Plug 'file:///tmp/jg/vim-emoji'
  127. call plug#end()
  128. Execute (PlugStatus):
  129. call PlugStatusSorted()
  130. Expect:
  131. Invalid branch: no-t_co (expected: master). Try PlugUpdate.
  132. - vim-emoji: OK
  133. Finished. 1 error(s).
  134. [==]
  135. x seoul256.vim:
  136. Execute (PlugUpdate to switch branch, then PlugStatus):
  137. PlugUpdate
  138. call PlugStatusSorted()
  139. Expect:
  140. - seoul256.vim: OK
  141. - vim-emoji: OK
  142. Finished. 0 error(s).
  143. [==]
  144. Execute (Change tag of seoul256.vim):
  145. call plug#begin()
  146. Plug 'junegunn/seoul256.vim', { 'tag': 'no-such-tag' }
  147. call plug#end()
  148. call PlugStatusSorted()
  149. Expect:
  150. Invalid tag: N/A (expected: no-such-tag). Try PlugUpdate.
  151. Finished. 1 error(s).
  152. [=]
  153. x seoul256.vim:
  154. Execute (Change URI of seoul256.vim):
  155. call plug#begin()
  156. Plug 'junegunn.choi/seoul256.vim'
  157. Plug 'file:///tmp/jg/vim-emoji'
  158. call plug#end()
  159. Execute (PlugStatus):
  160. call PlugStatusSorted()
  161. Expect:
  162. Expected: file:///tmp/junegunn.choi/seoul256.vim
  163. Invalid URI: file:///tmp/junegunn/seoul256.vim
  164. PlugClean required.
  165. - vim-emoji: OK
  166. Finished. 1 error(s).
  167. [==]
  168. x seoul256.vim:
  169. # TODO: does not work due to inputsave()
  170. # Do (PlugClean):
  171. # :PlugClean\<Enter>y\<Enter>
  172. # ggyG
  173. # q
  174. # PGdd
  175. Execute (PlugClean! to remove seoul256.vim):
  176. PlugClean!
  177. " Three removed, emoji left
  178. AssertExpect '^- ', 3
  179. AssertExpect 'Removed', 1
  180. Assert empty(globpath(&rtp, 'colors/seoul256.vim'))
  181. Assert !empty(globpath(&rtp, 'autoload/emoji.vim'))
  182. q
  183. Execute (Change GIT URI of vim-emoji):
  184. call plug#begin()
  185. Plug 'junegunn/seoul256.vim'
  186. Plug 'junegunn/vim-emoji'
  187. call plug#end()
  188. Execute (PlugStatus):
  189. call PlugStatusSorted()
  190. Expect:
  191. Expected: file:///tmp/junegunn/vim-emoji
  192. Invalid URI: file:///tmp/jg/vim-emoji
  193. Not found. Try PlugInstall.
  194. PlugClean required.
  195. Finished. 2 error(s).
  196. [==]
  197. x seoul256.vim:
  198. x vim-emoji:
  199. Execute (PlugClean! to remove vim-emoji):
  200. PlugClean!
  201. AssertExpect '^- ', 1
  202. AssertExpect 'Removed', 1
  203. Assert empty(globpath(&rtp, 'colors/seoul256.vim'))
  204. Assert empty(globpath(&rtp, 'autoload/emoji.vim'))
  205. q
  206. Execute (PlugUpdate to install both again):
  207. PlugUpdate
  208. AssertExpect '^- [^:]*:', 2
  209. Assert !empty(globpath(&rtp, 'colors/seoul256.vim')), 'seoul256.vim should be found'
  210. Assert !empty(globpath(&rtp, 'autoload/emoji.vim')), 'vim-emoji should be found'
  211. q
  212. Execute (PlugUpdate only to find out plugins are up-to-date, D key to check):
  213. PlugUpdate
  214. AssertExpect 'Already up-to-date', 2
  215. normal D
  216. AssertEqual 'No updates.', getline(1)
  217. q
  218. Execute (PlugDiff - 'No updates.'):
  219. PlugDiff
  220. AssertEqual 'No updates.', getline(1)
  221. q
  222. Execute (New commits on remote, PlugUpdate, then PlugDiff):
  223. for repo in ['seoul256.vim', 'vim-emoji']
  224. for _ in range(2)
  225. call system(printf('cd /tmp/junegunn/%s && git commit --allow-empty -m "update"', repo))
  226. endfor
  227. endfor
  228. PlugUpdate
  229. " Now we have updates
  230. normal D
  231. AssertEqual 'Last update:', getline(1)
  232. " Preview commit
  233. silent! wincmd P
  234. AssertEqual 0, &previewwindow
  235. " ]] motion
  236. execute 'normal ]]'
  237. let lnum = line('.')
  238. AssertEqual 3, col('.')
  239. " Open commit preview
  240. execute "normal j\<cr>"
  241. wincmd P
  242. AssertEqual 1, &previewwindow
  243. AssertEqual 'git', &filetype
  244. " Back to plug window
  245. wincmd p
  246. " ]] motion
  247. execute 'normal $]]'
  248. Assert line('.') >= 4
  249. " 5+ for merge commit
  250. AssertEqual 3, col('.')
  251. " [[ motion
  252. execute 'normal 0[['
  253. AssertEqual lnum, line('.')
  254. AssertEqual 3, col('.')
  255. " X key to revert the update
  256. AssertExpect '^- ', 2
  257. execute "normal Xn\<cr>"
  258. AssertExpect '^- ', 2
  259. execute "normal Xy\<cr>"
  260. AssertExpect '^- ', 1
  261. " q will close preview window as well
  262. normal q
  263. " We no longer have preview window
  264. silent! wincmd P
  265. AssertEqual 0, &previewwindow
  266. " q should not close preview window if it's already open
  267. pedit
  268. PlugDiff
  269. AssertExpect '^- ', 1
  270. execute "normal ]]j\<cr>"
  271. normal q
  272. silent! wincmd P
  273. AssertEqual 1, &previewwindow
  274. pclose
  275. Execute (Reuse Plug window in another tab):
  276. let tabnr = tabpagenr()
  277. PlugDiff
  278. tab new new-tab
  279. set buftype=nofile
  280. PlugUpdate
  281. normal D
  282. AssertExpect '^- ', 1
  283. normal q
  284. AssertEqual tabnr, tabpagenr()
  285. normal! gt
  286. q
  287. **********************************************************************
  288. ~ On-demand loading / Partial installation/update ~
  289. **********************************************************************
  290. Execute (Trying to execute on-demand commands when plugin is not installed):
  291. call ReloadPlug()
  292. call plug#begin()
  293. Plug 'junegunn/vim-easy-align', { 'on': ['EasyAlign', 'LiveEasyAlign'] }
  294. call plug#end()
  295. Assert exists(':EasyAlign')
  296. Assert exists(':LiveEasyAlign')
  297. AssertThrows EasyAlign
  298. AssertThrows LiveEasyAlign
  299. Assert !exists(':EasyAlign')
  300. Assert !exists(':LiveEasyAlign')
  301. Execute (New set of plugins):
  302. call ReloadPlug()
  303. call plug#begin()
  304. Plug 'junegunn/vim-fnr'
  305. Plug 'junegunn/vim-pseudocl'
  306. Plug 'junegunn/vim-easy-align', { 'on': 'EasyAlign' }
  307. Plug 'junegunn/vim-redis', { 'for': 'redis' }
  308. let user_autocmd = {}
  309. autocmd! User vim-fnr let user_autocmd.fnr = 1
  310. autocmd! User vim-easy-align let user_autocmd.easy_align = 1
  311. autocmd! User vim-redis let user_autocmd.redis = 1
  312. call plug#end()
  313. Execute (Check commands):
  314. Assert !exists(':FNR'), 'FNR command should not be found'
  315. Assert !exists(':RedisExecute'), 'RedisExecute command should not be found'
  316. Assert empty(user_autocmd)
  317. Execute (Partial PlugInstall):
  318. PlugInstall vim-fnr vim-easy-align
  319. AssertExpect 'vim-fnr', 1
  320. q
  321. PlugInstall vim-fnr vim-easy-align 1
  322. AssertExpect 'vim-fnr', 1
  323. AssertExpect 'vim-easy-align', 1
  324. AssertEqual first_rtp, split(&rtp, ',')[0]
  325. AssertEqual last_rtp, split(&rtp, ',')[-1]
  326. q
  327. Given (Unaligned code):
  328. a=1
  329. aa=2
  330. Execute (Check installed plugins):
  331. call EnsureLoaded()
  332. Assert exists(':FNR'), 'FNR command should be found'
  333. Assert !exists(':RedisExecute'), 'RedisExecute command still should not be found'
  334. Assert exists(':EasyAlign'), 'EasyAlign command should be found'
  335. %EasyAlign=
  336. Expect (Aligned code):
  337. a = 1
  338. aa = 2
  339. Then (autocmd executed):
  340. Assert user_autocmd.easy_align
  341. AssertEqual 1, len(user_autocmd)
  342. Given:
  343. Execute (Partial PlugUpdate):
  344. PlugUpdate vim-redis
  345. q
  346. Execute (On-demand loading based on filetypes):
  347. Assert !exists(':RedisExecute'), 'RedisExecute command still should not be found'
  348. set ft=redis
  349. Assert exists(':RedisExecute'), 'RedisExecute command is now found'
  350. Assert user_autocmd.redis
  351. AssertEqual 2, len(user_autocmd)
  352. Then:
  353. autocmd! User
  354. unlet user_autocmd
  355. **********************************************************************
  356. ~ Local (unmanaged) plugins
  357. **********************************************************************
  358. Execute (Add unmanaged plugin):
  359. let fzf = expand('$PLUG_FIXTURES/fzf')
  360. Log fzf
  361. call plug#begin()
  362. Plug fzf, { 'on': 'SomeCommand' }
  363. call plug#end()
  364. " Check uri field
  365. Assert !has_key(g:plugs.fzf, 'uri'), 'Should not have uri field'
  366. " Check dir field
  367. AssertEqual fzf.'/', g:plugs.fzf.dir
  368. " Trailing slashes and backslashes should be stripped
  369. for suffix in ['///', '/\/\/']
  370. call plug#begin()
  371. Plug fzf.suffix, { 'on': 'SomeCommand' }
  372. call plug#end()
  373. " Check dir field
  374. AssertEqual fzf.'/', g:plugs.fzf.dir
  375. endfor
  376. Execute (Plug block for following tests):
  377. call plug#begin()
  378. Plug 'junegunn/vim-easy-align'
  379. Plug fzf, { 'on': 'SomeCommand' }
  380. call plug#end()
  381. " Remove plugins from previous tests
  382. PlugClean!
  383. q
  384. Execute (PlugInstall will only install vim-easy-align):
  385. PlugInstall
  386. Log getline(1, '$')
  387. AssertExpect 'fzf', 0
  388. q
  389. Execute (PlugUpdate will only update vim-easy-align):
  390. PlugUpdate
  391. Log getline(1, '$')
  392. AssertExpect 'fzf', 0
  393. q
  394. Execute (PlugClean should not care about unmanaged plugins):
  395. PlugClean
  396. Log getline(1, '$')
  397. AssertExpect 'fzf', 0
  398. q
  399. Execute (PlugStatus should point out that the plugin is missing):
  400. PlugStatus
  401. Log getline(1, '$')
  402. AssertExpect 'x fzf', 1
  403. AssertExpect 'Not found', 1
  404. q
  405. Execute (Deploy unmanaged plugin):
  406. Assert !exists(':FZF'), ':FZF command should not exist'
  407. call rename(expand('$PLUG_FIXTURES/fzf-staged'), fzf)
  408. Execute (PlugUpdate still should not care):
  409. PlugUpdate
  410. Log getline(1, '$')
  411. AssertExpect 'fzf', 0
  412. q
  413. Execute (PlugStatus with no error):
  414. PlugStatus
  415. Log getline(1, '$')
  416. AssertExpect 'x fzf', 0
  417. AssertExpect 'Not found', 0
  418. q
  419. Execute (Check &rtp after SomeCommand):
  420. Log &rtp
  421. Assert &rtp !~ 'fzf'
  422. silent! SomeCommand
  423. Assert &rtp =~ 'fzf'
  424. AssertEqual first_rtp, split(&rtp, ',')[0]
  425. AssertEqual last_rtp, split(&rtp, ',')[-1]
  426. Execute (Common parent):
  427. call plug#begin()
  428. Plug 'junegunn/vim-pseudocl'
  429. Plug 'junegunn/vim-fnr'
  430. Plug 'junegunn/vim-oblique'
  431. call plug#end()
  432. PlugInstall
  433. Log getline(1, '$')
  434. AssertExpect! '[===]', 1
  435. q
  436. **********************************************************************
  437. ~ Frozen plugins
  438. **********************************************************************
  439. - We've decided to install plugins that are frozen: see #113
  440. Execute (Frozen plugin are not ~~installed nor~~ updated):
  441. " Remove plugins
  442. call plug#begin()
  443. call plug#end()
  444. PlugClean!
  445. q
  446. " vim-easy-align is not found, so it will be installed even though it's frozen
  447. call plug#begin()
  448. Plug 'junegunn/vim-easy-align', { 'frozen': 1 }
  449. call plug#end()
  450. PlugInstall
  451. AssertEqual 1, len(filter(getline(1, '$'), 'v:val =~ "vim-easy-align"'))
  452. q
  453. " Remove plugins again
  454. call plug#begin()
  455. call plug#end()
  456. PlugClean!
  457. q
  458. " PlugUpdate will do the same
  459. call plug#begin()
  460. Plug 'junegunn/vim-easy-align', { 'frozen': 1 }
  461. call plug#end()
  462. PlugInstall
  463. AssertEqual 1, len(filter(getline(1, '$'), 'v:val =~ "vim-easy-align"'))
  464. q
  465. " Since vim-easy-align already exists, PlugInstall or PlugUpdate will skip it
  466. redir => out
  467. silent PlugInstall
  468. redir END
  469. Assert out =~ 'No plugin to install'
  470. redir => out
  471. silent PlugUpdate
  472. redir END
  473. Assert out =~ 'No plugin to update'
  474. Execute (But you can still install it if the name is given as the argument):
  475. PlugInstall vim-easy-align
  476. Log getline(1, '$')
  477. AssertEqual 1, len(filter(getline(1, '$'), 'v:val =~ "vim-easy-align"'))
  478. q
  479. PlugUpdate vim-easy-align
  480. Log getline(1, '$')
  481. AssertEqual 1, len(filter(getline(1, '$'), 'v:val =~ "vim-easy-align"'))
  482. q
  483. **********************************************************************
  484. ~ Retry
  485. **********************************************************************
  486. Execute (Retry failed tasks):
  487. call plug#begin()
  488. Plug 'junegunn/vim-easy-align'
  489. Plug 'junegunn/aaaaaaaaaaaaaa'
  490. call plug#end()
  491. PlugInstall
  492. Log getline(1, '$')
  493. AssertExpect 'x aaa', 1
  494. AssertExpect '- vim-easy-align', 1
  495. normal R
  496. Log getline(1, '$')
  497. AssertExpect 'x aaa', 1
  498. AssertExpect '- vim-easy-align', 0
  499. AssertExpect! '[x]', 1
  500. q
  501. call plug#begin()
  502. Plug 'junegunn/vim-easy-align'
  503. Plug 'junegunn/aaaaaaaaaaaaaa'
  504. Plug 'junegunn/bbbbbbbbbbbbbb'
  505. Plug 'junegunn/cccccccccccccc'
  506. call plug#end()
  507. " Ruby installer
  508. PlugUpdate
  509. normal R
  510. AssertExpect '- vim-easy-align', 0
  511. AssertExpect! '[xxx]', 1
  512. q
  513. " Vim installer
  514. PlugUpdate 1
  515. normal R
  516. AssertExpect '- vim-easy-align', 0
  517. AssertExpect! '[xxx]', 1
  518. q
  519. **********************************************************************
  520. ~ Post-update hook (`do` option)
  521. **********************************************************************
  522. Execute (Cleanup):
  523. call plug#begin()
  524. call plug#end()
  525. PlugClean!
  526. q
  527. Execute (On install):
  528. call plug#begin()
  529. Plug 'junegunn/vim-easy-align', { 'do': 'touch installed' }
  530. Plug 'junegunn/vim-pseudocl'
  531. call plug#end()
  532. silent PlugInstall
  533. q
  534. Assert filereadable(g:plugs['vim-easy-align'].dir.'/installed'),
  535. \ 'vim-easy-align/installed should exist'
  536. Assert !filereadable(g:plugs['vim-pseudocl'].dir.'/installed'),
  537. \ 'vim-pseudocl/installed should not exist'
  538. Execute (On update):
  539. call plug#begin()
  540. Plug 'junegunn/vim-easy-align', { 'do': 'touch updated' }
  541. Plug 'junegunn/vim-pseudocl', { 'do': 'touch updated' }
  542. call plug#end()
  543. " New commits on remote
  544. call system('cd /tmp/junegunn/vim-pseudocl && git commit --allow-empty -m "update"')
  545. silent PlugUpdate
  546. Log getline(1, '$')
  547. q
  548. Assert !filereadable(g:plugs['vim-easy-align'].dir.'/updated'),
  549. \ 'vim-easy-align/updated should not exist'
  550. Assert filereadable(g:plugs['vim-pseudocl'].dir.'/updated'),
  551. \ 'vim-pseudocl/updated should exist'
  552. Execute (When already installed):
  553. call plug#begin()
  554. Plug 'junegunn/vim-easy-align', { 'do': 'touch installed2' }
  555. Plug 'junegunn/vim-pseudocl', { 'do': 'touch installed2' }
  556. call plug#end()
  557. PlugInstall
  558. q
  559. Assert !filereadable(g:plugs['vim-easy-align'].dir.'/installed2'),
  560. \ 'vim-easy-align/installed2 should not exist'
  561. Assert !filereadable(g:plugs['vim-pseudocl'].dir.'/installed2'),
  562. \ 'vim-pseudocl/installed2 should not exist'
  563. Execute (PlugInstall!):
  564. silent PlugInstall!
  565. q
  566. Assert filereadable(g:plugs['vim-easy-align'].dir.'/installed2'),
  567. \ 'vim-easy-align/installed2 should exist'
  568. Assert filereadable(g:plugs['vim-pseudocl'].dir.'/installed2'),
  569. \ 'vim-pseudocl/installed2 should exist'
  570. Execute (When already updated):
  571. call plug#begin()
  572. Plug 'junegunn/vim-easy-align', { 'do': 'touch updated2' }
  573. Plug 'junegunn/vim-pseudocl', { 'do': 'touch updated2' }
  574. call plug#end()
  575. PlugUpdate
  576. q
  577. Assert !filereadable(g:plugs['vim-easy-align'].dir.'/updated2'),
  578. \ 'vim-easy-align/updated2 should not exist'
  579. Assert !filereadable(g:plugs['vim-pseudocl'].dir.'/updated2'),
  580. \ 'vim-pseudocl/updated2 should not exist'
  581. Execute (PlugUpdate!):
  582. silent PlugUpdate!
  583. q
  584. Assert filereadable(g:plugs['vim-easy-align'].dir.'/updated2'),
  585. \ 'vim-easy-align/updated2 should exist'
  586. Assert filereadable(g:plugs['vim-pseudocl'].dir.'/updated2'),
  587. \ 'vim-pseudocl/updated2 should exist'
  588. Execute (Using Funcref):
  589. function! PlugUpdated(info)
  590. call system('touch '. a:info.name . a:info.status . a:info.force . len(a:info))
  591. endfunction
  592. call plug#begin()
  593. Plug 'junegunn/vim-easy-align', { 'do': function('PlugUpdated') }
  594. Plug 'junegunn/vim-pseudocl', { 'do': function('PlugUpdated') }
  595. call plug#end()
  596. call system('cd /tmp/junegunn/vim-easy-align && git commit --allow-empty -m "update"')
  597. call system('cd '.g:plugs['vim-easy-align'].dir.' && git reset --hard HEAD^')
  598. call system('rm -rf '.g:plugs['vim-pseudocl'].dir)
  599. PlugUpdate
  600. Log getline(1, '$')
  601. q
  602. Assert filereadable(g:plugs['vim-easy-align'].dir.'/vim-easy-alignupdated03'),
  603. \ 'vim-easy-align/vim-easy-alignupdated03 should exist'
  604. Assert filereadable(g:plugs['vim-pseudocl'].dir.'/vim-pseudoclinstalled03'),
  605. \ 'vim-pseudocl/vim-pseudoclinstalled03 should exist'
  606. call system('rm -rf '.g:plugs['vim-pseudocl'].dir)
  607. PlugInstall!
  608. q
  609. Assert filereadable(g:plugs['vim-easy-align'].dir.'/vim-easy-alignunchanged13'),
  610. \ 'vim-easy-align/vim-easy-alignunchanged13 should exist'
  611. Assert filereadable(g:plugs['vim-pseudocl'].dir.'/vim-pseudoclinstalled13'),
  612. \ 'vim-pseudocl/vim-pseudoclinstalled13 should exist'
  613. call system('cd '.g:plugs['vim-easy-align'].dir.' && git reset --hard HEAD^')
  614. PlugUpdate!
  615. q
  616. Assert filereadable(g:plugs['vim-easy-align'].dir.'/vim-easy-alignupdated13'),
  617. \ 'vim-easy-align/vim-easy-alignupdated13 should exist'
  618. Assert filereadable(g:plugs['vim-pseudocl'].dir.'/vim-pseudoclunchanged13'),
  619. \ 'vim-pseudocl/vim-pseudoclunchanged13 should exist'
  620. **********************************************************************
  621. ~ Overriding `dir`
  622. **********************************************************************
  623. Execute (Using custom dir):
  624. Assert isdirectory(g:plugs['vim-easy-align'].dir)
  625. call system('rm -rf '.$TMPDIR.'easy-align')
  626. call plug#begin()
  627. Plug 'junegunn/vim-easy-align', { 'dir': $TMPDIR.'easy-align' }
  628. call plug#end()
  629. AssertEqual $TMPDIR.'easy-align/', g:plugs['vim-easy-align'].dir
  630. PlugClean!
  631. Assert !isdirectory(g:plugs['vim-easy-align'].dir)
  632. q
  633. PlugInstall
  634. q
  635. Assert isdirectory(g:plugs['vim-easy-align'].dir)
  636. **********************************************************************
  637. ~ On-demand loading load order
  638. **********************************************************************
  639. Before (Clear global vars):
  640. let g:xxx = []
  641. set rtp-=$PLUG_FIXTURES/xxx/
  642. set rtp-=$PLUG_FIXTURES/xxx/after
  643. Execute (Immediate loading):
  644. call ReloadPlug()
  645. call plug#begin()
  646. Plug '$PLUG_FIXTURES/xxx'
  647. call plug#end()
  648. " FIXME:
  649. " Different result when Vader is run from commandline with `-c` option
  650. Log g:xxx
  651. if has('vim_starting')
  652. AssertEqual ['xxx/ftdetect', 'xxx/after/ftdetect'], g:xxx
  653. else
  654. AssertEqual ['xxx/plugin', 'xxx/after/plugin', 'xxx/ftdetect', 'xxx/after/ftdetect'], g:xxx
  655. endif
  656. Execute (Command-based on-demand loading):
  657. call ReloadPlug()
  658. call plug#begin()
  659. Plug '$PLUG_FIXTURES/xxx', { 'on': 'XXX' }
  660. call plug#end()
  661. AssertEqual [], g:xxx
  662. silent! XXX
  663. AssertEqual ['xxx/ftdetect', 'xxx/after/ftdetect', 'xxx/plugin', 'xxx/after/plugin'], g:xxx
  664. setf xxx
  665. AssertEqual ['xxx/ftdetect', 'xxx/after/ftdetect', 'xxx/plugin', 'xxx/after/plugin', 'xxx/ftplugin', 'xxx/after/ftplugin', 'xxx/indent', 'xxx/after/indent', 'xxx/syntax', 'xxx/after/syntax'], g:xxx
  666. Execute (Filetype-based on-demand loading):
  667. call ReloadPlug()
  668. call plug#begin()
  669. Plug '$PLUG_FIXTURES/xxx', { 'for': 'xxx' }
  670. call plug#end()
  671. AssertEqual ['xxx/ftdetect', 'xxx/after/ftdetect'], g:xxx
  672. setf xxx
  673. AssertEqual ['xxx/ftdetect', 'xxx/after/ftdetect', 'xxx/plugin', 'xxx/after/plugin', 'xxx/ftplugin', 'xxx/after/ftplugin', 'xxx/indent', 'xxx/after/indent', 'xxx/syntax', 'xxx/after/syntax'], g:xxx
  674. Before:
  675. **********************************************************************
  676. ~ plug#helptags()
  677. **********************************************************************
  678. Execute (plug#helptags):
  679. silent! call delete(expand('$PLUG_FIXTURES/xxx/doc/tags'))
  680. Assert !filereadable(expand('$PLUG_FIXTURES/xxx/doc/tags'))
  681. AssertEqual 1, plug#helptags()
  682. Assert filereadable(expand('$PLUG_FIXTURES/xxx/doc/tags'))
  683. **********************************************************************
  684. ~ Manual loading
  685. **********************************************************************
  686. Execute (plug#load - invalid arguments):
  687. AssertEqual 0, plug#load()
  688. AssertEqual 0, plug#load('non-existent-plugin')
  689. AssertEqual 0, plug#load('non-existent-plugin', 'another-non-existent-plugin')
  690. AssertEqual 1, plug#load('xxx')
  691. AssertEqual 0, plug#load('xxx', 'non-existent-plugin')
  692. AssertEqual 0, plug#load('non-existent-plugin', 'xxx')
  693. Execute (on: []):
  694. call plug#begin()
  695. Plug 'junegunn/rust.vim', { 'on': [] }
  696. call plug#end()
  697. PlugInstall
  698. q
  699. Execute (PlugStatus reports (not loaded)):
  700. PlugStatus
  701. AssertExpect 'not loaded', 1
  702. q
  703. Execute (plug#load to load it):
  704. tabnew test.rs
  705. " Vader will switch tab to [Vader-workbench] after Log
  706. " Log &filetype
  707. AssertEqual 1, plug#load('rust.vim')
  708. AssertEqual 'rust', &filetype
  709. q
  710. Execute (PlugStatus should not contain (not loaded)):
  711. PlugStatus
  712. AssertExpect 'not loaded', 0
  713. q
  714. Execute (Load plugin from PlugStatus screen with L key in normal mode):
  715. call plug#begin()
  716. Plug '$PLUG_FIXTURES/yyy', { 'on': [] }
  717. call plug#end()
  718. PlugStatus
  719. AssertExpect 'not loaded', 1
  720. Assert !exists('g:yyy'), 'yyy not loaded'
  721. /not loaded
  722. normal L
  723. AssertExpect 'not loaded', 0
  724. Assert exists('g:yyy'), 'yyy loaded'
  725. q
  726. Execute (Load plugin from PlugStatus screen with L key in visual mode):
  727. call plug#begin()
  728. Plug '$PLUG_FIXTURES/z1', { 'on': [] }
  729. Plug '$PLUG_FIXTURES/z2', { 'for': [] }
  730. call plug#end()
  731. PlugStatus
  732. AssertExpect 'not loaded', 2
  733. Assert !exists('g:z1'), 'z1 not loaded'
  734. Assert !exists('g:z2'), 'z2 not loaded'
  735. normal ggVGL
  736. AssertExpect 'not loaded', 0
  737. Assert exists('g:z1'), 'z1 loaded'
  738. Assert exists('g:z2'), 'z2 loaded'
  739. q
  740. **********************************************************************
  741. ~ g:plug_window
  742. **********************************************************************
  743. Execute (Open plug window in a new tab):
  744. " Without g:plug_window, plug window is open on the left split
  745. let tabnr = tabpagenr()
  746. PlugStatus
  747. AssertEqual tabnr, tabpagenr()
  748. AssertEqual 1, winnr()
  749. " PlugStatus again inside the window should not change the view
  750. normal S
  751. AssertEqual tabnr, tabpagenr()
  752. AssertEqual 1, winnr()
  753. q
  754. " Define g:plug_window so that plug window is open in a new tab
  755. let g:plug_window = 'tabnew'
  756. PlugStatus
  757. AssertNotEqual tabnr, tabpagenr()
  758. " PlugStatus again inside the window should not change the view
  759. let tabnr = tabpagenr()
  760. normal S
  761. AssertEqual tabnr, tabpagenr()
  762. q
  763. unlet g:plug_window
  764. **********************************************************************
  765. ~ g:plug_url_format
  766. **********************************************************************
  767. Execute (Using g:plug_url_format):
  768. let prev_plug_url_format = g:plug_url_format
  769. call plug#begin()
  770. let g:plug_url_format = 'git@bitbucket.org:%s.git'
  771. Plug 'junegunn/seoul256.vim'
  772. let g:plug_url_format = 'git@bitsocket.org:%s.git'
  773. Plug 'beauty256'
  774. AssertEqual 'git@bitbucket.org:junegunn/seoul256.vim.git', g:plugs['seoul256.vim'].uri
  775. AssertEqual 'git@bitsocket.org:vim-scripts/beauty256.git', g:plugs['beauty256'].uri
  776. let g:plug_url_format = prev_plug_url_format
  777. **********************************************************************
  778. ~ U
  779. **********************************************************************
  780. Execute (Plug block):
  781. call plug#begin()
  782. Plug 'junegunn/vim-easy-align'
  783. Plug 'junegunn/vim-emoji'
  784. call plug#end()
  785. Execute (Update plugin with U key in normal mode):
  786. PlugStatus
  787. /emoji
  788. normal U
  789. Log getline(1, '$')
  790. AssertExpect 'Updated', 1
  791. AssertExpect 'vim-emoji', 1
  792. AssertExpect 'vim-easy-align', 0
  793. AssertExpect! '[=]', 1
  794. " From PlugInstall screen
  795. PlugInstall
  796. /easy-align
  797. normal U
  798. AssertExpect 'Updated', 1
  799. AssertExpect 'vim-emoji', 0
  800. AssertExpect 'vim-easy-align', 1
  801. AssertExpect! '[=]', 1
  802. q
  803. Execute (Update plugins with U key in visual mode):
  804. silent! call system('rm -rf '.g:plugs['vim-easy-align'].dir)
  805. PlugStatus
  806. normal VGU
  807. Log getline(1, '$')
  808. AssertExpect 'Updated', 1
  809. AssertExpect 'vim-emoji', 1
  810. AssertExpect 'vim-easy-align', 1
  811. AssertExpect! '[==]', 1
  812. " From PlugUpdate screen
  813. normal VGU
  814. Log getline(1, '$')
  815. AssertExpect 'Updated', 1
  816. AssertExpect 'vim-emoji', 1
  817. AssertExpect 'vim-easy-align', 1
  818. AssertExpect! '[==]', 1
  819. q
  820. **********************************************************************
  821. Execute (plug#begin should expand env vars):
  822. AssertNotEqual '$HOME/.emacs/plugged', expand('$HOME/.emacs/plugged')
  823. call plug#begin('$HOME/.emacs/plugged')
  824. AssertEqual expand('$HOME/.emacs/plugged'), g:plug_home
  825. **********************************************************************
  826. Execute (Plug directory with comma):
  827. call plug#begin(temp_plugged . '/p,l,u,g,g,e,d')
  828. Plug 'junegunn/vim-emoji'
  829. call plug#end()
  830. Log &rtp
  831. PlugInstall
  832. q
  833. let found = filter(split(globpath(&rtp, 'README.md'), '\n'), 'v:val =~ ","')
  834. Log found
  835. AssertEqual 1, len(found)
  836. **********************************************************************
  837. Execute (Strict load order):
  838. let g:total_order = []
  839. call ReloadPlug()
  840. call plug#begin()
  841. Plug '$PLUG_FIXTURES/xxx'
  842. Plug '$PLUG_FIXTURES/yyy', { 'for': ['xxx'] }
  843. call plug#end()
  844. call EnsureLoaded()
  845. setf xxx
  846. Log 'Case 1: ' . &rtp
  847. AssertEqual ['yyy/ftdetect', 'yyy/after/ftdetect', 'xxx/ftdetect', 'xxx/after/ftdetect'], g:total_order[0:3]
  848. Assert index(g:total_order, 'xxx/plugin') < index(g:total_order, 'yyy/plugin')
  849. Assert index(g:total_order, 'xxx/after/plugin') < index(g:total_order, 'yyy/after/plugin')
  850. let len = len(split(&rtp, ','))
  851. let g:total_order = []
  852. call ReloadPlug()
  853. call plug#begin()
  854. Plug '$PLUG_FIXTURES/xxx', { 'for': ['xxx'] }
  855. Plug '$PLUG_FIXTURES/yyy'
  856. call plug#end()
  857. call EnsureLoaded()
  858. set rtp^=manually-prepended
  859. set rtp+=manually-appended
  860. setf xxx
  861. Log 'Case 2: ' . &rtp
  862. AssertEqual 'manually-prepended', split(&rtp, ',')[3]
  863. AssertEqual 'manually-appended', split(&rtp, ',')[-4]
  864. AssertEqual ['xxx/ftdetect', 'xxx/after/ftdetect', 'yyy/ftdetect', 'yyy/after/ftdetect'], g:total_order[0:3]
  865. Assert index(g:total_order, 'yyy/plugin') < index(g:total_order, 'xxx/plugin')
  866. Assert index(g:total_order, 'yyy/after/plugin') < index(g:total_order, 'xxx/after/plugin')
  867. AssertEqual len + 2, len(split(&rtp, ','))
  868. let g:total_order = []
  869. call ReloadPlug()
  870. set rtp^=manually-prepended
  871. set rtp+=manually-appended
  872. call plug#begin()
  873. Plug '$PLUG_FIXTURES/xxx', { 'for': ['xxx'] }
  874. Plug '$PLUG_FIXTURES/yyy', { 'for': ['xxx'] }
  875. call plug#end()
  876. call EnsureLoaded()
  877. setf xxx
  878. Log 'Case 3: ' . &rtp
  879. AssertEqual ['xxx/ftdetect', 'xxx/after/ftdetect', 'yyy/ftdetect', 'yyy/after/ftdetect'], g:total_order[0:3]
  880. Assert index(g:total_order, 'xxx/plugin') < index(g:total_order, 'yyy/plugin')
  881. Assert index(g:total_order, 'xxx/after/plugin') < index(g:total_order, 'yyy/after/plugin')
  882. AssertEqual len + 2, len(split(&rtp, ','))
  883. **********************************************************************
  884. Execute (PlugClean should not try to remove unmanaged plugins inside g:plug_home):
  885. call plug#begin('$PLUG_FIXTURES')
  886. Plug '$PLUG_FIXTURES/ftplugin-msg', { 'for': [] }
  887. Plug '$PLUG_FIXTURES/fzf'
  888. Plug '$PLUG_FIXTURES/xxx'
  889. Plug '$PLUG_FIXTURES/yyy'
  890. call plug#end()
  891. " Remove z1, z2
  892. PlugClean!
  893. AssertExpect '^- ', 2
  894. AssertExpect 'Already clean', 0
  895. PlugClean!
  896. AssertExpect '^- ', 0
  897. AssertExpect 'Already clean', 1
  898. q
  899. **********************************************************************
  900. Execute (PlugSnapshot / #154 issues with paths containing spaces):
  901. call plug#begin('$TMPDIR/plug with spaces')
  902. Plug 'junegunn/vim-easy-align'
  903. Plug 'junegunn/seoul256.vim'
  904. call plug#end()
  905. PlugClean!
  906. PlugInstall
  907. call plug#load('vim-easy-align') " Should properly handle paths with spaces
  908. PlugSnapshot
  909. AssertEqual '#!/bin/sh', getline(1)
  910. AssertEqual '# Generated by vim-plug', getline(2)
  911. AssertEqual 'vim +PlugUpdate +qa', getline(5)
  912. AssertEqual 'PLUG_HOME=$TMPDIR/plug\ with\ spaces', getline(7)
  913. AssertEqual 0, stridx(getline(9), 'cd $PLUG_HOME/seoul256.vim/ && git reset --hard')
  914. AssertEqual 0, stridx(getline(10), 'cd $PLUG_HOME/vim-easy-align/ && git reset --hard')
  915. AssertEqual 'sh', &filetype
  916. execute 'PlugSnapshot' g:plug_home.'/snapshot.sh'
  917. AssertEqual 'sh', &filetype
  918. AssertEqual 'snapshot.sh', fnamemodify(expand('%'), ':t')
  919. q
  920. **********************************************************************
  921. Execute (#221 Shallow-clone and tag option):
  922. call plug#begin(temp_plugged)
  923. Plug 'junegunn/goyo.vim'
  924. call plug#end()
  925. PlugInstall
  926. execute 'cd' g:plugs['goyo.vim'].dir
  927. Assert len(split(system('git log --oneline'), '\n')) == 1
  928. Assert filereadable('.git/shallow')
  929. Plug 'junegunn/goyo.vim', { 'tag': '1.5.3' }
  930. PlugUpdate
  931. q
  932. Assert len(split(system('git log --oneline'), '\n')) > 1
  933. Assert system('git describe --tag') =~ '^1.5.3'
  934. Assert !filereadable('.git/shallow')
  935. cd -
  936. Execute (#221 Shallow-clone disabled by g:plug_shallow = 0):
  937. call plug#begin(temp_plugged)
  938. call plug#end()
  939. PlugClean!
  940. let g:plug_shallow = 0
  941. call plug#begin(temp_plugged)
  942. Plug 'junegunn/goyo.vim'
  943. call plug#end()
  944. PlugInstall
  945. q
  946. execute 'cd' g:plugs['goyo.vim'].dir
  947. Assert len(split(system('git log --oneline'), '\n')) > 1, 'not shallow'
  948. Assert !filereadable('.git/shallow'), 'not shallow'
  949. cd -
  950. Then:
  951. unlet g:plug_shallow
  952. Execute (#221 Shallow-clone disabled by tag):
  953. call plug#begin(temp_plugged)
  954. call plug#end()
  955. PlugClean!
  956. call plug#begin(temp_plugged)
  957. Plug 'junegunn/goyo.vim', { 'tag': '1.5.3' }
  958. call plug#end()
  959. Assert !isdirectory(g:plugs['goyo.vim'].dir)
  960. PlugInstall
  961. Assert isdirectory(g:plugs['goyo.vim'].dir)
  962. q
  963. execute 'cd' g:plugs['goyo.vim'].dir
  964. Assert system('git describe --tag') =~ '^1.5.3'
  965. Assert len(split(system('git log --oneline'), '\n')) > 1
  966. Assert !filereadable('.git/shallow')
  967. cd -