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

from __future__ import print_function

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


class TestVSCode_setExceptionBreakpoints(
        lldbvscode_testcase.VSCodeTestCaseBase):

    mydir = TestBase.compute_mydir(__file__)

    @skipIfWindows
    @skipIfDarwin # Skip this test for now until we can figure out why tings aren't working on build bots
    @expectedFailureNetBSD
    @no_debug_info_test
    def test_functionality(self):
        '''Tests setting and clearing exception breakpoints.
           This packet is a bit tricky on the debug adaptor side since there
           is no "clear exception breakpoints" packet. Exception breakpoints
           are set by sending a "setExceptionBreakpoints" packet with zero or
           more exception filters. If exception breakpoints have been set
           before, any exising breakpoints must remain set, and any new
           breakpoints must be created, and any breakpoints that were in
           previous requests and are not in the current request must be
           removed. This exception tests this setting and clearing and makes
           sure things happen correctly. It doesn't test hitting breakpoints
           and the functionality of each breakpoint, like 'conditions' and
           x'hitCondition' settings.
        '''
        # Visual Studio Code Debug Adaptors have no way to specify the file
        # without launching or attaching to a process, so we must start a
        # process in order to be able to set breakpoints.
        program = self.getBuildArtifact("a.out")
        self.build_and_launch(program)

        filters = ['cpp_throw', 'cpp_catch']
        response = self.vscode.request_setExceptionBreakpoints(filters)
        if response:
            self.assertTrue(response['success'])

        self.continue_to_exception_breakpoint('C++ Throw')
        self.continue_to_exception_breakpoint('C++ Catch')
