"""
Test finish out of an empty function (may be one-instruction long)
"""

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


class FinishFromEmptyFunctionTestCase(TestBase):
    NO_DEBUG_INFO_TESTCASE = True

    def test_finish_from_empty_function(self):
        """Test that when stopped at a breakpoint in an empty function, finish leaves it correctly."""
        self.build()
        exe = self.getBuildArtifact("a.out")
        target, process, thread, _ = lldbutil.run_to_name_breakpoint(
            self, "done", exe_name=exe
        )
        if self.TraceOn():
            self.runCmd("bt")

        correct_stepped_out_line = line_number("main.c", "leaving main")
        return_statement_line = line_number("main.c", "return 0")
        safety_bp = target.BreakpointCreateByLocation(
            lldb.SBFileSpec("main.c"), return_statement_line
        )
        self.assertTrue(safety_bp.IsValid())

        error = lldb.SBError()
        thread.StepOut(error)
        self.assertTrue(error.Success())

        if self.TraceOn():
            self.runCmd("bt")

        frame = thread.GetSelectedFrame()
        self.assertEqual(
            frame.line_entry.GetLine(),
            correct_stepped_out_line,
            "Step-out lost control of execution, ran too far",
        )
