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


class TestCase(TestBase):
    NO_DEBUG_INFO_TESTCASE = True

    def run_class_tests(self):
        # Expression not referencing context class.
        self.expect_expr("1 + 1", result_type="int", result_value="2")
        # Referencing context class.
        self.expect_expr("member", result_type="const int", result_value="3")
        # Check the type of context class.
        self.expect_expr("this", result_type="const ContextClass *")

    def test_member_func(self):
        self.build()
        lldbutil.run_to_source_breakpoint(
            self, "// break in function in class.", lldb.SBFileSpec("main.cpp")
        )
        self.run_class_tests()

    def test_templated_member_func(self):
        self.build()
        lldbutil.run_to_source_breakpoint(
            self,
            "// break in templated function in class.",
            lldb.SBFileSpec("main.cpp"),
        )
        self.run_class_tests()

    def run_template_class_tests(self):
        # Expression not referencing context class.
        self.expect_expr("1 + 1", result_type="int", result_value="2")
        # Referencing context class.
        self.expect_expr("member", result_type="const int", result_value="4")
        # Check the type of context class.
        self.expect_expr("this", result_type="const TemplatedContextClass<int> *")

    def test_template_member_func(self):
        self.build()
        lldbutil.run_to_source_breakpoint(
            self,
            "// break in function in templated class.",
            lldb.SBFileSpec("main.cpp"),
        )
        self.run_template_class_tests()

    def test_template_templated_member_func(self):
        self.build()
        lldbutil.run_to_source_breakpoint(
            self,
            "// break in templated function in templated class.",
            lldb.SBFileSpec("main.cpp"),
        )
        self.run_template_class_tests()
