test_treesitter_linter.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. from openhands.linter import DefaultLinter, LintResult
  2. from openhands.linter.languages.treesitter import TreesitterBasicLinter
  3. def test_syntax_error_py_file(syntax_error_py_file):
  4. linter = TreesitterBasicLinter()
  5. result = linter.lint(syntax_error_py_file)
  6. print(result)
  7. assert isinstance(result, list) and len(result) == 1
  8. assert result[0] == LintResult(
  9. file=syntax_error_py_file,
  10. line=5,
  11. column=5,
  12. message='Syntax error',
  13. )
  14. assert (
  15. result[0].visualize()
  16. == (
  17. '2| def foo():\n'
  18. '3| print("Hello, World!")\n'
  19. '4| print("Wrong indent")\n'
  20. '\033[91m5| foo(\033[0m\n' # color red
  21. ' ^ ERROR HERE: Syntax error\n'
  22. '6|'
  23. )
  24. )
  25. print(result[0].visualize())
  26. general_linter = DefaultLinter()
  27. general_result = general_linter.lint(syntax_error_py_file)
  28. # NOTE: general linter returns different result
  29. # because it uses flake8 first, which is different from treesitter
  30. assert general_result != result
  31. def test_simple_correct_ruby_file(simple_correct_ruby_file):
  32. linter = TreesitterBasicLinter()
  33. result = linter.lint(simple_correct_ruby_file)
  34. assert isinstance(result, list) and len(result) == 0
  35. # Test that the general linter also returns the same result
  36. general_linter = DefaultLinter()
  37. general_result = general_linter.lint(simple_correct_ruby_file)
  38. assert general_result == result
  39. def test_simple_incorrect_ruby_file(simple_incorrect_ruby_file):
  40. linter = TreesitterBasicLinter()
  41. result = linter.lint(simple_incorrect_ruby_file)
  42. print(result)
  43. assert isinstance(result, list) and len(result) == 2
  44. assert result[0] == LintResult(
  45. file=simple_incorrect_ruby_file,
  46. line=1,
  47. column=1,
  48. message='Syntax error',
  49. )
  50. print(result[0].visualize())
  51. assert (
  52. result[0].visualize()
  53. == (
  54. '\033[91m1|def foo():\033[0m\n' # color red
  55. ' ^ ERROR HERE: Syntax error\n'
  56. '2| print("Hello, World!")\n'
  57. '3|foo()'
  58. )
  59. )
  60. assert result[1] == LintResult(
  61. file=simple_incorrect_ruby_file,
  62. line=1,
  63. column=10,
  64. message='Syntax error',
  65. )
  66. print(result[1].visualize())
  67. assert (
  68. result[1].visualize()
  69. == (
  70. '\033[91m1|def foo():\033[0m\n' # color red
  71. ' ^ ERROR HERE: Syntax error\n'
  72. '2| print("Hello, World!")\n'
  73. '3|foo()'
  74. )
  75. )
  76. # Test that the general linter also returns the same result
  77. general_linter = DefaultLinter()
  78. general_result = general_linter.lint(simple_incorrect_ruby_file)
  79. assert general_result == result
  80. def test_parenthesis_incorrect_ruby_file(parenthesis_incorrect_ruby_file):
  81. linter = TreesitterBasicLinter()
  82. result = linter.lint(parenthesis_incorrect_ruby_file)
  83. print(result)
  84. assert isinstance(result, list) and len(result) == 1
  85. assert result[0] == LintResult(
  86. file=parenthesis_incorrect_ruby_file,
  87. line=1,
  88. column=1,
  89. message='Syntax error',
  90. )
  91. print(result[0].visualize())
  92. assert result[0].visualize() == (
  93. '\033[91m1|def print_hello_world()\033[0m\n'
  94. ' ^ ERROR HERE: Syntax error\n'
  95. "2| puts 'Hello World'"
  96. )
  97. # Test that the general linter also returns the same result
  98. general_linter = DefaultLinter()
  99. general_result = general_linter.lint(parenthesis_incorrect_ruby_file)
  100. assert general_result == result