from test.constant import *
from test.vim_test_case import VimTestCase as _VimTest


class ContextSnippets_SimpleSnippet(_VimTest):
    files = { 'us/all.snippets': r"""
        snippet a "desc" "True" e
        abc
        endsnippet
        """}
    keys = 'a' + EX
    wanted = 'abc'

class ContextSnippets_ExpandOnTrue(_VimTest):
    files = { 'us/all.snippets': r"""
        global !p
        def check_context():
            return True
        endglobal

        snippet a "desc" "check_context()" e
        abc
        endsnippet
        """}
    keys = 'a' + EX
    wanted = 'abc'


class ContextSnippets_DoNotExpandOnFalse(_VimTest):
    files = { 'us/all.snippets': r"""
        global !p
        def check_context():
            return False
        endglobal

        snippet a "desc" "check_context()" e
        abc
        endsnippet
        """}
    keys = 'a' + EX
    wanted = keys


class ContextSnippets_UseContext(_VimTest):
    files = { 'us/all.snippets': r"""
        global !p
        def wrap(ins):
            return "< " + ins + " >"
        endglobal

        snippet a "desc" "wrap(snip.buffer[snip.line])" e
        { `!p snip.rv = context` }
        endsnippet
        """}
    keys = 'a' + EX
    wanted = '{ < a > }'


class ContextSnippets_SnippetPriority(_VimTest):
    files = { 'us/all.snippets': r"""
        snippet i "desc" "re.search('err :=', snip.buffer[snip.line-1])" e
        if err != nil {
            ${1:// pass}
        }
        endsnippet

        snippet i
        if ${1:true} {
            ${2:// pass}
        }
        endsnippet
        """}

    keys = r"""
        err := some_call()
        i""" + EX + JF +  """
        i""" + EX
    wanted = r"""
        err := some_call()
        if err != nil {
            // pass
        }
        if true {
            // pass
        }"""


class ContextSnippets_PriorityKeyword(_VimTest):
    files = { 'us/all.snippets': r"""
        snippet i "desc" "True" e
        a
        endsnippet

        priority 100
        snippet i
        b
        endsnippet
        """}

    keys = 'i' + EX
    wanted = 'b'


class ContextSnippets_ReportError(_VimTest):
    files = { 'us/all.snippets': r"""
        snippet e "desc" "Tru" e
        error
        endsnippet
        """}

    keys = 'e' + EX
    wanted = 'e' + EX
    expected_error = r"NameError: name 'Tru' is not defined"


class ContextSnippets_ReportErrorOnIndexOutOfRange(_VimTest):
    # Working around: https://github.com/neovim/python-client/issues/128.
    skip_if = lambda self: 'Bug in Neovim.' \
            if self.vim_flavor == 'neovim' else None
    files = { 'us/all.snippets': r"""
        snippet e "desc" "snip.buffer[123]" e
        error
        endsnippet
        """}

    keys = 'e' + EX
    wanted = 'e' + EX
    expected_error = r"IndexError: line number out of range"


class ContextSnippets_CursorIsZeroBased(_VimTest):
    files = { 'us/all.snippets': r"""
        snippet e "desc" "snip.cursor" e
        `!p snip.rv = str(snip.context)`
        endsnippet
        """}

    keys = "e" + EX
    wanted = "(2, 1)"


class ContextSnippets_ContextIsClearedBeforeExpand(_VimTest):
    files = { 'us/all.snippets': r"""
        pre_expand "snip.context = 1 if snip.context is None else 2"
        snippet e "desc" w
        `!p snip.rv = str(snip.context)`
        endsnippet
        """}

    keys = "e" + EX + " " + "e" + EX
    wanted = "1 1"

class ContextSnippets_ContextHasAccessToVisual(_VimTest):
    files = { 'us/all.snippets': r"""
        snippet test "desc" "snip.visual_text == '123'" we
        Yes
        endsnippet

        snippet test "desc" w
        No
        endsnippet
        """}

    keys = "123" + ESC + "vhh" + EX + "test" + EX + " zzz" + ESC + \
        "vhh" + EX + "test" + EX
    wanted = "Yes No"


class ContextSnippets_Header_ExpandOnTrue(_VimTest):
    files = { 'us/all.snippets': r"""
        global !p
        def check_context():
            return True
        endglobal

        context "check_context()"
        snippet a "desc" e
        abc
        endsnippet
        """}
    keys = 'a' + EX
    wanted = 'abc'


class ContextSnippets_Header_DoNotExpandOnFalse(_VimTest):
    files = { 'us/all.snippets': r"""
        global !p
        def check_context():
            return False
        endglobal

        context "check_context()"
        snippet a "desc" e
        abc
        endsnippet
        """}
    keys = 'a' + EX
    wanted = keys
