# Based on work by Stephen Gildea, October 2010.

import pytest

from conftest import assert_bash_exec


@pytest.mark.bashcomp(cmd=None, ignore_env=r"^\+COMPREPLY=")
class TestUnitLongopt:
    @pytest.fixture(scope="class")
    def functions(self, request, bash):
        assert_bash_exec(bash, "_grephelp() { cat _longopt/grep--help.txt; }")
        assert_bash_exec(bash, "complete -F _longopt _grephelp")
        assert_bash_exec(bash, "_various() { cat _longopt/various.txt; }")
        assert_bash_exec(bash, "complete -F _longopt _various")

    @pytest.mark.complete("_grephelp --")
    def test_1(self, functions, completion):
        """First long option should be included"""
        assert completion
        assert all(
            x in completion for x in "--quiet --recursive --text".split()
        )

    @pytest.mark.complete("_grephelp -")
    def test_2(self, functions, completion):
        """Only long options should be included"""
        assert completion
        assert all(x.startswith("--") for x in completion)

    @pytest.mark.complete("_grephelp --")
    def test_3(self, functions, completion):
        """Should have both ones ending with a = and ones not"""
        assert completion
        assert any(x.endswith("=") for x in completion)
        assert any(not x.endswith("=") for x in completion)

    @pytest.mark.complete("_various --")
    def test_no_dashdashdash(self, functions, completion):
        assert all(not x.startswith("---") for x in completion)

    @pytest.mark.complete("_various --")
    def test_no_trailingdash(self, functions, completion):
        assert all(not x.endswith("-") for x in completion)

    @pytest.mark.complete("_various --")
    def test_underscore(self, functions, completion):
        assert "--foo_bar" in completion

    @pytest.mark.complete("_various --")
    def test_equals(self, functions, completion):
        assert "--foo=" in completion
