After: unlet! b:ale_tsserver_completion_names Execute(TypeScript completions responses should be parsed correctly): AssertEqual [], \ ale#completion#ParseTSServerCompletions({ \ 'body': [], \}) AssertEqual \ [ \ { \ 'word': 'foo', \ 'source': '/path/to/foo.ts', \ }, \ { \ 'word': 'bar', \ 'source': '', \ }, \ { \ 'word': 'baz', \ 'source': '', \ } \ ], \ ale#completion#ParseTSServerCompletions({ \ 'body': [ \ {'name': 'foo', 'source': '/path/to/foo.ts'}, \ {'name': 'bar'}, \ {'name': 'baz'}, \ ], \}) Execute(TypeScript completions responses should include warnings): AssertEqual \ [ \ { \ 'word': 'foo', \ 'source': '/path/to/foo.ts', \ }, \ { \ 'word': 'bar', \ 'source': '', \ }, \ { \ 'word': 'baz', \ 'source': '', \ } \ ], \ ale#completion#ParseTSServerCompletions({ \ 'body': [ \ {'name': 'foo', 'source': '/path/to/foo.ts'}, \ {'name': 'bar', 'kind': 'warning'}, \ {'name': 'baz'}, \ ], \}) Execute(TypeScript completions responses should not include warnings if excluded): let g:ale_completion_tsserver_remove_warnings = 1 AssertEqual \ [ \ { \ 'word': 'foo', \ 'source': '/path/to/foo.ts', \ }, \ { \ 'word': 'baz', \ 'source': '', \ } \ ], \ ale#completion#ParseTSServerCompletions({ \ 'body': [ \ {'name': 'foo', 'source': '/path/to/foo.ts'}, \ {'name': 'bar', 'kind': 'warning'}, \ {'name': 'baz'}, \ ], \}) Execute(TypeScript completion details responses should be parsed correctly): AssertEqual \ [ \ { \ 'word': 'abc', \ 'menu': '(property) Foo.abc: number', \ 'info': '', \ 'kind': 'f', \ 'icase': 1, \ 'dup': g:ale_completion_tsserver_autoimport, \ }, \ { \ 'word': 'def', \ 'menu': '(property) Foo.def: number', \ 'info': 'foo bar baz', \ 'kind': 'f', \ 'icase': 1, \ 'dup': g:ale_completion_tsserver_autoimport, \ }, \ { \ 'word': 'ghi', \ 'menu': '(class) Foo', \ 'info': '', \ 'kind': 'f', \ 'icase': 1, \ 'dup': g:ale_completion_tsserver_autoimport, \ }, \ ], \ ale#completion#ParseTSServerCompletionEntryDetails({ \ 'body': [ \ { \ 'name': 'abc', \ 'kind': 'parameterName', \ 'displayParts': [ \ {'text': '('}, \ {'text': 'property'}, \ {'text': ')'}, \ {'text': ' '}, \ {'text': 'Foo'}, \ {'text': '.'}, \ {'text': 'abc'}, \ {'text': ':'}, \ {'text': ' '}, \ {'text': 'number'}, \ ], \ }, \ { \ 'name': 'def', \ 'kind': 'parameterName', \ 'displayParts': [ \ {'text': '('}, \ {'text': 'property'}, \ {'text': ')'}, \ {'text': ' '}, \ {'text': 'Foo'}, \ {'text': '.'}, \ {'text': 'def'}, \ {'text': ':'}, \ {'text': ' '}, \ {'text': 'number'}, \ ], \ 'documentation': [ \ {'text': 'foo'}, \ {'text': ' '}, \ {'text': 'bar'}, \ {'text': ' '}, \ {'text': 'baz'}, \ ], \ }, \ { \ 'name': 'ghi', \ 'kind': 'className', \ 'displayParts': [ \ {'text': '('}, \ {'text': 'class'}, \ {'text': ')'}, \ {'text': ' '}, \ {'text': 'Foo'}, \ ], \ }, \ ], \}) Execute(Entries without details should be included in the responses): let b:ale_tsserver_completion_names = [{ \ 'word': 'xyz', \ 'source': '/path/to/xyz.ts', \ }] AssertEqual \ [ \ { \ 'word': 'abc', \ 'menu': 'import { def } from "./Foo"; (property) Foo.abc: number', \ 'info': '', \ 'kind': 'f', \ 'icase': 1, \ 'user_data': json_encode({ \ 'codeActions': [{ \ 'description': 'import { def } from "./Foo";', \ 'changes': [], \ }], \ }), \ 'dup': g:ale_completion_tsserver_autoimport, \ }, \ { \ 'word': 'def', \ 'menu': '(property) Foo.def: number', \ 'info': 'foo bar baz', \ 'kind': 'f', \ 'icase': 1, \ 'dup': g:ale_completion_tsserver_autoimport, \ }, \ { \ 'word': 'xyz', \ 'menu': '', \ 'info': '', \ 'kind': 'v', \ 'icase': 1, \ }, \ ], \ ale#completion#ParseTSServerCompletionEntryDetails({ \ 'body': [ \ { \ 'name': 'abc', \ 'kind': 'parameterName', \ 'displayParts': [ \ {'text': '('}, \ {'text': 'property'}, \ {'text': ')'}, \ {'text': ' '}, \ {'text': 'Foo'}, \ {'text': '.'}, \ {'text': 'abc'}, \ {'text': ':'}, \ {'text': ' '}, \ {'text': 'number'}, \ ], \ 'codeActions': [{ \ 'description': 'import { def } from "./Foo";', \ 'changes': [], \ }], \ }, \ { \ 'name': 'def', \ 'kind': 'parameterName', \ 'displayParts': [ \ {'text': '('}, \ {'text': 'property'}, \ {'text': ')'}, \ {'text': ' '}, \ {'text': 'Foo'}, \ {'text': '.'}, \ {'text': 'def'}, \ {'text': ':'}, \ {'text': ' '}, \ {'text': 'number'}, \ ], \ 'documentation': [ \ {'text': 'foo'}, \ {'text': ' '}, \ {'text': 'bar'}, \ {'text': ' '}, \ {'text': 'baz'}, \ ], \ }, \ ], \})