Right now running `expr` to start the multiline expression editor and then pressing enter causes an empty history empty to be created for the multiline editor. That doesn't seem very useful for users as pressing the 'up' key will now also bring up these empty expressions. I don't think there is ever a use case for recalling a completely empty expression from the history, so instead don't save those entries to the history file and make sure we never recall them when navigating over the expression history. Note: This is actually a Swift downstream patch that got shipped with Apple's LLDB for many years. However, this recently started conflicting with upstream LLDB as D100048 added a test that made sure that empty expression entries don't crash LLDB. Apple's LLDB was never affected by this crash as it never saved empty expressions in the first place. Reviewed By: augusto2112 Differential Revision: https://reviews.llvm.org/D108983
108 lines
4.3 KiB
Python
108 lines
4.3 KiB
Python
"""
|
|
Tests navigating in the multiline expression editor.
|
|
"""
|
|
|
|
import lldb
|
|
from lldbsuite.test.decorators import *
|
|
from lldbsuite.test.lldbtest import *
|
|
from lldbsuite.test.lldbpexpect import PExpectTest
|
|
|
|
class TestCase(PExpectTest):
|
|
|
|
mydir = TestBase.compute_mydir(__file__)
|
|
|
|
arrow_up = "\033[A"
|
|
arrow_down = "\033[B"
|
|
|
|
# PExpect uses many timeouts internally and doesn't play well
|
|
# under ASAN on a loaded machine..
|
|
@skipIfAsan
|
|
@skipIfEditlineSupportMissing
|
|
@expectedFailureAll(oslist=['freebsd'], bugnumber='llvm.org/pr48316')
|
|
@skipIf(oslist=["linux"], archs=["arm", "aarch64"]) # Randomly fails on buildbot
|
|
def test_nav_arrow_up(self):
|
|
"""Tests that we can navigate back to the previous line with the up arrow"""
|
|
self.launch()
|
|
|
|
# Start multiline expression mode by just running 'expr'
|
|
self.child.sendline("expr")
|
|
self.child.expect_exact("terminate with an empty line to evaluate")
|
|
# Create a simple integer expression '123' and press enter.
|
|
self.child.send("123\n")
|
|
# We should see the prompt for the second line of our expression.
|
|
self.child.expect_exact("2: ")
|
|
# Go back to the first line and change 123 to 124.
|
|
# Then press enter twice to evaluate our expression.
|
|
self.child.send(self.arrow_up + "\b4\n\n")
|
|
# The result of our expression should be 124 (our edited expression)
|
|
# and not 123 (the one we initially typed).
|
|
self.child.expect_exact("(int) $0 = 124")
|
|
|
|
self.quit()
|
|
|
|
@skipIfAsan
|
|
@skipIfEditlineSupportMissing
|
|
@expectedFailureAll(oslist=['freebsd'], bugnumber='llvm.org/pr48316')
|
|
@skipIf(oslist=["linux"], archs=["arm", "aarch64"]) # Randomly fails on buildbot
|
|
def test_nav_arrow_down(self):
|
|
"""Tests that we can navigate to the next line with the down arrow"""
|
|
self.launch()
|
|
|
|
# Start multiline expression mode by just running 'expr'
|
|
self.child.sendline("expr")
|
|
self.child.expect_exact("terminate with an empty line to evaluate")
|
|
# Create a simple integer expression '111' and press enter.
|
|
self.child.send("111\n")
|
|
# We should see the prompt for the second line of our expression.
|
|
self.child.expect_exact("2: ")
|
|
# Create another simple integer expression '222'.
|
|
self.child.send("222")
|
|
# Go back to the first line and change '111' to '111+' to make
|
|
# an addition operation that spans two lines. We need to go up to
|
|
# test that we can go back down again.
|
|
self.child.send(self.arrow_up + "+")
|
|
# Go back down to our second line and change '222' to '223'
|
|
# so that the full expression is now '111+\n223'.
|
|
# Then press enter twice to evaluate the expression.
|
|
self.child.send(self.arrow_down + "\b3\n\n")
|
|
# The result of our expression '111 + 223' should be '334'.
|
|
# If the expression is '333' then arrow down failed to get
|
|
# us back to the second line.
|
|
self.child.expect_exact("(int) $0 = 334")
|
|
|
|
self.quit()
|
|
|
|
@skipIfAsan
|
|
@skipIfEditlineSupportMissing
|
|
@expectedFailureAll(oslist=['freebsd'], bugnumber='llvm.org/pr48316')
|
|
@skipIf(oslist=["linux"], archs=["arm", "aarch64"]) # Randomly fails on buildbot
|
|
def test_nav_arrow_up_empty(self):
|
|
"""
|
|
Tests that navigating with the up arrow doesn't crash and skips
|
|
empty history entries.
|
|
"""
|
|
self.launch()
|
|
|
|
# Create a real history entry '456' and then follow up with an
|
|
# empty entry (that shouldn't be saved).
|
|
self.child.sendline("expr")
|
|
self.child.expect_exact("terminate with an empty line to evaluate")
|
|
self.child.send("456\n\n")
|
|
self.expect_prompt()
|
|
|
|
self.child.sendline("expr")
|
|
self.child.expect_exact("terminate with an empty line to evaluate")
|
|
self.child.send("\n")
|
|
self.expect_prompt()
|
|
|
|
# The up arrow should recall the actual history entry and not the
|
|
# the empty entry (as that one shouldn't have been saved).
|
|
self.child.sendline("expr")
|
|
self.child.expect_exact("terminate with an empty line to evaluate")
|
|
self.child.send(self.arrow_up)
|
|
self.child.expect_exact("456")
|
|
self.child.send("\n\n")
|
|
self.expect_prompt()
|
|
|
|
self.quit()
|