465 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			465 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/env zsh
 | 
						|
 | 
						|
SCRIPT_DIR=$(dirname "$0")
 | 
						|
TEST_DIR=$SCRIPT_DIR/../test
 | 
						|
DIST_DIR=$SCRIPT_DIR/../
 | 
						|
TMPHIST_FILE=/tmp/zsh-autosuggestions-test-tmp-hist
 | 
						|
 | 
						|
# Use stub.sh for stubbing/mocking
 | 
						|
source $TEST_DIR/stub-1.0.2.sh
 | 
						|
 | 
						|
source $DIST_DIR/zsh-autosuggestions.zsh
 | 
						|
 | 
						|
#--------------------------------------------------------------------#
 | 
						|
# Suggestions                                                        #
 | 
						|
#--------------------------------------------------------------------#
 | 
						|
 | 
						|
testSuggestionSimple() {
 | 
						|
	HISTSIZE=0  # Clear history
 | 
						|
	HISTSIZE=10
 | 
						|
 | 
						|
	cat > $TMPHIST_FILE <<-EOH
 | 
						|
		one
 | 
						|
		two
 | 
						|
		three
 | 
						|
		four
 | 
						|
		five
 | 
						|
	EOH
 | 
						|
	echo >> $TMPHIST_FILE
 | 
						|
 | 
						|
	fc -R $TMPHIST_FILE
 | 
						|
 | 
						|
	rm $TMPHIST_FILE
 | 
						|
 | 
						|
	unset ZSH_AUTOSUGGEST_MATCH_PREV_CMD
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 'garbage'" \
 | 
						|
		"" \
 | 
						|
		"$(_zsh_autosuggest_suggestion garbage)"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 'o'" \
 | 
						|
		"one" \
 | 
						|
		"$(_zsh_autosuggest_suggestion o)"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 't'" \
 | 
						|
		"three" \
 | 
						|
		"$(_zsh_autosuggest_suggestion t)"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 'tw'" \
 | 
						|
		"two" \
 | 
						|
		"$(_zsh_autosuggest_suggestion tw)"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 'f'" \
 | 
						|
		"five" \
 | 
						|
		"$(_zsh_autosuggest_suggestion f)"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 'fo'" \
 | 
						|
		"four" \
 | 
						|
		"$(_zsh_autosuggest_suggestion fo)"
 | 
						|
}
 | 
						|
 | 
						|
testSuggestionMatchPrevCmd() {
 | 
						|
	HISTSIZE=0  # Clear history
 | 
						|
	HISTSIZE=10
 | 
						|
 | 
						|
	cat > $TMPHIST_FILE <<-EOH
 | 
						|
		one
 | 
						|
		two
 | 
						|
		three
 | 
						|
		four
 | 
						|
		five
 | 
						|
	EOH
 | 
						|
	echo >> $TMPHIST_FILE
 | 
						|
 | 
						|
	fc -R $TMPHIST_FILE
 | 
						|
 | 
						|
	rm $TMPHIST_FILE
 | 
						|
 | 
						|
	ZSH_AUTOSUGGEST_MATCH_PREV_CMD=1
 | 
						|
 | 
						|
	stub_and_echo _zsh_autosuggest_prev_cmd "one"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 'garbage' after 'one'" \
 | 
						|
		"" \
 | 
						|
		"$(_zsh_autosuggest_suggestion garbage)"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 'o' after 'one'" \
 | 
						|
		"one" \
 | 
						|
		"$(_zsh_autosuggest_suggestion o)"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 't' after 'one'" \
 | 
						|
		"two" \
 | 
						|
		"$(_zsh_autosuggest_suggestion t)"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 'th' after 'one'" \
 | 
						|
		"three" \
 | 
						|
		"$(_zsh_autosuggest_suggestion th)"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 'f' after 'one'" \
 | 
						|
		"five" \
 | 
						|
		"$(_zsh_autosuggest_suggestion f)"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 'fo' after 'one" \
 | 
						|
		"four" \
 | 
						|
		"$(_zsh_autosuggest_suggestion fo)"
 | 
						|
 | 
						|
	stub_and_echo _zsh_autosuggest_prev_cmd "two"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 'garbage' after 'two'" \
 | 
						|
		"" \
 | 
						|
		"$(_zsh_autosuggest_suggestion garbage)"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 'o' after 'two'" \
 | 
						|
		"one" \
 | 
						|
		"$(_zsh_autosuggest_suggestion o)"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 't' after 'two'" \
 | 
						|
		"three" \
 | 
						|
		"$(_zsh_autosuggest_suggestion t)"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 'tw' after 'two'" \
 | 
						|
		"two" \
 | 
						|
		"$(_zsh_autosuggest_suggestion tw)"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 'f' after 'two'" \
 | 
						|
		"five" \
 | 
						|
		"$(_zsh_autosuggest_suggestion f)"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not pick correct suggestion for prefix 'fo' after 'two" \
 | 
						|
		"four" \
 | 
						|
		"$(_zsh_autosuggest_suggestion fo)"
 | 
						|
}
 | 
						|
 | 
						|
