"""
Test lldb-vscode setBreakpoints request
"""

from __future__ import print_function

import unittest2
import vscode
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
import lldbvscode_testcase


class TestVSCode_console(lldbvscode_testcase.VSCodeTestCaseBase):

    mydir = TestBase.compute_mydir(__file__)

    def check_lldb_command(self, lldb_command, contains_string, assert_msg):
        response = self.vscode.request_evaluate('`%s' % (lldb_command))
        output = response['body']['result']
        self.assertTrue(contains_string in output,
                        ("""Verify %s by checking the command output:\n"""
                         """'''\n%s'''\nfor the string: "%s" """ % (
                         assert_msg, output, contains_string)))

    @skipIfWindows
    @skipIfRemote
    def test_scopes_variables_setVariable_evaluate(self):
        '''
            Tests that the "scopes" request causes the currently selected
            thread and frame to be updated. There are no DAP packets that tell
            lldb-vscode which thread and frame are selected other than the
            "scopes" request. lldb-vscode will now select the thread and frame
            for the latest "scopes" request that it receives.

            The LLDB command interpreter needs to have the right thread and
            frame selected so that commands executed in the debug console act
            on the right scope. This applies both to the expressions that are
            evaluated and the lldb commands that start with the backtick
            character.
        '''
        program = self.getBuildArtifact("a.out")
        self.build_and_launch(program)
        source = 'main.cpp'
        breakpoint1_line = line_number(source, '// breakpoint 1')
        lines = [breakpoint1_line]
        # Set breakpoint in the thread function so we can step the threads
        breakpoint_ids = self.set_source_breakpoints(source, lines)
        self.assertTrue(len(breakpoint_ids) == len(lines),
                        "expect correct number of breakpoints")
        self.continue_to_breakpoints(breakpoint_ids)
        # Cause a "scopes" to be sent for frame zero which should update the
        # selected thread and frame to frame 0.
        self.vscode.get_local_variables(frameIndex=0)
        # Verify frame #0 is selected in the command interpreter by running
        # the "frame select" command with no frame index which will print the
        # currently selected frame.
        self.check_lldb_command("frame select", "frame #0",
                                "frame 0 is selected")

        # Cause a "scopes" to be sent for frame one which should update the
        # selected thread and frame to frame 1.
        self.vscode.get_local_variables(frameIndex=1)
        # Verify frame #1 is selected in the command interpreter by running
        # the "frame select" command with no frame index which will print the
        # currently selected frame.

        self.check_lldb_command("frame select", "frame #1",
                                "frame 1 is selected")
