fish-shell/tests/history.expect
Kurtis Rader ee1d310651 Implement history search --reverse (#4375)
* Implement `history search --reverse`

It should be possible to have `history search` output ordered oldest to
newest like nearly every other shell including bash, ksh, zsh, and csh.
We can't make this the default because too many people expect the
current behavior. This simply makes it possible for people to define
their own abbreviations or functions that provide behavior they are
likely used to if they are transitioning to fish from another shell.

This also fixes a bug in the `history` function with respect to how it
handles the `-n` / `--max` flag.

Fixes #4354

* Fix comment for format_history_record()
2017-09-14 15:44:17 -07:00

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 --reverse '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"
}