"""
Test some lldb command abbreviations.
"""

import os, time
import unittest2
import lldb
from lldbtest import *

class AbbreviationsTestCase(TestBase):
    
    mydir = "abbreviation_tests"

    def test_nonrunning_command_abbreviations (self):
        self.expect("ap script",
                    startstr = "The following commands may relate to 'script':",
                    substrs = ['breakpoint command add',
                               'breakpoint command list',
                               'breakpoint list',
                               'commands alias',
                               'expression',
                               'script'])

        self.runCmd("com a alias com al")
        self.runCmd("alias gurp help")
        self.expect("gurp file",
                    substrs = ['Syntax: file <cmd-options> <filename>'])
        self.runCmd("com u gurp")
        self.expect("gurp",
                    COMMAND_FAILED_AS_EXPECTED, error = True,
                    substrs = ["error: 'gurp' is not a valid command."])

        self.expect("h",
                    startstr = "The following is a list of built-in, permanent debugger commands:")


        self.expect("com s ./change_prompt.lldb",
                    patterns = ["Executing commands in '.*change_prompt.lldb'"])

        self.expect("settings show prompt",
                    startstr = "prompt (string) = '[old-oak]'")


        self.runCmd("settings set -r prompt")
        self.expect("settings show prompt",
                    startstr = "prompt (string) = '(lldb) '")


        self.expect("lo li",
                    startstr = "Logging categories for 'lldb':")

        self.runCmd("se se prompt Sycamore> ")
        self.expect("se sh prompt",
                    startstr = "prompt (string) = 'Sycamore>'")

        self.runCmd("se se -r prompt")
        self.expect("set sh prompt",
                    startstr = "prompt (string) = '(lldb) '")

        self.runCmd (r'''sc print "\n\n\tHello!\n"''')


    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
    def test_with_dsym (self):
        self.buildDsym ()
        self.running_abbreviations ()

    def test_with_dwarf (self):
        self.buildDwarf ()
        self.running_abbreviations ()

    def running_abbreviations (self):
        exe = os.path.join (os.getcwd(), "a.out")
        self.expect("fil " + exe,
                    patterns = [ "Current executable set to .*a.out.*(x86_64)" ])

        self.expect("regex product",
                    substrs = [ "breakpoint set --name 'product'",
                                "Breakpoint created: 1: name = 'product', locations = 1" ])

        self.expect("br s -n sum",
                    startstr = "Breakpoint created: 2: name = 'sum', locations = 1")

        self.expect("br s -f main.cpp -l 32",
                    startstr = "Breakpoint created: 3: file ='main.cpp', line = 32, locations = 1")

        self.runCmd("br co a -p 1 -o 'print frame'")
        self.expect("br co l 1",
                    substrs = [ "Breakpoint 1:",
                                "Breakpoint commands:",
                                "print frame" ])

        self.runCmd("br co rem 1")
        self.expect("breakpoint command list 1",
                    startstr = "Breakpoint 1 does not have an associated command.")

        self.expect("br di",
                    startstr = 'All breakpoints disabled. (3 breakpoints)')

        self.expect("bre e",
                    startstr = "All breakpoints enabled. (3 breakpoints)")

        self.expect("break list",
                    substrs = ["1: name = 'product', locations = 1",
                               "2: name = 'sum', locations = 1",
                               "3: file ='main.cpp', line = 32, locations = 1"])
        self.expect("br cl -l 32 -f main.cpp",
                    startstr = "1 breakpoints cleared:",
                    substrs = ["3: file ='main.cpp', line = 32, locations = 1"])

        self.expect("pro la",
                    patterns = [ "Process .* launched: "])

        self.expect("pro st",
                    patterns = [ "Process .* stopped",
                                 "thread #1:",
                                 "a.out",
                                 "sum\(int, int\)",
                                 "at main.cpp\:25", 
                                 "stop reason = breakpoint 2.1" ])

        self.expect("d -f",
                    startstr = "a.out`sum(int, int):",
                    substrs = [' pushq ',
                               ' movq ',
                               ' addl ',
                               'leave',
                               'ret'])

        self.expect("i d l main.cpp",
                    patterns = ["Line table for .*main.cpp in `a.out"])

        self.expect("i d se",
                    startstr = "Dumping sections for 5 modules.")

        self.expect("i d symf",
                    startstr = "Dumping debug symbols for 5 modules.")

        self.expect("i d symt",
                    startstr = "Dumping symbol table for 5 modules.")

        self.expect("i li",
                    substrs = [ 'a.out',
                                '/usr/lib/dyld',
                                '/usr/lib/libstdc++',
                                '/usr/lib/libSystem.B.dylib',
                                '/usr/lib/system/libmathCommon.A.dylib'])




if __name__ == '__main__':
    import atexit
    lldb.SBDebugger.Initialize()
    atexit.register(lambda: lldb.SBDebugger.Terminate())
    unittest2.main()


@@ -2473,16 +2473,8 @@
 ut.*
-(x86_64)
 %22 %5D)
@@ -4553,18 +4553,16 @@
  %5B' push
-q 
 ',%0A     
@@ -4596,10 +4596,8 @@
  mov
-q 
 ',%0A 
@@ -4672,16 +4672,68 @@
    '
-leave',%0A
+ret'%5D,%0A                    patterns = %5B'(leave%7Cpopq%7Cpopl)'%5D)
     
@@ -4763,15 +4763,8 @@
     
-'ret'%5D)
 %0A%0A  

Modify the test case to run under ['gcc', 'llvm-gcc', 'clang'] x ['x86_64', 'i386'] combinations.