from itertools import chain

import jedi
from ..helpers import cwd_at


def test_import_empty():
    """ github #340, return the full word. """
    completion = jedi.Script("import ").completions()[0]
    definition = completion.follow_definition()[0]
    assert definition


def check_follow_definition_types(source):
    # nested import
    completions = jedi.Script(source, path='some_path.py').completions()
    defs = chain.from_iterable(c.follow_definition() for c in completions)
    return [d.type for d in defs]


def test_follow_import_incomplete():
    """
    Completion on incomplete imports should always take the full completion
    to do any evaluation.
    """
    datetime = check_follow_definition_types("import itertool")
    assert datetime == ['module']

    # empty `from * import` parts
    itert = jedi.Script("from itertools import ").completions()
    definitions = [d for d in itert if d.name == 'chain']
    assert len(definitions) == 1
    assert [d.type for d in definitions[0].follow_definition()] == ['class']

    # incomplete `from * import` part
    datetime = check_follow_definition_types("from datetime import datetim")
    assert set(datetime) == set(['class', 'instance'])  # py33: builtin and pure py version

    # os.path check
    ospath = check_follow_definition_types("from os.path import abspat")
    assert ospath == ['function']

    # alias
    alias = check_follow_definition_types("import io as abcd; abcd")
    assert alias == ['module']


@cwd_at('test/completion/import_tree')
def test_follow_definition_nested_import():
    types = check_follow_definition_types("import pkg.mod1; pkg")
    assert types == ['module']

    types = check_follow_definition_types("import pkg.mod1; pkg.mod1")
    assert types == ['module']

    types = check_follow_definition_types("import pkg.mod1; pkg.mod1.a")
    assert types == ['instance']


def test_follow_definition_land_on_import():
    types = check_follow_definition_types("import datetime; datetim")
    assert types == ['module']