#--------------------------------------------------------------------#
 | 
						|
# Highlighting                                                       #
 | 
						|
#--------------------------------------------------------------------#
 | 
						|
 | 
						|
testHighlightDefaultStyle() {
 | 
						|
	assertEquals \
 | 
						|
		"fg=8" \
 | 
						|
		"$ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE"
 | 
						|
}
 | 
						|
 | 
						|
testHighlightApplyWithSuggestion() {
 | 
						|
	orig_style=ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE
 | 
						|
	ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=4"
 | 
						|
 | 
						|
	BUFFER="ec"
 | 
						|
	POSTDISPLAY="ho hello"
 | 
						|
	region_highlight=("0 2 fg=1")
 | 
						|
 | 
						|
	_zsh_autosuggest_highlight_apply
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"highlight did not use correct style" \
 | 
						|
		"0 2 fg=1 2 10 $ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE" \
 | 
						|
		"$region_highlight"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"higlight was not saved to be removed later" \
 | 
						|
		"2 10 $ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE" \
 | 
						|
		"$_ZSH_AUTOSUGGEST_LAST_HIGHLIGHT"
 | 
						|
 | 
						|
	ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE=orig_style
 | 
						|
}
 | 
						|
 | 
						|
testHighlightApplyWithoutSuggestion() {
 | 
						|
	BUFFER="echo hello"
 | 
						|
	POSTDISPLAY=""
 | 
						|
	region_highlight=("0 4 fg=1")
 | 
						|
 | 
						|
	_zsh_autosuggest_highlight_apply
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"region_highlight was modified" \
 | 
						|
		"0 4 fg=1" \
 | 
						|
		"$region_highlight"
 | 
						|
 | 
						|
	assertNull \
 | 
						|
		"last highlight region was not cleared" \
 | 
						|
		"$_ZSH_AUTOSUGGEST_LAST_HIGHLIGHT"
 | 
						|
}
 | 
						|
 | 
						|
testHighlightReset() {
 | 
						|
	BUFFER="ec"
 | 
						|
	POSTDISPLAY="ho hello"
 | 
						|
	region_highlight=("0 1 fg=1" "2 10 fg=8" "1 2 fg=1")
 | 
						|
	_ZSH_AUTOSUGGEST_LAST_HIGHLIGHT="2 10 fg=8"
 | 
						|
 | 
						|
	_zsh_autosuggest_highlight_reset
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"last highlight region was not removed" \
 | 
						|
		"0 1 fg=1 1 2 fg=1" \
 | 
						|
		"$region_highlight"
 | 
						|
 | 
						|
	assertNull \
 | 
						|
		"last highlight variable was not cleared" \
 | 
						|
		"$_ZSH_AUTOSUGGEST_LAST_HIGHLIGHT"
 | 
						|
}
 | 
						|
 | 
						|
#--------------------------------------------------------------------#
 | 
						|
# Widgets                                                            #
 | 
						|
#--------------------------------------------------------------------#
 | 
						|
 | 
						|
testWidgetFunctionClear() {
 | 
						|
	BUFFER="ec"
 | 
						|
	POSTDISPLAY="ho hello"
 | 
						|
 | 
						|
	_zsh_autosuggest_clear "original-widget"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"BUFFER was modified" \
 | 
						|
		"ec" \
 | 
						|
		"$BUFFER"
 | 
						|
 | 
						|
	assertNull \
 | 
						|
		"POSTDISPLAY was not cleared" \
 | 
						|
		"$POSTDISPLAY"
 | 
						|
}
 | 
						|
 | 
						|
