| 1 | #!/bin/sh |
| 2 | TEST_PREFIX="[arrays]" |
| 3 | . "$(cd "$(dirname "$0")" && pwd)/test_harness.sh" |
| 4 | |
| 5 | section "1. indexed array basics" |
| 6 | compare_output "array literal assignment" 'arr=(a b c); echo ${arr[0]}' |
| 7 | compare_output "array second element" 'arr=(a b c); echo ${arr[1]}' |
| 8 | compare_output "array third element" 'arr=(a b c); echo ${arr[2]}' |
| 9 | compare_output "array all elements @" 'arr=(a b c); echo ${arr[@]}' |
| 10 | compare_output "array all elements *" 'arr=(a b c); echo ${arr[*]}' |
| 11 | compare_output "array length" 'arr=(a b c); echo ${#arr[@]}' |
| 12 | compare_output "array single element assignment" 'arr[0]=hello; echo ${arr[0]}' |
| 13 | |
| 14 | section "2. indexed array operations" |
| 15 | compare_output "array sparse assignment" 'arr=(); arr[0]=x; arr[5]=y; echo ${arr[5]}' |
| 16 | compare_output "array indices with !" 'arr=(a b c); arr[5]=d; echo ${!arr[@]}' |
| 17 | compare_output "array append +=" 'arr=(a b); arr+=(c d); echo ${arr[@]}' |
| 18 | compare_output "array slice" 'arr=(a b c d e); echo ${arr[@]:1:2}' |
| 19 | compare_output "array slice to end" 'arr=(a b c d e); echo ${arr[@]:2}' |
| 20 | compare_output "array unset element" 'arr=(a b c); unset arr[1]; echo ${arr[@]}' |
| 21 | compare_output "array unset preserves indices" 'arr=(a b c d); unset arr[1]; echo ${!arr[@]}' |
| 22 | compare_output "array element length" 'arr=(hello world); echo ${#arr[0]}' |
| 23 | |
| 24 | section "3. indexed array advanced" |
| 25 | compare_output "array in for loop" 'arr=(a b c); for x in "${arr[@]}"; do echo $x; done' |
| 26 | compare_output "array with spaces in elements" 'arr=("hello world" "foo bar"); echo ${arr[0]}' |
| 27 | compare_output "array reassignment" 'arr=(a b c); arr=(x y); echo ${arr[@]}' |
| 28 | compare_output "array from command substitution" 'arr=($(echo a b c)); echo ${arr[1]}' |
| 29 | compare_output "array element modification" 'arr=(a b c); arr[1]=B; echo ${arr[@]}' |
| 30 | |
| 31 | section "4. associative array basics" |
| 32 | compare_output "assoc array set and get" 'declare -A m; m[name]=alice; echo ${m[name]}' |
| 33 | compare_output "assoc array multiple keys" 'declare -A m; m[a]=1; m[b]=2; m[c]=3; echo ${m[a]} ${m[b]} ${m[c]}' |
| 34 | compare_output "assoc array count" 'declare -A m; m[a]=1; m[b]=2; m[c]=3; echo ${#m[@]}' |
| 35 | compare_output "assoc array overwrite key" 'declare -A m; m[k]=old; m[k]=new; echo ${m[k]}' |
| 36 | compare_output "assoc array unset key" 'declare -A m; m[a]=1; m[b]=2; unset m[a]; echo ${#m[@]}' |
| 37 | |
| 38 | section "5. associative array advanced" |
| 39 | compare_output "assoc array key list sorted" 'declare -A m; m[x]=1; m[y]=2; for k in "${!m[@]}"; do echo "$k"; done | sort' |
| 40 | compare_output "assoc array value with spaces" 'declare -A m; m[key]="hello world"; echo ${m[key]}' |
| 41 | compare_output "assoc array numeric keys" 'declare -A m; m[1]=one; m[2]=two; echo ${m[1]} ${m[2]}' |
| 42 | compare_output "assoc array empty value" 'declare -A m; m[k]=""; echo ">${m[k]}<"' |
| 43 | compare_output "assoc array in loop" 'declare -A m; m[a]=1; m[b]=2; for v in "${m[@]}"; do echo $v; done | sort' |
| 44 | compare_output "assoc array quoted key" 'declare -A m; m["my key"]="value"; echo ${m["my key"]}' |
| 45 | |
| 46 | print_summary |