/ tests / test_extcomp_variable_expansion.sh
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"