"""
Test scopes in C++.
"""
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class TestCppScopes(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764")
    def test_all_but_c(self):
        self.do_test(False)

    @expectedFailureAll(oslist=["windows"])
    def test_c(self):
        self.do_test(True)

    def do_test(self, test_c):
        self.build()

        # Get main source file
        src_file = os.path.join(self.getSourceDir(), "main.cpp")
        src_file_spec = lldb.SBFileSpec(src_file)
        self.assertTrue(src_file_spec.IsValid(), "Main source file")

        # Get the path of the executable
        exe_path = self.getBuildArtifact("a.out")

        # Load the executable
        target = self.dbg.CreateTarget(exe_path)
        self.assertTrue(target.IsValid(), VALID_TARGET)

        # Break on main function
        main_breakpoint = target.BreakpointCreateBySourceRegex(
            "// break here", src_file_spec)
        self.assertTrue(
            main_breakpoint.IsValid() and main_breakpoint.GetNumLocations() >= 1,
            VALID_BREAKPOINT)

        # Launch the process
        args = None
        env = None
        process = target.LaunchSimple(
            args, env, self.get_process_working_directory())
        self.assertTrue(process.IsValid(), PROCESS_IS_VALID)

        # Get the thread of the process
        self.assertTrue(
            process.GetState() == lldb.eStateStopped,
            PROCESS_STOPPED)
        thread = lldbutil.get_stopped_thread(
            process, lldb.eStopReasonBreakpoint)

        # Get current fream of the thread at the breakpoint
        frame = thread.GetSelectedFrame()

        # Test result for scopes of variables

        global_variables = frame.GetVariables(True, True, True, False)
        global_variables_assert = {
            'A::a': 1111,
            'B::a': 2222,
            'C::a': 3333,
            '::a': 4444,
            'a': 4444
        }

        self.assertTrue(
            global_variables.GetSize() == 4,
            "target variable returns all variables")
        for variable in global_variables:
            name = variable.GetName()
            self.assertTrue(
                name in global_variables_assert,
                "target variable returns wrong variable " + name)

        for name in global_variables_assert:
            if name is "C::a" and not test_c:
                continue
            if name is not "C::a" and test_c:
                continue

            value = frame.EvaluateExpression(name)
            assert_value = global_variables_assert[name]
            self.assertTrue(
                value.IsValid() and value.GetValueAsSigned() == assert_value,
                name + " = " + str(assert_value))
