test_extcomp_variable_expansion.sh
1 #!/bin/bash 2 # Test variable expansion in extcomp prototype 3 4 # shellcheck disable=SC1091 5 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 6 REPO_ROOT="$(dirname "$SCRIPT_DIR")" 7 8 source "$REPO_ROOT/contrib/bar_complete" 9 10 echo "Testing variable expansion in __bar_comp_extcomp..." 11 12 # Test 1: Variable expansion with empty variable 13 echo "" 14 echo "Test 1: Variable expansion with empty variable" 15 export TEST_VAR="" 16 result=$(__bar_comp_extcomp "echo \${TEST_VAR} hello" "wor") 17 if [[ -n "$result" ]]; then 18 echo "✓ PASS: Function handles empty variable correctly" 19 else 20 echo "ℹ INFO: No completions (expected for file-based fallback)" 21 fi 22 23 # Test 2: Variable expansion with set variable 24 echo "" 25 echo "Test 2: Variable expansion with set variable" 26 export TEST_VAR="test" 27 # Manually check internal state by adding debug 28 _test_var_expansion() { 29 local cmd="$1" 30 shift 31 local -a args=() 32 local -a remaining_args=("$@") 33 34 if [[ "$cmd" == *' '* ]]; then 35 local -a cmd_parts=() 36 read -ra cmd_parts <<< "$cmd" 37 cmd="${cmd_parts[0]}" 38 if (( ${#cmd_parts[@]} > 1 )); then 39 args+=("${cmd_parts[@]:1}") 40 fi 41 fi 42 43 local -a expanded_args=() 44 local arg 45 for arg in "${args[@]}"; do 46 if [[ "$arg" =~ \$\{[^}]+\} ]]; then 47 local expanded 48 expanded=$(eval echo "$arg") 49 if [[ -n "$expanded" ]]; then 50 expanded_args+=("$expanded") 51 fi 52 else 53 expanded_args+=("$arg") 54 fi 55 done 56 57 for arg in "${remaining_args[@]}"; do 58 if [[ "$arg" =~ \$\{[^}]+\} ]]; then 59 local expanded 60 expanded=$(eval echo "$arg") 61 if [[ -n "$expanded" ]]; then 62 expanded_args+=("$expanded") 63 fi 64 else 65 expanded_args+=("$arg") 66 fi 67 done 68 69 args=("${expanded_args[@]}") 70 echo "Final args: (${args[*]})" 71 return 0 72 } 73 74 result=$(_test_var_expansion "echo \${TEST_VAR} hello" "world") 75 if [[ "$result" == *"test"* ]]; then 76 echo "✓ PASS: Variable ${TEST_VAR} correctly expanded to 'test'" 77 else 78 echo "✗ FAIL: Variable not expanded correctly" 79 echo " Got: $result" 80 fi 81 82 # Test 3: Multiple variables 83 echo "" 84 echo "Test 3: Multiple variables expansion" 85 export VAR1="one" 86 export VAR2="two" 87 result=$(_test_var_expansion "cmd \${VAR1} \${VAR2}" "arg") 88 if [[ "$result" == *"one"* && "$result" == *"two"* ]]; then 89 echo "✓ PASS: Multiple variables expanded correctly" 90 else 91 echo "✗ FAIL: Multiple variables not expanded" 92 echo " Got: $result" 93 fi 94 95 # Test 4: Real-world git example 96 echo "" 97 echo "Test 4: Real-world git completion" 98 if command -v git &>/dev/null; then 99 result=$(__bar_comp_extcomp "git checkout" "") 100 completion_count=$(echo "$result" | wc -l) 101 102 if [[ $completion_count -gt 0 ]]; then 103 echo "✓ PASS: git checkout completion works ($completion_count branches)" 104 else 105 echo "ℹ INFO: git checkout returned no completions (expected in empty repo)" 106 fi 107 else 108 echo "ℹ INFO: git not available, skipping test" 109 fi 110 111 # Test 5: Cargo-like example (without actual cargo completion) 112 echo "" 113 echo "Test 5: Cargo-like variable expansion" 114 export CARGO_TOOLCHAIN="+stable" 115 _test_cargo_args() { 116 local cmd="$1" 117 shift 118 local -a args=() 119 local -a remaining_args=("$@") 120 121 if [[ "$cmd" == *' '* ]]; then 122 local -a cmd_parts=() 123 read -ra cmd_parts <<< "$cmd" 124 cmd="${cmd_parts[0]}" 125 if (( ${#cmd_parts[@]} > 1 )); then 126 args+=("${cmd_parts[@]:1}") 127 fi 128 fi 129 130 local -a expanded_args=() 131 local arg 132 for arg in "${args[@]}"; do 133 if [[ "$arg" =~ \$\{[^}]+\} ]]; then 134 local expanded 135 expanded=$(eval echo "$arg") 136 if [[ -n "$expanded" ]]; then 137 expanded_args+=("$expanded") 138 fi 139 else 140 expanded_args+=("$arg") 141 fi 142 done 143 144 for arg in "${remaining_args[@]}"; do 145 if [[ "$arg" =~ \$\{[^}]+\} ]]; then 146 local expanded 147 expanded=$(eval echo "$arg") 148 if [[ -n "$expanded" ]]; then 149 expanded_args+=("$expanded") 150 fi 151 else 152 expanded_args+=("$arg") 153 fi 154 done 155 156 args=("${expanded_args[@]}") 157 158 # Check that +stable was properly inserted 159 local found_toolchain=false 160 for arg in "${args[@]}"; do 161 if [[ "$arg" == "+stable" ]]; then 162 found_toolchain=true 163 break 164 fi 165 done 166 167 if [[ $found_toolchain == true ]]; then 168 echo "PASS" 169 else 170 echo "FAIL: args=(${args[*]})" 171 fi 172 } 173 174 result=$(_test_cargo_args "cargo \${CARGO_TOOLCHAIN} build --workspace" "--release") 175 if [[ "$result" == "PASS" ]]; then 176 echo "✓ PASS: CARGO_TOOLCHAIN variable expanded to +stable in argument list" 177 else 178 echo "✗ FAIL: Variable expansion failed" 179 echo " $result" 180 fi 181 182 echo "" 183 echo "Variable expansion tests complete"