workflow.vader 31 KB

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