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


class TestPtrAuthObjectiveC(TestBase):
    NO_DEBUG_INFO_TESTCASE = True
    SHARED_BUILD_TESTCASE = False

    def build_arm64e(self):
        self.build(
            dictionary={"TRIPLE": configuration.triple.replace("arm64", "arm64e")}
        )

    @skipUnlessArm64eSupported
    def test_objc_message_send(self):
        self.build_arm64e()

        lldbutil.run_to_source_breakpoint(
            self, "// break here", lldb.SBFileSpec("main.m", False)
        )

        self.expect_expr(
            "[obj doubleValue]",
            result_type="int",
            result_value="42",
        )

    @skipUnlessArm64eSupported
    def test_objc_message_send_with_arg(self):
        self.build_arm64e()

        lldbutil.run_to_source_breakpoint(
            self, "// break here", lldb.SBFileSpec("main.m", False)
        )

        self.expect_expr(
            "[obj addValue:9]",
            result_type="int",
            result_value="30",
        )

    @skipUnlessArm64eSupported
    def test_objc_alloc_and_message(self):
        self.build_arm64e()

        lldbutil.run_to_source_breakpoint(
            self, "// break here", lldb.SBFileSpec("main.m", False)
        )

        self.expect_expr(
            "PtrAuthTestObj *tmp = (PtrAuthTestObj *)[[PtrAuthTestObj alloc] init]; "
            "tmp.value = 7; [tmp doubleValue]",
            result_type="int",
            result_value="14",
        )

    @skipUnlessArm64eSupported
    def test_objc_derived_class(self):
        self.build_arm64e()

        lldbutil.run_to_source_breakpoint(
            self, "// break here", lldb.SBFileSpec("main.m", False)
        )

        self.expect_expr(
            "[derived tripleValue]",
            result_type="int",
            result_value="30",
        )

        self.expect_expr(
            "[derived doubleValue]",
            result_type="int",
            result_value="20",
        )

    @skipUnlessArm64eSupported
    def test_objc_isa_check(self):
        self.build_arm64e()

        lldbutil.run_to_source_breakpoint(
            self, "// break here", lldb.SBFileSpec("main.m", False)
        )

        self.expect_expr(
            "(bool)[derived isKindOfClass:[PtrAuthTestObj class]]",
            result_type="bool",
            result_value="true",
        )

        self.expect_expr(
            "(bool)[obj isKindOfClass:[PtrAuthDerived class]]",
            result_type="bool",
            result_value="false",
        )
