"""
Test embedded breakpoints, like `asm int 3;` in x86 or or `__debugbreak` on Windows.
"""

from __future__ import print_function

import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class DebugBreakTestCase(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    @skipIf(archs=no_match(["i386", "i686", "x86_64"]))
    @no_debug_info_test
    def test_asm_int_3(self):
        """Test that intrinsics like `__debugbreak();` and `asm {"int3"}` are treated like breakpoints."""
        self.build()
        exe = self.getBuildArtifact("a.out")

        # Run the program.
        target = self.dbg.CreateTarget(exe)
        process = target.LaunchSimple(
            None, None, self.get_process_working_directory())

        # We've hit the first stop, so grab the frame.
        self.assertEqual(process.GetState(), lldb.eStateStopped)
        stop_reason = lldb.eStopReasonException if (lldbplatformutil.getPlatform(
        ) == "windows" or lldbplatformutil.getPlatform() == "macosx") else lldb.eStopReasonSignal
        thread = lldbutil.get_stopped_thread(process, stop_reason)
        self.assertIsNotNone(
            thread, "Unable to find thread stopped at the __debugbreak()")
        frame = thread.GetFrameAtIndex(0)

        # We should be in funciton 'bar'.
        self.assertTrue(frame.IsValid())
        function_name = frame.GetFunctionName()
        self.assertTrue('bar' in function_name,
                        "Unexpected function name {}".format(function_name))

        # We should be able to evaluate the parameter foo.
        value = frame.EvaluateExpression('*foo')
        self.assertEqual(value.GetValueAsSigned(), 42)

        # The counter should be 1 at the first stop and increase by 2 for each
        # subsequent stop.
        counter = 1
        while counter < 20:
            value = frame.EvaluateExpression('count')
            self.assertEqual(value.GetValueAsSigned(), counter)
            counter += 2
            process.Continue()

        # The inferior should exit after the last iteration.
        self.assertEqual(process.GetState(), lldb.eStateExited)
