#!/bin/bash #shellcheck disable=SC1090 . "$TF_DIR/include/subtest.sh" . "$TF_DIR/include/tools.sh" . "$(sfpath)" || tf_exit_error "failed to init shellfu" export PRETTY=plain shellfu import arr || tf_exit_error "failed to import arr" tf_enum_subtests() { echo arr__fromcmd,inval echo arr__fromcmd,c_null echo arr__fromcmd,c_zlz echo arr__fromcmd,c_lzl echo arr__fromcmd,c_lz echo arr__fromcmd,c_zl echo arr__fromcmd,c_zz echo arr__fromcmd,c_zzz echo arr__fromcmd,c_l echo arr__fromcmd,c_ll echo arr__fromcmd,c_lll echo arr__has,nsuch echo arr__has,c_null echo arr__has,w_null_yes echo arr__has,w_null_not echo arr__has,m_not echo arr__has,m_mid echo arr__has,m_a echo arr__has,m_z echo arr__join,nsuch echo arr__join,d_null echo arr__join,c_null echo arr__join,d_mult echo arr__join,c_zz echo arr__join,c_lll echo arr__join,c_z echo arr__join,c_l } bashfix() { local x=${BASH_VERSION%%.*} local yz=${BASH_VERSION#$x.} local y=${yz%%.**} if test "$x" -eq 4 && test "$y" -lt 4; then tr -d "'" else cat fi } cmd_printing() { local what=$1 case $1 in c_null) : ;; c_z) echo ;; c_zz) echo; echo ;; c_zzz) echo; echo; echo ;; c_l) echo all ;; c_ll) echo first; echo last ;; c_lll) echo first; echo mid; echo last ;; c_zlz) echo; echo mid; echo ;; c_lzl) echo first; echo; echo last ;; c_lz) echo left; echo ;; c_zl) echo; echo right ;; esac } mkadecl() { local name=$1 local shape=$2 echo -n "declare -a $name=" case $shape in inval) echo '()' ;; c_null) echo '()' ;; c_z) echo '([0]="")' ;; c_zz) echo '([0]="" [1]="")' ;; c_zzz) echo '([0]="" [1]="" [2]="")' ;; c_l) echo '([0]="all")' ;; c_ll) echo '([0]="first" [1]="last")' ;; c_lll) echo '([0]="first" [1]="mid" [2]="last")' ;; c_zlz) echo '([0]="" [1]="mid" [2]="")' ;; c_lzl) echo '([0]="first" [1]="" [2]="last")' ;; c_lz) echo '([0]="left" [1]="")' ;; c_zl) echo '([0]="" [1]="right")' ;; esac } getprop() { # # Make artifact or oracle $what for $TestName # local what=$1 case $TestName:$what in # arr__fromcmd arr__fromcmd,inval:args) echo bad=array=name; echo echo; echo hello ;; arr__fromcmd,c_*:args) echo cout; echo cmd_printing; echo "${TestName#*,}" ;; arr__fromcmd,*:o_decl) mkadecl cout "${TestName#*,}" ;; arr__fromcmd,inval:o_es) echo 2 ;; arr__fromcmd,*:o_es) echo 0 ;; # arr__has arr__has,w_null_yes:a_decl) mkadecl cin c_lzl ;; arr__has,w_null_not:a_decl) mkadecl cin c_lll ;; arr__has,c_null:a_decl) mkadecl cin c_null ;; arr__has,m_not:a_decl) mkadecl cin c_lll ;; arr__has,m_mid:a_decl) mkadecl cin c_lll ;; arr__has,m_a:a_decl) mkadecl cin c_lll ;; arr__has,m_z:a_decl) mkadecl cin c_lll ;; arr__has,nsuch:args) echo foo; echo nonesuch ;; arr__has,c_null:args) echo foo; echo cin ;; arr__has,w_null*:args) echo ""; echo cin ;; arr__has,m_not:args) echo bar; echo cin ;; arr__has,m_mid:args) echo mid; echo cin ;; arr__has,m_a:args) echo first; echo cin ;; arr__has,m_z:args) echo last; echo cin ;; arr__has,nsuch:o_es) echo 2 ;; arr__has,m_not:o_es) echo 1 ;; arr__has,c_null:o_es) echo 1 ;; arr__has,w_null_not:o_es) echo 1 ;; arr__has,*:o_es) echo 0 ;; # arr__join arr__join,nsuch:a_decl) mkadecl cin c_lll ;; arr__join,d_null:a_decl) mkadecl cin c_lll ;; arr__join,d_mult:a_decl) mkadecl cin c_lll ;; arr__join,c_null:a_decl) mkadecl cin c_null ;; arr__join,c_zz:a_decl) mkadecl cin c_zz ;; arr__join,c_zzz:a_decl) mkadecl cin c_zzz ;; arr__join,c_lll:a_decl) mkadecl cin c_lll ;; arr__join,c_z:a_decl) mkadecl cin c_z ;; arr__join,c_l:a_decl) mkadecl cin c_l ;; arr__join,nsuch:args) echo oxo; echo nonesuch ;; arr__join,d_null:args) echo ""; echo cin ;; arr__join,d_mult:args) echo oxo; echo cin ;; arr__join,c_null:args) echo .; echo cin ;; arr__join,c_zz:args) echo .; echo cin ;; arr__join,c_zzz:args) echo .; echo cin ;; arr__join,c_lll:args) echo .; echo cin ;; arr__join,c_z:args) echo .; echo cin ;; arr__join,c_l:args) echo .; echo cin ;; arr__join,nsuch:o_out) echo -n ;; arr__join,d_null:o_out) echo -n firstmidlast ;; arr__join,d_mult:o_out) echo -n firstoxomidoxolast ;; arr__join,c_null:o_out) echo -n '' ;; arr__join,c_zz:o_out) echo -n . ;; arr__join,c_zzz:o_out) echo -n .. ;; arr__join,c_lll:o_out) echo -n first.mid.last ;; arr__join,c_z:o_out) echo -n ;; arr__join,c_l:o_out) echo -n all ;; arr__join,nsuch:o_es) echo 2 ;; arr__join,*:o_es) echo 0 ;; esac } mkresult() { local sut local ttype local args=() local cout=() local cin=() local r_es ttype=${TestName##*,} sut=${TestName%,$ttype} type -t "$sut" >/dev/null || { tf_exit_error "no such function: $sut" } readarray -t args <<<"$(getprop args)" tf_debugv args case $sut in arr__fromcmd) cout=() "$sut" "${args[@]}"; r_es=$? declare -p cout | bashfix ;; *) eval "$(getprop a_decl)" "$sut" "${args[@]}"; r_es=$? ;; esac return "$r_es" } mkoracle() { case $TestName in *,nsuch) echo 'no such array: nonesuch' >&2 ;; arr__fromcmd,inval) getprop o_decl echo 'invalid array name: bad=array=name' >&2 ;; arr__fromcmd,*) getprop o_decl ;; arr__join,*) getprop o_out ;; esac >"oracle/$TestName.out" 2>"oracle/$TestName.err" } tf_do_subtest() { local TestName=$1 local o_es mkdir -p oracle result o_es=$(getprop o_es) mkoracle tf_testflt \ -n "$TestName" \ -O "oracle/$TestName.out" \ -E "oracle/$TestName.err" \ -S "$o_es" \ "mkresult" } tf_do_subtests