testWidgetFunctionModify() {
 | 
						|
	BUFFER=""
 | 
						|
	POSTDISPLAY=""
 | 
						|
 | 
						|
	stub_and_eval \
 | 
						|
		_zsh_autosuggest_invoke_original_widget \
 | 
						|
		'BUFFER+="e"'
 | 
						|
 | 
						|
	stub_and_echo \
 | 
						|
		_zsh_autosuggest_suggestion \
 | 
						|
		"echo hello"
 | 
						|
 | 
						|
	_zsh_autosuggest_modify "original-widget"
 | 
						|
 | 
						|
	assertTrue \
 | 
						|
		"original widget not invoked" \
 | 
						|
		"stub_called _zsh_autosuggest_invoke_original_widget"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"BUFFER was not modified" \
 | 
						|
		"e" \
 | 
						|
		"$BUFFER"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"POSTDISPLAY does not contain suggestion" \
 | 
						|
		"cho hello" \
 | 
						|
		"$POSTDISPLAY"
 | 
						|
 | 
						|
	restore _zsh_autosuggest_invoke_original_widget
 | 
						|
	restore _zsh_autosuggest_suggestion
 | 
						|
}
 | 
						|
 | 
						|
testWidgetFunctionAcceptCursorAtEnd() {
 | 
						|
	BUFFER="echo"
 | 
						|
	POSTDISPLAY=" hello"
 | 
						|
	CURSOR=4
 | 
						|
 | 
						|
	stub _zsh_autosuggest_invoke_original_widget
 | 
						|
 | 
						|
	_zsh_autosuggest_accept "original-widget"
 | 
						|
 | 
						|
	assertTrue \
 | 
						|
		"original widget not invoked" \
 | 
						|
		"stub_called _zsh_autosuggest_invoke_original_widget"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"BUFFER was not modified" \
 | 
						|
		"echo hello" \
 | 
						|
		"$BUFFER"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"POSTDISPLAY was not cleared" \
 | 
						|
		"" \
 | 
						|
		"$POSTDISPLAY"
 | 
						|
}
 | 
						|
 | 
						|
testWidgetFunctionAcceptCursorNotAtEnd() {
 | 
						|
	BUFFER="echo"
 | 
						|
	POSTDISPLAY=" hello"
 | 
						|
	CURSOR=2
 | 
						|
 | 
						|
	stub _zsh_autosuggest_invoke_original_widget
 | 
						|
 | 
						|
	_zsh_autosuggest_accept "original-widget"
 | 
						|
 | 
						|
	assertTrue \
 | 
						|
		"original widget not invoked" \
 | 
						|
		"stub_called _zsh_autosuggest_invoke_original_widget"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"BUFFER was modified" \
 | 
						|
		"echo" \
 | 
						|
		"$BUFFER"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"POSTDISPLAY was modified" \
 | 
						|
		" hello" \
 | 
						|
		"$POSTDISPLAY"
 | 
						|
}
 | 
						|
 | 
						|
testWidgetFunctionPartialAcceptCursorMovesOutOfBuffer() {
 | 
						|
	BUFFER="ec"
 | 
						|
	POSTDISPLAY="ho hello"
 | 
						|
	CURSOR=1
 | 
						|
 | 
						|
	stub_and_eval \
 | 
						|
		_zsh_autosuggest_invoke_original_widget \
 | 
						|
		'CURSOR=5; LBUFFER="echo "; RBUFFER="hello"'
 | 
						|
 | 
						|
	_zsh_autosuggest_partial_accept "original-widget"
 | 
						|
 | 
						|
	assertTrue \
 | 
						|
		"original widget not invoked" \
 | 
						|
		"stub_called _zsh_autosuggest_invoke_original_widget"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"BUFFER was not modified correctly" \
 | 
						|
		"echo " \
 | 
						|
		"$BUFFER"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"POSTDISPLAY was not modified correctly" \
 | 
						|
		"hello" \
 | 
						|
		"$POSTDISPLAY"
 | 
						|
}
 | 
						|
 | 
						|
testWidgetFunctionPartialAcceptCursorStaysInBuffer() {
 | 
						|
	BUFFER="echo hello"
 | 
						|
	POSTDISPLAY=" world"
 | 
						|
	CURSOR=1
 | 
						|
 | 
						|
	stub_and_eval \
 | 
						|
		_zsh_autosuggest_invoke_original_widget \
 | 
						|
		'CURSOR=5; LBUFFER="echo "; RBUFFER="hello"'
 | 
						|
 | 
						|
	_zsh_autosuggest_partial_accept "original-widget"
 | 
						|
 | 
						|
	assertTrue \
 | 
						|
		"original widget not invoked" \
 | 
						|
		"stub_called _zsh_autosuggest_invoke_original_widget"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"BUFFER was modified" \
 | 
						|
		"echo hello" \
 | 
						|
		"$BUFFER"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"POSTDISPLAY was modified" \
 | 
						|
		" world" \
 | 
						|
		"$POSTDISPLAY"
 | 
						|
}
 | 
						|
 | 
						|
