"""
Test that the 'gui' displays the help window and basic UI.
"""

import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test.lldbpexpect import PExpectTest


class BasicGuiCommandTest(PExpectTest):
    # PExpect uses many timeouts internally and doesn't play well
    # under ASAN on a loaded machine..
    @skipIfAsan
    @skipIfCursesSupportMissing
    @skipIf(oslist=["linux"], archs=["arm$", "aarch64"])
    def test_gui(self):
        self.build()

        self.launch(executable=self.getBuildArtifact("a.out"), dimensions=(100, 500))
        self.expect(
            'br set -f main.c -p "// Break here"', substrs=["Breakpoint 1", "address ="]
        )
        self.expect("run", substrs=["stop reason ="])

        escape_key = chr(27).encode()

        # Start the GUI.
        self.child.sendline("gui")

        # Check for GUI elements in the menu bar.
        self.child.expect_exact("Target")
        self.child.expect_exact("Process")
        self.child.expect_exact("Thread")
        self.child.expect_exact("View")
        self.child.expect_exact("Help")

        # Check the sources window.
        self.child.expect_exact("Sources")
        self.child.expect_exact("main")
        self.child.expect_exact("funky_var_name_that_should_be_rendered")

        # Check the variable window.
        self.child.expect_exact("Variables")
        self.child.expect_exact("(int) funky_var_name_that_should_be_rendered = 22")

        # Check the bar at the bottom.
        self.child.expect_exact("Frame:")

        # Press escape to quit the gui
        self.child.send(escape_key)

        self.expect_prompt()
        self.quit()
