"""
Test some target commands: create, list, select, variable.
"""

import unittest2
import lldb
import sys
from lldbtest import *
import lldbutil

class targetCommandTestCase(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        # Find the line numbers for our breakpoints.
        self.line_b = line_number('b.c', '// Set break point at this line.')
        self.line_c = line_number('c.c', '// Set break point at this line.')

    @dwarf_test
    def test_target_command_with_dwarf(self):
        """Test some target commands: create, list, select."""
        da = {'C_SOURCES': 'a.c', 'EXE': 'a.out'}
        self.buildDwarf(dictionary=da)
        self.addTearDownCleanup(dictionary=da)

        db = {'C_SOURCES': 'b.c', 'EXE': 'b.out'}
        self.buildDwarf(dictionary=db)
        self.addTearDownCleanup(dictionary=db)

        dc = {'C_SOURCES': 'c.c', 'EXE': 'c.out'}
        self.buildDwarf(dictionary=dc)
        self.addTearDownCleanup(dictionary=dc)

        self.do_target_command()

    # rdar://problem/9763907
    # 'target variable' command fails if the target program has been run
    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
    @dsym_test
    def test_target_variable_command_with_dsym(self):
        """Test 'target variable' command before and after starting the inferior."""
        d = {'C_SOURCES': 'globals.c', 'EXE': 'globals'}
        self.buildDsym(dictionary=d)
        self.addTearDownCleanup(dictionary=d)

        self.do_target_variable_command('globals')

    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
    @dsym_test
    def test_target_variable_command_with_dsym_no_fail(self):
        """Test 'target variable' command before and after starting the inferior."""
        d = {'C_SOURCES': 'globals.c', 'EXE': 'globals'}
        self.buildDsym(dictionary=d)
        self.addTearDownCleanup(dictionary=d)

        self.do_target_variable_command_no_fail('globals')

    def do_target_command(self):
        """Exercise 'target create', 'target list', 'target select' commands."""
        exe_a = os.path.join(os.getcwd(), "a.out")
        exe_b = os.path.join(os.getcwd(), "b.out")
        exe_c = os.path.join(os.getcwd(), "c.out")

        self.runCmd("target list")
        output = self.res.GetOutput()
        if output.startswith("No targets"):
            # We start from index 0.
            base = 0
        else:
            # Find the largest index of the existing list.
            import re
            pattern = re.compile("target #(\d+):")
            for line in reversed(output.split(os.linesep)):
                match = pattern.search(line)
                if match:
                    # We will start from (index + 1) ....
                    base = int(match.group(1), 10) + 1
                    #print "base is:", base
                    break;

        self.runCmd("target create " + exe_a, CURRENT_EXECUTABLE_SET)
        self.runCmd("run", RUN_SUCCEEDED)

        self.runCmd("target create " + exe_b, CURRENT_EXECUTABLE_SET)
        lldbutil.run_break_set_by_file_and_line (self, 'b.c', self.line_b, num_expected_locations=1, loc_exact=True)
        self.runCmd("run", RUN_SUCCEEDED)

        self.runCmd("target create " + exe_c, CURRENT_EXECUTABLE_SET)
        lldbutil.run_break_set_by_file_and_line (self, 'c.c', self.line_c, num_expected_locations=1, loc_exact=True)
        self.runCmd("run", RUN_SUCCEEDED)

        self.runCmd("target list")

        self.runCmd("target select %d" % base)
        self.runCmd("thread backtrace")

        self.runCmd("target select %d" % (base + 2))
        self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT,
            substrs = ['c.c:%d' % self.line_c,
                       'stop reason = breakpoint'])

        self.runCmd("target select %d" % (base + 1))
        self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT,
            substrs = ['b.c:%d' % self.line_b,
                       'stop reason = breakpoint'])

        self.runCmd("target list")

    def do_target_variable_command(self, exe_name):
        """Exercise 'target variable' command before and after starting the inferior."""
        self.runCmd("file " + exe_name, CURRENT_EXECUTABLE_SET)

        self.expect("target variable my_global_char", VARIABLES_DISPLAYED_CORRECTLY,
            substrs = ["my_global_char", "'X'"])
        self.expect("target variable my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
            substrs = ['my_global_str', '"abc"'])
        self.expect("target variable my_static_int", VARIABLES_DISPLAYED_CORRECTLY,
            substrs = ['my_static_int', '228'])
        self.expect("target variable my_global_str_ptr", matching=False,
                    substrs = ['"abc"'])
        self.expect("target variable *my_global_str_ptr", matching=True,
                    substrs = ['"abc"'])
        self.expect("target variable *my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
                    substrs = ['a'])

        self.runCmd("b main")
        self.runCmd("run")
        
        self.expect("target variable my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
                    substrs = ['my_global_str', '"abc"'])
        self.expect("target variable my_static_int", VARIABLES_DISPLAYED_CORRECTLY,
                    substrs = ['my_static_int', '228'])
        self.expect("target variable my_global_str_ptr", matching=False,
                    substrs = ['"abc"'])
        self.expect("target variable *my_global_str_ptr", matching=True,
                    substrs = ['"abc"'])
        self.expect("target variable *my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
                    substrs = ['a'])
        self.expect("target variable my_global_char", VARIABLES_DISPLAYED_CORRECTLY,
                    substrs = ["my_global_char", "'X'"])

        self.runCmd("c")

        # rdar://problem/9763907
        # 'target variable' command fails if the target program has been run
        self.expect("target variable my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
            substrs = ['my_global_str', '"abc"'])
        self.expect("target variable my_static_int", VARIABLES_DISPLAYED_CORRECTLY,
            substrs = ['my_static_int', '228'])
        self.expect("target variable my_global_str_ptr", matching=False,
                    substrs = ['"abc"'])
        self.expect("target variable *my_global_str_ptr", matching=True,
                    substrs = ['"abc"'])
        self.expect("target variable *my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
                    substrs = ['a'])
        self.expect("target variable my_global_char", VARIABLES_DISPLAYED_CORRECTLY,
                    substrs = ["my_global_char", "'X'"])

    def do_target_variable_command_no_fail(self, exe_name):
        """Exercise 'target variable' command before and after starting the inferior."""
        self.runCmd("file " + exe_name, CURRENT_EXECUTABLE_SET)

        self.expect("target variable my_global_char", VARIABLES_DISPLAYED_CORRECTLY,
            substrs = ["my_global_char", "'X'"])
        self.expect("target variable my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
            substrs = ['my_global_str', '"abc"'])
        self.expect("target variable my_static_int", VARIABLES_DISPLAYED_CORRECTLY,
            substrs = ['my_static_int', '228'])
        self.expect("target variable my_global_str_ptr", matching=False,
                    substrs = ['"abc"'])
        self.expect("target variable *my_global_str_ptr", matching=True,
                    substrs = ['"abc"'])
        self.expect("target variable *my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
                    substrs = ['a'])

        self.runCmd("b main")
        self.runCmd("run")
        
        # New feature: you don't need to specify the variable(s) to 'target vaiable'.
        # It will find all the global and static variables in the current compile unit.
        self.expect("target variable",
            substrs = ['my_global_char',
                       'my_global_str',
                       'my_global_str_ptr',
                       'my_static_int'])

        self.expect("target variable my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
                    substrs = ['my_global_str', '"abc"'])
        self.expect("target variable my_static_int", VARIABLES_DISPLAYED_CORRECTLY,
                    substrs = ['my_static_int', '228'])
        self.expect("target variable my_global_str_ptr", matching=False,
                    substrs = ['"abc"'])
        self.expect("target variable *my_global_str_ptr", matching=True,
                    substrs = ['"abc"'])
        self.expect("target variable *my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
                    substrs = ['a'])
        self.expect("target variable my_global_char", VARIABLES_DISPLAYED_CORRECTLY,
                    substrs = ["my_global_char", "'X'"])

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