tree-sitter-spec.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. const dedent = require('dedent');
  2. describe('Tree-sitter Ruby grammar', () => {
  3. beforeEach(async () => {
  4. atom.config.set('core.useTreeSitterParsers', true);
  5. atom.config.set('core.useLegacyTreeSitter', true);
  6. await atom.packages.activatePackage('language-ruby');
  7. });
  8. it('tokenizes symbols', async () => {
  9. const editor = await atom.workspace.open('foo.rb');
  10. editor.setText(dedent`
  11. :foo
  12. %i(foo)
  13. `);
  14. expect(editor.scopeDescriptorForBufferPosition([0, 1]).toString()).toBe(
  15. '.source.ruby'
  16. );
  17. // TODO: ^^^ Test expected '.source.ruby .constant.other.symbol' but got '.source.ruby'
  18. expect(editor.scopeDescriptorForBufferPosition([1, 3]).toString()).toBe(
  19. '.source.ruby .constant.other.symbol'
  20. );
  21. });
  22. it('tokenizes visibility modifiers', async () => {
  23. const editor = await atom.workspace.open('foo.rb');
  24. editor.setText(dedent`
  25. public
  26. protected
  27. private
  28. public def foo; end
  29. protected def bar; end
  30. private def baz; end
  31. `);
  32. expect(editor.scopeDescriptorForBufferPosition([0, 0]).toString()).toBe(
  33. '.source.ruby .keyword.other.special-method'
  34. );
  35. expect(editor.scopeDescriptorForBufferPosition([1, 0]).toString()).toBe(
  36. '.source.ruby .keyword.other.special-method'
  37. );
  38. expect(editor.scopeDescriptorForBufferPosition([2, 0]).toString()).toBe(
  39. '.source.ruby .keyword.other.special-method'
  40. );
  41. expect(editor.scopeDescriptorForBufferPosition([4, 0]).toString()).toBe(
  42. '.source.ruby .keyword.other.special-method'
  43. );
  44. expect(editor.scopeDescriptorForBufferPosition([5, 0]).toString()).toBe(
  45. '.source.ruby .keyword.other.special-method'
  46. );
  47. expect(editor.scopeDescriptorForBufferPosition([6, 0]).toString()).toBe(
  48. '.source.ruby .keyword.other.special-method'
  49. );
  50. });
  51. it('tokenizes keyword predicates', async () => {
  52. const editor = await atom.workspace.open('foo.rb');
  53. editor.setText(dedent`
  54. defined?(:thing)
  55. block_given?
  56. iterator?
  57. `);
  58. expect(editor.scopeDescriptorForBufferPosition([0, 0]).toString()).toBe(
  59. '.source.ruby .keyword.control'
  60. );
  61. expect(editor.scopeDescriptorForBufferPosition([1, 0]).toString()).toBe(
  62. '.source.ruby .keyword.control'
  63. );
  64. expect(editor.scopeDescriptorForBufferPosition([2, 0]).toString()).toBe(
  65. '.source.ruby .keyword.control'
  66. );
  67. });
  68. it('tokenizes alias definitions', async () => {
  69. const editor = await atom.workspace.open('foo.rb');
  70. editor.setText(dedent`
  71. alias_method :name, :full_name
  72. alias name full_name
  73. `);
  74. expect(editor.scopeDescriptorForBufferPosition([0, 0]).toString()).toBe(
  75. '.source.ruby .keyword.control'
  76. );
  77. expect(editor.scopeDescriptorForBufferPosition([1, 0]).toString()).toBe(
  78. '.source.ruby .keyword.control'
  79. );
  80. });
  81. it('tokenizes keywords', async () => {
  82. const editor = await atom.workspace.open('foo.rb');
  83. editor.setText(dedent`
  84. super
  85. undef foo
  86. `);
  87. expect(editor.scopeDescriptorForBufferPosition([0, 0]).toString()).toBe(
  88. '.source.ruby .keyword.control'
  89. );
  90. expect(editor.scopeDescriptorForBufferPosition([1, 0]).toString()).toBe(
  91. '.source.ruby .keyword.control'
  92. );
  93. });
  94. it('tokenizes variable in assignment expressions', async () => {
  95. const editor = await atom.workspace.open('foo.rb');
  96. editor.setText(dedent`
  97. a = 10
  98. `);
  99. expect(editor.scopeDescriptorForBufferPosition([0, 0]).toString()).toBe(
  100. '.source.ruby .variable'
  101. );
  102. });
  103. it('does not tokenizes method call in assignment expressions', async () => {
  104. const editor = await atom.workspace.open('foo.rb');
  105. editor.setText(dedent`
  106. foo() = 10
  107. `);
  108. expect(editor.scopeDescriptorForBufferPosition([0, 0]).toString()).not.toBe(
  109. '.source.ruby .variable'
  110. );
  111. });
  112. });