menu_spec.lua 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644
  1. local helpers = require('test.functional.helpers')(after_each)
  2. local clear, command, nvim = helpers.clear, helpers.command, helpers.nvim
  3. local expect, feed = helpers.expect, helpers.feed
  4. local eq, eval = helpers.eq, helpers.eval
  5. local funcs = helpers.funcs
  6. describe(':emenu', function()
  7. before_each(function()
  8. clear()
  9. command('nnoremenu Test.Test inormal<ESC>')
  10. command('inoremenu Test.Test insert')
  11. command('vnoremenu Test.Test x')
  12. command('cnoremenu Test.Test cmdmode')
  13. command('nnoremenu Edit.Paste p')
  14. command('cnoremenu Edit.Paste <C-R>"')
  15. end)
  16. it('executes correct bindings in normal mode without using API', function()
  17. command('emenu Test.Test')
  18. expect('normal')
  19. end)
  20. it('executes correct bindings in normal mode', function()
  21. command('emenu Test.Test')
  22. expect('normal')
  23. end)
  24. it('executes correct bindings in insert mode', function()
  25. feed('i')
  26. command('emenu Test.Test')
  27. expect('insert')
  28. end)
  29. it('executes correct bindings in visual mode', function()
  30. feed('iabcde<ESC>0lvll')
  31. command('emenu Test.Test')
  32. expect('ae')
  33. end)
  34. it('executes correct bindings in command mode', function()
  35. feed('ithis is a sentence<esc>^yiwo<esc>')
  36. -- Invoke "Edit.Paste" in normal-mode.
  37. nvim('command', 'emenu Edit.Paste')
  38. -- Invoke "Edit.Paste" and "Test.Test" in command-mode.
  39. feed(':')
  40. nvim('command', 'emenu Edit.Paste')
  41. nvim('command', 'emenu Test.Test')
  42. expect([[
  43. this is a sentence
  44. this]])
  45. -- Assert that Edit.Paste pasted @" into the commandline.
  46. eq('thiscmdmode', eval('getcmdline()'))
  47. end)
  48. end)
  49. describe('menu_get', function()
  50. before_each(function()
  51. clear()
  52. command([=[
  53. aunmenu *
  54. nnoremenu &Test.Test inormal<ESC>
  55. inoremenu Test.Test insert
  56. vnoremenu Test.Test x
  57. cnoremenu Test.Test cmdmode
  58. menu Test.Nested.test level1
  59. menu Test.Nested.Nested2 level2
  60. nnoremenu <script> Export.Script p
  61. tmenu Export.Script This is the tooltip
  62. menu ]Export.hidden thisoneshouldbehidden
  63. nnoremenu Edit.Paste p
  64. cnoremenu Edit.Paste <C-R>"
  65. ]=])
  66. end)
  67. it("path='', modes='a'", function()
  68. local m = funcs.menu_get("","a");
  69. -- HINT: To print the expected table and regenerate the tests:
  70. -- print(require('vim.inspect')(m))
  71. local expected = {
  72. {
  73. shortcut = "T",
  74. hidden = 0,
  75. submenus = {
  76. {
  77. mappings = {
  78. i = {
  79. sid = 1,
  80. noremap = 1,
  81. enabled = 1,
  82. rhs = "insert",
  83. silent = 0
  84. },
  85. s = {
  86. sid = 1,
  87. noremap = 1,
  88. enabled = 1,
  89. rhs = "x",
  90. silent = 0
  91. },
  92. n = {
  93. sid = 1,
  94. noremap = 1,
  95. enabled = 1,
  96. rhs = "inormal<Esc>",
  97. silent = 0
  98. },
  99. v = {
  100. sid = 1,
  101. noremap = 1,
  102. enabled = 1,
  103. rhs = "x",
  104. silent = 0
  105. },
  106. c = {
  107. sid = 1,
  108. noremap = 1,
  109. enabled = 1,
  110. rhs = "cmdmode",
  111. silent = 0
  112. }
  113. },
  114. priority = 500,
  115. name = "Test",
  116. hidden = 0
  117. },
  118. {
  119. priority = 500,
  120. name = "Nested",
  121. submenus = {
  122. {
  123. mappings = {
  124. o = {
  125. sid = 0,
  126. noremap = 0,
  127. enabled = 1,
  128. rhs = "level1",
  129. silent = 0
  130. },
  131. v = {
  132. sid = 0,
  133. noremap = 0,
  134. enabled = 1,
  135. rhs = "level1",
  136. silent = 0
  137. },
  138. s = {
  139. sid = 0,
  140. noremap = 0,
  141. enabled = 1,
  142. rhs = "level1",
  143. silent = 0
  144. },
  145. n = {
  146. sid = 0,
  147. noremap = 0,
  148. enabled = 1,
  149. rhs = "level1",
  150. silent = 0
  151. }
  152. },
  153. priority = 500,
  154. name = "test",
  155. hidden = 0
  156. },
  157. {
  158. mappings = {
  159. o = {
  160. sid = 0,
  161. noremap = 0,
  162. enabled = 1,
  163. rhs = "level2",
  164. silent = 0
  165. },
  166. v = {
  167. sid = 0,
  168. noremap = 0,
  169. enabled = 1,
  170. rhs = "level2",
  171. silent = 0
  172. },
  173. s = {
  174. sid = 0,
  175. noremap = 0,
  176. enabled = 1,
  177. rhs = "level2",
  178. silent = 0
  179. },
  180. n = {
  181. sid = 0,
  182. noremap = 0,
  183. enabled = 1,
  184. rhs = "level2",
  185. silent = 0
  186. }
  187. },
  188. priority = 500,
  189. name = "Nested2",
  190. hidden = 0
  191. }
  192. },
  193. hidden = 0
  194. }
  195. },
  196. priority = 500,
  197. name = "Test"
  198. },
  199. {
  200. priority = 500,
  201. name = "Export",
  202. submenus = {
  203. {
  204. tooltip = "This is the tooltip",
  205. hidden = 0,
  206. name = "Script",
  207. priority = 500,
  208. mappings = {
  209. n = {
  210. sid = 1,
  211. noremap = 1,
  212. enabled = 1,
  213. rhs = "p",
  214. silent = 0
  215. }
  216. }
  217. }
  218. },
  219. hidden = 0
  220. },
  221. {
  222. priority = 500,
  223. name = "Edit",
  224. submenus = {
  225. {
  226. mappings = {
  227. c = {
  228. sid = 1,
  229. noremap = 1,
  230. enabled = 1,
  231. rhs = "<C-R>\"",
  232. silent = 0
  233. },
  234. n = {
  235. sid = 1,
  236. noremap = 1,
  237. enabled = 1,
  238. rhs = "p",
  239. silent = 0
  240. }
  241. },
  242. priority = 500,
  243. name = "Paste",
  244. hidden = 0
  245. }
  246. },
  247. hidden = 0
  248. },
  249. {
  250. priority = 500,
  251. name = "]Export",
  252. submenus = {
  253. {
  254. mappings = {
  255. o = {
  256. sid = 0,
  257. noremap = 0,
  258. enabled = 1,
  259. rhs = "thisoneshouldbehidden",
  260. silent = 0
  261. },
  262. v = {
  263. sid = 0,
  264. noremap = 0,
  265. enabled = 1,
  266. rhs = "thisoneshouldbehidden",
  267. silent = 0
  268. },
  269. s = {
  270. sid = 0,
  271. noremap = 0,
  272. enabled = 1,
  273. rhs = "thisoneshouldbehidden",
  274. silent = 0
  275. },
  276. n = {
  277. sid = 0,
  278. noremap = 0,
  279. enabled = 1,
  280. rhs = "thisoneshouldbehidden",
  281. silent = 0
  282. }
  283. },
  284. priority = 500,
  285. name = "hidden",
  286. hidden = 0
  287. }
  288. },
  289. hidden = 1
  290. }
  291. }
  292. eq(expected, m)
  293. end)
  294. it('matching path, all modes', function()
  295. local m = funcs.menu_get("Export", "a")
  296. local expected = { {
  297. hidden = 0,
  298. name = "Export",
  299. priority = 500,
  300. submenus = { {
  301. tooltip = "This is the tooltip",
  302. hidden = 0,
  303. name = "Script",
  304. priority = 500,
  305. mappings = {
  306. n = {
  307. sid = 1,
  308. noremap = 1,
  309. enabled = 1,
  310. rhs = "p",
  311. silent = 0
  312. }
  313. }
  314. } }
  315. } }
  316. eq(expected, m)
  317. end)
  318. it('no path, matching modes', function()
  319. local m = funcs.menu_get("","i")
  320. local expected = {
  321. {
  322. shortcut = "T",
  323. hidden = 0,
  324. submenus = {
  325. {
  326. mappings = {
  327. i = {
  328. sid = 1,
  329. noremap = 1,
  330. enabled = 1,
  331. rhs = "insert",
  332. silent = 0
  333. }
  334. },
  335. priority = 500,
  336. name = "Test",
  337. hidden = 0
  338. },
  339. },
  340. priority = 500,
  341. name = "Test"
  342. }
  343. }
  344. eq(expected, m)
  345. end)
  346. it('matching path and modes', function()
  347. local m = funcs.menu_get("Test","i")
  348. local expected = {
  349. {
  350. shortcut = "T",
  351. submenus = {
  352. {
  353. mappings = {
  354. i = {
  355. sid = 1,
  356. noremap = 1,
  357. enabled = 1,
  358. rhs = "insert",
  359. silent = 0
  360. },
  361. },
  362. priority = 500,
  363. name = "Test",
  364. hidden = 0
  365. },
  366. },
  367. priority = 500,
  368. name = "Test",
  369. hidden = 0
  370. }
  371. }
  372. eq(expected, m)
  373. end)
  374. end)
  375. describe('menu_get', function()
  376. before_each(function()
  377. clear()
  378. command('aunmenu *')
  379. end)
  380. it('returns <keycode> representation of special keys', function()
  381. command('nnoremenu &Test.Test inormal<ESC>')
  382. command('inoremenu &Test.Test2 <Tab><Esc>')
  383. command('vnoremenu &Test.Test3 yA<C-R>0<Tab>xyz<Esc>')
  384. command('inoremenu &Test.Test4 <c-r>*')
  385. command('inoremenu &Test.Test5 <c-R>+')
  386. command('nnoremenu &Test.Test6 <Nop>')
  387. command('nnoremenu &Test.Test7 <NOP>')
  388. command('nnoremenu &Test.Test8 <NoP>')
  389. command('nnoremenu &Test.Test9 ""')
  390. local m = funcs.menu_get("");
  391. local expected = {
  392. {
  393. shortcut = "T",
  394. hidden = 0,
  395. submenus = {
  396. {
  397. priority = 500,
  398. mappings = {
  399. n = {
  400. sid = 1,
  401. noremap = 1,
  402. enabled = 1,
  403. rhs = "inormal<Esc>",
  404. silent = 0
  405. }
  406. },
  407. name = "Test",
  408. hidden = 0
  409. },
  410. {
  411. priority = 500,
  412. mappings = {
  413. i = {
  414. sid = 1,
  415. noremap = 1,
  416. enabled = 1,
  417. rhs = "<Tab><Esc>",
  418. silent = 0
  419. }
  420. },
  421. name = "Test2",
  422. hidden = 0
  423. },
  424. {
  425. priority = 500,
  426. mappings = {
  427. s = {
  428. sid = 1,
  429. noremap = 1,
  430. enabled = 1,
  431. rhs = "yA<C-R>0<Tab>xyz<Esc>",
  432. silent = 0
  433. },
  434. v = {
  435. sid = 1,
  436. noremap = 1,
  437. enabled = 1,
  438. rhs = "yA<C-R>0<Tab>xyz<Esc>",
  439. silent = 0
  440. }
  441. },
  442. name = "Test3",
  443. hidden = 0
  444. },
  445. {
  446. priority = 500,
  447. mappings = {
  448. i = {
  449. sid = 1,
  450. noremap = 1,
  451. enabled = 1,
  452. rhs = "<C-R>*",
  453. silent = 0
  454. }
  455. },
  456. name = "Test4",
  457. hidden = 0
  458. },
  459. {
  460. priority = 500,
  461. mappings = {
  462. i = {
  463. sid = 1,
  464. noremap = 1,
  465. enabled = 1,
  466. rhs = "<C-R>+",
  467. silent = 0
  468. }
  469. },
  470. name = "Test5",
  471. hidden = 0
  472. },
  473. {
  474. priority = 500,
  475. mappings = {
  476. n = {
  477. sid = 1,
  478. noremap = 1,
  479. enabled = 1,
  480. rhs = "",
  481. silent = 0
  482. }
  483. },
  484. name = "Test6",
  485. hidden = 0
  486. },
  487. {
  488. priority = 500,
  489. mappings = {
  490. n = {
  491. sid = 1,
  492. noremap = 1,
  493. enabled = 1,
  494. rhs = "",
  495. silent = 0
  496. }
  497. },
  498. name = "Test7",
  499. hidden = 0
  500. },
  501. {
  502. priority = 500,
  503. mappings = {
  504. n = {
  505. sid = 1,
  506. noremap = 1,
  507. enabled = 1,
  508. rhs = "",
  509. silent = 0
  510. }
  511. },
  512. name = "Test8",
  513. hidden = 0
  514. },
  515. {
  516. priority = 500,
  517. mappings = {
  518. n = {
  519. sid = 1,
  520. noremap = 1,
  521. enabled = 1,
  522. rhs = "\"\"",
  523. silent = 0
  524. }
  525. },
  526. name = "Test9",
  527. hidden = 0
  528. }
  529. },
  530. priority = 500,
  531. name = "Test"
  532. }
  533. }
  534. eq(m, expected)
  535. end)
  536. it('works with right-aligned text and spaces', function()
  537. command('nnoremenu &Test<Tab>Y.Test<Tab>X\\ x inormal<Alt-j>')
  538. command('nnoremenu &Test\\ 1.Test\\ 2 Wargl')
  539. command('nnoremenu &Test4.Test<Tab>3 i space<Esc>')
  540. local m = funcs.menu_get("");
  541. local expected = {
  542. {
  543. shortcut = "T",
  544. hidden = 0,
  545. actext = "Y",
  546. submenus = {
  547. {
  548. mappings = {
  549. n = {
  550. sid = 1,
  551. noremap = 1,
  552. enabled = 1,
  553. rhs = "inormal<Alt-j>",
  554. silent = 0
  555. }
  556. },
  557. hidden = 0,
  558. actext = "X x",
  559. priority = 500,
  560. name = "Test"
  561. }
  562. },
  563. priority = 500,
  564. name = "Test"
  565. },
  566. {
  567. shortcut = "T",
  568. hidden = 0,
  569. submenus = {
  570. {
  571. priority = 500,
  572. mappings = {
  573. n = {
  574. sid = 1,
  575. noremap = 1,
  576. enabled = 1,
  577. rhs = "Wargl",
  578. silent = 0
  579. }
  580. },
  581. name = "Test 2",
  582. hidden = 0
  583. }
  584. },
  585. priority = 500,
  586. name = "Test 1"
  587. },
  588. {
  589. shortcut = "T",
  590. hidden = 0,
  591. submenus = {
  592. {
  593. mappings = {
  594. n = {
  595. sid = 1,
  596. noremap = 1,
  597. enabled = 1,
  598. rhs = "i space<Esc>",
  599. silent = 0
  600. }
  601. },
  602. hidden = 0,
  603. actext = "3",
  604. priority = 500,
  605. name = "Test"
  606. }
  607. },
  608. priority = 500,
  609. name = "Test4"
  610. }
  611. }
  612. eq(m, expected)
  613. end)
  614. end)