"""
Test diamond inheritance.
"""

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


class TestCase(TestBase):
    @no_debug_info_test
    def test_with_sbvalue(self):
        """
        Test that virtual base classes work in when SBValue objects are
        used to explore the class.
        """
        self.build()
        lldbutil.run_to_source_breakpoint(
            self, "// breakpoint 1", lldb.SBFileSpec("main.cpp")
        )

        self.runCmd("settings set target.prefer-dynamic-value no-dynamic-values")

        j1 = self.frame().FindVariable("j1")
        j1_Derived1 = j1.GetChildAtIndex(0)
        j1_Derived2 = j1.GetChildAtIndex(1)
        j1_Derived1_VBase = j1_Derived1.GetChildAtIndex(0)
        j1_Derived2_VBase = j1_Derived2.GetChildAtIndex(0)
        j1_Derived1_VBase_m_value = j1_Derived1_VBase.GetChildAtIndex(0)
        j1_Derived2_VBase_m_value = j1_Derived2_VBase.GetChildAtIndex(0)

        self.assertEqual(
            j1_Derived1_VBase.GetLoadAddress(),
            j1_Derived2_VBase.GetLoadAddress(),
            "ensure virtual base class is the same between Derived1 and Derived2",
        )
        self.assertEqual(
            j1_Derived1_VBase_m_value.GetValueAsUnsigned(1),
            j1_Derived2_VBase_m_value.GetValueAsUnsigned(2),
            "ensure m_value in VBase is the same",
        )
        self.assertEqual(
            self.frame()
            .FindVariable("d")
            .GetChildAtIndex(0)
            .GetChildAtIndex(0)
            .GetValueAsUnsigned(0),
            12345,
            "ensure Derived2 from j1 is correct",
        )

        # This reassigns 'd' to point to 'j2'.
        self.thread().StepOver()

        self.assertEqual(
            self.frame()
            .FindVariable("d")
            .GetChildAtIndex(0)
            .GetChildAtIndex(0)
            .GetValueAsUnsigned(0),
            12346,
            "ensure Derived2 from j2 is correct",
        )

    @no_debug_info_test
    def test(self):
        self.build()
        lldbutil.run_to_source_breakpoint(
            self, "// breakpoint 1", lldb.SBFileSpec("main.cpp")
        )

        # All the children of j1.
        children = [
            ValueCheck(
                type="Derived1",
                children=[
                    ValueCheck(
                        type="VBase",
                        children=[
                            ValueCheck(type="int", name="m_value", value="12345")
                        ],
                    )
                ],
            ),
            ValueCheck(
                type="Derived2",
                children=[
                    ValueCheck(
                        type="VBase",
                        children=[
                            ValueCheck(type="int", name="m_value", value="12345")
                        ],
                    )
                ],
            ),
            ValueCheck(type="long", value="1"),
        ]
        # Try using the class with expression evaluator/variable paths.
        self.expect_expr("j1", result_type="Joiner1", result_children=children)
        self.expect_var_path("j1", type="Joiner1", children=children)

        # Use the expression evaluator to access the members.
        self.expect_expr("j1.x", result_type="long", result_value="1")
        self.expect_expr("j1.m_value", result_type="int", result_value="12345")

        # Use variable paths to access the members.
        self.expect_var_path("j1.x", type="long", value="1")

    @expectedFailureAll
    @no_debug_info_test
    def test_invalid_member(self):
        self.build()
        lldbutil.run_to_source_breakpoint(
            self, "// breakpoint 1", lldb.SBFileSpec("main.cpp")
        )
        # FIXME: This is completely broken and 'succeeds' with an error that
        # there is noch such value/member in Joiner1. Move this up to the test
        # above when fixed.
        self.expect_var_path("j1.m_value", type="int", value="12345")