testWidgetAccept() {
 | 
						|
	stub _zsh_autosuggest_highlight_reset
 | 
						|
	stub _zsh_autosuggest_accept
 | 
						|
	stub _zsh_autosuggest_highlight_apply
 | 
						|
 | 
						|
	# Call the function pointed to by the widget since we can't call
 | 
						|
	# the widget itself when zle is not active
 | 
						|
	${widgets[autosuggest-accept]#*:} "original-widget"
 | 
						|
 | 
						|
	assertTrue \
 | 
						|
		"autosuggest-accept widget does not exist" \
 | 
						|
		"zle -l autosuggest-accept"
 | 
						|
 | 
						|
	assertTrue \
 | 
						|
		"highlight_reset was not called" \
 | 
						|
		"stub_called _zsh_autosuggest_highlight_reset"
 | 
						|
 | 
						|
	assertTrue \
 | 
						|
		"widget function was not called" \
 | 
						|
		"stub_called _zsh_autosuggest_accept"
 | 
						|
 | 
						|
	assertTrue \
 | 
						|
		"highlight_apply was not called" \
 | 
						|
		"stub_called _zsh_autosuggest_highlight_apply"
 | 
						|
}
 | 
						|
 | 
						|
testWidgetClear() {
 | 
						|
	stub _zsh_autosuggest_highlight_reset
 | 
						|
	stub _zsh_autosuggest_clear
 | 
						|
	stub _zsh_autosuggest_highlight_apply
 | 
						|
 | 
						|
	# Call the function pointed to by the widget since we can't call
 | 
						|
	# the widget itself when zle is not active
 | 
						|
	${widgets[autosuggest-clear]#*:} "original-widget"
 | 
						|
 | 
						|
	assertTrue \
 | 
						|
		"autosuggest-clear widget does not exist" \
 | 
						|
		"zle -l autosuggest-clear"
 | 
						|
 | 
						|
	assertTrue \
 | 
						|
		"highlight_reset was not called" \
 | 
						|
		"stub_called _zsh_autosuggest_highlight_reset"
 | 
						|
 | 
						|
	assertTrue \
 | 
						|
		"widget function was not called" \
 | 
						|
		"stub_called _zsh_autosuggest_clear"
 | 
						|
 | 
						|
	assertTrue \
 | 
						|
		"highlight_apply was not called" \
 | 
						|
		"stub_called _zsh_autosuggest_highlight_apply"
 | 
						|
}
 | 
						|
 | 
						|
testEscapeCommandPrefix() {
 | 
						|
	assertEquals \
 | 
						|
		"Did not escape single backslash" \
 | 
						|
		"\\\\" \
 | 
						|
		"$(_zsh_autosuggest_escape_command_prefix "\\")"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not escape two backslashes" \
 | 
						|
		"\\\\\\\\" \
 | 
						|
		"$(_zsh_autosuggest_escape_command_prefix "\\\\")"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not escape parentheses" \
 | 
						|
		"\\(\\)" \
 | 
						|
		"$(_zsh_autosuggest_escape_command_prefix "()")"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not escape square brackets" \
 | 
						|
		"\\[\\]" \
 | 
						|
		"$(_zsh_autosuggest_escape_command_prefix "[]")"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not escape pipe" \
 | 
						|
		"\\|" \
 | 
						|
		"$(_zsh_autosuggest_escape_command_prefix "|")"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not escape star" \
 | 
						|
		"\\*" \
 | 
						|
		"$(_zsh_autosuggest_escape_command_prefix "*")"
 | 
						|
 | 
						|
	assertEquals \
 | 
						|
		"Did not escape question mark" \
 | 
						|
		"\\?" \
 | 
						|
		"$(_zsh_autosuggest_escape_command_prefix "?")"
 | 
						|
}
 | 
						|
 | 
						|
# For zsh compatibility
 | 
						|
setopt shwordsplit
 | 
						|
SHUNIT_PARENT=$0
 | 
						|
 | 
						|
source $TEST_DIR/shunit2-2.1.6/src/shunit2
 |