cursorhold_spec.lua 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. local helpers = require('test.functional.helpers')(after_each)
  2. local clear = helpers.clear
  3. local eq = helpers.eq
  4. local feed = helpers.feed
  5. local retry = helpers.retry
  6. local exec = helpers.source
  7. local sleep = helpers.sleep
  8. local meths = helpers.meths
  9. before_each(clear)
  10. describe('CursorHold', function()
  11. before_each(function()
  12. exec([[
  13. let g:cursorhold = 0
  14. augroup test
  15. au CursorHold * let g:cursorhold += 1
  16. augroup END
  17. ]])
  18. end)
  19. it('is triggered correctly #12587', function()
  20. local function test_cursorhold(fn, early)
  21. local ut = 2
  22. -- if testing with small 'updatetime' fails, double its value and test again
  23. retry(10, nil, function()
  24. ut = ut * 2
  25. meths.set_option('updatetime', ut)
  26. feed('0') -- reset did_cursorhold
  27. meths.set_var('cursorhold', 0)
  28. sleep(ut / 4)
  29. fn()
  30. eq(0, meths.get_var('cursorhold'))
  31. sleep(ut / 2)
  32. fn()
  33. eq(0, meths.get_var('cursorhold'))
  34. sleep(ut / 2)
  35. eq(early, meths.get_var('cursorhold'))
  36. sleep(ut / 4 * 3)
  37. eq(1, meths.get_var('cursorhold'))
  38. end)
  39. end
  40. local ignore_key = meths.replace_termcodes('<Ignore>', true, true, true)
  41. test_cursorhold(function() end, 1)
  42. test_cursorhold(function() feed('') end, 1)
  43. test_cursorhold(function() meths.feedkeys('', 'n', true) end, 1)
  44. test_cursorhold(function() feed('<Ignore>') end, 0)
  45. test_cursorhold(function() meths.feedkeys(ignore_key, 'n', true) end, 0)
  46. end)
  47. it("reducing 'updatetime' while waiting for CursorHold #20241", function()
  48. meths.set_option('updatetime', 10000)
  49. feed('0') -- reset did_cursorhold
  50. meths.set_var('cursorhold', 0)
  51. sleep(50)
  52. eq(0, meths.get_var('cursorhold'))
  53. meths.set_option('updatetime', 20)
  54. sleep(10)
  55. eq(1, meths.get_var('cursorhold'))
  56. end)
  57. end)
  58. describe('CursorHoldI', function()
  59. -- NOTE: since this test uses RPC it is not necessary to trigger the initial
  60. -- issue (#3757) via timer's or RPC callbacks in the first place.
  61. it('is triggered after input', function()
  62. exec([[
  63. set updatetime=1
  64. let g:cursorhold = 0
  65. augroup test
  66. au CursorHoldI * let g:cursorhold += 1
  67. augroup END
  68. ]])
  69. feed('ifoo')
  70. retry(5, nil, function()
  71. sleep(1)
  72. eq(1, meths.get_var('cursorhold'))
  73. end)
  74. end)
  75. end)