"""
Test situations where we don't have a definition for a type, but we have (some)
of its member functions.
"""

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


class TestCppIncompleteTypeMembers(TestBase):
    @skipIf(oslist=["darwin", "macos"], debug_info="gmodules")
    def test(self):
        self.build()
        lldbutil.run_to_source_breakpoint(
            self, "// break here", lldb.SBFileSpec("f.cpp")
        )

        # Sanity check that we really have to debug info for this type.
        this = self.expect_var_path("this", type="A *")
        self.assertEqual(
            this.GetType().GetPointeeType().GetNumberOfFields(), 0, str(this)
        )

        self.expect_var_path("af.x", value="42")

        lldbutil.run_break_set_by_source_regexp(
            self, "// break here", extra_options="-f g.cpp"
        )
        self.runCmd("continue")

        self.expect_var_path("ag.a", value="47")
