workflow.vader 28 KB

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