Merge nucleic/sleek-thistle-egret-fyej into dev
This commit is contained in:
@@ -0,0 +1,451 @@
|
||||
name: "Builtins: declare"
|
||||
common_test_files:
|
||||
- path: "helpers.sh"
|
||||
contents: |
|
||||
stable_print_assoc_array() {
|
||||
# TODO(nameref): enable use of nameref when implemented; for now
|
||||
# we assume the name of the array is assoc_array
|
||||
# local -n assoc_array=$1
|
||||
local key
|
||||
|
||||
for key in $(printf "%s\n" "${!assoc_array[@]}" | sort -n); do
|
||||
echo "\"${key}\" => ${assoc_array[${key}]}"
|
||||
done
|
||||
}
|
||||
|
||||
cases:
|
||||
- name: "Display vars"
|
||||
stdin: |
|
||||
declare myvar=something
|
||||
declare -p myvar
|
||||
|
||||
myarr=(a b c)
|
||||
declare -p myarr
|
||||
|
||||
- name: "Display vars with interesting chars"
|
||||
stdin: |
|
||||
(testvar="\"abc\"" && declare -p testvar && declare | grep testvar=)
|
||||
echo "-------------------------"
|
||||
(testvar="a b c" && declare -p testvar && declare | grep testvar=)
|
||||
echo "-------------------------"
|
||||
(testvar="'" && declare -p testvar && declare | grep testvar=)
|
||||
|
||||
- name: "Display vars with interesting chars 2"
|
||||
min_oracle_version: 5.2 # some sequences render differently in older shell versions
|
||||
stdin: |
|
||||
(testvar=$'a\nb' && declare -p testvar && declare | grep testvar=)
|
||||
echo "-------------------------"
|
||||
(testvar=$'\x03' && declare -p testvar && declare | grep testvar=)
|
||||
echo "-------------------------"
|
||||
(testvar=$'\x08' && declare -p testvar && declare | grep testvar=)
|
||||
echo "-------------------------"
|
||||
(testvar=$(printf '\033[34mabc\033[0m') && declare -p testvar && declare | grep testvar=)
|
||||
|
||||
- name: "Declare integer"
|
||||
stdin: |
|
||||
declare -i num=10
|
||||
declare -p num
|
||||
|
||||
echo $num
|
||||
num+=10
|
||||
echo $num
|
||||
|
||||
declare +i num
|
||||
declare -p num
|
||||
|
||||
echo $num
|
||||
num+=10
|
||||
echo $num
|
||||
|
||||
- name: "Declare integer with non-integer string"
|
||||
stdin: |
|
||||
declare -i var=value
|
||||
declare -p var
|
||||
|
||||
- name: "Update integer with non-integer string"
|
||||
stdin: |
|
||||
declare -i var=10
|
||||
declare -p var
|
||||
|
||||
var=value
|
||||
declare -p var
|
||||
|
||||
- name: "Update integer array with non-integer string"
|
||||
stdin: |
|
||||
declare -ai arr=()
|
||||
declare -p arr
|
||||
|
||||
arr[0]="value"
|
||||
declare -p arr
|
||||
|
||||
- name: "Update integer array with non-integer string"
|
||||
stdin: |
|
||||
declare -Ai arr=()
|
||||
declare -p arr
|
||||
|
||||
arr['key']="value"
|
||||
declare -p arr
|
||||
|
||||
- name: "Declare readonly variable"
|
||||
ignore_stderr: true
|
||||
stdin: |
|
||||
declare -r var="readonly"
|
||||
declare -p var
|
||||
|
||||
echo $var
|
||||
|
||||
var="change"
|
||||
echo "change result: $?"
|
||||
echo "var: ${var}"
|
||||
|
||||
declare +r var
|
||||
echo "+r result: $?"
|
||||
declare -p var
|
||||
|
||||
- name: "Declare array"
|
||||
stdin: |
|
||||
declare -a arr=("element1" "element2" "element3")
|
||||
declare -p arr
|
||||
echo "[0]: ${arr[0]}"
|
||||
echo "[1]: ${arr[0]}"
|
||||
echo "[2]: ${arr[0]}"
|
||||
echo "[3]: ${arr[0]}"
|
||||
echo "STAR: ${arr[*]}"
|
||||
echo "AT: ${arr[*]}"
|
||||
|
||||
- name: "Declare associative array"
|
||||
stdin: |
|
||||
declare -A arr=(["x1"]=1 ["x2"]=2)
|
||||
declare -p arr
|
||||
echo "[x]: ${arr[x1]}"
|
||||
echo "[y]: ${arr[x2]}"
|
||||
echo "[z]: ${arr[x3]}"
|
||||
echo "STAR: ${arr[*]}"
|
||||
echo "AT: ${arr[*]}"
|
||||
|
||||
- name: "Declare and export variable"
|
||||
stdin: |
|
||||
declare -x myexportedvar="exported variable"
|
||||
env | grep myexportedvar
|
||||
|
||||
- name: "Declare and export unset variable"
|
||||
stdin: |
|
||||
declare -x myunsetexportedvar
|
||||
env | grep myunsetexportedvar
|
||||
set | grep myunsetexportedvar=
|
||||
|
||||
- name: "Re-declaring variable"
|
||||
stdin: |
|
||||
var="value"
|
||||
declare var
|
||||
echo "var: ${var}"
|
||||
|
||||
- name: "Declaring without value"
|
||||
stdin: |
|
||||
[[ -v var ]] && echo "1: Variable is set"
|
||||
declare var
|
||||
declare -p var
|
||||
[[ -v var ]] && echo "2: Variable is set"
|
||||
declare var2=""
|
||||
declare -p var2
|
||||
[[ -v var2 ]] && echo "3: Variable is set"
|
||||
|
||||
- name: "Displaying local vars"
|
||||
stdin: |
|
||||
function test {
|
||||
echo "Dumping local variables (should be empty)"
|
||||
local -p
|
||||
|
||||
local -i int_var=10
|
||||
local -A assoc_array=(["x1"]=1 ["x2"]=2)
|
||||
local -a array=(a b c)
|
||||
local -r ro_var="readonly"
|
||||
local -t traced="value"
|
||||
|
||||
echo "Dump all variables"
|
||||
local -p
|
||||
}
|
||||
|
||||
test
|
||||
|
||||
- name: "Using local to detect function presence"
|
||||
stdin: |
|
||||
function test {
|
||||
local something 2>/dev/null && echo "In function"
|
||||
}
|
||||
|
||||
local something 2>/dev/null || echo "Not in function"
|
||||
|
||||
test
|
||||
|
||||
- name: "Displaying function names"
|
||||
stdin: |
|
||||
echo "Dumping function names"
|
||||
declare -F
|
||||
declare -p -F
|
||||
|
||||
function test {
|
||||
:
|
||||
}
|
||||
|
||||
echo "Dumping function names again"
|
||||
declare -F
|
||||
declare -p -F
|
||||
|
||||
echo "Dumping test"
|
||||
declare -F test
|
||||
declare -p -F test
|
||||
|
||||
- name: "Displaying functions"
|
||||
stdin: |
|
||||
echo "Dumping functions"
|
||||
declare -f
|
||||
declare -p -f
|
||||
|
||||
function test {
|
||||
:
|
||||
}
|
||||
|
||||
echo "Dumping functions again"
|
||||
declare -f
|
||||
declare -p -f
|
||||
|
||||
echo "Dumping test"
|
||||
declare -f test
|
||||
declare -p -f test
|
||||
|
||||
- name: "Displaying non-existent functions"
|
||||
stdin: |
|
||||
declare -f not_a_function
|
||||
echo "Result (-f): $?"
|
||||
|
||||
declare -F not_a_function
|
||||
echo "Result (-F): $?"
|
||||
|
||||
- name: "Valid conversions"
|
||||
stdin: |
|
||||
declare -a arr1=(a b c)
|
||||
declare -a arr1
|
||||
echo "Conversion result: $?"
|
||||
declare -p arr1
|
||||
|
||||
declare -A arr2=(["x1"]=1 ["x2"]=2)
|
||||
declare -A arr2
|
||||
echo "Conversion result: $?"
|
||||
declare -p arr2
|
||||
|
||||
declare scalar1="value"
|
||||
declare -a scalar1
|
||||
echo "Conversion result: $?"
|
||||
declare -p scalar1
|
||||
|
||||
declare scalar2="value"
|
||||
declare -A scalar2
|
||||
echo "Conversion result: $?"
|
||||
declare -p scalar2
|
||||
|
||||
- name: "Bad conversions"
|
||||
ignore_stderr: true
|
||||
stdin: |
|
||||
declare -a arr1=(a b c)
|
||||
declare -A arr1
|
||||
echo "Conversion result: $?"
|
||||
declare -p arr1
|
||||
|
||||
declare -A arr2=(["x1"]=1 ["x2"]=2)
|
||||
declare -a arr2
|
||||
echo "Conversion result: $?"
|
||||
declare -p arr2
|
||||
|
||||
- name: "Declare -p using invalid forms"
|
||||
ignore_stderr: true
|
||||
stdin: |
|
||||
declare arr=(a b c)
|
||||
declare -p arr[0]
|
||||
echo "Result: $?"
|
||||
declare -p arr[0]=1
|
||||
echo "Result: $?"
|
||||
|
||||
declare scalar=x
|
||||
echo "Result: $?"
|
||||
declare -p scalar=y
|
||||
echo "Result: $?"
|
||||
|
||||
- name: "Updating value"
|
||||
stdin: |
|
||||
declare var="value"
|
||||
declare -p var
|
||||
declare var="changed"
|
||||
declare -p var
|
||||
|
||||
- name: "Updating value attributes"
|
||||
stdin: |
|
||||
declare -ix var=10
|
||||
declare -p var
|
||||
declare +ix var
|
||||
declare -p var
|
||||
|
||||
- name: "Updating array"
|
||||
stdin: |
|
||||
declare arr=(a b c)
|
||||
declare -p arr
|
||||
declare arr=(d e)
|
||||
declare -p arr
|
||||
declare arr=10
|
||||
declare -p arr
|
||||
|
||||
declare arr2=a
|
||||
declare -p arr2
|
||||
declare -A arr2=(["key"]="value")
|
||||
declare -p arr2
|
||||
|
||||
- name: "Updating causing conversion"
|
||||
stdin: |
|
||||
source helpers.sh
|
||||
|
||||
declare assoc_array="scalar-value"
|
||||
declare -p assoc_array
|
||||
|
||||
declare -A assoc_array["key"]="key-value"
|
||||
stable_print_assoc_array assoc_array
|
||||
|
||||
- name: "Uppercase attribute"
|
||||
stdin: |
|
||||
declare var=value
|
||||
|
||||
declare -u var
|
||||
declare -p var
|
||||
|
||||
var="abcd"
|
||||
declare -p var
|
||||
|
||||
declare another="abcd"
|
||||
declare -u another
|
||||
another+=efg
|
||||
declare -p another
|
||||
|
||||
- name: "Lowercase attribute"
|
||||
stdin: |
|
||||
declare var=value
|
||||
|
||||
declare -l var
|
||||
declare -p var
|
||||
|
||||
var="AbCd"
|
||||
declare -p var
|
||||
|
||||
declare another="ABCD"
|
||||
declare -l another
|
||||
another+=EFG
|
||||
declare -p another
|
||||
|
||||
- name: "Capitalize attribute"
|
||||
stdin: |
|
||||
declare var=value
|
||||
|
||||
declare -c var
|
||||
declare -p var
|
||||
|
||||
var="aBcD eFg"
|
||||
declare -p var
|
||||
|
||||
declare another="aBcD"
|
||||
declare -c another
|
||||
another+=eFg
|
||||
declare -p another
|
||||
|
||||
- name: "Declare invalid identifiers"
|
||||
ignore_stderr: true
|
||||
stdin: |
|
||||
declare 1=x && echo "Set 1"
|
||||
declare @=10 && echo "Set @"
|
||||
|
||||
- name: "Nameref declare -p shows nameref attribute"
|
||||
stdin: |
|
||||
target="hello"
|
||||
declare -n ref=target
|
||||
declare -p ref
|
||||
declare -p target
|
||||
|
||||
- name: "Nameref declare -n with initial value"
|
||||
known_failure: true
|
||||
stdin: |
|
||||
target="original"
|
||||
declare -n ref=target
|
||||
echo "ref: $ref"
|
||||
echo "target: $target"
|
||||
|
||||
- name: "Nameref remove attribute with +n"
|
||||
known_failure: true
|
||||
stdin: |
|
||||
target="value"
|
||||
declare -n ref=target
|
||||
echo "as nameref: $ref"
|
||||
declare +n ref
|
||||
echo "after +n: ref=$ref"
|
||||
declare -p ref
|
||||
|
||||
- name: "Nameref to array via declare"
|
||||
known_failure: true
|
||||
stdin: |
|
||||
arr=(one two three)
|
||||
declare -n ref=arr
|
||||
echo "ref[0]: ${ref[0]}"
|
||||
echo "ref[1]: ${ref[1]}"
|
||||
echo "ref[@]: ${ref[@]}"
|
||||
echo "ref[*]: ${ref[*]}"
|
||||
|
||||
- name: "Nameref array modification via declare"
|
||||
known_failure: true
|
||||
stdin: |
|
||||
arr=(a b c)
|
||||
declare -n ref=arr
|
||||
ref[1]="modified"
|
||||
echo "arr[1]: ${arr[1]}"
|
||||
echo "ref[1]: ${ref[1]}"
|
||||
|
||||
- name: "Nameref to associative array via declare"
|
||||
known_failure: true
|
||||
stdin: |
|
||||
declare -A assoc=(["key1"]="val1" ["key2"]="val2")
|
||||
declare -n ref=assoc
|
||||
echo "ref[key1]: ${ref[key1]}"
|
||||
echo "ref[key2]: ${ref[key2]}"
|
||||
|
||||
- name: "Nameref array iteration in function via local -n"
|
||||
known_failure: true
|
||||
stdin: |
|
||||
print_array() {
|
||||
local -n arr=$1
|
||||
echo "count: ${#arr[@]}"
|
||||
for elem in "${arr[@]}"; do
|
||||
echo "elem: $elem"
|
||||
done
|
||||
}
|
||||
|
||||
myarr=(first second third)
|
||||
print_array myarr
|
||||
|
||||
- name: "Nameref get keys via declare"
|
||||
known_failure: true
|
||||
stdin: |
|
||||
declare -A assoc=(["a"]=1 ["b"]=2 ["c"]=3)
|
||||
declare -n ref=assoc
|
||||
echo "keys (sorted): $(printf '%s\n' ${!ref[@]} | sort | tr '\n' ' ')"
|
||||
echo "count: ${#ref[@]}"
|
||||
|
||||
- name: "Nameref array length via declare"
|
||||
known_failure: true
|
||||
stdin: |
|
||||
arr=(one two three four five)
|
||||
declare -n ref=arr
|
||||
echo "length: ${#ref[@]}"
|
||||
echo "first element length: ${#ref[0]}"
|
||||
|
||||
- name: "Nameref declare -n filter"
|
||||
stdin: |
|
||||
regular="plain"
|
||||
declare -n ref1=regular
|
||||
declare -n ref2=regular
|
||||
not_a_ref="also plain"
|
||||
declare -p -n 2>/dev/null | sort
|
||||
Reference in New Issue
Block a user