summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorw0rp <devw0rp@gmail.com>2018-04-22 12:28:12 +0100
committerw0rp <devw0rp@gmail.com>2018-04-22 12:28:19 +0100
commitd8a673515a8ec9fd102d6da8d8fa499ae2770f11 (patch)
tree838f675d6ec508dd29b1f91a364b36d8326066a3 /test
parent20241c87ef9f033e2ac2f44f5bb99af358ab44b2 (diff)
downloadale-d8a673515a8ec9fd102d6da8d8fa499ae2770f11.zip
Close #1162 - Implement completion support with LSP servers
Diffstat (limited to 'test')
-rw-r--r--test/completion/test_completion_events.vader4
-rw-r--r--test/completion/test_completion_prefixes.vader17
-rw-r--r--test/completion/test_lsp_completion_messages.vader6
-rw-r--r--test/completion/test_lsp_completion_parsing.vader392
4 files changed, 409 insertions, 10 deletions
diff --git a/test/completion/test_completion_events.vader b/test/completion/test_completion_events.vader
index 49d485f6..fbe18bb6 100644
--- a/test/completion/test_completion_events.vader
+++ b/test/completion/test_completion_events.vader
@@ -2,12 +2,9 @@ Before:
Save g:ale_completion_enabled
Save g:ale_completion_delay
Save g:ale_completion_max_suggestions
- Save g:ale_completion_experimental_lsp_support
Save &l:omnifunc
Save &l:completeopt
- unlet! g:ale_completion_experimental_lsp_support
-
let g:ale_completion_enabled = 1
let g:get_completions_called = 0
let g:feedkeys_calls = []
@@ -43,7 +40,6 @@ After:
unlet! b:ale_completion_response
unlet! b:ale_completion_parser
unlet! b:ale_complete_done_time
- unlet! g:ale_completion_experimental_lsp_support
delfunction CheckCompletionCalled
diff --git a/test/completion/test_completion_prefixes.vader b/test/completion/test_completion_prefixes.vader
index 8ac29326..a88e978d 100644
--- a/test/completion/test_completion_prefixes.vader
+++ b/test/completion/test_completion_prefixes.vader
@@ -17,3 +17,20 @@ Execute(Completion should not be done after parens in TypeScript):
Execute(Completion prefixes should work for other filetypes):
AssertEqual 'ab', ale#completion#GetPrefix('xxxyyyzzz', 3, 14)
+
+Given rust():
+ let abc = y.
+ let abc = String::
+ let foo = (ab)
+
+Execute(Completion should be done after dots in Rust):
+ AssertEqual '.', ale#completion#GetPrefix(&filetype, 1, 13)
+
+Execute(Completion should be done after colons in Rust):
+ AssertEqual '::', ale#completion#GetPrefix(&filetype, 2, 19)
+
+Execute(Completion should be done after words in parens in Rust):
+ AssertEqual 'ab', ale#completion#GetPrefix(&filetype, 3, 14)
+
+Execute(Completion should not be done after parens in Rust):
+ AssertEqual '', ale#completion#GetPrefix(&filetype, 3, 15)
diff --git a/test/completion/test_lsp_completion_messages.vader b/test/completion/test_lsp_completion_messages.vader
index f21acfb9..af3aa8c0 100644
--- a/test/completion/test_lsp_completion_messages.vader
+++ b/test/completion/test_lsp_completion_messages.vader
@@ -2,12 +2,9 @@ Before:
Save g:ale_completion_delay
Save g:ale_completion_max_suggestions
Save g:ale_completion_info
- Save g:ale_completion_experimental_lsp_support
Save &l:omnifunc
Save &l:completeopt
- unlet! g:ale_completion_experimental_lsp_support
-
let g:ale_completion_enabled = 1
call ale#test#SetDirectory('/testplugin/test/completion')
@@ -44,7 +41,6 @@ After:
unlet! b:ale_completion_parser
unlet! b:ale_complete_done_time
unlet! b:ale_linters
- unlet! g:ale_completion_experimental_lsp_support
call ale#test#RestoreDirectory()
call ale#linter#Reset()
@@ -136,8 +132,6 @@ Given python(Some Python file):
bazxyzxyzxyz
Execute(The right message should be sent for the initial LSP request):
- let g:ale_completion_experimental_lsp_support = 1
-
runtime ale_linters/python/pyls.vim
let b:ale_linters = ['pyls']
" The cursor position needs to match what was saved before.
diff --git a/test/completion/test_lsp_completion_parsing.vader b/test/completion/test_lsp_completion_parsing.vader
new file mode 100644
index 00000000..c9c51a66
--- /dev/null
+++ b/test/completion/test_lsp_completion_parsing.vader
@@ -0,0 +1,392 @@
+After:
+ unlet! b:ale_completion_info
+
+Execute(Should handle Rust completion results correctly):
+ AssertEqual
+ \ [
+ \ {'word': 'new', 'menu': 'pub fn new() -> String', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'with_capacity', 'menu': 'pub fn with_capacity(capacity: usize) -> String', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'from_utf8', 'menu': 'pub fn from_utf8(vec: Vec<u8>) -> Result<String, FromUtf8Error>', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'from_utf8_lossy', 'menu': 'pub fn from_utf8_lossy<''a>(v: &''a [u8]) -> Cow<''a, str>', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'from_utf16', 'menu': 'pub fn from_utf16(v: &[u16]) -> Result<String, FromUtf16Error>', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'from_utf16_lossy', 'menu': 'pub fn from_utf16_lossy(v: &[u16]) -> String', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'from_raw_parts', 'menu': 'pub unsafe fn from_raw_parts(buf: *mut u8, length: usize, capacity: usize) -> String', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'from_utf8_unchecked', 'menu': 'pub unsafe fn from_utf8_unchecked(bytes: Vec<u8>) -> String', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'from_iter', 'menu': 'fn from_iter<I: IntoIterator<Item = char>>(iter: I) -> String', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'from_iter', 'menu': 'fn from_iter<I: IntoIterator<Item = &''a char>>(iter: I) -> String', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'from_iter', 'menu': 'fn from_iter<I: IntoIterator<Item = &''a str>>(iter: I) -> String', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'from_iter', 'menu': 'fn from_iter<I: IntoIterator<Item = String>>(iter: I) -> String', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'from_iter', 'menu': 'fn from_iter<I: IntoIterator<Item = Cow<''a, str>>>(iter: I) -> String', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'Searcher', 'menu': 'type Searcher = <&''b str as Pattern<''a>>::Searcher;', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'default', 'menu': 'fn default() -> String', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'Output', 'menu': 'type Output = String;', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'Target', 'menu': 'type Target = str;', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'Err', 'menu': 'type Err = ParseError;', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'from_str', 'menu': 'fn from_str(s: &str) -> Result<String, ParseError>', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'from', 'menu': 'fn from(s: &''a str) -> String', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'from', 'menu': 'fn from(s: Box<str>) -> String', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'from', 'menu': 'fn from(s: Cow<''a, str>) -> String', 'info': '', 'kind': 'f', 'icase': 1},
+ \],
+ \ ale#completion#ParseLSPCompletions({
+ \ "jsonrpc":"2.0",
+ \ "id":65,
+ \ "result":[
+ \ {
+ \ "label":"new",
+ \ "kind":3,
+ \ "detail":"pub fn new() -> String"
+ \ },
+ \ {
+ \ "label":"with_capacity",
+ \ "kind":3,
+ \ "detail":"pub fn with_capacity(capacity: usize) -> String"
+ \ },
+ \ {
+ \ "label":"from_utf8",
+ \ "kind":3,
+ \ "detail":"pub fn from_utf8(vec: Vec<u8>) -> Result<String, FromUtf8Error>"
+ \ },
+ \ {
+ \ "label":"from_utf8_lossy",
+ \ "kind":3,
+ \ "detail":"pub fn from_utf8_lossy<'a>(v: &'a [u8]) -> Cow<'a, str>"
+ \ },
+ \ {
+ \ "label":"from_utf16",
+ \ "kind":3,
+ \ "detail":"pub fn from_utf16(v: &[u16]) -> Result<String, FromUtf16Error>"
+ \ },
+ \ {
+ \ "label":"from_utf16_lossy",
+ \ "kind":3,
+ \ "detail":"pub fn from_utf16_lossy(v: &[u16]) -> String"
+ \ },
+ \ {
+ \ "label":"from_raw_parts",
+ \ "kind":3,
+ \ "detail":"pub unsafe fn from_raw_parts(buf: *mut u8, length: usize, capacity: usize) -> String"
+ \ },
+ \ {
+ \ "label":"from_utf8_unchecked",
+ \ "kind":3,
+ \ "detail":"pub unsafe fn from_utf8_unchecked(bytes: Vec<u8>) -> String"
+ \ },
+ \ {
+ \ "label":"from_iter",
+ \ "kind":3,
+ \ "detail":"fn from_iter<I: IntoIterator<Item = char>>(iter: I) -> String"
+ \ },
+ \ {
+ \ "label":"from_iter",
+ \ "kind":3,
+ \ "detail":"fn from_iter<I: IntoIterator<Item = &'a char>>(iter: I) -> String"
+ \ },
+ \ {
+ \ "label":"from_iter",
+ \ "kind":3,
+ \ "detail":"fn from_iter<I: IntoIterator<Item = &'a str>>(iter: I) -> String"
+ \ },
+ \ {
+ \ "label":"from_iter",
+ \ "kind":3,
+ \ "detail":"fn from_iter<I: IntoIterator<Item = String>>(iter: I) -> String"
+ \ },
+ \ {
+ \ "label":"from_iter",
+ \ "kind":3,
+ \ "detail":"fn from_iter<I: IntoIterator<Item = Cow<'a, str>>>(iter: I) -> String"
+ \ },
+ \ {
+ \ "label":"Searcher",
+ \ "kind":8,
+ \ "detail":"type Searcher = <&'b str as Pattern<'a>>::Searcher;"
+ \ },
+ \ {
+ \ "label":"default",
+ \ "kind":3,
+ \ "detail":"fn default() -> String"
+ \ },
+ \ {
+ \ "label":"Output",
+ \ "kind":8,
+ \ "detail":"type Output = String;"
+ \ },
+ \ {
+ \ "label":"Output",
+ \ "kind":8,
+ \ "detail":"type Output = str;"
+ \ },
+ \ {
+ \ "label":"Output",
+ \ "kind":8,
+ \ "detail":"type Output = str;"
+ \ },
+ \ {
+ \ "label":"Output",
+ \ "kind":8,
+ \ "detail":"type Output = str;"
+ \ },
+ \ {
+ \ "label":"Output",
+ \ "kind":8,
+ \ "detail":"type Output = str;"
+ \ },
+ \ {
+ \ "label":"Output",
+ \ "kind":8,
+ \ "detail":"type Output = str;"
+ \ },
+ \ {
+ \ "label":"Output",
+ \ "kind":8,
+ \ "detail":"type Output = str;"
+ \ },
+ \ {
+ \ "label":"Target",
+ \ "kind":8,
+ \ "detail":"type Target = str;"
+ \ },
+ \ {
+ \ "label":"Err",
+ \ "kind":8,
+ \ "detail":"type Err = ParseError;"
+ \ },
+ \ {
+ \ "label":"from_str",
+ \ "kind":3,
+ \ "detail":"fn from_str(s: &str) -> Result<String, ParseError>"
+ \ },
+ \ {
+ \ "label":"from",
+ \ "kind":3,
+ \ "detail":"fn from(s: &'a str) -> String"
+ \ },
+ \ {
+ \ "label":"from",
+ \ "kind":3,
+ \ "detail":"fn from(s: Box<str>) -> String"
+ \ },
+ \ {
+ \ "label":"from",
+ \ "kind":3,
+ \ "detail":"fn from(s: Cow<'a, str>) -> String"
+ \ }
+ \ ]
+ \ })
+
+Execute(Should handle Python completion results correctly):
+ let b:ale_completion_info = {
+ \ 'completion_filter': 'ale#completion#python#CompletionItemFilter',
+ \}
+
+ AssertEqual
+ \ [
+ \ {'word': 'what', 'menu': 'example-python-project.bar.Bar', 'info': "what()\n\n", 'kind': 'f', 'icase': 1},
+ \ ],
+ \ ale#completion#ParseLSPCompletions({
+ \ "jsonrpc":"2.0",
+ \ "id":6,
+ \ "result":{
+ \ "isIncomplete":v:false,
+ \ "items":[
+ \ {
+ \ "label":"what()",
+ \ "kind":3,
+ \ "detail":"example-python-project.bar.Bar",
+ \ "documentation":"what()\n\n",
+ \ "sortText":"awhat",
+ \ "insertText":"what"
+ \ },
+ \ {
+ \ "label":"__class__",
+ \ "kind":7,
+ \ "detail":"object",
+ \ "documentation":"type(object_or_name, bases, dict)\ntype(object) -> the object's type\ntype(name, bases, dict) -> a new type",
+ \ "sortText":"z__class__",
+ \ "insertText":"__class__"
+ \ },
+ \ {
+ \ "label":"__delattr__(name)",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"Implement delattr(self, name).",
+ \ "sortText":"z__delattr__",
+ \ "insertText":"__delattr__"
+ \ },
+ \ {
+ \ "label":"__dir__()",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"__dir__() -> list\ndefault dir() implementation",
+ \ "sortText":"z__dir__",
+ \ "insertText":"__dir__"
+ \ },
+ \ {
+ \ "label":"__doc__",
+ \ "kind":18,
+ \ "detail":"object",
+ \ "documentation":"str(object='') -> str\nstr(bytes_or_buffer[, encoding[, errors]]) -> str\n\nCreate a new string object from the given object. If encoding or\nerrors is specified, then the object must expose a data buffer\nthat will be decoded using the given encoding and error handler.\nOtherwise, returns the result of object.__str__() (if defined)\nor repr(object).\nencoding defaults to sys.getdefaultencoding().\nerrors defaults to 'strict'.",
+ \ "sortText":"z__doc__",
+ \ "insertText":"__doc__"
+ \ },
+ \ {
+ \ "label":"__eq__(value)",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"Return self==value.",
+ \ "sortText":"z__eq__",
+ \ "insertText":"__eq__"
+ \ },
+ \ {
+ \ "label":"__format__()",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"default object formatter",
+ \ "sortText":"z__format__",
+ \ "insertText":"__format__"
+ \ },
+ \ {
+ \ "label":"__ge__(value)",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"Return self>=value.",
+ \ "sortText":"z__ge__",
+ \ "insertText":"__ge__"
+ \ },
+ \ {
+ \ "label":"__getattribute__(name)",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"Return getattr(self, name).",
+ \ "sortText":"z__getattribute__",
+ \ "insertText":"__getattribute__"
+ \ },
+ \ {
+ \ "label":"__gt__(value)",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"Return self>value.",
+ \ "sortText":"z__gt__",
+ \ "insertText":"__gt__"
+ \ },
+ \ {
+ \ "label":"__hash__()",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"Return hash(self).",
+ \ "sortText":"z__hash__",
+ \ "insertText":"__hash__"
+ \ },
+ \ {
+ \ "label":"__init__(args, kwargs)",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"Initialize self.\u00a0\u00a0See help(type(self)) for accurate signature.",
+ \ "sortText":"z__init__",
+ \ "insertText":"__init__"
+ \ },
+ \ {
+ \ "label":"__init_subclass__()",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"This method is called when a class is subclassed.\n\nThe default implementation does nothing. It may be\noverridden to extend subclasses.",
+ \ "sortText":"z__init_subclass__",
+ \ "insertText":"__init_subclass__"
+ \ },
+ \ {
+ \ "label":"__le__(value)",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"Return self<=value.",
+ \ "sortText":"z__le__",
+ \ "insertText":"__le__"
+ \ },
+ \ {
+ \ "label":"__lt__(value)",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"Return self<value.",
+ \ "sortText":"z__lt__",
+ \ "insertText":"__lt__"
+ \ },
+ \ {
+ \ "label":"__ne__(value)",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"Return self!=value.",
+ \ "sortText":"z__ne__",
+ \ "insertText":"__ne__"
+ \ },
+ \ {
+ \ "label":"__new__(kwargs)",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"Create and return a new object.\u00a0\u00a0See help(type) for accurate signature.",
+ \ "sortText":"z__new__",
+ \ "insertText":"__new__"
+ \ },
+ \ {
+ \ "label":"__reduce__()",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"helper for pickle",
+ \ "sortText":"z__reduce__",
+ \ "insertText":"__reduce__"
+ \ },
+ \ {
+ \ "label":"__reduce_ex__()",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"helper for pickle",
+ \ "sortText":"z__reduce_ex__",
+ \ "insertText":"__reduce_ex__"
+ \ },
+ \ {
+ \ "label":"__repr__()",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"Return repr(self).",
+ \ "sortText":"z__repr__",
+ \ "insertText":"__repr__"
+ \ },
+ \ {
+ \ "label":"__setattr__(name, value)",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"Implement setattr(self, name, value).",
+ \ "sortText":"z__setattr__",
+ \ "insertText":"__setattr__"
+ \ },
+ \ {
+ \ "label":"__sizeof__()",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"__sizeof__() -> int\nsize of object in memory, in bytes",
+ \ "sortText":"z__sizeof__",
+ \ "insertText":"__sizeof__"
+ \ },
+ \ {
+ \ "label":"__str__()",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"Return str(self).",
+ \ "sortText":"z__str__",
+ \ "insertText":"__str__"
+ \ },
+ \ {
+ \ "label":"__subclasshook__()",
+ \ "kind":3,
+ \ "detail":"object",
+ \ "documentation":"Abstract classes can override this to customize issubclass().\n\nThis is invoked early on by abc.ABCMeta.__subclasscheck__().\nIt should return True, False or NotImplemented.\u00a0\u00a0If it returns\nNotImplemented, the normal algorithm is used.\u00a0\u00a0Otherwise, it\noverrides the normal algorithm (and the outcome is cached).",
+ \ "sortText":"z__subclasshook__",
+ \ "insertText":"__subclasshook__"
+ \ }
+ \ ]
+ \ }
+ \ })