"""
Test that SBFrame::GetVariables() calls work correctly.
"""

from __future__ import print_function


import os
import time
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbplatform
from lldbsuite.test import lldbutil


def get_names_from_value_list(value_list):
    names = list()
    for value in value_list:
        names.append(value.GetName())
    return names


class TestGetVariables(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        self.source = 'main.c'

    def verify_variable_names(self, description, value_list, names):
        copy_names = list(names)
        actual_names = get_names_from_value_list(value_list)
        for name in actual_names:
            if name in copy_names:
                copy_names.remove(name)
            else:
                self.assertTrue(
                    False, "didn't find '%s' in %s" %
                    (name, copy_names))
        self.assertEqual(
            len(copy_names), 0, "%s: we didn't find variables: %s in value list (%s)" %
            (description, copy_names, actual_names))

    def test(self):
        self.build()

        # Set debugger into synchronous mode
        self.dbg.SetAsync(False)

        # Create a target by the debugger.
        exe = self.getBuildArtifact("a.out")
        target = self.dbg.CreateTarget(exe)
        self.assertTrue(target, VALID_TARGET)

        line1 = line_number(self.source, '// breakpoint 1')
        line2 = line_number(self.source, '// breakpoint 2')
        line3 = line_number(self.source, '// breakpoint 3')

        breakpoint1 = target.BreakpointCreateByLocation(self.source, line1)
        breakpoint2 = target.BreakpointCreateByLocation(self.source, line2)
        breakpoint3 = target.BreakpointCreateByLocation(self.source, line3)

        self.assertTrue(breakpoint1.GetNumLocations() >= 1, PROCESS_IS_VALID)
        self.assertTrue(breakpoint2.GetNumLocations() >= 1, PROCESS_IS_VALID)
        self.assertTrue(breakpoint3.GetNumLocations() >= 1, PROCESS_IS_VALID)

        # Register our shared libraries for remote targets so they get
        # automatically uploaded
        arguments = None
        environment = None

        # Now launch the process, and do not stop at entry point.
        process = target.LaunchSimple(
            arguments, environment, self.get_process_working_directory())
        self.assertTrue(process, PROCESS_IS_VALID)

        threads = lldbutil.get_threads_stopped_at_breakpoint(
            process, breakpoint1)
        self.assertEqual(
            len(threads),
            1,
            "There should be a thread stopped at breakpoint 1")

        thread = threads[0]
        self.assertTrue(thread.IsValid(), "Thread must be valid")
        frame = thread.GetFrameAtIndex(0)
        self.assertTrue(frame.IsValid(), "Frame must be valid")

        arg_names = ['argc', 'argv']
        local_names = ['i', 'j', 'k']
        static_names = ['static_var', 'g_global_var', 'g_static_var']
        breakpoint1_locals = ['i']
        breakpoint1_statics = ['static_var']
        num_args = len(arg_names)
        num_locals = len(local_names)
        num_statics = len(static_names)
        args_yes = True
        args_no = False
        locals_yes = True
        locals_no = False
        statics_yes = True
        statics_no = False
        in_scopy_only = True
        ignore_scope = False

        # Verify if we ask for only arguments that we got what we expect
        vars = frame.GetVariables(
            args_yes, locals_no, statics_no, ignore_scope)
        self.assertEqual(
            vars.GetSize(),
            num_args,
            "There should be %i arguments, but we are reporting %i" %
            (num_args,
             vars.GetSize()))
        self.verify_variable_names("check names of arguments", vars, arg_names)
        self.assertEqual(
            len(arg_names),
            num_args,
            "make sure verify_variable_names() didn't mutate list")

        # Verify if we ask for only locals that we got what we expect
        vars = frame.GetVariables(
            args_no, locals_yes, statics_no, ignore_scope)
        self.assertEqual(
            vars.GetSize(),
            num_locals,
            "There should be %i local variables, but we are reporting %i" %
            (num_locals,
             vars.GetSize()))
        self.verify_variable_names("check names of locals", vars, local_names)

        # Verify if we ask for only statics that we got what we expect
        vars = frame.GetVariables(
            args_no, locals_no, statics_yes, ignore_scope)
        print('statics: ', str(vars))
        self.assertEqual(
            vars.GetSize(),
            num_statics,
            "There should be %i static variables, but we are reporting %i" %
            (num_statics,
             vars.GetSize()))
        self.verify_variable_names(
            "check names of statics", vars, static_names)

        # Verify if we ask for arguments and locals that we got what we expect
        vars = frame.GetVariables(
            args_yes, locals_yes, statics_no, ignore_scope)
        desc = 'arguments + locals'
        names = arg_names + local_names
        count = len(names)
        self.assertEqual(
            vars.GetSize(),
            count,
            "There should be %i %s (%s) but we are reporting %i (%s)" %
            (count,
             desc,
             names,
             vars.GetSize(),
             get_names_from_value_list(vars)))
        self.verify_variable_names("check names of %s" % (desc), vars, names)

        # Verify if we ask for arguments and statics that we got what we expect
        vars = frame.GetVariables(
            args_yes, locals_no, statics_yes, ignore_scope)
        desc = 'arguments + statics'
        names = arg_names + static_names
        count = len(names)
        self.assertEqual(
            vars.GetSize(),
            count,
            "There should be %i %s (%s) but we are reporting %i (%s)" %
            (count,
             desc,
             names,
             vars.GetSize(),
             get_names_from_value_list(vars)))
        self.verify_variable_names("check names of %s" % (desc), vars, names)

        # Verify if we ask for locals and statics that we got what we expect
        vars = frame.GetVariables(
            args_no, locals_yes, statics_yes, ignore_scope)
        desc = 'locals + statics'
        names = local_names + static_names
        count = len(names)
        self.assertEqual(
            vars.GetSize(),
            count,
            "There should be %i %s (%s) but we are reporting %i (%s)" %
            (count,
             desc,
             names,
             vars.GetSize(),
             get_names_from_value_list(vars)))
        self.verify_variable_names("check names of %s" % (desc), vars, names)

        # Verify if we ask for arguments, locals and statics that we got what
        # we expect
        vars = frame.GetVariables(
            args_yes, locals_yes, statics_yes, ignore_scope)
        desc = 'arguments + locals + statics'
        names = arg_names + local_names + static_names
        count = len(names)
        self.assertEqual(
            vars.GetSize(),
            count,
            "There should be %i %s (%s) but we are reporting %i (%s)" %
            (count,
             desc,
             names,
             vars.GetSize(),
             get_names_from_value_list(vars)))
        self.verify_variable_names("check names of %s" % (desc), vars, names)

        # Verify if we ask for in scope locals that we got what we expect
        vars = frame.GetVariables(
            args_no, locals_yes, statics_no, in_scopy_only)
        desc = 'in scope locals at breakpoint 1'
        names = ['i']
        count = len(names)
        self.assertEqual(
            vars.GetSize(),
            count,
            "There should be %i %s (%s) but we are reporting %i (%s)" %
            (count,
             desc,
             names,
             vars.GetSize(),
             get_names_from_value_list(vars)))
        self.verify_variable_names("check names of %s" % (desc), vars, names)

        # Continue to breakpoint 2
        process.Continue()

        threads = lldbutil.get_threads_stopped_at_breakpoint(
            process, breakpoint2)
        self.assertEqual(
            len(threads),
            1,
            "There should be a thread stopped at breakpoint 2")

        thread = threads[0]
        self.assertTrue(thread.IsValid(), "Thread must be valid")
        frame = thread.GetFrameAtIndex(0)
        self.assertTrue(frame.IsValid(), "Frame must be valid")

        # Verify if we ask for in scope locals that we got what we expect
        vars = frame.GetVariables(
            args_no, locals_yes, statics_no, in_scopy_only)
        desc = 'in scope locals at breakpoint 2'
        names = ['i', 'j']
        count = len(names)
        self.assertEqual(
            vars.GetSize(),
            count,
            "There should be %i %s (%s) but we are reporting %i (%s)" %
            (count,
             desc,
             names,
             vars.GetSize(),
             get_names_from_value_list(vars)))
        self.verify_variable_names("check names of %s" % (desc), vars, names)

        # Continue to breakpoint 3
        process.Continue()

        threads = lldbutil.get_threads_stopped_at_breakpoint(
            process, breakpoint3)
        self.assertEqual(
            len(threads),
            1,
            "There should be a thread stopped at breakpoint 3")

        thread = threads[0]
        self.assertTrue(thread.IsValid(), "Thread must be valid")
        frame = thread.GetFrameAtIndex(0)
        self.assertTrue(frame.IsValid(), "Frame must be valid")

        # Verify if we ask for in scope locals that we got what we expect
        vars = frame.GetVariables(
            args_no, locals_yes, statics_no, in_scopy_only)
        desc = 'in scope locals at breakpoint 3'
        names = ['i', 'j', 'k']
        count = len(names)
        self.assertEqual(
            vars.GetSize(),
            count,
            "There should be %i %s (%s) but we are reporting %i (%s)" %
            (count,
             desc,
             names,
             vars.GetSize(),
             get_names_from_value_list(vars)))
        self.verify_variable_names("check names of %s" % (desc), vars, names)
