Execute(Invalid responses should be handled):
  AssertEqual '', ale#lsp#response#GetErrorMessage({})
  AssertEqual '', ale#lsp#response#GetErrorMessage({'error': 0})
  AssertEqual '', ale#lsp#response#GetErrorMessage({'error': {}})
  AssertEqual '', ale#lsp#response#GetErrorMessage({
  \ 'error': {
  \   'code': 0,
  \   'message': 'x',
  \ },
  \})
  AssertEqual '', ale#lsp#response#GetErrorMessage({'error': {'code': -32602}})
  AssertEqual '', ale#lsp#response#GetErrorMessage({'error': {'code': -32603}})

Execute(Messages without tracebacks should be handled):
  AssertEqual 'xyz', ale#lsp#response#GetErrorMessage({
  \ 'error': {
  \   'code': -32602,
  \   'message': 'xyz',
  \ },
  \})
  AssertEqual 'abc', ale#lsp#response#GetErrorMessage({
  \ 'error': {
  \   'code': -32603,
  \   'message': 'abc',
  \ },
  \})

Execute(Invalid traceback data should be tolerated):
  AssertEqual 'xyz', ale#lsp#response#GetErrorMessage({
  \ 'error': {
  \   'code': -32602,
  \   'message': 'xyz',
  \   'data': {
  \   },
  \ },
  \})
  AssertEqual 'xyz', ale#lsp#response#GetErrorMessage({
  \ 'error': {
  \   'code': -32602,
  \   'message': 'xyz',
  \   'data': {
  \     'traceback': 0,
  \   },
  \ },
  \})
  AssertEqual 'xyz', ale#lsp#response#GetErrorMessage({
  \ 'error': {
  \   'code': -32602,
  \   'message': 'xyz',
  \   'data': {
  \     'traceback': [],
  \   },
  \ },
  \})

Execute(Messages with tracebacks should be handled):
  AssertEqual "xyz\n123\n456", ale#lsp#response#GetErrorMessage({
  \ 'error': {
  \   'code': -32602,
  \   'message': 'xyz',
  \   'data': {
  \     'traceback': ['123', '456'],
  \   },
  \ },
  \})

Execute(Messages with string data should be handled):
  AssertEqual "xyz\nUncaught Exception", ale#lsp#response#GetErrorMessage({
  \ 'error': {
  \   'code': -32602,
  \   'message': 'xyz',
  \   'data': 'Uncaught Exception',
  \ },
  \})