"""
Test lldb breakpoint command for CPP methods & functions in a namespace.
"""


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


class CPPBreakpointCommandsTestCase(TestBase):
    def make_breakpoint(self, name, type, expected_num_locations):
        bkpt = self.target.BreakpointCreateByName(
            name, type, self.a_out_module, self.nested_comp_unit
        )
        num_locations = bkpt.GetNumLocations()
        self.assertEqual(
            num_locations,
            expected_num_locations,
            "Wrong number of locations for '%s', expected: %d got: %d"
            % (name, expected_num_locations, num_locations),
        )
        return bkpt

    def test_cpp_breakpoint_cmds(self):
        """Test a sequence of breakpoint command add, list, and delete."""
        self.build()

        exe = self.getBuildArtifact("a.out")

        # Create a target from the debugger.

        self.target = self.dbg.CreateTarget(exe)
        self.assertTrue(self.target, VALID_TARGET)

        self.a_out_module = lldb.SBFileSpecList()
        self.a_out_module.Append(lldb.SBFileSpec(exe))

        self.nested_comp_unit = lldb.SBFileSpecList()
        self.nested_comp_unit.Append(lldb.SBFileSpec("nested.cpp"))

        # First provide ONLY the method name.  This should get everybody...
        self.make_breakpoint("Function", lldb.eFunctionNameTypeAuto, 5)

        # Now add the Baz class specifier.  This should get the version contained in Bar,
        # AND the one contained in ::
        self.make_breakpoint("Baz::Function", lldb.eFunctionNameTypeAuto, 2)

        # Then add the Bar::Baz specifier.  This should get the version
        # contained in Bar only
        self.make_breakpoint("Bar::Baz::Function", lldb.eFunctionNameTypeAuto, 1)

        self.make_breakpoint("Function", lldb.eFunctionNameTypeMethod, 3)

        self.make_breakpoint("Baz::Function", lldb.eFunctionNameTypeMethod, 2)

        self.make_breakpoint("Bar::Baz::Function", lldb.eFunctionNameTypeMethod, 1)

        self.make_breakpoint("Function", lldb.eFunctionNameTypeBase, 2)

        self.make_breakpoint("Bar::Function", lldb.eFunctionNameTypeBase, 1)
