from __future__ import absolute_import

# System modules
import os
import sys

# Third-party modules
import six

# LLDB Modules
import lldb
from .lldbtest import *
from . import lldbutil
from lldbsuite.test.decorators import *

@skipIfRemote
@skipIfWindows  # llvm.org/pr22274: need a pexpect replacement for windows
class PExpectTest(TestBase):

    NO_DEBUG_INFO_TESTCASE = True
    PROMPT = "(lldb) "

    def expect_prompt(self):
        self.child.expect_exact(self.PROMPT)

    def launch(self, executable=None, extra_args=None, timeout=60, dimensions=None):
        logfile = getattr(sys.stdout, 'buffer',
                            sys.stdout) if self.TraceOn() else None

        args = ['--no-lldbinit', '--no-use-colors']
        for cmd in self.setUpCommands():
            args += ['-O', cmd]
        if executable is not None:
            args += ['--file', executable]
        if extra_args is not None:
            args.extend(extra_args)

        env = dict(os.environ)
        env["TERM"] = "vt100"
        env["HOME"] = self.getBuildDir()

        import pexpect
        self.child = pexpect.spawn(
                lldbtest_config.lldbExec, args=args, logfile=logfile,
                timeout=timeout, dimensions=dimensions, env=env)
        self.expect_prompt()
        for cmd in self.setUpCommands():
            self.child.expect_exact(cmd)
            self.expect_prompt()
        if executable is not None:
            self.child.expect_exact("target create")
            self.child.expect_exact("Current executable set to")
            self.expect_prompt()

    def expect(self, cmd, substrs=None):
        self.assertNotIn('\n', cmd)
        # If 'substrs' is a string then this code would just check that every
        # character of the string is in the output.
        assert not isinstance(substrs, six.string_types), \
            "substrs must be a collection of strings"

        self.child.sendline(cmd)
        if substrs is not None:
            for s in substrs:
                self.child.expect_exact(s)
        self.expect_prompt()

    def quit(self, gracefully=True):
        self.child.sendeof()
        self.child.close(force=not gracefully)
        self.child = None

    def cursor_forward_escape_seq(self, chars_to_move):
        """
        Returns the escape sequence to move the cursor forward/right
        by a certain amount of characters.
        """
        return b"\x1b\[" + str(chars_to_move).encode("utf-8") + b"C"
