1c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenkofrom clang.cindex import TranslationUnit
2c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko
3724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramerdef check_completion_results(cr, expected):
4724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer    assert cr is not None
5724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer    assert len(cr.diagnostics) == 0
6724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer
7724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer    completions = [str(c) for c in cr.results]
8724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer
9724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer    for c in expected:
10724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer        assert c in completions
11724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer
12c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenkodef test_code_complete():
13c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko    files = [('fake.c', """
14c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko/// Aaa.
15c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenkoint test1;
16c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko
17c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko/// Bbb.
18c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenkovoid test2(void);
19c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko
20c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenkovoid f() {
21c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko
22c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko}
23c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko""")]
24c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko
25c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko    tu = TranslationUnit.from_source('fake.c', ['-std=c99'], unsaved_files=files,
26c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko            options=TranslationUnit.PARSE_INCLUDE_BRIEF_COMMENTS_IN_CODE_COMPLETION)
27c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko
28c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko    cr = tu.codeComplete('fake.c', 9, 1, unsaved_files=files, include_brief_comments=True)
29c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko
30c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko    expected = [
31c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko      "{'int', ResultType} | {'test1', TypedText} || Priority: 50 || Availability: Available || Brief comment: Aaa.",
32c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko      "{'void', ResultType} | {'test2', TypedText} | {'(', LeftParen} | {')', RightParen} || Priority: 50 || Availability: Available || Brief comment: Bbb.",
33c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko      "{'return', TypedText} || Priority: 40 || Availability: Available || Brief comment: None"
34c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko    ]
35724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer    check_completion_results(cr, expected)
36c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko
37724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramerdef test_code_complete_availability():
38724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer    files = [('fake.cpp', """
39724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramerclass P {
40724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramerprotected:
41724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer  int member;
42724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer};
43c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko
44724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramerclass Q : public P {
45724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramerpublic:
46724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer  using P::member;
47724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer};
48724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer
49724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramervoid f(P x, Q y) {
50724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer  x.; // member is inaccessible
51724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer  y.; // member is accessible
52724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer}
53724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer""")]
54724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer
55724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer    tu = TranslationUnit.from_source('fake.cpp', ['-std=c++98'], unsaved_files=files)
56724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer
57724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer    cr = tu.codeComplete('fake.cpp', 12, 5, unsaved_files=files)
58724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer
59724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer    expected = [
60724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer      "{'const', TypedText} || Priority: 40 || Availability: Available || Brief comment: None",
61724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer      "{'volatile', TypedText} || Priority: 40 || Availability: Available || Brief comment: None",
62724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer      "{'operator', TypedText} || Priority: 40 || Availability: Available || Brief comment: None",
63724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer      "{'P', TypedText} | {'::', Text} || Priority: 75 || Availability: Available || Brief comment: None",
64724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer      "{'Q', TypedText} | {'::', Text} || Priority: 75 || Availability: Available || Brief comment: None"
65724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer    ]
66724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer    check_completion_results(cr, expected)
67724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer
68724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer    cr = tu.codeComplete('fake.cpp', 13, 5, unsaved_files=files)
69724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer    expected = [
70724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer        "{'P', TypedText} | {'::', Text} || Priority: 75 || Availability: Available || Brief comment: None",
71724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer        "{'P &', ResultType} | {'operator=', TypedText} | {'(', LeftParen} | {'const P &', Placeholder} | {')', RightParen} || Priority: 34 || Availability: Available || Brief comment: None",
72724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer        "{'int', ResultType} | {'member', TypedText} || Priority: 35 || Availability: NotAccessible || Brief comment: None",
73724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer        "{'void', ResultType} | {'~P', TypedText} | {'(', LeftParen} | {')', RightParen} || Priority: 34 || Availability: Available || Brief comment: None"
74724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer    ]
75724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer    check_completion_results(cr, expected)
76