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


class TestCase(TestBase):
    def test(self):
        """
        Tests that running the utility expression that retrieves the Objective-C
        class list works even when user-code contains functions with apparently
        conflicting identifiers (e.g. 'free') but that are not in the global
        scope.

        This is *not* supposed to test what happens when there are actual
        conflicts such as when a user somehow defined their own '::free'
        function.
        """

        self.build()
        lldbutil.run_to_source_breakpoint(
            self, "// break here", lldb.SBFileSpec("main.mm")
        )

        # First check our side effect variable is in its initial state.
        self.expect_expr("called_function", result_summary='"none"')

        # Get the (dynamic) type of our 'id' variable so that our Objective-C
        # runtime information is updated.
        str_val = self.expect_expr("str")
        dyn_val = str_val.GetDynamicValue(lldb.eDynamicCanRunTarget)
        dyn_type = dyn_val.GetTypeName()

        # Check our side effect variable which should still be in its initial
        # state if none of our trap functions were called.
        # If this is failing, then LLDB called one of the trap functions.
        self.expect_expr("called_function", result_summary='"none"')

        # Double check that our dynamic type is correct. This is done last
        # as the assert message from above is the more descriptive one (it
        # contains the unintentionally called function).
        self.assertEqual(dyn_type, "__NSCFConstantString *")
