fnamemodify_spec.lua 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. local t = require('test.testutil')
  2. local n = require('test.functional.testnvim')()
  3. local clear = n.clear
  4. local eq = t.eq
  5. local fnamemodify = n.fn.fnamemodify
  6. local getcwd = n.fn.getcwd
  7. local command = n.command
  8. local write_file = t.write_file
  9. local is_os = t.is_os
  10. local function eq_slashconvert(expected, got)
  11. eq(t.fix_slashes(expected), t.fix_slashes(got))
  12. end
  13. describe('fnamemodify()', function()
  14. setup(function()
  15. write_file('Xtest-fnamemodify.txt', [[foobar]])
  16. end)
  17. before_each(clear)
  18. teardown(function()
  19. os.remove('Xtest-fnamemodify.txt')
  20. end)
  21. it('handles the root path', function()
  22. local root = n.pathroot()
  23. eq(root, fnamemodify([[/]], ':p:h'))
  24. eq(root, fnamemodify([[/]], ':p'))
  25. if is_os('win') then
  26. eq(root, fnamemodify([[\]], ':p:h'))
  27. eq(root, fnamemodify([[\]], ':p'))
  28. command('set shellslash')
  29. root = string.sub(root, 1, -2) .. '/'
  30. eq(root, fnamemodify([[\]], ':p:h'))
  31. eq(root, fnamemodify([[\]], ':p'))
  32. eq(root, fnamemodify([[/]], ':p:h'))
  33. eq(root, fnamemodify([[/]], ':p'))
  34. end
  35. end)
  36. it(':8 works', function()
  37. eq('Xtest-fnamemodify.txt', fnamemodify([[Xtest-fnamemodify.txt]], ':8'))
  38. end)
  39. it('handles examples from ":help filename-modifiers"', function()
  40. local filename = 'src/version.c'
  41. local cwd = getcwd()
  42. eq_slashconvert(cwd .. '/src/version.c', fnamemodify(filename, ':p'))
  43. eq_slashconvert('src/version.c', fnamemodify(filename, ':p:.'))
  44. eq_slashconvert(cwd .. '/src', fnamemodify(filename, ':p:h'))
  45. eq_slashconvert(cwd .. '', fnamemodify(filename, ':p:h:h'))
  46. eq('version.c', fnamemodify(filename, ':p:t'))
  47. eq_slashconvert(cwd .. '/src/version', fnamemodify(filename, ':p:r'))
  48. eq_slashconvert(cwd .. '/src/main.c', fnamemodify(filename, ':s?version?main?:p'))
  49. local converted_cwd = cwd:gsub('/', '\\')
  50. eq(converted_cwd .. '\\src\\version.c', fnamemodify(filename, ':p:gs?/?\\\\?'))
  51. eq('src', fnamemodify(filename, ':h'))
  52. eq('version.c', fnamemodify(filename, ':t'))
  53. eq_slashconvert('src/version', fnamemodify(filename, ':r'))
  54. eq('version', fnamemodify(filename, ':t:r'))
  55. eq('c', fnamemodify(filename, ':e'))
  56. eq_slashconvert('src/main.c', fnamemodify(filename, ':s?version?main?'))
  57. end)
  58. it('handles advanced examples from ":help filename-modifiers"', function()
  59. local filename = 'src/version.c.gz'
  60. eq('gz', fnamemodify(filename, ':e'))
  61. eq('c.gz', fnamemodify(filename, ':e:e'))
  62. eq('c.gz', fnamemodify(filename, ':e:e:e'))
  63. eq('c', fnamemodify(filename, ':e:e:r'))
  64. eq_slashconvert('src/version.c', fnamemodify(filename, ':r'))
  65. eq('c', fnamemodify(filename, ':r:e'))
  66. eq_slashconvert('src/version', fnamemodify(filename, ':r:r'))
  67. eq_slashconvert('src/version', fnamemodify(filename, ':r:r:r'))
  68. end)
  69. it('handles :h', function()
  70. eq('.', fnamemodify('hello.txt', ':h'))
  71. eq_slashconvert('path/to', fnamemodify('path/to/hello.txt', ':h'))
  72. end)
  73. it('handles :t', function()
  74. eq('hello.txt', fnamemodify('hello.txt', ':t'))
  75. eq_slashconvert('hello.txt', fnamemodify('path/to/hello.txt', ':t'))
  76. end)
  77. it('handles :r', function()
  78. eq('hello', fnamemodify('hello.txt', ':r'))
  79. eq_slashconvert('path/to/hello', fnamemodify('path/to/hello.txt', ':r'))
  80. end)
  81. it('handles :e', function()
  82. eq('txt', fnamemodify('hello.txt', ':e'))
  83. eq_slashconvert('txt', fnamemodify('path/to/hello.txt', ':e'))
  84. end)
  85. it('handles regex replacements', function()
  86. eq('content-there-here.txt', fnamemodify('content-here-here.txt', ':s/here/there/'))
  87. eq('content-there-there.txt', fnamemodify('content-here-here.txt', ':gs/here/there/'))
  88. end)
  89. it('handles shell escape', function()
  90. local expected
  91. if is_os('win') then
  92. -- we expand with double-quotes on Windows
  93. expected = [["hello there! quote ' newline]] .. '\n' .. [["]]
  94. else
  95. expected = [['hello there! quote '\'' newline]] .. '\n' .. [[']]
  96. end
  97. eq(expected, fnamemodify("hello there! quote ' newline\n", ':S'))
  98. end)
  99. it('can combine :e and :r', function()
  100. -- simple, single extension filename
  101. eq('c', fnamemodify('a.c', ':e'))
  102. eq('c', fnamemodify('a.c', ':e:e'))
  103. eq('c', fnamemodify('a.c', ':e:e:r'))
  104. eq('c', fnamemodify('a.c', ':e:e:r:r'))
  105. -- multi extension filename
  106. eq('rb', fnamemodify('a.spec.rb', ':e:r'))
  107. eq('rb', fnamemodify('a.spec.rb', ':e:r:r'))
  108. eq('spec', fnamemodify('a.spec.rb', ':e:e:r'))
  109. eq('spec', fnamemodify('a.spec.rb', ':e:e:r:r'))
  110. eq('spec', fnamemodify('a.b.spec.rb', ':e:e:r'))
  111. eq('b.spec', fnamemodify('a.b.spec.rb', ':e:e:e:r'))
  112. eq('b', fnamemodify('a.b.spec.rb', ':e:e:e:r:r'))
  113. eq('spec', fnamemodify('a.b.spec.rb', ':r:e'))
  114. eq('b', fnamemodify('a.b.spec.rb', ':r:r:e'))
  115. -- extraneous :e expansions
  116. eq('c', fnamemodify('a.b.c.d.e', ':r:r:e'))
  117. eq('b.c', fnamemodify('a.b.c.d.e', ':r:r:e:e'))
  118. -- :e never includes the whole filename, so "a.b":e:e:e --> "b"
  119. eq('b.c', fnamemodify('a.b.c.d.e', ':r:r:e:e:e'))
  120. eq('b.c', fnamemodify('a.b.c.d.e', ':r:r:e:e:e:e'))
  121. end)
  122. end)