"""
Test some lldb command abbreviations and aliases for proper resolution.
"""

from __future__ import print_function


import os
import time
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class AbbreviationsTestCase(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    @no_debug_info_test
    def test_command_abbreviations_and_aliases(self):
        command_interpreter = self.dbg.GetCommandInterpreter()
        self.assertTrue(command_interpreter, VALID_COMMAND_INTERPRETER)
        result = lldb.SBCommandReturnObject()

        # Check that abbreviations are expanded to the full command.
        command_interpreter.ResolveCommand("ap script", result)
        self.assertTrue(result.Succeeded())
        self.assertEqual("apropos script", result.GetOutput())

        command_interpreter.ResolveCommand("h", result)
        self.assertTrue(result.Succeeded())
        self.assertEqual("help", result.GetOutput())

        # Check resolution of abbreviations for multi-word commands.
        command_interpreter.ResolveCommand("lo li", result)
        self.assertTrue(result.Succeeded())
        self.assertEqual("log list", result.GetOutput())

        command_interpreter.ResolveCommand("br s", result)
        self.assertTrue(result.Succeeded())
        self.assertEqual("breakpoint set", result.GetOutput())

        # Try an ambiguous abbreviation.
        # "pl" could be "platform" or "plugin".
        command_interpreter.ResolveCommand("pl", result)
        self.assertFalse(result.Succeeded())
        self.assertTrue(result.GetError().startswith("Ambiguous command"))

        # Make sure an unabbreviated command is not mangled.
        command_interpreter.ResolveCommand(
            "breakpoint set --name main --line 123", result)
        self.assertTrue(result.Succeeded())
        self.assertEqual(
            "breakpoint set --name main --line 123",
            result.GetOutput())

        # Create some aliases.
        self.runCmd("com a alias com al")
        self.runCmd("alias gurp help")

        # Check that an alias is replaced with the actual command
        command_interpreter.ResolveCommand("gurp target create", result)
        self.assertTrue(result.Succeeded())
        self.assertEqual("help target create", result.GetOutput())

        # Delete the alias and make sure it no longer has an effect.
        self.runCmd("com u gurp")
        command_interpreter.ResolveCommand("gurp", result)
        self.assertFalse(result.Succeeded())

        # Check aliases with text replacement.
        self.runCmd("alias pltty process launch -s -o %1 -e %1")
        command_interpreter.ResolveCommand("pltty /dev/tty0", result)
        self.assertTrue(result.Succeeded())
        self.assertEqual(
            "process launch -s -o /dev/tty0 -e /dev/tty0",
            result.GetOutput())

        self.runCmd("alias xyzzy breakpoint set -n %1 -l %2")
        command_interpreter.ResolveCommand("xyzzy main 123", result)
        self.assertTrue(result.Succeeded())
        self.assertEqual(
            "breakpoint set -n main -l 123",
            result.GetOutput().strip())

        # And again, without enough parameters.
        command_interpreter.ResolveCommand("xyzzy main", result)
        self.assertFalse(result.Succeeded())

        # Check a command that wants the raw input.
        command_interpreter.ResolveCommand(
            r'''sc print("\n\n\tHello!\n")''', result)
        self.assertTrue(result.Succeeded())
        self.assertEqual(
            r'''script print("\n\n\tHello!\n")''',
            result.GetOutput())

        # Prompt changing stuff should be tested, but this doesn't seem like the
        # right test to do it in.  It has nothing to do with aliases or abbreviations.
        #self.runCmd("com sou ./change_prompt.lldb")
        # self.expect("settings show prompt",
        #            startstr = 'prompt (string) = "[with-three-trailing-spaces]   "')
        #self.runCmd("settings clear prompt")
        # self.expect("settings show prompt",
        #            startstr = 'prompt (string) = "(lldb) "')
        #self.runCmd("se se prompt 'Sycamore> '")
        # self.expect("se sh prompt",
        #            startstr = 'prompt (string) = "Sycamore> "')
        #self.runCmd("se cl prompt")
        # self.expect("set sh prompt",
        #            startstr = 'prompt (string) = "(lldb) "')
