"""Test that forward declarations don't cause bogus conflicts in namespaced types"""


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


class NamespaceDefinitionsTestCase(TestBase):
    # See also llvm.org/pr28948
    @expectedFailureAll(bugnumber="llvm.org/pr50814", compiler="gcc")
    @expectedFailureAll(
        bugnumber="llvm.org/pr28948",
        oslist=["linux"],
        compiler="gcc",
        archs=["arm$", "aarch64"],
    )
    @expectedFailureAll(oslist=["windows"])
    def test_expr(self):
        self.build()
        self.common_setup()

        self.expect(
            "expression -- Foo::MyClass()",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["thing = "],
        )

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        # Find the line number to break inside main().
        self.source = "main.cpp"
        self.line = line_number(self.source, "// Set breakpoint here")
        self.shlib_names = ["a", "b"]

    def common_setup(self):
        # Run in synchronous mode
        self.dbg.SetAsync(False)

        # Create a target by the debugger.
        target = self.dbg.CreateTarget(self.getBuildArtifact("a.out"))
        self.assertTrue(target, VALID_TARGET)

        # Break inside the foo function which takes a bar_ptr argument.
        lldbutil.run_break_set_by_file_and_line(
            self, self.source, self.line, num_expected_locations=1, loc_exact=True
        )

        # Register our shared libraries for remote targets so they get
        # automatically uploaded
        environment = self.registerSharedLibrariesWithTarget(target, self.shlib_names)

        # Now launch the process, and do not stop at entry point.
        process = target.LaunchSimple(
            None, environment, self.get_process_working_directory()
        )
        self.assertTrue(process, PROCESS_IS_VALID)

        # The stop reason of the thread should be breakpoint.
        self.expect(
            "thread list",
            STOPPED_DUE_TO_BREAKPOINT,
            substrs=["stopped", "stop reason = breakpoint"],
        )

        # The breakpoint should have a hit count of 1.
        lldbutil.check_breakpoint(self, bpno=1, expected_hit_count=1)
