Home | History | Annotate | Download | only in cindex
      1 from clang.cindex import TranslationUnit
      2 
      3 def check_completion_results(cr, expected):
      4     assert cr is not None
      5     assert len(cr.diagnostics) == 0
      6 
      7     completions = [str(c) for c in cr.results]
      8 
      9     for c in expected:
     10         assert c in completions
     11 
     12 def test_code_complete():
     13     files = [('fake.c', """
     14 /// Aaa.
     15 int test1;
     16 
     17 /// Bbb.
     18 void test2(void);
     19 
     20 void f() {
     21 
     22 }
     23 """)]
     24 
     25     tu = TranslationUnit.from_source('fake.c', ['-std=c99'], unsaved_files=files,
     26             options=TranslationUnit.PARSE_INCLUDE_BRIEF_COMMENTS_IN_CODE_COMPLETION)
     27 
     28     cr = tu.codeComplete('fake.c', 9, 1, unsaved_files=files, include_brief_comments=True)
     29 
     30     expected = [
     31       "{'int', ResultType} | {'test1', TypedText} || Priority: 50 || Availability: Available || Brief comment: Aaa.",
     32       "{'void', ResultType} | {'test2', TypedText} | {'(', LeftParen} | {')', RightParen} || Priority: 50 || Availability: Available || Brief comment: Bbb.",
     33       "{'return', TypedText} || Priority: 40 || Availability: Available || Brief comment: None"
     34     ]
     35     check_completion_results(cr, expected)
     36 
     37 def test_code_complete_availability():
     38     files = [('fake.cpp', """
     39 class P {
     40 protected:
     41   int member;
     42 };
     43 
     44 class Q : public P {
     45 public:
     46   using P::member;
     47 };
     48 
     49 void f(P x, Q y) {
     50   x.; // member is inaccessible
     51   y.; // member is accessible
     52 }
     53 """)]
     54 
     55     tu = TranslationUnit.from_source('fake.cpp', ['-std=c++98'], unsaved_files=files)
     56 
     57     cr = tu.codeComplete('fake.cpp', 12, 5, unsaved_files=files)
     58 
     59     expected = [
     60       "{'const', TypedText} || Priority: 40 || Availability: Available || Brief comment: None",
     61       "{'volatile', TypedText} || Priority: 40 || Availability: Available || Brief comment: None",
     62       "{'operator', TypedText} || Priority: 40 || Availability: Available || Brief comment: None",
     63       "{'P', TypedText} | {'::', Text} || Priority: 75 || Availability: Available || Brief comment: None",
     64       "{'Q', TypedText} | {'::', Text} || Priority: 75 || Availability: Available || Brief comment: None"
     65     ]
     66     check_completion_results(cr, expected)
     67 
     68     cr = tu.codeComplete('fake.cpp', 13, 5, unsaved_files=files)
     69     expected = [
     70         "{'P', TypedText} | {'::', Text} || Priority: 75 || Availability: Available || Brief comment: None",
     71         "{'P &', ResultType} | {'operator=', TypedText} | {'(', LeftParen} | {'const P &', Placeholder} | {')', RightParen} || Priority: 34 || Availability: Available || Brief comment: None",
     72         "{'int', ResultType} | {'member', TypedText} || Priority: 35 || Availability: NotAccessible || Brief comment: None",
     73         "{'void', ResultType} | {'~P', TypedText} | {'(', LeftParen} | {')', RightParen} || Priority: 34 || Availability: Available || Brief comment: None"
     74     ]
     75     check_completion_results(cr, expected)
     76