Before:
  Save g:ale_warn_about_trailing_blank_lines
  Save g:ale_warn_about_trailing_whitespace

  let g:ale_warn_about_trailing_blank_lines = 1
  let g:ale_warn_about_trailing_whitespace = 1

  runtime ale_linters/python/ruff.vim

After:
  Restore

  unlet! b:ale_warn_about_trailing_blank_lines
  unlet! b:ale_warn_about_trailing_whitespace

  call ale#linter#Reset()

Execute(We should handle basic output of ruff correctly):
  AssertEqual
  \ [
  \   {
  \     'lnum': 2,
  \     'col': 1,
  \     'code': 'F821',
  \     'type': 'W',
  \     'end_col': 7,
  \     'end_lnum': 2,
  \     'text': 'Undefined name example',
  \   },
  \ ],
  \ ale_linters#python#ruff#Handle(bufnr(''), [
  \   '{"cell":null,"code":"F821","end_location":{"column":8,"row":2},"filename":"/home/eduardo/Code/Python/test.py","fix":null,"location":{"column":1,"row":2},"message":"Undefined name example","noqa_row":2,"url":"https://docs.astral.sh/ruff/rules/undefined-name"}',
  \ ])

Execute(We should handle totally broken output from ruff):
  AssertEqual [], ale_linters#python#ruff#Handle(bufnr(''), ['ERROR: oh noes!'])

Execute(We should handle mixed error lines and JSON output from ruff):
  AssertEqual
  \ [
  \   {
  \     'lnum': 2,
  \     'col': 1,
  \     'code': 'F821',
  \     'type': 'W',
  \     'end_col': 7,
  \     'end_lnum': 2,
  \     'text': 'Undefined name example',
  \   },
  \ ],
  \ ale_linters#python#ruff#Handle(bufnr(''), [
  \   'ERROR: oh noes!',
  \   '{"cell":null,"code":"F821","end_location":{"column":8,"row":2},"filename":"/home/eduardo/Code/Python/test.py","fix":null,"location":{"column":1,"row":2},"message":"Undefined name example","noqa_row":2,"url":"https://docs.astral.sh/ruff/rules/undefined-name"}',
  \ ])

Execute(Warnings about trailing whitespace should be reported by default):
  AssertEqual
  \ [
  \   {
  \     'lnum': 6,
  \     'col': 1,
  \     'end_lnum': 6,
  \     'end_col': 1,
  \     'code': 'W291',
  \     'type': 'W',
  \     'text': 'who cares',
  \   },
  \   {
  \     'lnum': 6,
  \     'col': 1,
  \     'end_lnum': 6,
  \     'end_col': 1,
  \     'code': 'W293',
  \     'type': 'W',
  \     'text': 'who cares',
  \   },
  \ ],
  \ ale_linters#python#ruff#Handle(bufnr(''), [
  \   '{"cell":null,"code":"W291","end_location":{"column":2,"row":6},"filename":"/test.py","fix":null,"location":{"column":1,"row":6},"message":"who cares","noqa_row":2,"url":""}',
  \   '{"cell":null,"code":"W293","end_location":{"column":2,"row":6},"filename":"/test.py","fix":null,"location":{"column":1,"row":6},"message":"who cares","noqa_row":2,"url":""}',
  \ ])

Execute(Disabling trailing whitespace warnings should work):
  let b:ale_warn_about_trailing_whitespace = 0

  AssertEqual
  \ [],
  \ ale_linters#python#ruff#Handle(bufnr(''), [
  \   '{"cell":null,"code":"W291","end_location":{"column":2,"row":6},"filename":"/test.py","fix":null,"location":{"column":1,"row":6},"message":"who cares","noqa_row":2,"url":""}',
  \   '{"cell":null,"code":"W293","end_location":{"column":2,"row":6},"filename":"/test.py","fix":null,"location":{"column":1,"row":6},"message":"who cares","noqa_row":2,"url":""}',
  \ ])

Execute(Warnings about trailing blank lines should be reported by default):
  AssertEqual
  \ [
  \   {
  \     'lnum': 6,
  \     'col': 1,
  \     'end_lnum': 6,
  \     'end_col': 1,
  \     'code': 'W391',
  \     'type': 'W',
  \     'text': 'blank line at end of file',
  \   },
  \ ],
  \ ale_linters#python#ruff#Handle(bufnr(''), [
  \   '{"cell":null,"code":"W391","end_location":{"column":2,"row":6},"filename":"/test.py","fix":null,"location":{"column":1,"row":6},"message":"blank line at end of file","noqa_row":2,"url":""}',
  \ ])

Execute(Disabling trailing blank line warnings should work):
  let b:ale_warn_about_trailing_blank_lines = 0

  AssertEqual
  \ [],
  \ ale_linters#python#ruff#Handle(bufnr(''), [
  \   '{"cell":null,"code":"W391","end_location":{"column":2,"row":6},"filename":"/test.py","fix":null,"location":{"column":1,"row":6},"message":"blank line at end of file","noqa_row":2,"url":""}',
  \ ])
