mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-26 12:53:13 +00:00
99d2a344c7
cherry-picked from krader1961/fish-shell commit b69df4fe72 Fixes #4353 (regression in indexing of history contents) and introduces new unit tests to catch bad $history indexing in the future.
159 lines
5.8 KiB
Text
159 lines
5.8 KiB
Text
# vim: set filetype=expect:
|
|
#
|
|
# This is a very fragile test. Sorry about that. But interactively entering
|
|
# commands and verifying they are recorded correctly in the interactive
|
|
# history and that history can be manipulated is inherently difficult.
|
|
#
|
|
# This is meant to verify just a few of the most basic behaviors of the
|
|
# interactive history to hopefully keep regressions from happening. It is not
|
|
# meant to be a comprehensive test of the history subsystem. Those types of
|
|
# tests belong in the src/fish_tests.cpp module.
|
|
#
|
|
|
|
# The history function might pipe output through the user's pager. We don't
|
|
# want something like `less` to complicate matters so force the use of `cat`.
|
|
set ::env(PAGER) cat
|
|
spawn $fish
|
|
expect_prompt
|
|
|
|
# ==========
|
|
# Start by ensuring we're not affected by earlier tests. Clear the history.
|
|
send "builtin history clear\r"
|
|
expect_prompt
|
|
|
|
# ==========
|
|
# The following tests verify the behavior of the history builtin.
|
|
# ==========
|
|
|
|
# ==========
|
|
# List our history which should be empty after just clearing it.
|
|
send "echo start1; builtin history; echo end1\r"
|
|
expect_prompt -re {start1\r\nend1\r\n} {
|
|
puts "empty history detected as expected"
|
|
} timeout {
|
|
puts stderr "empty history not detected as expected"
|
|
}
|
|
|
|
# ==========
|
|
# Our history should now contain the previous command and nothing else.
|
|
send "echo start2; builtin history; echo end2\r"
|
|
expect_prompt -re {start2\r\necho start1; builtin history; echo end1\r\nend2\r\n} {
|
|
puts "first history command detected as expected"
|
|
} timeout {
|
|
puts stderr "first history command not detected as expected"
|
|
}
|
|
|
|
# ==========
|
|
# The following tests verify the behavior of the history function.
|
|
# ==========
|
|
|
|
# ==========
|
|
# Verify explicit searching for the first two commands in the previous tests
|
|
# returns the expected results.
|
|
send "history search echo start\r"
|
|
expect_prompt -re {\r\necho start1.*\r\necho start2} {
|
|
puts "history function explicit search succeeded"
|
|
} timeout {
|
|
puts stderr "history function explicit search failed"
|
|
}
|
|
|
|
# ==========
|
|
# Verify searching is the implicit action.
|
|
send "history -p 'echo start'\r"
|
|
expect_prompt -re {\r\necho start2.*\r\necho start1} {
|
|
puts "history function implicit search succeeded"
|
|
} timeout {
|
|
puts stderr "history function implicit search failed"
|
|
}
|
|
|
|
# ==========
|
|
# Verify searching with a request for timestamps includes the timestamps.
|
|
send "history search --show-time='# %F %T%n' --prefix 'echo start'\r"
|
|
expect_prompt -re {\r\n# \d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d\r\necho start2; .*\r\n# \d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d\r\necho start1; } {
|
|
puts "history function implicit search with timestamps succeeded"
|
|
} timeout {
|
|
puts stderr "history function implicit search with timestamps failed"
|
|
}
|
|
|
|
# ==========
|
|
# Verify explicit searching for an exact command returns just that command.
|
|
# returns the expected results.
|
|
send "echo hello\r"
|
|
expect_prompt
|
|
send "echo goodbye\r"
|
|
expect_prompt
|
|
send "echo hello again\r"
|
|
expect_prompt
|
|
send "echo hello AGAIN\r"
|
|
expect_prompt
|
|
|
|
send "history search --exact 'echo goodbye'\r"
|
|
expect_prompt -re {\r\necho goodbye\r\n} {
|
|
puts "history function explicit exact search 'echo goodbye' succeeded"
|
|
} timeout {
|
|
puts stderr "history function explicit exact search 'echo goodbye' failed"
|
|
}
|
|
|
|
send "history search --exact 'echo hello'\r"
|
|
expect_prompt -re {\r\necho hello\r\n} {
|
|
puts "history function explicit exact search 'echo hello' succeeded"
|
|
} timeout {
|
|
puts stderr "history function explicit exact search 'echo hello' failed"
|
|
}
|
|
|
|
# This is slightly subtle in that it shouldn't actually match anything between
|
|
# the command we sent and the next prompt.
|
|
send "history search --exact 'echo hell'\r"
|
|
expect_prompt -re {history search --exact 'echo hell'\r\n} {
|
|
puts "history function explicit exact search 'echo hell' succeeded"
|
|
} timeout {
|
|
puts stderr "history function explicit exact search 'echo hell' failed"
|
|
}
|
|
|
|
# ==========
|
|
# Delete a single command we recently ran.
|
|
send "history delete -e -C 'echo hello'\r"
|
|
expect -re {history delete -e -C 'echo hello'\r\n}
|
|
send "echo count hello (history search -e -C 'echo hello' | wc -l | string trim)\r"
|
|
expect -re {\r\ncount hello 0\r\n} {
|
|
puts "history function explicit exact delete 'echo hello' succeeded"
|
|
} timeout {
|
|
puts stderr "history function explicit exact delete 'echo hello' failed"
|
|
}
|
|
|
|
# ==========
|
|
# Interactively delete one of multiple matched commands. This verifies that we
|
|
# delete the first entry matched by the prefix search (the most recent command
|
|
# sent above that matches).
|
|
send "history delete -p 'echo hello'\r"
|
|
expect -re {history delete -p 'echo hello'\r\n}
|
|
expect -re {\[1\] echo hello AGAIN\r\n}
|
|
expect -re {\[2\] echo hello again\r\n\r\n}
|
|
expect -re {Enter nothing to cancel.*\r\nEnter "all" to delete all the matching entries\.\r\n}
|
|
expect -re {Delete which entries\? >}
|
|
send "1\r"
|
|
expect -re {Deleting history entry 1: "echo hello AGAIN"\r\n}
|
|
|
|
# Verify that the deleted history entry is gone and the other one that matched
|
|
# the prefix search above is still there.
|
|
send "echo count AGAIN (history search -e -C 'echo hello AGAIN' | wc -l | string trim)\r"
|
|
expect -re {\r\ncount AGAIN 0\r\n} {
|
|
puts "history function explicit prefix delete 'echo hello AGAIN' succeeded"
|
|
} timeout {
|
|
puts stderr "history function explicit prefix delete 'echo hello AGAIN' failed"
|
|
}
|
|
|
|
send "echo count again (history search -e -C 'echo hello again' | wc -l | string trim)\r"
|
|
expect -re {\r\ncount again 1\r\n} {
|
|
puts "history function explicit exact search 'echo hello again' succeeded"
|
|
} timeout {
|
|
puts stderr "history function explicit exact search 'echo hello again' failed"
|
|
}
|
|
|
|
# Verify that the $history var has the expected content.
|
|
send "echo history2=\$history\[2\]\r"
|
|
expect -re {\r\nhistory2=echo count AGAIN .*\r\n} {
|
|
puts "history\[2\] had the correct data"
|
|
} timeout {
|
|
puts stderr "history\[2\] had the wrong data"
|
|
}
|