diff_spec.lua 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356
  1. local helpers = require('test.functional.helpers')(after_each)
  2. local Screen = require('test.functional.ui.screen')
  3. local feed = helpers.feed
  4. local clear = helpers.clear
  5. local command = helpers.command
  6. local insert = helpers.insert
  7. local write_file = helpers.write_file
  8. local exec = helpers.exec
  9. describe('Diff mode screen', function()
  10. local fname = 'Xtest-functional-diff-screen-1'
  11. local fname_2 = fname .. '.2'
  12. local screen
  13. local reread = function()
  14. feed(':e<cr><c-w>w:e<cr><c-w>w')
  15. end
  16. setup(function()
  17. clear()
  18. os.remove(fname)
  19. os.remove(fname_2)
  20. end)
  21. teardown(function()
  22. os.remove(fname)
  23. os.remove(fname_2)
  24. end)
  25. before_each(function()
  26. clear()
  27. feed(':e ' .. fname_2 .. '<cr>')
  28. feed(':vnew ' .. fname .. '<cr>')
  29. feed(':diffthis<cr>')
  30. feed('<c-w>w:diffthis<cr><c-w>w')
  31. screen = Screen.new(40, 16)
  32. screen:attach()
  33. screen:set_default_attr_ids({
  34. [1] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.WebGray},
  35. [2] = {background = Screen.colors.LightCyan1, bold = true, foreground = Screen.colors.Blue1},
  36. [3] = {reverse = true},
  37. [4] = {background = Screen.colors.LightBlue},
  38. [5] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.LightGrey},
  39. [6] = {bold = true, foreground = Screen.colors.Blue1},
  40. [7] = {bold = true, reverse = true},
  41. [8] = {bold = true, background = Screen.colors.Red},
  42. [9] = {background = Screen.colors.LightMagenta},
  43. })
  44. end)
  45. it('Add a line in beginning of file 2', function()
  46. write_file(fname, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", false)
  47. write_file(fname_2, "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", false)
  48. reread()
  49. feed(':set diffopt=filler<cr>')
  50. screen:expect([[
  51. {1: }{2:------------------}{3:│}{1: }{4:0 }|
  52. {1: }^1 {3:│}{1: }1 |
  53. {1: }2 {3:│}{1: }2 |
  54. {1: }3 {3:│}{1: }3 |
  55. {1: }4 {3:│}{1: }4 |
  56. {1: }5 {3:│}{1: }5 |
  57. {1: }6 {3:│}{1: }6 |
  58. {1:+ }{5:+-- 4 lines: 7···}{3:│}{1:+ }{5:+-- 4 lines: 7··}|
  59. {6:~ }{3:│}{6:~ }|
  60. {6:~ }{3:│}{6:~ }|
  61. {6:~ }{3:│}{6:~ }|
  62. {6:~ }{3:│}{6:~ }|
  63. {6:~ }{3:│}{6:~ }|
  64. {6:~ }{3:│}{6:~ }|
  65. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  66. :set diffopt=filler |
  67. ]])
  68. feed(':set diffopt+=internal<cr>')
  69. screen:expect([[
  70. {1: }{2:------------------}{3:│}{1: }{4:0 }|
  71. {1: }^1 {3:│}{1: }1 |
  72. {1: }2 {3:│}{1: }2 |
  73. {1: }3 {3:│}{1: }3 |
  74. {1: }4 {3:│}{1: }4 |
  75. {1: }5 {3:│}{1: }5 |
  76. {1: }6 {3:│}{1: }6 |
  77. {1:+ }{5:+-- 4 lines: 7···}{3:│}{1:+ }{5:+-- 4 lines: 7··}|
  78. {6:~ }{3:│}{6:~ }|
  79. {6:~ }{3:│}{6:~ }|
  80. {6:~ }{3:│}{6:~ }|
  81. {6:~ }{3:│}{6:~ }|
  82. {6:~ }{3:│}{6:~ }|
  83. {6:~ }{3:│}{6:~ }|
  84. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  85. :set diffopt+=internal |
  86. ]])
  87. end)
  88. it('Add a line in beginning of file 1', function()
  89. write_file(fname, "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", false)
  90. write_file(fname_2, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", false)
  91. reread()
  92. feed(":set diffopt=filler<cr>")
  93. screen:expect([[
  94. {1: }{4:^0 }{3:│}{1: }{2:-----------------}|
  95. {1: }1 {3:│}{1: }1 |
  96. {1: }2 {3:│}{1: }2 |
  97. {1: }3 {3:│}{1: }3 |
  98. {1: }4 {3:│}{1: }4 |
  99. {1: }5 {3:│}{1: }5 |
  100. {1: }6 {3:│}{1: }6 |
  101. {1:+ }{5:+-- 4 lines: 7···}{3:│}{1:+ }{5:+-- 4 lines: 7··}|
  102. {6:~ }{3:│}{6:~ }|
  103. {6:~ }{3:│}{6:~ }|
  104. {6:~ }{3:│}{6:~ }|
  105. {6:~ }{3:│}{6:~ }|
  106. {6:~ }{3:│}{6:~ }|
  107. {6:~ }{3:│}{6:~ }|
  108. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  109. :set diffopt=filler |
  110. ]])
  111. feed(":set diffopt+=internal<cr>")
  112. screen:expect([[
  113. {1: }{4:^0 }{3:│}{1: }{2:-----------------}|
  114. {1: }1 {3:│}{1: }1 |
  115. {1: }2 {3:│}{1: }2 |
  116. {1: }3 {3:│}{1: }3 |
  117. {1: }4 {3:│}{1: }4 |
  118. {1: }5 {3:│}{1: }5 |
  119. {1: }6 {3:│}{1: }6 |
  120. {1:+ }{5:+-- 4 lines: 7···}{3:│}{1:+ }{5:+-- 4 lines: 7··}|
  121. {6:~ }{3:│}{6:~ }|
  122. {6:~ }{3:│}{6:~ }|
  123. {6:~ }{3:│}{6:~ }|
  124. {6:~ }{3:│}{6:~ }|
  125. {6:~ }{3:│}{6:~ }|
  126. {6:~ }{3:│}{6:~ }|
  127. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  128. :set diffopt+=internal |
  129. ]])
  130. end)
  131. it('Add a line at the end of file 2', function()
  132. write_file(fname, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", false)
  133. write_file(fname_2, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n", false)
  134. reread()
  135. feed(":set diffopt=filler<cr>")
  136. screen:expect([[
  137. {1:+ }{5:^+-- 4 lines: 1···}{3:│}{1:+ }{5:+-- 4 lines: 1··}|
  138. {1: }5 {3:│}{1: }5 |
  139. {1: }6 {3:│}{1: }6 |
  140. {1: }7 {3:│}{1: }7 |
  141. {1: }8 {3:│}{1: }8 |
  142. {1: }9 {3:│}{1: }9 |
  143. {1: }10 {3:│}{1: }10 |
  144. {1: }{2:------------------}{3:│}{1: }{4:11 }|
  145. {6:~ }{3:│}{6:~ }|
  146. {6:~ }{3:│}{6:~ }|
  147. {6:~ }{3:│}{6:~ }|
  148. {6:~ }{3:│}{6:~ }|
  149. {6:~ }{3:│}{6:~ }|
  150. {6:~ }{3:│}{6:~ }|
  151. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  152. :set diffopt=filler |
  153. ]])
  154. feed(":set diffopt+=internal<cr>")
  155. screen:expect([[
  156. {1:+ }{5:^+-- 4 lines: 1···}{3:│}{1:+ }{5:+-- 4 lines: 1··}|
  157. {1: }5 {3:│}{1: }5 |
  158. {1: }6 {3:│}{1: }6 |
  159. {1: }7 {3:│}{1: }7 |
  160. {1: }8 {3:│}{1: }8 |
  161. {1: }9 {3:│}{1: }9 |
  162. {1: }10 {3:│}{1: }10 |
  163. {1: }{2:------------------}{3:│}{1: }{4:11 }|
  164. {6:~ }{3:│}{6:~ }|
  165. {6:~ }{3:│}{6:~ }|
  166. {6:~ }{3:│}{6:~ }|
  167. {6:~ }{3:│}{6:~ }|
  168. {6:~ }{3:│}{6:~ }|
  169. {6:~ }{3:│}{6:~ }|
  170. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  171. :set diffopt+=internal |
  172. ]])
  173. screen:try_resize(40, 9)
  174. screen:expect([[
  175. {1:+ }{5:^+-- 4 lines: 1···}{3:│}{1:+ }{5:+-- 4 lines: 1··}|
  176. {1: }5 {3:│}{1: }5 |
  177. {1: }6 {3:│}{1: }6 |
  178. {1: }7 {3:│}{1: }7 |
  179. {1: }8 {3:│}{1: }8 |
  180. {1: }9 {3:│}{1: }9 |
  181. {1: }10 {3:│}{1: }10 |
  182. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  183. |
  184. ]])
  185. end)
  186. it('Add a line at the end of file 1', function()
  187. write_file(fname, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n", false)
  188. write_file(fname_2, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", false)
  189. reread()
  190. feed(":set diffopt=filler<cr>")
  191. screen:expect([[
  192. {1:+ }{5:^+-- 4 lines: 1···}{3:│}{1:+ }{5:+-- 4 lines: 1··}|
  193. {1: }5 {3:│}{1: }5 |
  194. {1: }6 {3:│}{1: }6 |
  195. {1: }7 {3:│}{1: }7 |
  196. {1: }8 {3:│}{1: }8 |
  197. {1: }9 {3:│}{1: }9 |
  198. {1: }10 {3:│}{1: }10 |
  199. {1: }{4:11 }{3:│}{1: }{2:-----------------}|
  200. {6:~ }{3:│}{6:~ }|
  201. {6:~ }{3:│}{6:~ }|
  202. {6:~ }{3:│}{6:~ }|
  203. {6:~ }{3:│}{6:~ }|
  204. {6:~ }{3:│}{6:~ }|
  205. {6:~ }{3:│}{6:~ }|
  206. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  207. :set diffopt=filler |
  208. ]])
  209. feed(":set diffopt+=internal<cr>")
  210. screen:expect([[
  211. {1:+ }{5:^+-- 4 lines: 1···}{3:│}{1:+ }{5:+-- 4 lines: 1··}|
  212. {1: }5 {3:│}{1: }5 |
  213. {1: }6 {3:│}{1: }6 |
  214. {1: }7 {3:│}{1: }7 |
  215. {1: }8 {3:│}{1: }8 |
  216. {1: }9 {3:│}{1: }9 |
  217. {1: }10 {3:│}{1: }10 |
  218. {1: }{4:11 }{3:│}{1: }{2:-----------------}|
  219. {6:~ }{3:│}{6:~ }|
  220. {6:~ }{3:│}{6:~ }|
  221. {6:~ }{3:│}{6:~ }|
  222. {6:~ }{3:│}{6:~ }|
  223. {6:~ }{3:│}{6:~ }|
  224. {6:~ }{3:│}{6:~ }|
  225. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  226. :set diffopt+=internal |
  227. ]])
  228. screen:try_resize(40, 9)
  229. screen:expect([[
  230. {1:+ }{5:^+-- 4 lines: 1···}{3:│}{1:+ }{5:+-- 4 lines: 1··}|
  231. {1: }5 {3:│}{1: }5 |
  232. {1: }6 {3:│}{1: }6 |
  233. {1: }7 {3:│}{1: }7 |
  234. {1: }8 {3:│}{1: }8 |
  235. {1: }9 {3:│}{1: }9 |
  236. {1: }10 {3:│}{1: }10 |
  237. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  238. |
  239. ]])
  240. end)
  241. it('Add a line in the middle of file 2, remove on at the end of file 1', function()
  242. write_file(fname, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n", false)
  243. write_file(fname_2, "1\n2\n3\n4\n4\n5\n6\n7\n8\n9\n10\n", false)
  244. reread()
  245. feed(':set diffopt=filler<cr>')
  246. screen:expect([[
  247. {1: }^1 {3:│}{1: }1 |
  248. {1: }2 {3:│}{1: }2 |
  249. {1: }3 {3:│}{1: }3 |
  250. {1: }4 {3:│}{1: }4 |
  251. {1: }{2:------------------}{3:│}{1: }{4:4 }|
  252. {1: }5 {3:│}{1: }5 |
  253. {1: }6 {3:│}{1: }6 |
  254. {1: }7 {3:│}{1: }7 |
  255. {1: }8 {3:│}{1: }8 |
  256. {1: }9 {3:│}{1: }9 |
  257. {1: }10 {3:│}{1: }10 |
  258. {1: }{4:11 }{3:│}{1: }{2:-----------------}|
  259. {6:~ }{3:│}{6:~ }|
  260. {6:~ }{3:│}{6:~ }|
  261. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  262. :set diffopt=filler |
  263. ]])
  264. feed(':set diffopt+=internal<cr>')
  265. screen:expect([[
  266. {1: }^1 {3:│}{1: }1 |
  267. {1: }2 {3:│}{1: }2 |
  268. {1: }3 {3:│}{1: }3 |
  269. {1: }4 {3:│}{1: }4 |
  270. {1: }{2:------------------}{3:│}{1: }{4:4 }|
  271. {1: }5 {3:│}{1: }5 |
  272. {1: }6 {3:│}{1: }6 |
  273. {1: }7 {3:│}{1: }7 |
  274. {1: }8 {3:│}{1: }8 |
  275. {1: }9 {3:│}{1: }9 |
  276. {1: }10 {3:│}{1: }10 |
  277. {1: }{4:11 }{3:│}{1: }{2:-----------------}|
  278. {6:~ }{3:│}{6:~ }|
  279. {6:~ }{3:│}{6:~ }|
  280. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  281. :set diffopt+=internal |
  282. ]])
  283. end)
  284. it('Add a line in the middle of file 1, remove on at the end of file 2', function()
  285. write_file(fname, "1\n2\n3\n4\n4\n5\n6\n7\n8\n9\n10\n", false)
  286. write_file(fname_2, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n", false)
  287. reread()
  288. feed(':set diffopt=filler<cr>')
  289. screen:expect([[
  290. {1: }^1 {3:│}{1: }1 |
  291. {1: }2 {3:│}{1: }2 |
  292. {1: }3 {3:│}{1: }3 |
  293. {1: }4 {3:│}{1: }4 |
  294. {1: }{4:4 }{3:│}{1: }{2:-----------------}|
  295. {1: }5 {3:│}{1: }5 |
  296. {1: }6 {3:│}{1: }6 |
  297. {1: }7 {3:│}{1: }7 |
  298. {1: }8 {3:│}{1: }8 |
  299. {1: }9 {3:│}{1: }9 |
  300. {1: }10 {3:│}{1: }10 |
  301. {1: }{2:------------------}{3:│}{1: }{4:11 }|
  302. {6:~ }{3:│}{6:~ }|
  303. {6:~ }{3:│}{6:~ }|
  304. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  305. :set diffopt=filler |
  306. ]])
  307. feed(':set diffopt+=internal<cr>')
  308. screen:expect([[
  309. {1: }^1 {3:│}{1: }1 |
  310. {1: }2 {3:│}{1: }2 |
  311. {1: }3 {3:│}{1: }3 |
  312. {1: }4 {3:│}{1: }4 |
  313. {1: }{4:4 }{3:│}{1: }{2:-----------------}|
  314. {1: }5 {3:│}{1: }5 |
  315. {1: }6 {3:│}{1: }6 |
  316. {1: }7 {3:│}{1: }7 |
  317. {1: }8 {3:│}{1: }8 |
  318. {1: }9 {3:│}{1: }9 |
  319. {1: }10 {3:│}{1: }10 |
  320. {1: }{2:------------------}{3:│}{1: }{4:11 }|
  321. {6:~ }{3:│}{6:~ }|
  322. {6:~ }{3:│}{6:~ }|
  323. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  324. :set diffopt+=internal |
  325. ]])
  326. end)
  327. describe('normal/patience/histogram diff algorithm', function()
  328. setup(function()
  329. local f1 = [[#include <stdio.h>
  330. // Frobs foo heartily
  331. int frobnitz(int foo)
  332. {
  333. int i;
  334. for(i = 0; i < 10; i++)
  335. {
  336. printf("Your answer is: ");
  337. printf("%d\n", foo);
  338. }
  339. }
  340. int fact(int n)
  341. {
  342. if(n > 1)
  343. {
  344. return fact(n-1) * n;
  345. }
  346. return 1;
  347. }
  348. int main(int argc, char **argv)
  349. {
  350. frobnitz(fact(10));
  351. }]]
  352. write_file(fname, f1, false)
  353. local f2 = [[#include <stdio.h>
  354. int fib(int n)
  355. {
  356. if(n > 2)
  357. {
  358. return fib(n-1) + fib(n-2);
  359. }
  360. return 1;
  361. }
  362. // Frobs foo heartily
  363. int frobnitz(int foo)
  364. {
  365. int i;
  366. for(i = 0; i < 10; i++)
  367. {
  368. printf("%d\n", foo);
  369. }
  370. }
  371. int main(int argc, char **argv)
  372. {
  373. frobnitz(fib(10));
  374. }]]
  375. write_file(fname_2, f2, false)
  376. end)
  377. it('diffopt=+algorithm:myers', function()
  378. reread()
  379. feed(':set diffopt=internal,filler<cr>')
  380. screen:expect([[
  381. {1: }^#include <stdio.h>{3:│}{1: }#include <stdio.h|
  382. {1: } {3:│}{1: } |
  383. {1: }{8:// Frobs foo heart}{3:│}{1: }{8:int fib(int n)}{9: }|
  384. {1: }{4:int frobnitz(int f}{3:│}{1: }{2:-----------------}|
  385. {1: }{ {3:│}{1: }{ |
  386. {1: }{9: i}{8:nt i;}{9: }{3:│}{1: }{9: i}{8:f(n > 2)}{9: }|
  387. {1: }{4: for(i = 0; i <}{3:│}{1: }{2:-----------------}|
  388. {1: } { {3:│}{1: } { |
  389. {1: }{9: }{8:printf("Yo}{3:│}{1: }{9: }{8:return fi}|
  390. {1: }{4: printf("%d}{3:│}{1: }{2:-----------------}|
  391. {1: } } {3:│}{1: } } |
  392. {1: }{2:------------------}{3:│}{1: }{4: return 1; }|
  393. {1: }} {3:│}{1: }} |
  394. {1: } {3:│}{1: } |
  395. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  396. :set diffopt=internal,filler |
  397. ]])
  398. feed('G')
  399. screen:expect([[
  400. {1: }{2:------------------}{3:│}{1: }{4:int frobnitz(int }|
  401. {1: }{ {3:│}{1: }{ |
  402. {1: }{9: i}{8:f(n > 1)}{9: }{3:│}{1: }{9: i}{8:nt i;}{9: }|
  403. {1: }{2:------------------}{3:│}{1: }{4: for(i = 0; i }|
  404. {1: } { {3:│}{1: } { |
  405. {1: }{9: }{8:return fac}{3:│}{1: }{9: }{8:printf("%}|
  406. {1: } } {3:│}{1: } } |
  407. {1: }{4: return 1; }{3:│}{1: }{2:-----------------}|
  408. {1: }} {3:│}{1: }} |
  409. {1: } {3:│}{1: } |
  410. {1: }int main(int argc,{3:│}{1: }int main(int argc|
  411. {1: }{ {3:│}{1: }{ |
  412. {1: }{9: frobnitz(f}{8:act}{9:(}{3:│}{1: }{9: frobnitz(f}{8:ib}{9:(}|
  413. {1: }^} {3:│}{1: }} |
  414. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  415. :set diffopt=internal,filler |
  416. ]])
  417. end)
  418. it('diffopt+=algorithm:patience', function()
  419. reread()
  420. feed(':set diffopt=internal,filler,algorithm:patience<cr>')
  421. screen:expect([[
  422. {1: }^#include <stdio.h>{3:│}{1: }#include <stdio.h|
  423. {1: } {3:│}{1: } |
  424. {1: }{2:------------------}{3:│}{1: }{4:int fib(int n) }|
  425. {1: }{2:------------------}{3:│}{1: }{4:{ }|
  426. {1: }{2:------------------}{3:│}{1: }{4: if(n > 2) }|
  427. {1: }{2:------------------}{3:│}{1: }{4: { }|
  428. {1: }{2:------------------}{3:│}{1: }{4: return fi}|
  429. {1: }{2:------------------}{3:│}{1: }{4: } }|
  430. {1: }{2:------------------}{3:│}{1: }{4: return 1; }|
  431. {1: }{2:------------------}{3:│}{1: }{4:} }|
  432. {1: }{2:------------------}{3:│}{1: }{4: }|
  433. {1: }// Frobs foo heart{3:│}{1: }// Frobs foo hear|
  434. {1: }int frobnitz(int f{3:│}{1: }int frobnitz(int |
  435. {1: }{ {3:│}{1: }{ |
  436. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  437. |
  438. ]])
  439. feed('G')
  440. screen:expect([[
  441. {1: } {3:│}{1: } |
  442. {1: }{4:int fact(int n) }{3:│}{1: }{2:-----------------}|
  443. {1: }{4:{ }{3:│}{1: }{2:-----------------}|
  444. {1: }{4: if(n > 1) }{3:│}{1: }{2:-----------------}|
  445. {1: }{4: { }{3:│}{1: }{2:-----------------}|
  446. {1: }{4: return fac}{3:│}{1: }{2:-----------------}|
  447. {1: }{4: } }{3:│}{1: }{2:-----------------}|
  448. {1: }{4: return 1; }{3:│}{1: }{2:-----------------}|
  449. {1: }{4:} }{3:│}{1: }{2:-----------------}|
  450. {1: }{4: }{3:│}{1: }{2:-----------------}|
  451. {1: }int main(int argc,{3:│}{1: }int main(int argc|
  452. {1: }{ {3:│}{1: }{ |
  453. {1: }{9: frobnitz(f}{8:act}{9:(}{3:│}{1: }{9: frobnitz(f}{8:ib}{9:(}|
  454. {1: }^} {3:│}{1: }} |
  455. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  456. |
  457. ]])
  458. end)
  459. it('diffopt+=algorithm:histogram', function()
  460. reread()
  461. feed(':set diffopt=internal,filler,algorithm:histogram<cr>')
  462. screen:expect([[
  463. {1: }^#include <stdio.h>{3:│}{1: }#include <stdio.h|
  464. {1: } {3:│}{1: } |
  465. {1: }{2:------------------}{3:│}{1: }{4:int fib(int n) }|
  466. {1: }{2:------------------}{3:│}{1: }{4:{ }|
  467. {1: }{2:------------------}{3:│}{1: }{4: if(n > 2) }|
  468. {1: }{2:------------------}{3:│}{1: }{4: { }|
  469. {1: }{2:------------------}{3:│}{1: }{4: return fi}|
  470. {1: }{2:------------------}{3:│}{1: }{4: } }|
  471. {1: }{2:------------------}{3:│}{1: }{4: return 1; }|
  472. {1: }{2:------------------}{3:│}{1: }{4:} }|
  473. {1: }{2:------------------}{3:│}{1: }{4: }|
  474. {1: }// Frobs foo heart{3:│}{1: }// Frobs foo hear|
  475. {1: }int frobnitz(int f{3:│}{1: }int frobnitz(int |
  476. {1: }{ {3:│}{1: }{ |
  477. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  478. |
  479. ]])
  480. feed('G')
  481. screen:expect([[
  482. {1: } {3:│}{1: } |
  483. {1: }{4:int fact(int n) }{3:│}{1: }{2:-----------------}|
  484. {1: }{4:{ }{3:│}{1: }{2:-----------------}|
  485. {1: }{4: if(n > 1) }{3:│}{1: }{2:-----------------}|
  486. {1: }{4: { }{3:│}{1: }{2:-----------------}|
  487. {1: }{4: return fac}{3:│}{1: }{2:-----------------}|
  488. {1: }{4: } }{3:│}{1: }{2:-----------------}|
  489. {1: }{4: return 1; }{3:│}{1: }{2:-----------------}|
  490. {1: }{4:} }{3:│}{1: }{2:-----------------}|
  491. {1: }{4: }{3:│}{1: }{2:-----------------}|
  492. {1: }int main(int argc,{3:│}{1: }int main(int argc|
  493. {1: }{ {3:│}{1: }{ |
  494. {1: }{9: frobnitz(f}{8:act}{9:(}{3:│}{1: }{9: frobnitz(f}{8:ib}{9:(}|
  495. {1: }^} {3:│}{1: }} |
  496. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  497. |
  498. ]])
  499. end)
  500. end)
  501. describe('diffopt+=indent-heuristic', function()
  502. setup(function()
  503. local f1 = [[
  504. def finalize(values)
  505. values.each do |v|
  506. v.finalize
  507. end]]
  508. write_file(fname, f1, false)
  509. local f2 = [[
  510. def finalize(values)
  511. values.each do |v|
  512. v.prepare
  513. end
  514. values.each do |v|
  515. v.finalize
  516. end]]
  517. write_file(fname_2, f2, false)
  518. feed(':diffupdate!<cr>')
  519. end)
  520. it('internal', function()
  521. reread()
  522. feed(":set diffopt=internal,filler<cr>")
  523. screen:expect([[
  524. {1: }^def finalize(value{3:│}{1: }def finalize(valu|
  525. {1: } {3:│}{1: } |
  526. {1: } values.each do |{3:│}{1: } values.each do |
  527. {1: }{2:------------------}{3:│}{1: }{4: v.prepare }|
  528. {1: }{2:------------------}{3:│}{1: }{4: end }|
  529. {1: }{2:------------------}{3:│}{1: }{4: }|
  530. {1: }{2:------------------}{3:│}{1: }{4: values.each do }|
  531. {1: } v.finalize {3:│}{1: } v.finalize |
  532. {1: } end {3:│}{1: } end |
  533. {6:~ }{3:│}{6:~ }|
  534. {6:~ }{3:│}{6:~ }|
  535. {6:~ }{3:│}{6:~ }|
  536. {6:~ }{3:│}{6:~ }|
  537. {6:~ }{3:│}{6:~ }|
  538. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  539. :set diffopt=internal,filler |
  540. ]])
  541. end)
  542. it('indent-heuristic', function()
  543. reread()
  544. feed(':set diffopt=internal,filler,indent-heuristic<cr>')
  545. screen:expect([[
  546. {1: }^def finalize(value{3:│}{1: }def finalize(valu|
  547. {1: } {3:│}{1: } |
  548. {1: }{2:------------------}{3:│}{1: }{4: values.each do }|
  549. {1: }{2:------------------}{3:│}{1: }{4: v.prepare }|
  550. {1: }{2:------------------}{3:│}{1: }{4: end }|
  551. {1: }{2:------------------}{3:│}{1: }{4: }|
  552. {1: } values.each do |{3:│}{1: } values.each do |
  553. {1: } v.finalize {3:│}{1: } v.finalize |
  554. {1: } end {3:│}{1: } end |
  555. {6:~ }{3:│}{6:~ }|
  556. {6:~ }{3:│}{6:~ }|
  557. {6:~ }{3:│}{6:~ }|
  558. {6:~ }{3:│}{6:~ }|
  559. {6:~ }{3:│}{6:~ }|
  560. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  561. |
  562. ]])
  563. end)
  564. it('indent-heuristic random order', function()
  565. reread()
  566. feed(':set diffopt=internal,filler,indent-heuristic,algorithm:patience<cr>')
  567. feed(':<cr>')
  568. screen:expect([[
  569. {1: }^def finalize(value{3:│}{1: }def finalize(valu|
  570. {1: } {3:│}{1: } |
  571. {1: }{2:------------------}{3:│}{1: }{4: values.each do }|
  572. {1: }{2:------------------}{3:│}{1: }{4: v.prepare }|
  573. {1: }{2:------------------}{3:│}{1: }{4: end }|
  574. {1: }{2:------------------}{3:│}{1: }{4: }|
  575. {1: } values.each do |{3:│}{1: } values.each do |
  576. {1: } v.finalize {3:│}{1: } v.finalize |
  577. {1: } end {3:│}{1: } end |
  578. {6:~ }{3:│}{6:~ }|
  579. {6:~ }{3:│}{6:~ }|
  580. {6:~ }{3:│}{6:~ }|
  581. {6:~ }{3:│}{6:~ }|
  582. {6:~ }{3:│}{6:~ }|
  583. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  584. : |
  585. ]])
  586. end)
  587. end)
  588. it('Diff the same file', function()
  589. write_file(fname, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", false)
  590. write_file(fname_2, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", false)
  591. reread()
  592. feed(':set diffopt=filler<cr>')
  593. screen:expect([[
  594. {1:+ }{5:^+-- 10 lines: 1···}{3:│}{1:+ }{5:+-- 10 lines: 1··}|
  595. {6:~ }{3:│}{6:~ }|
  596. {6:~ }{3:│}{6:~ }|
  597. {6:~ }{3:│}{6:~ }|
  598. {6:~ }{3:│}{6:~ }|
  599. {6:~ }{3:│}{6:~ }|
  600. {6:~ }{3:│}{6:~ }|
  601. {6:~ }{3:│}{6:~ }|
  602. {6:~ }{3:│}{6:~ }|
  603. {6:~ }{3:│}{6:~ }|
  604. {6:~ }{3:│}{6:~ }|
  605. {6:~ }{3:│}{6:~ }|
  606. {6:~ }{3:│}{6:~ }|
  607. {6:~ }{3:│}{6:~ }|
  608. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  609. :set diffopt=filler |
  610. ]])
  611. feed(':set diffopt+=internal<cr>')
  612. screen:expect([[
  613. {1:+ }{5:^+-- 10 lines: 1···}{3:│}{1:+ }{5:+-- 10 lines: 1··}|
  614. {6:~ }{3:│}{6:~ }|
  615. {6:~ }{3:│}{6:~ }|
  616. {6:~ }{3:│}{6:~ }|
  617. {6:~ }{3:│}{6:~ }|
  618. {6:~ }{3:│}{6:~ }|
  619. {6:~ }{3:│}{6:~ }|
  620. {6:~ }{3:│}{6:~ }|
  621. {6:~ }{3:│}{6:~ }|
  622. {6:~ }{3:│}{6:~ }|
  623. {6:~ }{3:│}{6:~ }|
  624. {6:~ }{3:│}{6:~ }|
  625. {6:~ }{3:│}{6:~ }|
  626. {6:~ }{3:│}{6:~ }|
  627. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  628. :set diffopt+=internal |
  629. ]])
  630. end)
  631. it('Diff an empty file', function()
  632. write_file(fname, "", false)
  633. write_file(fname_2, "", false)
  634. reread()
  635. feed(':set diffopt=filler<cr>')
  636. screen:expect([[
  637. {1:- }^ {3:│}{1:- } |
  638. {6:~ }{3:│}{6:~ }|
  639. {6:~ }{3:│}{6:~ }|
  640. {6:~ }{3:│}{6:~ }|
  641. {6:~ }{3:│}{6:~ }|
  642. {6:~ }{3:│}{6:~ }|
  643. {6:~ }{3:│}{6:~ }|
  644. {6:~ }{3:│}{6:~ }|
  645. {6:~ }{3:│}{6:~ }|
  646. {6:~ }{3:│}{6:~ }|
  647. {6:~ }{3:│}{6:~ }|
  648. {6:~ }{3:│}{6:~ }|
  649. {6:~ }{3:│}{6:~ }|
  650. {6:~ }{3:│}{6:~ }|
  651. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  652. :set diffopt=filler |
  653. ]])
  654. feed(':set diffopt+=internal<cr>')
  655. screen:expect([[
  656. {1:- }^ {3:│}{1:- } |
  657. {6:~ }{3:│}{6:~ }|
  658. {6:~ }{3:│}{6:~ }|
  659. {6:~ }{3:│}{6:~ }|
  660. {6:~ }{3:│}{6:~ }|
  661. {6:~ }{3:│}{6:~ }|
  662. {6:~ }{3:│}{6:~ }|
  663. {6:~ }{3:│}{6:~ }|
  664. {6:~ }{3:│}{6:~ }|
  665. {6:~ }{3:│}{6:~ }|
  666. {6:~ }{3:│}{6:~ }|
  667. {6:~ }{3:│}{6:~ }|
  668. {6:~ }{3:│}{6:~ }|
  669. {6:~ }{3:│}{6:~ }|
  670. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  671. :set diffopt+=internal |
  672. ]])
  673. end)
  674. it('diffopt+=icase', function()
  675. write_file(fname, "a\nb\ncd\n", false)
  676. write_file(fname_2, "A\nb\ncDe\n", false)
  677. reread()
  678. feed(':set diffopt=filler,icase<cr>')
  679. screen:expect([[
  680. {1: }^a {3:│}{1: }A |
  681. {1: }b {3:│}{1: }b |
  682. {1: }{9:cd }{3:│}{1: }{9:cD}{8:e}{9: }|
  683. {6:~ }{3:│}{6:~ }|
  684. {6:~ }{3:│}{6:~ }|
  685. {6:~ }{3:│}{6:~ }|
  686. {6:~ }{3:│}{6:~ }|
  687. {6:~ }{3:│}{6:~ }|
  688. {6:~ }{3:│}{6:~ }|
  689. {6:~ }{3:│}{6:~ }|
  690. {6:~ }{3:│}{6:~ }|
  691. {6:~ }{3:│}{6:~ }|
  692. {6:~ }{3:│}{6:~ }|
  693. {6:~ }{3:│}{6:~ }|
  694. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  695. :set diffopt=filler,icase |
  696. ]])
  697. feed(':set diffopt+=internal<cr>')
  698. screen:expect([[
  699. {1: }^a {3:│}{1: }A |
  700. {1: }b {3:│}{1: }b |
  701. {1: }{9:cd }{3:│}{1: }{9:cD}{8:e}{9: }|
  702. {6:~ }{3:│}{6:~ }|
  703. {6:~ }{3:│}{6:~ }|
  704. {6:~ }{3:│}{6:~ }|
  705. {6:~ }{3:│}{6:~ }|
  706. {6:~ }{3:│}{6:~ }|
  707. {6:~ }{3:│}{6:~ }|
  708. {6:~ }{3:│}{6:~ }|
  709. {6:~ }{3:│}{6:~ }|
  710. {6:~ }{3:│}{6:~ }|
  711. {6:~ }{3:│}{6:~ }|
  712. {6:~ }{3:│}{6:~ }|
  713. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  714. :set diffopt+=internal |
  715. ]])
  716. end)
  717. describe('diffopt+=iwhite', function()
  718. setup(function()
  719. local f1 = 'int main()\n{\n printf("Hello, World!");\n return 0;\n}\n'
  720. write_file(fname, f1, false)
  721. local f2 = 'int main()\n{\n if (0)\n {\n printf("Hello, World!");\n return 0;\n }\n}\n'
  722. write_file(fname_2, f2, false)
  723. feed(':diffupdate!<cr>')
  724. end)
  725. it('external', function()
  726. reread()
  727. feed(':set diffopt=filler,iwhite<cr>')
  728. screen:expect([[
  729. {1: }^int main() {3:│}{1: }int main() |
  730. {1: }{ {3:│}{1: }{ |
  731. {1: }{2:------------------}{3:│}{1: }{4: if (0) }|
  732. {1: }{2:------------------}{3:│}{1: }{4: { }|
  733. {1: } printf("Hello, {3:│}{1: } printf("Hel|
  734. {1: } return 0; {3:│}{1: } return 0; |
  735. {1: }{2:------------------}{3:│}{1: }{4: } }|
  736. {1: }} {3:│}{1: }} |
  737. {6:~ }{3:│}{6:~ }|
  738. {6:~ }{3:│}{6:~ }|
  739. {6:~ }{3:│}{6:~ }|
  740. {6:~ }{3:│}{6:~ }|
  741. {6:~ }{3:│}{6:~ }|
  742. {6:~ }{3:│}{6:~ }|
  743. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  744. :set diffopt=filler,iwhite |
  745. ]])
  746. end)
  747. it('internal', function()
  748. reread()
  749. feed(':set diffopt=filler,iwhite,internal<cr>')
  750. screen:expect([[
  751. {1: }^int main() {3:│}{1: }int main() |
  752. {1: }{ {3:│}{1: }{ |
  753. {1: }{2:------------------}{3:│}{1: }{4: if (0) }|
  754. {1: }{2:------------------}{3:│}{1: }{4: { }|
  755. {1: } printf("Hello, {3:│}{1: } printf("Hel|
  756. {1: } return 0; {3:│}{1: } return 0; |
  757. {1: }{2:------------------}{3:│}{1: }{4: } }|
  758. {1: }} {3:│}{1: }} |
  759. {6:~ }{3:│}{6:~ }|
  760. {6:~ }{3:│}{6:~ }|
  761. {6:~ }{3:│}{6:~ }|
  762. {6:~ }{3:│}{6:~ }|
  763. {6:~ }{3:│}{6:~ }|
  764. {6:~ }{3:│}{6:~ }|
  765. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  766. :set diffopt=filler,iwhite,internal |
  767. ]])
  768. end)
  769. end)
  770. describe('diffopt+=iblank', function()
  771. setup(function()
  772. write_file(fname, 'a\n\n \ncd\nef\nxxx\n', false)
  773. write_file(fname_2, 'a\ncd\n\nef\nyyy\n', false)
  774. feed(':diffupdate!<cr>')
  775. end)
  776. it('generic', function()
  777. reread()
  778. feed(':set diffopt=internal,filler,iblank<cr>')
  779. screen:expect([[
  780. {1: }^a {3:│}{1: }a |
  781. {1: }{4: }{3:│}{1: }{2:-----------------}|
  782. {1: }{4: }{3:│}{1: }{2:-----------------}|
  783. {1: }cd {3:│}{1: }cd |
  784. {1: }ef {3:│}{1: } |
  785. {1: }{8:xxx}{9: }{3:│}{1: }ef |
  786. {6:~ }{3:│}{1: }{8:yyy}{9: }|
  787. {6:~ }{3:│}{6:~ }|
  788. {6:~ }{3:│}{6:~ }|
  789. {6:~ }{3:│}{6:~ }|
  790. {6:~ }{3:│}{6:~ }|
  791. {6:~ }{3:│}{6:~ }|
  792. {6:~ }{3:│}{6:~ }|
  793. {6:~ }{3:│}{6:~ }|
  794. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  795. :set diffopt=internal,filler,iblank |
  796. ]])
  797. end)
  798. it('diffopt+=iwhite', function()
  799. reread()
  800. feed(':set diffopt=internal,filler,iblank,iwhite<cr>')
  801. feed(':<cr>')
  802. screen:expect([[
  803. {1: }^a {3:│}{1: }a |
  804. {1: } {3:│}{1: }cd |
  805. {1: } {3:│}{1: } |
  806. {1: }cd {3:│}{1: }ef |
  807. {1: }ef {3:│}{1: }{8:yyy}{9: }|
  808. {1: }{8:xxx}{9: }{3:│}{6:~ }|
  809. {6:~ }{3:│}{6:~ }|
  810. {6:~ }{3:│}{6:~ }|
  811. {6:~ }{3:│}{6:~ }|
  812. {6:~ }{3:│}{6:~ }|
  813. {6:~ }{3:│}{6:~ }|
  814. {6:~ }{3:│}{6:~ }|
  815. {6:~ }{3:│}{6:~ }|
  816. {6:~ }{3:│}{6:~ }|
  817. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  818. : |
  819. ]])
  820. end)
  821. it('diffopt+=iwhiteall', function()
  822. reread()
  823. feed(':set diffopt=internal,filler,iblank,iwhiteall<cr>')
  824. feed(':<cr>')
  825. screen:expect([[
  826. {1: }^a {3:│}{1: }a |
  827. {1: } {3:│}{1: }cd |
  828. {1: } {3:│}{1: } |
  829. {1: }cd {3:│}{1: }ef |
  830. {1: }ef {3:│}{1: }{8:yyy}{9: }|
  831. {1: }{8:xxx}{9: }{3:│}{6:~ }|
  832. {6:~ }{3:│}{6:~ }|
  833. {6:~ }{3:│}{6:~ }|
  834. {6:~ }{3:│}{6:~ }|
  835. {6:~ }{3:│}{6:~ }|
  836. {6:~ }{3:│}{6:~ }|
  837. {6:~ }{3:│}{6:~ }|
  838. {6:~ }{3:│}{6:~ }|
  839. {6:~ }{3:│}{6:~ }|
  840. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  841. : |
  842. ]])
  843. end)
  844. it('diffopt+=iwhiteeol', function()
  845. reread()
  846. feed(':set diffopt=internal,filler,iblank,iwhiteeol<cr>')
  847. feed(':<cr>')
  848. screen:expect([[
  849. {1: }^a {3:│}{1: }a |
  850. {1: } {3:│}{1: }cd |
  851. {1: } {3:│}{1: } |
  852. {1: }cd {3:│}{1: }ef |
  853. {1: }ef {3:│}{1: }{8:yyy}{9: }|
  854. {1: }{8:xxx}{9: }{3:│}{6:~ }|
  855. {6:~ }{3:│}{6:~ }|
  856. {6:~ }{3:│}{6:~ }|
  857. {6:~ }{3:│}{6:~ }|
  858. {6:~ }{3:│}{6:~ }|
  859. {6:~ }{3:│}{6:~ }|
  860. {6:~ }{3:│}{6:~ }|
  861. {6:~ }{3:│}{6:~ }|
  862. {6:~ }{3:│}{6:~ }|
  863. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  864. : |
  865. ]])
  866. end)
  867. end)
  868. describe('diffopt+=iwhite{eol,all}', function()
  869. setup(function()
  870. write_file(fname, 'a \nx\ncd\nef\nxx xx\nfoo\nbar\n', false)
  871. write_file(fname_2, 'a\nx\nc d\n ef\nxx xx\nfoo\n\nbar\n', false)
  872. feed(':diffupdate!<cr>')
  873. end)
  874. it('diffopt+=iwhiteeol', function()
  875. reread()
  876. feed(':set diffopt=internal,filler,iwhiteeol<cr>')
  877. feed(':<cr>')
  878. screen:expect([[
  879. {1: }^a {3:│}{1: }a |
  880. {1: }x {3:│}{1: }x |
  881. {1: }{9:cd }{3:│}{1: }{9:c}{8: }{9:d }|
  882. {1: }{9:ef }{3:│}{1: }{8: }{9:ef }|
  883. {1: }{9:xx }{8: }{9:xx }{3:│}{1: }{9:xx xx }|
  884. {1: }foo {3:│}{1: }foo |
  885. {1: }{2:------------------}{3:│}{1: }{4: }|
  886. {1: }bar {3:│}{1: }bar |
  887. {6:~ }{3:│}{6:~ }|
  888. {6:~ }{3:│}{6:~ }|
  889. {6:~ }{3:│}{6:~ }|
  890. {6:~ }{3:│}{6:~ }|
  891. {6:~ }{3:│}{6:~ }|
  892. {6:~ }{3:│}{6:~ }|
  893. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  894. : |
  895. ]])
  896. end)
  897. it('diffopt+=iwhiteall', function()
  898. reread()
  899. feed(':set diffopt=internal,filler,iwhiteall<cr>')
  900. feed(':<cr>')
  901. screen:expect([[
  902. {1: }^a {3:│}{1: }a |
  903. {1: }x {3:│}{1: }x |
  904. {1: }cd {3:│}{1: }c d |
  905. {1: }ef {3:│}{1: } ef |
  906. {1: }xx xx {3:│}{1: }xx xx |
  907. {1: }foo {3:│}{1: }foo |
  908. {1: }{2:------------------}{3:│}{1: }{4: }|
  909. {1: }bar {3:│}{1: }bar |
  910. {6:~ }{3:│}{6:~ }|
  911. {6:~ }{3:│}{6:~ }|
  912. {6:~ }{3:│}{6:~ }|
  913. {6:~ }{3:│}{6:~ }|
  914. {6:~ }{3:│}{6:~ }|
  915. {6:~ }{3:│}{6:~ }|
  916. {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
  917. : |
  918. ]])
  919. end)
  920. end)
  921. end)
  922. it('win_update redraws lines properly', function()
  923. local screen
  924. clear()
  925. screen = Screen.new(50, 10)
  926. screen:attach()
  927. screen:set_default_attr_ids({
  928. [1] = {bold = true, foreground = Screen.colors.Blue1},
  929. [2] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
  930. [3] = {background = Screen.colors.Red, foreground = Screen.colors.Grey100, special = Screen.colors.Yellow},
  931. [4] = {bold = true, foreground = Screen.colors.SeaGreen4},
  932. [5] = {special = Screen.colors.Yellow},
  933. [6] = {special = Screen.colors.Yellow, bold = true, foreground = Screen.colors.SeaGreen4},
  934. [7] = {foreground = Screen.colors.Grey0, background = Screen.colors.Grey100},
  935. [8] = {foreground = Screen.colors.Gray90, background = Screen.colors.Grey100},
  936. [9] = {foreground = tonumber('0x00000c'), background = Screen.colors.Grey100},
  937. [10] = {background = Screen.colors.Grey100, bold = true, foreground = tonumber('0xe5e5ff')},
  938. [11] = {background = Screen.colors.Grey100, bold = true, foreground = tonumber('0x2b8452')},
  939. [12] = {bold = true, reverse = true},
  940. [13] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.WebGray},
  941. [14] = {reverse = true},
  942. [15] = {background = Screen.colors.LightBlue},
  943. [16] = {background = Screen.colors.LightCyan1, bold = true, foreground = Screen.colors.Blue1},
  944. [17] = {bold = true, background = Screen.colors.Red},
  945. [18] = {background = Screen.colors.LightMagenta},
  946. })
  947. insert([[
  948. 1
  949. 2
  950. 1a
  951. ]])
  952. command("vnew left")
  953. insert([[
  954. 2
  955. 2a
  956. 2b
  957. ]])
  958. command("windo diffthis")
  959. command("windo 1")
  960. screen:expect{grid=[[
  961. {13: }{16:-----------------------}{14:│}{13: }{15:^1 }|
  962. {13: }{16:-----------------------}{14:│}{13: }{15: }|
  963. {13: }{16:-----------------------}{14:│}{13: }{15: }|
  964. {13: }2 {14:│}{13: }2 |
  965. {13: }{17:2}{18:a }{14:│}{13: }{17:1}{18:a }|
  966. {13: }{15:2b }{14:│}{13: }{16:----------------------}|
  967. {13: } {14:│}{13: } |
  968. {1:~ }{14:│}{1:~ }|
  969. {14:left [+] }{12:[No Name] [+] }|
  970. |
  971. ]]}
  972. feed('<C-e>')
  973. feed('<C-e>')
  974. feed('<C-y>')
  975. feed('<C-y>')
  976. feed('<C-y>')
  977. screen:expect{grid=[[
  978. {13: }{16:-----------------------}{14:│}{13: }{15:1 }|
  979. {13: }{16:-----------------------}{14:│}{13: }{15: }|
  980. {13: }{16:-----------------------}{14:│}{13: }{15:^ }|
  981. {13: }2 {14:│}{13: }2 |
  982. {13: }{17:2}{18:a }{14:│}{13: }{17:1}{18:a }|
  983. {13: }{15:2b }{14:│}{13: }{16:----------------------}|
  984. {13: } {14:│}{13: } |
  985. {1:~ }{14:│}{1:~ }|
  986. {14:left [+] }{12:[No Name] [+] }|
  987. |
  988. ]]}
  989. end)
  990. it('diff updates line numbers below filler lines', function()
  991. clear()
  992. local screen = Screen.new(40, 14)
  993. screen:attach()
  994. screen:set_default_attr_ids({
  995. [1] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.WebGray},
  996. [2] = {background = Screen.colors.LightCyan1, bold = true, foreground = Screen.colors.Blue1},
  997. [3] = {reverse = true},
  998. [4] = {background = Screen.colors.LightBlue},
  999. [5] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.LightGrey},
  1000. [6] = {bold = true, foreground = Screen.colors.Blue1},
  1001. [7] = {bold = true, reverse = true},
  1002. [8] = {bold = true, background = Screen.colors.Red},
  1003. [9] = {background = Screen.colors.LightMagenta},
  1004. [10] = {bold = true, foreground = Screen.colors.Brown},
  1005. [11] = {foreground = Screen.colors.Brown},
  1006. })
  1007. exec([[
  1008. call setline(1, ['a', 'a', 'a', 'y', 'b', 'b', 'b', 'b', 'b'])
  1009. vnew
  1010. call setline(1, ['a', 'a', 'a', 'x', 'x', 'x', 'b', 'b', 'b', 'b', 'b'])
  1011. windo diffthis
  1012. setlocal number rnu cursorline cursorlineopt=number foldcolumn=0
  1013. ]])
  1014. screen:expect([[
  1015. {1: }a {3:│}{10:1 }^a |
  1016. {1: }a {3:│}{11: 1 }a |
  1017. {1: }a {3:│}{11: 2 }a |
  1018. {1: }{8:x}{9: }{3:│}{11: 3 }{8:y}{9: }|
  1019. {1: }{4:x }{3:│}{11: }{2:----------------}|
  1020. {1: }{4:x }{3:│}{11: }{2:----------------}|
  1021. {1: }b {3:│}{11: 4 }b |
  1022. {1: }b {3:│}{11: 5 }b |
  1023. {1: }b {3:│}{11: 6 }b |
  1024. {1: }b {3:│}{11: 7 }b |
  1025. {1: }b {3:│}{11: 8 }b |
  1026. {6:~ }{3:│}{6:~ }|
  1027. {3:[No Name] [+] }{7:[No Name] [+] }|
  1028. |
  1029. ]])
  1030. feed('j')
  1031. screen:expect([[
  1032. {1: }a {3:│}{11: 1 }a |
  1033. {1: }a {3:│}{10:2 }^a |
  1034. {1: }a {3:│}{11: 1 }a |
  1035. {1: }{8:x}{9: }{3:│}{11: 2 }{8:y}{9: }|
  1036. {1: }{4:x }{3:│}{11: }{2:----------------}|
  1037. {1: }{4:x }{3:│}{11: }{2:----------------}|
  1038. {1: }b {3:│}{11: 3 }b |
  1039. {1: }b {3:│}{11: 4 }b |
  1040. {1: }b {3:│}{11: 5 }b |
  1041. {1: }b {3:│}{11: 6 }b |
  1042. {1: }b {3:│}{11: 7 }b |
  1043. {6:~ }{3:│}{6:~ }|
  1044. {3:[No Name] [+] }{7:[No Name] [+] }|
  1045. |
  1046. ]])
  1047. feed('j')
  1048. screen:expect([[
  1049. {1: }a {3:│}{11: 2 }a |
  1050. {1: }a {3:│}{11: 1 }a |
  1051. {1: }a {3:│}{10:3 }^a |
  1052. {1: }{8:x}{9: }{3:│}{11: 1 }{8:y}{9: }|
  1053. {1: }{4:x }{3:│}{11: }{2:----------------}|
  1054. {1: }{4:x }{3:│}{11: }{2:----------------}|
  1055. {1: }b {3:│}{11: 2 }b |
  1056. {1: }b {3:│}{11: 3 }b |
  1057. {1: }b {3:│}{11: 4 }b |
  1058. {1: }b {3:│}{11: 5 }b |
  1059. {1: }b {3:│}{11: 6 }b |
  1060. {6:~ }{3:│}{6:~ }|
  1061. {3:[No Name] [+] }{7:[No Name] [+] }|
  1062. |
  1063. ]])
  1064. end)
  1065. it('Align the filler lines when changing text in diff mode', function()
  1066. clear()
  1067. local screen = Screen.new(40, 20)
  1068. screen:attach()
  1069. screen:set_default_attr_ids({
  1070. [1] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.Gray};
  1071. [2] = {background = Screen.colors.LightCyan, foreground = Screen.colors.Blue1, bold = true};
  1072. [3] = {reverse = true};
  1073. [4] = {background = Screen.colors.LightBlue};
  1074. [5] = {background = Screen.colors.LightMagenta};
  1075. [6] = {background = Screen.colors.Red, bold = true};
  1076. [7] = {foreground = Screen.colors.Blue1, bold = true};
  1077. [8] = {reverse = true, bold = true};
  1078. })
  1079. exec([[
  1080. call setline(1, range(1, 15))
  1081. vnew
  1082. call setline(1, range(9, 15))
  1083. windo diffthis
  1084. wincmd h
  1085. exe "normal Gl5\<C-E>"
  1086. ]])
  1087. screen:expect{grid=[[
  1088. {1: }{2:------------------}{3:│}{1: }{4:6 }|
  1089. {1: }{2:------------------}{3:│}{1: }{4:7 }|
  1090. {1: }{2:------------------}{3:│}{1: }{4:8 }|
  1091. {1: }9 {3:│}{1: }9 |
  1092. {1: }10 {3:│}{1: }10 |
  1093. {1: }11 {3:│}{1: }11 |
  1094. {1: }12 {3:│}{1: }12 |
  1095. {1: }13 {3:│}{1: }13 |
  1096. {1: }14 {3:│}{1: }14 |
  1097. {1:- }1^5 {3:│}{1:- }15 |
  1098. {7:~ }{3:│}{7:~ }|
  1099. {7:~ }{3:│}{7:~ }|
  1100. {7:~ }{3:│}{7:~ }|
  1101. {7:~ }{3:│}{7:~ }|
  1102. {7:~ }{3:│}{7:~ }|
  1103. {7:~ }{3:│}{7:~ }|
  1104. {7:~ }{3:│}{7:~ }|
  1105. {7:~ }{3:│}{7:~ }|
  1106. {8:[No Name] [+] }{3:[No Name] [+] }|
  1107. |
  1108. ]]}
  1109. feed('ax<Esc>')
  1110. screen:expect{grid=[[
  1111. {1: }{2:------------------}{3:│}{1: }{4:6 }|
  1112. {1: }{2:------------------}{3:│}{1: }{4:7 }|
  1113. {1: }{2:------------------}{3:│}{1: }{4:8 }|
  1114. {1: }9 {3:│}{1: }9 |
  1115. {1: }10 {3:│}{1: }10 |
  1116. {1: }11 {3:│}{1: }11 |
  1117. {1: }12 {3:│}{1: }12 |
  1118. {1: }13 {3:│}{1: }13 |
  1119. {1: }14 {3:│}{1: }14 |
  1120. {1: }{5:15}{6:^x}{5: }{3:│}{1: }{5:15 }|
  1121. {7:~ }{3:│}{7:~ }|
  1122. {7:~ }{3:│}{7:~ }|
  1123. {7:~ }{3:│}{7:~ }|
  1124. {7:~ }{3:│}{7:~ }|
  1125. {7:~ }{3:│}{7:~ }|
  1126. {7:~ }{3:│}{7:~ }|
  1127. {7:~ }{3:│}{7:~ }|
  1128. {7:~ }{3:│}{7:~ }|
  1129. {8:[No Name] [+] }{3:[No Name] [+] }|
  1130. |
  1131. ]]}
  1132. feed('<C-W>lay<Esc>')
  1133. screen:expect{grid=[[
  1134. {1: }{2:-----------------}{3:│}{1: }{4:6 }|
  1135. {1: }{2:-----------------}{3:│}{1: }{4:7 }|
  1136. {1: }{2:-----------------}{3:│}{1: }{4:8 }|
  1137. {1: }9 {3:│}{1: }9 |
  1138. {1: }10 {3:│}{1: }10 |
  1139. {1: }11 {3:│}{1: }11 |
  1140. {1: }12 {3:│}{1: }12 |
  1141. {1: }13 {3:│}{1: }13 |
  1142. {1: }14 {3:│}{1: }14 |
  1143. {1: }{5:15}{6:x}{5: }{3:│}{1: }{5:15}{6:^y}{5: }|
  1144. {7:~ }{3:│}{7:~ }|
  1145. {7:~ }{3:│}{7:~ }|
  1146. {7:~ }{3:│}{7:~ }|
  1147. {7:~ }{3:│}{7:~ }|
  1148. {7:~ }{3:│}{7:~ }|
  1149. {7:~ }{3:│}{7:~ }|
  1150. {7:~ }{3:│}{7:~ }|
  1151. {7:~ }{3:│}{7:~ }|
  1152. {3:[No Name] [+] }{8:[No Name] [+] }|
  1153. |
  1154. ]]}
  1155. end)
  1156. it('diff mode works properly if file contains NUL bytes vim-patch:8.2.3925', function()
  1157. clear()
  1158. local screen = Screen.new(40, 20)
  1159. screen:set_default_attr_ids({
  1160. [1] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.Gray};
  1161. [2] = {reverse = true};
  1162. [3] = {background = Screen.colors.LightBlue};
  1163. [4] = {background = Screen.colors.LightMagenta};
  1164. [5] = {background = Screen.colors.Red, bold = true};
  1165. [6] = {foreground = Screen.colors.Blue, bold = true};
  1166. [7] = {background = Screen.colors.Red, foreground = Screen.colors.Blue, bold = true};
  1167. [8] = {reverse = true, bold = true};
  1168. })
  1169. screen:attach()
  1170. exec([[
  1171. call setline(1, ['a', 'b', "c\n", 'd', 'e', 'f', 'g'])
  1172. vnew
  1173. call setline(1, ['A', 'b', 'c', 'd', 'E', 'f', 'g'])
  1174. windo diffthis
  1175. wincmd p
  1176. norm! gg0
  1177. redraw!
  1178. ]])
  1179. -- Test using internal diff
  1180. screen:expect([[
  1181. {1: }{5:^A}{4: }{2:│}{1: }{5:a}{4: }|
  1182. {1: }b {2:│}{1: }b |
  1183. {1: }{4:c }{2:│}{1: }{4:c}{7:^@}{4: }|
  1184. {1: }d {2:│}{1: }d |
  1185. {1: }{5:E}{4: }{2:│}{1: }{5:e}{4: }|
  1186. {1: }f {2:│}{1: }f |
  1187. {1: }g {2:│}{1: }g |
  1188. {6:~ }{2:│}{6:~ }|
  1189. {6:~ }{2:│}{6:~ }|
  1190. {6:~ }{2:│}{6:~ }|
  1191. {6:~ }{2:│}{6:~ }|
  1192. {6:~ }{2:│}{6:~ }|
  1193. {6:~ }{2:│}{6:~ }|
  1194. {6:~ }{2:│}{6:~ }|
  1195. {6:~ }{2:│}{6:~ }|
  1196. {6:~ }{2:│}{6:~ }|
  1197. {6:~ }{2:│}{6:~ }|
  1198. {6:~ }{2:│}{6:~ }|
  1199. {8:[No Name] [+] }{2:[No Name] [+] }|
  1200. |
  1201. ]])
  1202. -- Test using internal diff and case folding
  1203. command('set diffopt+=icase')
  1204. feed('<C-L>')
  1205. screen:expect([[
  1206. {1: }^A {2:│}{1: }a |
  1207. {1: }b {2:│}{1: }b |
  1208. {1: }{4:c }{2:│}{1: }{4:c}{7:^@}{4: }|
  1209. {1: }d {2:│}{1: }d |
  1210. {1: }E {2:│}{1: }e |
  1211. {1: }f {2:│}{1: }f |
  1212. {1: }g {2:│}{1: }g |
  1213. {6:~ }{2:│}{6:~ }|
  1214. {6:~ }{2:│}{6:~ }|
  1215. {6:~ }{2:│}{6:~ }|
  1216. {6:~ }{2:│}{6:~ }|
  1217. {6:~ }{2:│}{6:~ }|
  1218. {6:~ }{2:│}{6:~ }|
  1219. {6:~ }{2:│}{6:~ }|
  1220. {6:~ }{2:│}{6:~ }|
  1221. {6:~ }{2:│}{6:~ }|
  1222. {6:~ }{2:│}{6:~ }|
  1223. {6:~ }{2:│}{6:~ }|
  1224. {8:[No Name] [+] }{2:[No Name] [+] }|
  1225. |
  1226. ]])
  1227. -- Test using external diff
  1228. command('set diffopt=filler')
  1229. feed('<C-L>')
  1230. screen:expect([[
  1231. {1: }{5:^A}{4: }{2:│}{1: }{5:a}{4: }|
  1232. {1: }b {2:│}{1: }b |
  1233. {1: }{4:c }{2:│}{1: }{4:c}{7:^@}{4: }|
  1234. {1: }d {2:│}{1: }d |
  1235. {1: }{5:E}{4: }{2:│}{1: }{5:e}{4: }|
  1236. {1: }f {2:│}{1: }f |
  1237. {1: }g {2:│}{1: }g |
  1238. {6:~ }{2:│}{6:~ }|
  1239. {6:~ }{2:│}{6:~ }|
  1240. {6:~ }{2:│}{6:~ }|
  1241. {6:~ }{2:│}{6:~ }|
  1242. {6:~ }{2:│}{6:~ }|
  1243. {6:~ }{2:│}{6:~ }|
  1244. {6:~ }{2:│}{6:~ }|
  1245. {6:~ }{2:│}{6:~ }|
  1246. {6:~ }{2:│}{6:~ }|
  1247. {6:~ }{2:│}{6:~ }|
  1248. {6:~ }{2:│}{6:~ }|
  1249. {8:[No Name] [+] }{2:[No Name] [+] }|
  1250. |
  1251. ]])
  1252. -- Test using external diff and case folding
  1253. command('set diffopt+=filler,icase')
  1254. feed('<C-L>')
  1255. screen:expect([[
  1256. {1: }^A {2:│}{1: }a |
  1257. {1: }b {2:│}{1: }b |
  1258. {1: }{4:c }{2:│}{1: }{4:c}{7:^@}{4: }|
  1259. {1: }d {2:│}{1: }d |
  1260. {1: }E {2:│}{1: }e |
  1261. {1: }f {2:│}{1: }f |
  1262. {1: }g {2:│}{1: }g |
  1263. {6:~ }{2:│}{6:~ }|
  1264. {6:~ }{2:│}{6:~ }|
  1265. {6:~ }{2:│}{6:~ }|
  1266. {6:~ }{2:│}{6:~ }|
  1267. {6:~ }{2:│}{6:~ }|
  1268. {6:~ }{2:│}{6:~ }|
  1269. {6:~ }{2:│}{6:~ }|
  1270. {6:~ }{2:│}{6:~ }|
  1271. {6:~ }{2:│}{6:~ }|
  1272. {6:~ }{2:│}{6:~ }|
  1273. {6:~ }{2:│}{6:~ }|
  1274. {8:[No Name] [+] }{2:[No Name] [+] }|
  1275. |
  1276. ]])
  1277. end)