import os
from clang.cindex import Config
if 'CLANG_LIBRARY_PATH' in os.environ:
    Config.set_library_path(os.environ['CLANG_LIBRARY_PATH'])

from clang.cindex import TranslationUnit

import unittest
from .util import skip_if_no_fspath
from .util import str_to_path


class TestCodeCompletion(unittest.TestCase):
    def check_completion_results(self, cr, expected):
        self.assertIsNotNone(cr)
        self.assertEqual(len(cr.diagnostics), 0)

        completions = [str(c) for c in cr.results]

        for c in expected:
            self.assertIn(c, completions)

    def test_code_complete(self):
        files = [('fake.c', """
/// Aaa.
int test1;

/// Bbb.
void test2(void);

void f() {

}
""")]

        tu = TranslationUnit.from_source('fake.c', ['-std=c99'], unsaved_files=files,
                options=TranslationUnit.PARSE_INCLUDE_BRIEF_COMMENTS_IN_CODE_COMPLETION)

        cr = tu.codeComplete('fake.c', 9, 1, unsaved_files=files, include_brief_comments=True)

        expected = [
          "{'int', ResultType} | {'test1', TypedText} || Priority: 50 || Availability: Available || Brief comment: Aaa.",
          "{'void', ResultType} | {'test2', TypedText} | {'(', LeftParen} | {')', RightParen} || Priority: 50 || Availability: Available || Brief comment: Bbb.",
          "{'return', TypedText} || Priority: 40 || Availability: Available || Brief comment: None"
        ]
        self.check_completion_results(cr, expected)

    @skip_if_no_fspath
    def test_code_complete_pathlike(self):
        files = [(str_to_path('fake.c'), """
/// Aaa.
int test1;

/// Bbb.
void test2(void);

void f() {

}
""")]

        tu = TranslationUnit.from_source(str_to_path('fake.c'), ['-std=c99'], unsaved_files=files,
                options=TranslationUnit.PARSE_INCLUDE_BRIEF_COMMENTS_IN_CODE_COMPLETION)

        cr = tu.codeComplete(str_to_path('fake.c'), 9, 1, unsaved_files=files, include_brief_comments=True)

        expected = [
          "{'int', ResultType} | {'test1', TypedText} || Priority: 50 || Availability: Available || Brief comment: Aaa.",
          "{'void', ResultType} | {'test2', TypedText} | {'(', LeftParen} | {')', RightParen} || Priority: 50 || Availability: Available || Brief comment: Bbb.",
          "{'return', TypedText} || Priority: 40 || Availability: Available || Brief comment: None"
        ]
        self.check_completion_results(cr, expected)

    def test_code_complete_availability(self):
        files = [('fake.cpp', """
class P {
protected:
  int member;
};

class Q : public P {
public:
  using P::member;
};

void f(P x, Q y) {
  x.; // member is inaccessible
  y.; // member is accessible
}
""")]

        tu = TranslationUnit.from_source('fake.cpp', ['-std=c++98'], unsaved_files=files)

        cr = tu.codeComplete('fake.cpp', 12, 5, unsaved_files=files)

        expected = [
          "{'const', TypedText} || Priority: 50 || Availability: Available || Brief comment: None",
          "{'volatile', TypedText} || Priority: 50 || Availability: Available || Brief comment: None",
          "{'operator', TypedText} || Priority: 40 || Availability: Available || Brief comment: None",
          "{'P', TypedText} || Priority: 50 || Availability: Available || Brief comment: None",
          "{'Q', TypedText} || Priority: 50 || Availability: Available || Brief comment: None"
        ]
        self.check_completion_results(cr, expected)

        cr = tu.codeComplete('fake.cpp', 13, 5, unsaved_files=files)
        expected = [
            "{'P', TypedText} | {'::', Text} || Priority: 75 || Availability: Available || Brief comment: None",
            "{'P &', ResultType} | {'operator=', TypedText} | {'(', LeftParen} | {'const P &', Placeholder} | {')', RightParen} || Priority: 79 || Availability: Available || Brief comment: None",
            "{'int', ResultType} | {'member', TypedText} || Priority: 35 || Availability: NotAccessible || Brief comment: None",
            "{'void', ResultType} | {'~P', TypedText} | {'(', LeftParen} | {')', RightParen} || Priority: 79 || Availability: Available || Brief comment: None"
        ]
        self.check_completion_results(cr, expected)
