import lldb
from lldbsuite.test.lldbtest import *
import lldbsuite.test.lldbutil as lldbutil
from lldbsuite.test.decorators import *


@skipIfTargetDoesNotSupportSharedLibraries()
class TestMoveNearest(TestBase):
    NO_DEBUG_INFO_TESTCASE = True

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        # Find the line number to break inside main().
        self.line1 = line_number("foo.h", "// !BR1")
        self.line2 = line_number("foo.h", "// !BR2")
        self.line_between = line_number("main.cpp", "// BR_Between")
        print("BR_Between found at", self.line_between)
        self.line_main = line_number("main.cpp", "// !BR_main")

    def test(self):
        """Test target.move-to-nearest logic"""

        self.build()
        target = self.dbg.CreateTarget(self.getBuildArtifact("a.out"))
        self.assertTrue(target, VALID_TARGET)

        lldbutil.run_break_set_by_symbol(self, "main", sym_exact=True)
        environment = self.registerSharedLibrariesWithTarget(target, ["foo"])
        process = target.LaunchSimple(
            None, environment, self.get_process_working_directory()
        )
        self.assertState(process.GetState(), lldb.eStateStopped)

        # Regardless of the -m value the breakpoint should have exactly one
        # location on the foo functions
        self.runCmd("settings set target.move-to-nearest-code true")
        lldbutil.run_break_set_by_file_and_line(
            self, "foo.h", self.line1, loc_exact=True, extra_options="-m 1"
        )
        lldbutil.run_break_set_by_file_and_line(
            self, "foo.h", self.line2, loc_exact=True, extra_options="-m 1"
        )

        self.runCmd("settings set target.move-to-nearest-code false")
        lldbutil.run_break_set_by_file_and_line(
            self, "foo.h", self.line1, loc_exact=True, extra_options="-m 0"
        )
        lldbutil.run_break_set_by_file_and_line(
            self, "foo.h", self.line2, loc_exact=True, extra_options="-m 0"
        )

        # Make sure we set a breakpoint in main with -m 1 for various lines in
        # the function declaration
        # "int"
        lldbutil.run_break_set_by_file_and_line(
            self, "main.cpp", self.line_main - 1, extra_options="-m 1"
        )
        # "main()"
        lldbutil.run_break_set_by_file_and_line(
            self, "main.cpp", self.line_main, extra_options="-m 1"
        )
        # "{"
        lldbutil.run_break_set_by_file_and_line(
            self, "main.cpp", self.line_main + 1, extra_options="-m 1"
        )
        # "return .."
        lldbutil.run_break_set_by_file_and_line(
            self, "main.cpp", self.line_main + 2, extra_options="-m 1"
        )

        # Make sure we don't put move the breakpoint if it is set between two functions:
        lldbutil.run_break_set_by_file_and_line(
            self,
            "main.cpp",
            self.line_between,
            extra_options="-m 1",
            num_expected_locations=0,
        )
