# 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" } # Verify that glob searching works. send "history search --prefix 'echo start*echo end'\r" expect_prompt -re {echo start1; builtin history; echo end1\r\n} { puts "history function explicit glob search 'echo start*echo end' succeeded" } timeout { puts stderr "history function explicit glob search 'echo start*echo end' 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" }