shell dot on steroids https://pagure.io/shellfu

TF_RUN 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #!/bin/bash
  2. #shellcheck disable=SC1090
  3. . "$TF_DIR/include/subtest.sh"
  4. . "$TF_DIR/include/tools.sh"
  5. . "$(sfpath)" || tf_exit_error "failed to init shellfu"
  6. export PRETTY=plain
  7. shellfu import arr || tf_exit_error "failed to import arr"
  8. tf_enum_subtests() {
  9. echo arr__fromcmd,inval
  10. echo arr__fromcmd,c_null
  11. echo arr__fromcmd,c_zlz
  12. echo arr__fromcmd,c_lzl
  13. echo arr__fromcmd,c_lz
  14. echo arr__fromcmd,c_zl
  15. echo arr__fromcmd,c_zz
  16. echo arr__fromcmd,c_zzz
  17. echo arr__fromcmd,c_l
  18. echo arr__fromcmd,c_ll
  19. echo arr__fromcmd,c_lll
  20. echo arr__has,nsuch
  21. echo arr__has,c_null
  22. echo arr__has,w_null_yes
  23. echo arr__has,w_null_not
  24. echo arr__has,m_not
  25. echo arr__has,m_mid
  26. echo arr__has,m_a
  27. echo arr__has,m_z
  28. echo arr__join,nsuch
  29. echo arr__join,d_null
  30. echo arr__join,c_null
  31. echo arr__join,d_mult
  32. echo arr__join,c_zz
  33. echo arr__join,c_lll
  34. echo arr__join,c_z
  35. echo arr__join,c_l
  36. }
  37. bashfix() {
  38. local x=${BASH_VERSION%%.*}
  39. local yz=${BASH_VERSION#$x.}
  40. local y=${yz%%.**}
  41. if test "$x" -eq 4 && test "$y" -lt 4; then
  42. tr -d "'"
  43. else
  44. cat
  45. fi
  46. }
  47. cmd_printing() {
  48. local what=$1
  49. case $1 in
  50. c_null) : ;;
  51. c_z) echo ;;
  52. c_zz) echo; echo ;;
  53. c_zzz) echo; echo; echo ;;
  54. c_l) echo all ;;
  55. c_ll) echo first; echo last ;;
  56. c_lll) echo first; echo mid; echo last ;;
  57. c_zlz) echo; echo mid; echo ;;
  58. c_lzl) echo first; echo; echo last ;;
  59. c_lz) echo left; echo ;;
  60. c_zl) echo; echo right ;;
  61. esac
  62. }
  63. mkadecl() {
  64. local name=$1
  65. local shape=$2
  66. echo -n "declare -a $name="
  67. case $shape in
  68. inval) echo '()' ;;
  69. c_null) echo '()' ;;
  70. c_z) echo '([0]="")' ;;
  71. c_zz) echo '([0]="" [1]="")' ;;
  72. c_zzz) echo '([0]="" [1]="" [2]="")' ;;
  73. c_l) echo '([0]="all")' ;;
  74. c_ll) echo '([0]="first" [1]="last")' ;;
  75. c_lll) echo '([0]="first" [1]="mid" [2]="last")' ;;
  76. c_zlz) echo '([0]="" [1]="mid" [2]="")' ;;
  77. c_lzl) echo '([0]="first" [1]="" [2]="last")' ;;
  78. c_lz) echo '([0]="left" [1]="")' ;;
  79. c_zl) echo '([0]="" [1]="right")' ;;
  80. esac
  81. }
  82. getprop() {
  83. #
  84. # Make artifact or oracle $what for $TestName
  85. #
  86. local what=$1
  87. case $TestName:$what in
  88. # arr__fromcmd
  89. arr__fromcmd,inval:args) echo bad=array=name; echo echo; echo hello ;;
  90. arr__fromcmd,c_*:args) echo cout; echo cmd_printing; echo "${TestName#*,}" ;;
  91. arr__fromcmd,*:o_decl) mkadecl cout "${TestName#*,}" ;;
  92. arr__fromcmd,inval:o_es) echo 2 ;;
  93. arr__fromcmd,*:o_es) echo 0 ;;
  94. # arr__has
  95. arr__has,w_null_yes:a_decl) mkadecl cin c_lzl ;;
  96. arr__has,w_null_not:a_decl) mkadecl cin c_lll ;;
  97. arr__has,c_null:a_decl) mkadecl cin c_null ;;
  98. arr__has,m_not:a_decl) mkadecl cin c_lll ;;
  99. arr__has,m_mid:a_decl) mkadecl cin c_lll ;;
  100. arr__has,m_a:a_decl) mkadecl cin c_lll ;;
  101. arr__has,m_z:a_decl) mkadecl cin c_lll ;;
  102. arr__has,nsuch:args) echo foo; echo nonesuch ;;
  103. arr__has,c_null:args) echo foo; echo cin ;;
  104. arr__has,w_null*:args) echo ""; echo cin ;;
  105. arr__has,m_not:args) echo bar; echo cin ;;
  106. arr__has,m_mid:args) echo mid; echo cin ;;
  107. arr__has,m_a:args) echo first; echo cin ;;
  108. arr__has,m_z:args) echo last; echo cin ;;
  109. arr__has,nsuch:o_es) echo 2 ;;
  110. arr__has,m_not:o_es) echo 1 ;;
  111. arr__has,c_null:o_es) echo 1 ;;
  112. arr__has,w_null_not:o_es) echo 1 ;;
  113. arr__has,*:o_es) echo 0 ;;
  114. # arr__join
  115. arr__join,nsuch:a_decl) mkadecl cin c_lll ;;
  116. arr__join,d_null:a_decl) mkadecl cin c_lll ;;
  117. arr__join,d_mult:a_decl) mkadecl cin c_lll ;;
  118. arr__join,c_null:a_decl) mkadecl cin c_null ;;
  119. arr__join,c_zz:a_decl) mkadecl cin c_zz ;;
  120. arr__join,c_zzz:a_decl) mkadecl cin c_zzz ;;
  121. arr__join,c_lll:a_decl) mkadecl cin c_lll ;;
  122. arr__join,c_z:a_decl) mkadecl cin c_z ;;
  123. arr__join,c_l:a_decl) mkadecl cin c_l ;;
  124. arr__join,nsuch:args) echo oxo; echo nonesuch ;;
  125. arr__join,d_null:args) echo ""; echo cin ;;
  126. arr__join,d_mult:args) echo oxo; echo cin ;;
  127. arr__join,c_null:args) echo .; echo cin ;;
  128. arr__join,c_zz:args) echo .; echo cin ;;
  129. arr__join,c_zzz:args) echo .; echo cin ;;
  130. arr__join,c_lll:args) echo .; echo cin ;;
  131. arr__join,c_z:args) echo .; echo cin ;;
  132. arr__join,c_l:args) echo .; echo cin ;;
  133. arr__join,nsuch:o_out) echo -n ;;
  134. arr__join,d_null:o_out) echo -n firstmidlast ;;
  135. arr__join,d_mult:o_out) echo -n firstoxomidoxolast ;;
  136. arr__join,c_null:o_out) echo -n '' ;;
  137. arr__join,c_zz:o_out) echo -n . ;;
  138. arr__join,c_zzz:o_out) echo -n .. ;;
  139. arr__join,c_lll:o_out) echo -n first.mid.last ;;
  140. arr__join,c_z:o_out) echo -n ;;
  141. arr__join,c_l:o_out) echo -n all ;;
  142. arr__join,nsuch:o_es) echo 2 ;;
  143. arr__join,*:o_es) echo 0 ;;
  144. esac
  145. }
  146. mkresult() {
  147. local sut
  148. local ttype
  149. local args=()
  150. local cout=()
  151. local cin=()
  152. local r_es
  153. ttype=${TestName##*,}
  154. sut=${TestName%,$ttype}
  155. type -t "$sut" >/dev/null || {
  156. tf_exit_error "no such function: $sut"
  157. }
  158. readarray -t args <<<"$(getprop args)"
  159. tf_debugv args
  160. case $sut in
  161. arr__fromcmd)
  162. cout=()
  163. "$sut" "${args[@]}"; r_es=$?
  164. declare -p cout | bashfix
  165. ;;
  166. *)
  167. eval "$(getprop a_decl)"
  168. "$sut" "${args[@]}"; r_es=$?
  169. ;;
  170. esac
  171. return "$r_es"
  172. }
  173. mkoracle() {
  174. case $TestName in
  175. *,nsuch)
  176. echo 'no such array: nonesuch' >&2
  177. ;;
  178. arr__fromcmd,inval)
  179. getprop o_decl
  180. echo 'invalid array name: bad=array=name' >&2
  181. ;;
  182. arr__fromcmd,*)
  183. getprop o_decl
  184. ;;
  185. arr__join,*)
  186. getprop o_out
  187. ;;
  188. esac >"oracle/$TestName.out" 2>"oracle/$TestName.err"
  189. }
  190. tf_do_subtest() {
  191. local TestName=$1
  192. local o_es
  193. mkdir -p oracle result
  194. o_es=$(getprop o_es)
  195. mkoracle
  196. tf_testflt \
  197. -n "$TestName" \
  198. -O "oracle/$TestName.out" \
  199. -E "oracle/$TestName.err" \
  200. -S "$o_es" \
  201. "mkresult"
  202. }
  203. tf_do_subtests