"""
Tests that frame variable and expr work for
C++ unions and their static data members.
"""
import lldb
from lldbsuite.test.lldbtest import *
from lldbsuite.test.decorators import *
import lldbsuite.test.lldbutil as lldbutil

class CppUnionStaticMembersTestCase(TestBase):
    def test_print_union(self):
        """Tests that frame variable and expr work
        for union with static data members"""
        self.build()

        (target, process, main_thread, _) = lldbutil.run_to_source_breakpoint(
            self, "return 0", lldb.SBFileSpec("main.cpp")
        )

        self.expect("frame variable foo", substrs=["val = 42"])
        self.expect("frame variable bar", substrs=["val = 137"])

        self.expect_expr("foo", result_type="Foo", result_children=[ValueCheck(
                name="val", value="42"
            )])
        self.expect_expr("bar", result_type="Bar", result_children=[ValueCheck(
                name="val", value="137"
            )])

    @expectedFailureWindows
    def test_expr_union_static_members(self):
        """Tests that frame variable and expr work
        for union static data members"""
        self.build()

        (target, process, main_thread, _) = lldbutil.run_to_source_breakpoint(
            self, "return 0", lldb.SBFileSpec("main.cpp")
        )

        self.expect_expr("Foo::sVal1", result_type="const int", result_value="-42")
        self.expect_expr("Foo::sVal2", result_type="Foo", result_children=[ValueCheck(
                name="val", value="42"
            )])

    @expectedFailureWindows
    def test_union_in_anon_namespace(self):
        """Tests that frame variable and expr work
           for union static data members in anonymous
           namespaces"""
        self.build()

        (target, process, main_thread, _) = lldbutil.run_to_source_breakpoint(
            self, "return 0", lldb.SBFileSpec("main.cpp")
        )

        self.expect_expr("Bar::sVal1", result_type="const int", result_value="-137")
        self.expect_expr("Bar::sVal2", result_type="Bar", result_children=[ValueCheck(
                name="val", value="137"
            )])
