summaryrefslogtreecommitdiff
path: root/lib/tests/cli.test.zsh
diff options
context:
space:
mode:
Diffstat (limited to 'lib/tests/cli.test.zsh')
-rw-r--r--lib/tests/cli.test.zsh169
1 files changed, 169 insertions, 0 deletions
diff --git a/lib/tests/cli.test.zsh b/lib/tests/cli.test.zsh
new file mode 100644
index 000000000..9ee5cd219
--- /dev/null
+++ b/lib/tests/cli.test.zsh
@@ -0,0 +1,169 @@
+#!/usr/bin/zsh -df
+
+run_awk() {
+ local -a dis_plugins=(${=1})
+ local input_text="$2"
+
+ (( ! DEBUG )) || set -xv
+
+ local awk_subst_plugins="\
+ gsub(/[ \t]+(${(j:|:)dis_plugins})[ \t]+/, \" \") # with spaces before or after
+ gsub(/[ \t]+(${(j:|:)dis_plugins})$/, \"\") # with spaces before and EOL
+ gsub(/^(${(j:|:)dis_plugins})[ \t]+/, \"\") # with BOL and spaces after
+
+ gsub(/\((${(j:|:)dis_plugins})[ \t]+/, \"(\") # with parenthesis before and spaces after
+ gsub(/[ \t]+(${(j:|:)dis_plugins})\)/, \")\") # with spaces before or parenthesis after
+ gsub(/\((${(j:|:)dis_plugins})\)/, \"()\") # with only parentheses
+
+ gsub(/^(${(j:|:)dis_plugins})\)/, \")\") # with BOL and closing parenthesis
+ gsub(/\((${(j:|:)dis_plugins})$/, \"(\") # with opening parenthesis and EOL
+ "
+ # Disable plugins awk script
+ local awk_script="
+ # if plugins=() is in oneline form, substitute disabled plugins and go to next line
+ /^[ \t]*plugins=\([^#]+\).*\$/ {
+ $awk_subst_plugins
+ print \$0
+ next
+ }
+
+ # if plugins=() is in multiline form, enable multi flag and disable plugins if they're there
+ /^[ \t]*plugins=\(/ {
+ multi=1
+ $awk_subst_plugins
+ print \$0
+ next
+ }
+
+ # if multi flag is enabled and we find a valid closing parenthesis, remove plugins and disable multi flag
+ multi == 1 && /^[^#]*\)/ {
+ multi=0
+ $awk_subst_plugins
+ print \$0
+ next
+ }
+
+ multi == 1 && length(\$0) > 0 {
+ $awk_subst_plugins
+ if (length(\$0) > 0) print \$0
+ next
+ }
+
+ { print \$0 }
+ "
+
+ command awk "$awk_script" <<< "$input_text"
+
+ (( ! DEBUG )) || set +xv
+}
+
+# runs awk against stdin, checks if the resulting file is not empty and then checks if the file has valid zsh syntax
+run_awk_and_test() {
+ local description="$1"
+ local plugins_to_disable="$2"
+ local input_text="$3"
+ local expected_output="$4"
+
+ local tmpfile==(:)
+
+ {
+ print -u2 "Test: $description"
+ DEBUG=0 run_awk "$plugins_to_disable" "$input_text" >| $tmpfile
+
+ if [[ ! -s "$tmpfile" ]]; then
+ print -u2 "\e[31mError\e[0m: output file empty"
+ return 1
+ fi
+
+ if ! zsh -n $tmpfile; then
+ print -u2 "\e[31mError\e[0m: zsh syntax error"
+ diff -u $tmpfile <(echo "$expected_output")
+ return 1
+ fi
+
+ if ! diff -u --color=always $tmpfile <(echo "$expected_output"); then
+ if (( DEBUG )); then
+ print -u2 ""
+ DEBUG=1 run_awk "$plugins_to_disable" "$input_text"
+ print -u2 ""
+ fi
+ print -u2 "\e[31mError\e[0m: output file does not match expected output"
+ return 1
+ fi
+
+ print -u2 "\e[32mSuccess\e[0m"
+ } always {
+ print -u2 ""
+ command rm -f "$tmpfile"
+ }
+}
+
+# These tests are for the `omz plugin disable` command
+run_awk_and_test \
+ "it should delete a single plugin in oneline format" \
+ "git" \
+ "plugins=(git)" \
+ "plugins=()"
+
+run_awk_and_test \
+ "it should delete a single plugin in multiline format" \
+ "github" \
+"plugins=(
+ github
+)" \
+"plugins=(
+)"
+
+run_awk_and_test \
+ "it should delete multiple plugins in oneline format" \
+ "github git z" \
+ "plugins=(github git z)" \
+ "plugins=()"
+
+run_awk_and_test \
+ "it should delete multiple plugins in multiline format" \
+ "github git z" \
+"plugins=(
+ github
+ git
+ z
+)" \
+"plugins=(
+)"
+
+run_awk_and_test \
+ "it should delete a single plugin among multiple in oneline format" \
+ "git" \
+ "plugins=(github git z)" \
+ "plugins=(github z)"
+
+run_awk_and_test \
+ "it should delete a single plugin among multiple in multiline format" \
+ "git" \
+"plugins=(
+ github
+ git
+ z
+)" \
+"plugins=(
+ github
+ z
+)"
+
+run_awk_and_test \
+ "it should delete multiple plugins in mixed format" \
+ "git z" \
+"plugins=(github
+git z)" \
+"plugins=(github
+)"
+
+run_awk_and_test \
+ "it should delete multiple plugins in mixed format 2" \
+ "github z" \
+"plugins=(github
+ git
+z)" \
+"plugins=(
+ git
+)"