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


@skipIfWasm  # no expression evaluation
class TestCase(TestBase):
    def common_setup(self):
        self.build()
        lldbutil.run_to_source_breakpoint(
            self, "// break here", lldb.SBFileSpec("main.cpp")
        )

    def test_call_on_base(self):
        self.common_setup()
        self.expect_expr("base_with_dtor.foo()", result_type="int", result_value="1")
        self.expect_expr("base_without_dtor.foo()", result_type="int", result_value="2")

    def test_call_on_derived(self):
        self.common_setup()
        self.expect_expr("derived_with_dtor.foo()", result_type="int", result_value="3")
        self.expect_expr(
            "derived_without_dtor.foo()", result_type="int", result_value="4"
        )
        self.expect_expr(
            "derived_with_base_dtor.foo()", result_type="int", result_value="5"
        )
        self.expect_expr(
            "derived_with_dtor_but_no_base_dtor.foo()",
            result_type="int",
            result_value="6",
        )

    def test_call_on_derived_as_base(self):
        self.common_setup()
        self.expect_expr(
            "derived_with_dtor_as_base.foo()", result_type="int", result_value="3"
        )
        self.expect_expr(
            "derived_without_as_base.foo()", result_type="int", result_value="4"
        )
        self.expect_expr(
            "derived_with_base_dtor_as_base.foo()", result_type="int", result_value="5"
        )
        self.expect_expr(
            "derived_with_dtor_but_no_base_dtor_as_base.foo()",
            result_type="int",
            result_value="6",
        )

    def test_call_overloaded(self):
        self.common_setup()
        self.expect(
            "expr derived_with_overload.foo()",
            error=True,
            substrs=["too few arguments to function call, expected 1, have 0"],
        )
        self.expect_expr(
            "derived_with_overload.foo(1)", result_type="int", result_value="7"
        )
        self.expect_expr(
            "derived_with_overload_and_using.foo(1)",
            result_type="int",
            result_value="8",
        )
        # FIXME: It seems the using declaration doesn't import the overload from the base class.
        self.expect(
            "expr derived_with_overload_and_using.foo()",
            error=True,
            substrs=["too few arguments to function call, expected 1, have 0"],
        )
