# this script is a part of blesh (https://github.com/akinomyoga/ble.sh) under BSD-3-Clause license ble-import lib/core-test ble/test/start-section 'ble/util' 1198 ( ble/test 'bleopt a=1' \ exit=2 ble/test 'bleopt a' \ stdout= exit=2 ble/test 'bleopt a:=2' ble/test 'bleopt a' \ stdout="bleopt a=2" ble/test '[[ $bleopt_a == 2 ]]' ble/test "bleopt | grep 'bleopt a='" \ stdout="bleopt a=2" ble/test 'bleopt a=3' ble/test 'bleopt a' \ stdout="bleopt a=3" function bleopt/check:a { value=123; } ble/test 'bleopt a=4 && bleopt a' stdout="bleopt a=123" function bleopt/check:a { false; } ble/test 'bleopt a=5' \ exit=1 ble/test 'bleopt a' \ stdout="bleopt a=123" ble/test bleopt f:=10 g:=11 ble/test bleopt f g \ stdout="bleopt f=10${_ble_term_nl}bleopt g=11" ble/test bleopt f=12 g=13 ble/test bleopt f g \ stdout="bleopt f=12${_ble_term_nl}bleopt g=13" ble/test bleopt/declare -v b 6 ble/test bleopt b stdout="bleopt b=6" ble/test bleopt/declare -n c 7 ble/test bleopt c stdout="bleopt c=7" ble/test bleopt d:= e:= ble/test bleopt/declare -v d 8 ble/test bleopt/declare -n e 9 ble/test bleopt d stdout="bleopt d=" ble/test bleopt e stdout="bleopt e=9" ) ble/test ble/util/setexit 0 exit=0 ble/test ble/util/setexit 1 exit=1 ble/test ble/util/setexit 9 exit=9 ble/test ble/util/setexit 128 exit=128 ble/test ble/util/setexit 255 exit=255 ( a=1 function f1 { echo g:$a local a=2 echo l:$a ble/util/unlocal a echo g:$a a=3 } ble/test 'f1; echo g:$a' \ stdout=g:1 \ stdout=l:2 \ stdout=g:1 \ stdout=g:3 function f2 { echo f1:$a@f2 local a=3 echo f2:$a@f2 ble/util/unlocal a echo f1:$a@f2 a=$a+ } function f1 { echo g:$a@f1 local a=2 echo f1:$a@f1 f2 echo f1:$a@f1 ble/util/unlocal a echo g:$a@f1 a=$a+ } ble/test 'a=1; f1; echo g:$a@g' \ stdout=g:1@f1 \ stdout=f1:2@f1 \ stdout=f1:2@f2 \ stdout=f2:3@f2 \ stdout=f1:2@f2 \ stdout=f1:2+@f1 \ stdout=g:1@f1 \ stdout=g:1+@g ) ( function f1 { local a=1 b=2 local result=$((a+b)) local "$1" && ble/util/upvar "$1" "$result" } ble/test 'f1 x; ret=$x' ret=3 ble/test 'f1 a; ret=$a' ret=3 ble/test 'f1 result; ret=$result' ret=3 function f2 { local a=1 local -a b=(2) local -a result=($((a+b[0])) y z) local "$1" && ble/util/uparr "$1" "${result[@]}" } ble/test 'f2 x; ret="(${x[*]})"' ret='(3 y z)' ble/test 'f2 a; ret="(${a[*]})"' ret='(3 y z)' ble/test 'f2 b; ret="(${b[*]})"' ret='(3 y z)' ble/test 'f2 result; ret="(${result[*]})"' ret='(3 y z)' ) ( VARNAMES=(name x y count data) function print-status { echo "name=$name x=$x y=$y count=$count data=(${data[*]})" } function f1 { local "${VARNAMES[@]/%/=}" # WA #D1570 checked name=1 x=2 y=3 count=4 data=(aa bb cc dd) print-status ble/util/save-vars save1_ "${VARNAMES[@]}" name=one x= y=A count=1 data=(Q) print-status ble/util/save-vars save2_ "${VARNAMES[@]}" ble/util/restore-vars save1_ "${VARNAMES[@]}" print-status ble/util/restore-vars save2_ "${VARNAMES[@]}" print-status } ble/test f1 \ stdout='name=1 x=2 y=3 count=4 data=(aa bb cc dd)' \ stdout='name=one x= y=A count=1 data=(Q)' \ stdout='name=1 x=2 y=3 count=4 data=(aa bb cc dd)' \ stdout='name=one x= y=A count=1 data=(Q)' ) ( declare v=1 declare -i i=1 export x=2 readonly r=3 declare -a a=() if ((_ble_bash>=40000)); then declare -A A=() declare -u u=a declare -l l=B declare -c c=c fi if ((_ble_bash>=40300)); then declare -n n=r fi ble/test 'ble/variable#get-attr v; ret=$attr' ret= ble/test 'ble/variable#get-attr i; ret=$attr' ret=i ble/test 'ble/variable#get-attr x; ret=$attr' ret=x ble/test 'ble/variable#get-attr r; ret=$attr' ret=r ble/test 'ble/variable#get-attr a; ret=$attr' ret=a if ((_ble_bash>=40000)); then ble/test 'ble/variable#get-attr u; ret=$attr' ret=u ble/test 'ble/variable#get-attr l; ret=$attr' ret=l ble/test 'ble/variable#get-attr c; ret=$attr' ret=c ble/test 'ble/variable#get-attr A; ret=$attr' ret=A fi ble/test 'ble/variable#has-attr i i' ble/test 'ble/variable#has-attr x x' ble/test 'ble/variable#has-attr r r' ble/test 'ble/variable#has-attr a a' ble/test 'ble/variable#has-attr v i' exit=1 ble/test 'ble/variable#has-attr v x' exit=1 ble/test 'ble/variable#has-attr v r' exit=1 ble/test 'ble/variable#has-attr v a' exit=1 if ((_ble_bash>=40000)); then ble/test 'ble/variable#has-attr u u' ble/test 'ble/variable#has-attr l l' ble/test 'ble/variable#has-attr c c' ble/test 'ble/variable#has-attr A A' ble/test 'ble/variable#has-attr v u' exit=1 ble/test 'ble/variable#has-attr v l' exit=1 ble/test 'ble/variable#has-attr v c' exit=1 ble/test 'ble/variable#has-attr v A' exit=1 fi ble/test 'ble/is-inttype i' ble/test 'ble/is-inttype v' exit=1 ble/test 'ble/is-readonly r' ble/test 'ble/is-readonly v' exit=1 if ((_ble_bash>=40000)); then ble/test 'ble/is-transformed u' ble/test 'ble/is-transformed l' ble/test 'ble/is-transformed c' ble/test 'ble/is-transformed v' exit=1 fi ) function is-global() (readonly "$1"; ! local "$1" 2>/dev/null) ( v1=1 v2=2 ((_ble_bash>=40200)) && declare -g v1u v2u function f1 { local v2=22 v3=33 local v2u v3u f2 } function f2 { local v4=444 v4u ble/test 'is-global v0' ble/test 'is-global v1' ble/test 'is-global v2' exit=1 ble/test 'is-global v3' exit=1 ble/test 'is-global v4' exit=1 ble/test 'ble/variable#is-global v0' ble/test 'ble/variable#is-global v1' ble/test 'ble/variable#is-global v2' exit=1 ble/test 'ble/variable#is-global v3' exit=1 ble/test 'ble/variable#is-global v4' exit=1 ble/test 'ble/variable#is-global v0u' if ((_ble_bash>=40200)); then ble/test 'ble/variable#is-global v1u' ble/test 'ble/variable#is-global v2u' exit=1 fi ble/test 'ble/variable#is-global v3u' exit=1 ble/test 'ble/variable#is-global v4u' exit=1 } f1 ) ( _ble_array_prototype=() ble/test 'echo ${#_ble_array_prototype[@]}' stdout=0 ble/array#reserve-prototype 10 ble/test 'echo ${#_ble_array_prototype[@]}' stdout=10 ble/test 'x=("${_ble_array_prototype[@]::10}"); echo ${#x[@]}' stdout=10 ble/array#reserve-prototype 3 ble/test 'echo ${#_ble_array_prototype[@]}' stdout=10 ble/test 'x=("${_ble_array_prototype[@]::3}"); echo ${#x[@]}' stdout=3 ) ( declare -a a=() declare b= ble/test 'ble/is-array a' ble/test 'ble/is-array b' exit=1 ble/test 'ble/is-array c' exit=1 if ((_ble_bash>=40000)); then declare -A A=() ble/test 'ble/is-array A' exit=1 ble/test 'ble/is-assoc a' exit=1 ble/test 'ble/is-assoc A' ble/test 'ble/is-assoc b' exit=1 ble/test 'ble/is-assoc c' exit=1 fi ) ( ble/test 'ble/array#set a; echo "${#a[@]}:(${a[*]})"' stdout='0:()' ble/test 'ble/array#set a Q; echo "${#a[@]}:(${a[*]})"' stdout='1:(Q)' ble/test 'ble/array#set a 1 2 3; echo "${#a[@]}:(${a[*]})"' stdout='3:(1 2 3)' ble/test 'ble/array#set a; echo "${#a[@]}:(${a[*]})"' stdout='0:()' ) ( declare -a a=() ble/array#push a ble/test 'echo "${#a[@]}:(${a[*]})"' stdout='0:()' ble/array#push a A ble/test 'echo "${#a[@]}:(${a[*]})"' stdout='1:(A)' ble/array#push a B C ble/test 'echo "${#a[@]}:(${a[*]})"' stdout='3:(A B C)' ble/array#push a ble/test 'echo "${#a[@]}:(${a[*]})"' stdout='3:(A B C)' ) ( function result { echo "$ret:${#arr[*]}:(${arr[*]})"; } ble/test 'arr=() ; ble/array#pop arr; result' stdout=':0:()' ble/test 'arr=(1) ; ble/array#pop arr; result' stdout='1:0:()' ble/test 'arr=(1 2) ; ble/array#pop arr; result' stdout='2:1:(1)' ble/test 'arr=(0 0 0); ble/array#pop arr; result' stdout='0:2:(0 0)' ble/test 'arr=(1 2 3); ble/array#pop arr; result' stdout='3:2:(1 2)' ble/test 'arr=(" a a " " b b " " c c "); ble/array#pop arr; result' \ stdout=' c c :2:( a a b b )' ) ( function status { echo "${#a[@]}:(${a[*]})"; } a=() ble/array#unshift a ble/test status stdout='0:()' ble/array#unshift a A ble/test status stdout='1:(A)' ble/array#unshift a ble/test status stdout='1:(A)' ble/array#unshift a B ble/test status stdout='2:(B A)' ble/array#unshift a C D E ble/test status stdout='5:(C D E B A)' a=() ble/array#unshift a A B ble/test status stdout='2:(A B)' ) ( function status { echo "${#a[@]}:(${a[*]})"; } a=(); ble/array#reverse a ble/test status stdout='0:()' a=(1); ble/array#reverse a ble/test status stdout='1:(1)' a=(xy zw); ble/array#reverse a ble/test status stdout='2:(zw xy)' a=(a 3 x); ble/array#reverse a ble/test status stdout='3:(x 3 a)' a=({1..10}) b=({10..1}); ble/array#reverse a ble/test status stdout="10:(${b[*]})" a=({1..9}) b=({9..1}); ble/array#reverse a ble/test status stdout="9:(${b[*]})" ) ( function status { echo "${#a[@]}:(${a[*]})"; } a=(); ble/array#insert-at a 0 A B C ble/test status stdout='3:(A B C)' a=(); ble/array#insert-at a 1 A B C ble/test status stdout='3:(A B C)' a=(x y z); ble/array#insert-at a 0 A ble/test status stdout='4:(A x y z)' a=(x y z); ble/array#insert-at a 1 A ble/test status stdout='4:(x A y z)' a=(x y z); ble/array#insert-at a 3 A ble/test status stdout='4:(x y z A)' a=(x y z); ble/array#insert-at a 0 A B C ble/test status stdout='6:(A B C x y z)' a=(x y z); ble/array#insert-at a 1 A B C ble/test status stdout='6:(x A B C y z)' a=(x y z); ble/array#insert-at a 3 A B C ble/test status stdout='6:(x y z A B C)' a=(x y z); ble/array#insert-at a 0 ble/test status stdout='3:(x y z)' a=(x y z); ble/array#insert-at a 1 ble/test status stdout='3:(x y z)' a=(x y z); ble/array#insert-at a 3 ble/test status stdout='3:(x y z)' ) ( function status { echo "${#a[@]}:(${a[*]})"; } a=(hello world hello world) ble/array#insert-after a hello 1 2 3 ble/test status stdout='7:(hello 1 2 3 world hello world)' a=(heart world hello world) ble/array#insert-after a hello 1 2 3 ble/test status stdout='7:(heart world hello 1 2 3 world)' a=(hello world hello world) ble/test 'ble/array#insert-after a check 1 2 3' exit=1 ble/test status stdout='4:(hello world hello world)' ) ( function status { echo "${#a[@]}:(${a[*]})"; } a=(hello world this) ble/array#insert-before a this with check ble/test status stdout='5:(hello world with check this)' a=(hello world this) ble/test 'ble/array#insert-before a haystack kick check' exit=1 ble/test status stdout='3:(hello world this)' ) ( function status { echo "${#a[@]}:(${a[*]})"; } a=(xxx yyy xxx yyy yyy xxx fdsa fdsa) ble/array#remove a xxx ble/test status stdout='5:(yyy yyy yyy fdsa fdsa)' a=(aa aa aa aa aa) ble/array#remove a bb ble/test status stdout='5:(aa aa aa aa aa)' ble/array#remove a aa ble/test status stdout='0:()' ble/array#remove a cc ble/test status stdout='0:()' ) ( a=(hello world this hello world) ble/test 'ble/array#index a hello' ret=0 a=(world hep this hello world) ble/test 'ble/array#index a hello' ret=3 a=(hello world this hello world) ble/test 'ble/array#index a check' ret=-1 ) ( a=(hello world this hello world) ble/test 'ble/array#last-index a hello' ret=3 a=(world hep this hello world) ble/test 'ble/array#last-index a hello' ret=3 a=(hello world this hello world) ble/test 'ble/array#last-index a check' ret=-1 ) ( function status { echo "${#a[@]}:(${a[*]})"; } a=() ble/test 'ble/array#remove-at a 0; status' stdout='0:()' ble/test 'ble/array#remove-at a 10; status' stdout='0:()' a=(x y z) ble/test 'ble/array#remove-at a 4; status' stdout='3:(x y z)' ble/test 'ble/array#remove-at a 3; status' stdout='3:(x y z)' ble/test 'ble/array#remove-at a 1; status' stdout='2:(x z)' ble/test 'ble/array#remove-at a 0; status' stdout='1:(z)' ble/test 'ble/array#remove-at a 0; status' stdout='0:()' a=({a..z}) a1=({a..y}) a2=({b..y}) a3=({b..h} {j..y}) ble/test 'ble/array#remove-at a 25; status' stdout="25:(${a1[*]})" ble/test 'ble/array#remove-at a 0; status' stdout="24:(${a2[*]})" ble/test 'ble/array#remove-at a 7; status' stdout="23:(${a3[*]})" ) ( _ble_string_prototype=' ' ble/test 'echo ${#_ble_string_prototype}' stdout=8 ble/string#reserve-prototype 10 ble/test 'echo ${#_ble_string_prototype}' stdout=16 ble/test 'x=${_ble_string_prototype::10}; echo ${#x}' stdout=10 ble/string#reserve-prototype 3 ble/test 'echo ${#_ble_string_prototype}' stdout=16 ble/test 'x=${_ble_string_prototype::3}; echo ${#x}' stdout=3 ble/string#reserve-prototype 77 ble/test 'echo ${#_ble_string_prototype}' stdout=128 ble/test 'x=${_ble_string_prototype::77}; echo ${#x}' stdout=77 ) ( ble/test 'ble/string#repeat' ret= ble/test 'ble/string#repeat ""' ret= ble/test 'ble/string#repeat a' ret= ble/test 'ble/string#repeat abc' ret= ble/test 'ble/string#repeat "" ""' ret= ble/test 'ble/string#repeat a ""' ret= ble/test 'ble/string#repeat abc ""' ret= ble/test 'ble/string#repeat "" 0' ret= ble/test 'ble/string#repeat a 0' ret= ble/test 'ble/string#repeat abc 0' ret= ble/test 'ble/string#repeat "" 1' ret= ble/test 'ble/string#repeat "" 10' ret= ble/test 'ble/string#repeat a 1' ret=a ble/test 'ble/string#repeat a 2' ret=aa ble/test 'ble/string#repeat a 5' ret=aaaaa ble/test 'ble/string#repeat abc 1' ret=abc ble/test 'ble/string#repeat abc 2' ret=abcabc ble/test 'ble/string#repeat abc 5' ret=abcabcabcabcabc ble/test 'ble/string#repeat ";&|<>" 5' ret=';&|<>;&|<>;&|<>;&|<>;&|<>' ) ( ble/test 'ble/string#common-prefix' ret= ble/test 'ble/string#common-prefix ""' ret= ble/test 'ble/string#common-prefix a' ret= ble/test 'ble/string#common-prefix "" ""' ret= ble/test 'ble/string#common-prefix a ""' ret= ble/test 'ble/string#common-prefix a b' ret= ble/test 'ble/string#common-prefix a a' ret=a ble/test 'ble/string#common-prefix abc abc' ret=abc ble/test 'ble/string#common-prefix abc aaa' ret=a ble/test 'ble/string#common-prefix abc ccc' ret= ble/test 'ble/string#common-prefix abc xyz' ret= ) ( ble/test 'ble/string#common-suffix' ret= ble/test 'ble/string#common-suffix ""' ret= ble/test 'ble/string#common-suffix a' ret= ble/test 'ble/string#common-suffix "" ""' ret= ble/test 'ble/string#common-suffix a ""' ret= ble/test 'ble/string#common-suffix a b' ret= ble/test 'ble/string#common-suffix a a' ret=a ble/test 'ble/string#common-suffix abc abc' ret=abc ble/test 'ble/string#common-suffix abc aaa' ret= ble/test 'ble/string#common-suffix abc ccc' ret=c ble/test 'ble/string#common-suffix abc xyz' ret= ) ( function status { echo "${#a[@]}:(""${a[*]}"")"; } nl=$'\n' ble/test 'ble/string#split a , "" ; status' stdout='1:()' ble/test 'ble/string#split a , "1" ; status' stdout='1:(1)' ble/test 'ble/string#split a , "," ; status' stdout='2:( )' ble/test 'ble/string#split a , "1," ; status' stdout='2:(1 )' ble/test 'ble/string#split a , ",2" ; status' stdout='2:( 2)' ble/test 'ble/string#split a , "1,,3" ; status' stdout='3:(1 3)' ble/test 'ble/string#split a , "1,2,3" ; status' stdout='3:(1 2 3)' ble/test 'ble/string#split a " " "1 2 3"; status' stdout='3:(1 2 3)' ble/test 'ble/string#split a " " "1 2 3"; status' stdout='1:(1 2 3)' ble/test 'ble/string#split a " " "1'"$nl"'2'"$nl"'3"; status' stdout="1:(1${nl}2${nl}3)" ) ( function status { echo "${#a[@]}:(${a[*]})"; } nl=$'\n' ht=$'\t' ble/test 'ble/string#split-words a "" ; status' stdout='0:()' ble/test 'ble/string#split-words a "1" ; status' stdout='1:(1)' ble/test 'ble/string#split-words a " " ; status' stdout='0:()' ble/test 'ble/string#split-words a "1 " ; status' stdout='1:(1)' ble/test 'ble/string#split-words a " 2" ; status' stdout='1:(2)' ble/test 'ble/string#split-words a "1 3" ; status' stdout='2:(1 3)' ble/test 'ble/string#split-words a "1 2 3"; status' stdout='3:(1 2 3)' ble/test 'ble/string#split-words a " 1'"$ht"'2'"$ht"'3 "; status' stdout='3:(1 2 3)' ble/test 'ble/string#split-words a " 1'"$nl"'2'"$nl"'3 "; status' stdout='3:(1 2 3)' ) ( function status { echo "${#a[@]}:(""${a[*]}"")"; } nl=$'\n' ht=$'\t' ble/test 'ble/string#split-lines a "" ; status' stdout='1:()' ble/test 'ble/string#split-lines a "1" ; status' stdout='1:(1)' ble/test 'ble/string#split-lines a "'"$nl"'" ; status' stdout='2:( )' ble/test 'ble/string#split-lines a "1'"$nl"'" ; status' stdout='2:(1 )' ble/test 'ble/string#split-lines a "'"$nl"'2" ; status' stdout='2:( 2)' ble/test 'ble/string#split-lines a "1'"$nl$nl"'3" ; status' stdout='3:(1 3)' ble/test 'ble/string#split-lines a "1'"$nl"'2'"$nl"'3"; status' stdout='3:(1 2 3)' ble/test 'ble/string#split-lines a "1'"$ht"'2'"$ht"'3"; status' stdout="1:(1${ht}2${ht}3)" ble/test 'ble/string#split-lines a "1 2 3"; status' stdout="1:(1 2 3)" ) ( ble/test 'ble/string#count-char hello a' ret=0 ble/test 'ble/string#count-char hello あ' ret=0 ble/test 'ble/string#count-char hello e' ret=1 ble/test 'ble/string#count-char hello l' ret=2 ble/test 'ble/string#count-char hello olh' ret=4 ble/test 'ble/string#count-char hello hello' ret=5 ble/test 'ble/string#count-char "" a' ret=0 ble/test 'ble/string#count-char "" ab' ret=0 ) ( ble/test 'ble/string#count-string hello a' ret=0 ble/test 'ble/string#count-string hello あ' ret=0 ble/test 'ble/string#count-string hello ee' ret=0 ble/test 'ble/string#count-string hello e' ret=1 ble/test 'ble/string#count-string hello l' ret=2 ble/test 'ble/string#count-string hello ll' ret=1 ble/test 'ble/string#count-string hello hello' ret=1 ble/test 'ble/string#count-string "" a' ret=0 ble/test 'ble/string#count-string "" ab' ret=0 ble/test 'ble/string#count-string ababababa aba' ret=2 ) ( ble/test 'ble/string#index-of hello a' ret=-1 ble/test 'ble/string#index-of hello あ' ret=-1 ble/test 'ble/string#index-of hello ee' ret=-1 ble/test 'ble/string#index-of hello e' ret=1 ble/test 'ble/string#index-of hello l' ret=2 ble/test 'ble/string#index-of hello ll' ret=2 ble/test 'ble/string#index-of hello hello' ret=0 ble/test 'ble/string#index-of "" a' ret=-1 ble/test 'ble/string#index-of "" ab' ret=-1 ble/test 'ble/string#index-of ababababa aba' ret=0 ) ( ble/test 'ble/string#last-index-of hello a' ret=-1 ble/test 'ble/string#last-index-of hello あ' ret=-1 ble/test 'ble/string#last-index-of hello ee' ret=-1 ble/test 'ble/string#last-index-of hello e' ret=1 ble/test 'ble/string#last-index-of hello l' ret=3 ble/test 'ble/string#last-index-of hello ll' ret=2 ble/test 'ble/string#last-index-of hello hello' ret=0 ble/test 'ble/string#last-index-of "" a' ret=-1 ble/test 'ble/string#last-index-of "" ab' ret=-1 ble/test 'ble/string#last-index-of ababababa aba' ret=6 ) ( ble/test 'ble/string#toggle-case' ret= ble/test 'ble/string#tolower ' ret= ble/test 'ble/string#toupper ' ret= ble/test 'ble/string#capitalize ' ret= ble/test 'ble/string#toggle-case ""' ret= ble/test 'ble/string#tolower ""' ret= ble/test 'ble/string#toupper ""' ret= ble/test 'ble/string#capitalize ""' ret= ble/test 'ble/string#toggle-case a' ret=A ble/test 'ble/string#tolower a' ret=a ble/test 'ble/string#toupper a' ret=A ble/test 'ble/string#capitalize a' ret=A ble/test 'ble/string#toggle-case あ' ret=あ ble/test 'ble/string#tolower あ' ret=あ ble/test 'ble/string#toupper あ' ret=あ ble/test 'ble/string#capitalize あ' ret=あ ble/test 'ble/string#toggle-case +' ret=+ ble/test 'ble/string#tolower +' ret=+ ble/test 'ble/string#toupper +' ret=+ ble/test 'ble/string#capitalize +' ret=+ ble/test 'ble/string#toggle-case abc' ret=ABC ble/test 'ble/string#tolower abc' ret=abc ble/test 'ble/string#toupper abc' ret=ABC ble/test 'ble/string#capitalize abc' ret=Abc ble/test 'ble/string#toggle-case ABC' ret=abc ble/test 'ble/string#tolower ABC' ret=abc ble/test 'ble/string#toupper ABC' ret=ABC ble/test 'ble/string#capitalize ABC' ret=Abc ble/test 'ble/string#toggle-case aBc' ret=AbC ble/test 'ble/string#tolower aBc' ret=abc ble/test 'ble/string#toupper aBc' ret=ABC ble/test 'ble/string#capitalize aBc' ret=Abc ble/test 'ble/string#toggle-case +aBc' ret=+AbC ble/test 'ble/string#tolower +aBc' ret=+abc ble/test 'ble/string#toupper +aBc' ret=+ABC ble/test 'ble/string#capitalize +aBc' ret=+Abc ble/test 'ble/string#capitalize "hello world"' ret='Hello World' LC_ALL=en_US.utf8 ble/test 'ble/string#toggle-case +aBc' ret=+AbC ble/test 'ble/string#tolower +aBc' ret=+abc ble/test 'ble/string#toupper +aBc' ret=+ABC ble/test 'ble/string#capitalize +aBc' ret=+Abc ble/test 'ble/string#capitalize "hello world"' ret='Hello World' ) ( ble/test 'ble/string#trim ' ret= ble/test 'ble/string#ltrim' ret= ble/test 'ble/string#rtrim' ret= ble/test 'ble/string#trim ""' ret= ble/test 'ble/string#ltrim ""' ret= ble/test 'ble/string#rtrim ""' ret= ble/test 'ble/string#trim "a"' ret=a ble/test 'ble/string#ltrim "a"' ret=a ble/test 'ble/string#rtrim "a"' ret=a ble/test 'ble/string#trim " a "' ret=a ble/test 'ble/string#ltrim " a "' ret='a ' ble/test 'ble/string#rtrim " a "' ret=' a' ble/test 'ble/string#trim " a b "' ret='a b' ble/test 'ble/string#ltrim " a b "' ret='a b ' ble/test 'ble/string#rtrim " a b "' ret=' a b' ble/test 'ble/string#trim "abc"' ret='abc' ble/test 'ble/string#ltrim "abc"' ret='abc' ble/test 'ble/string#rtrim "abc"' ret='abc' ble/test 'ble/string#trim " abc "' ret='abc' ble/test 'ble/string#ltrim " abc "' ret='abc ' ble/test 'ble/string#rtrim " abc "' ret=' abc' for pad in $' \t\n \t\n' $'\t\t\t' $'\n\n\n'; do ble/test 'ble/string#trim "'"$pad"'abc'"$pad"'"' ret='abc' ble/test 'ble/string#ltrim "'"$pad"'abc'"$pad"'"' ret="abc${pad}" ble/test 'ble/string#rtrim "'"$pad"'abc'"$pad"'"' ret="${pad}abc" done ) ( ble/test 'ble/string#escape-characters hello' ret=hello ble/test 'ble/string#escape-characters hello ""' ret=hello ble/test 'ble/string#escape-characters hello xyz' ret=hello ble/test 'ble/string#escape-characters hello el' ret='h\e\l\lo' ble/test 'ble/string#escape-characters hello hl XY' ret='\Xe\Y\Yo' ble/test 'ble/string#escape-for-sed-regex "A\.[*?+|^\$(){}/"' \ ret='A\\\.\[\*?+|\^\$(){}\/' ble/test 'ble/string#escape-for-awk-regex "A\.[*?+|^\$(){}/"' \ ret='A\\\.\[\*\?\+\|\^\$\(\)\{\}\/' ble/test 'ble/string#escape-for-extended-regex "A\.[*?+|^\$(){}/"' \ ret='A\\\.\[\*\?\+\|\^\$\(\)\{\}/' ble/test 'ble/string#escape-for-bash-glob "A\*?[("' ret='A\\\*\?\[\(' ble/test 'ble/string#escape-for-bash-single-quote "A'\''B"' ret="A'\''B" ble/test 'ble/string#escape-for-bash-double-quote "hello \$ \` \\ ! world"' ret='hello \$ \` \\ "\!" world' input=A$'\\\a\b\e\f\n\r\t\v'\'B output=A'\\\a\b\e\f\n\r\t\v\'\'B ble/test 'ble/string#escape-for-bash-escape-string "$input"' ret="$output" ble/test 'ble/string#escape-for-bash-specialchars "[hello] (world) {this,is} "' \ ret='\[hello\]\ \(world\)\ {this,is}\ \' ble/test 'ble/string#escape-for-bash-specialchars "[hello] (world) {this,is} " b' \ ret='\[hello\]\ \(world\)\ \{this\,is\}\ \' ble/test 'ble/string#escape-for-bash-specialchars "a=b:c:d" c' \ ret='a\=b\:c\:d' ble/test $'ble/string#escape-for-bash-specialchars "a\tb\tc"' \ ret=$'a\\\tb\\\tc' ) ( ble/test 'ble/string#quote-command' ret= ble/test 'ble/string#quote-command echo' ret='echo' ble/test 'ble/string#quote-command echo hello world' ret="echo 'hello' 'world'" ble/test 'ble/string#quote-command echo "hello world"' ret="echo 'hello world'" ble/test 'ble/string#quote-command echo "'\''test'\''"' ret="echo ''\''test'\'''" ble/test 'ble/string#quote-command echo "" "" ""' ret="echo '' '' ''" ble/test 'ble/string#quote-command echo a{1..4}' ret="echo 'a1' 'a2' 'a3' 'a4'" ble/test 'ble/util/print-quoted-command' stdout= ble/test 'ble/util/print-quoted-command echo' stdout='echo' ble/test 'ble/util/print-quoted-command echo hello world' stdout="echo 'hello' 'world'" ble/test 'ble/util/print-quoted-command echo "hello world"' stdout="echo 'hello world'" ble/test 'ble/util/print-quoted-command echo "'\''test'\''"' stdout="echo ''\''test'\'''" ble/test 'ble/util/print-quoted-command echo "" "" ""' stdout="echo '' '' ''" ble/test 'ble/util/print-quoted-command echo a{1..4}' stdout="echo 'a1' 'a2' 'a3' 'a4'" ) ( ble/test 'ble/string#quote-word' ret= ble/test 'ble/string#quote-word echo' ret='echo' ble/test 'ble/string#quote-word "hello world"' ret="'hello world'" ble/test 'ble/string#quote-word "'\''test'\''"' ret="\'test\'" ble/test 'ble/string#quote-word "a'\''b'\''c"' ret="a\'b\'c" ) ( ble/test 'ble/string#create-unicode-progress-bar 0 24 3' ret=' ' ble/test 'ble/string#create-unicode-progress-bar 1 24 3' ret='▏ ' ble/test 'ble/string#create-unicode-progress-bar 2 24 3' ret='▎ ' ble/test 'ble/string#create-unicode-progress-bar 3 24 3' ret='▍ ' ble/test 'ble/string#create-unicode-progress-bar 4 24 3' ret='▌ ' ble/test 'ble/string#create-unicode-progress-bar 5 24 3' ret='▋ ' ble/test 'ble/string#create-unicode-progress-bar 6 24 3' ret='▊ ' ble/test 'ble/string#create-unicode-progress-bar 7 24 3' ret='▉ ' ble/test 'ble/string#create-unicode-progress-bar 8 24 3' ret='█ ' ble/test 'ble/string#create-unicode-progress-bar 9 24 3' ret='█▏ ' ble/test 'ble/string#create-unicode-progress-bar 15 24 3' ret='█▉ ' ble/test 'ble/string#create-unicode-progress-bar 16 24 3' ret='██ ' ble/test 'ble/string#create-unicode-progress-bar 17 24 3' ret='██▏' ble/test 'ble/string#create-unicode-progress-bar 24 24 3' ret='███' ble/test 'ble/string#create-unicode-progress-bar 0 24 4 unlimited' ret=$'█ ' ble/test 'ble/string#create-unicode-progress-bar 1 24 4 unlimited' ret=$'\e[7m▏\e[27m▏ ' ble/test 'ble/string#create-unicode-progress-bar 2 24 4 unlimited' ret=$'\e[7m▎\e[27m▎ ' ble/test 'ble/string#create-unicode-progress-bar 3 24 4 unlimited' ret=$'\e[7m▍\e[27m▍ ' ble/test 'ble/string#create-unicode-progress-bar 4 24 4 unlimited' ret=$'\e[7m▌\e[27m▌ ' ble/test 'ble/string#create-unicode-progress-bar 5 24 4 unlimited' ret=$'\e[7m▋\e[27m▋ ' ble/test 'ble/string#create-unicode-progress-bar 6 24 4 unlimited' ret=$'\e[7m▊\e[27m▊ ' ble/test 'ble/string#create-unicode-progress-bar 7 24 4 unlimited' ret=$'\e[7m▉\e[27m▉ ' ble/test 'ble/string#create-unicode-progress-bar 8 24 4 unlimited' ret=$' █ ' ble/test 'ble/string#create-unicode-progress-bar 9 24 4 unlimited' ret=$' \e[7m▏\e[27m▏ ' ble/test 'ble/string#create-unicode-progress-bar 15 24 4 unlimited' ret=$' \e[7m▉\e[27m▉ ' ble/test 'ble/string#create-unicode-progress-bar 16 24 4 unlimited' ret=$' █ ' ble/test 'ble/string#create-unicode-progress-bar 17 24 4 unlimited' ret=$' \e[7m▏\e[27m▏' ble/test 'ble/string#create-unicode-progress-bar 24 24 4 unlimited' ret=$'█ ' ) ( ble/test 'ble/util/strlen' ret=0 ble/test 'ble/util/strlen ""' ret=0 ble/test 'ble/util/strlen a' ret=1 ble/test 'ble/util/strlen abc' ret=3 ble/test 'ble/util/strlen α' ret=2 ble/test 'ble/util/strlen αβγ' ret=6 ble/test 'ble/util/strlen あ' ret=3 ble/test 'ble/util/strlen あいう' ret=9 ble/test 'ble/util/strlen aα' ret=3 ble/test 'ble/util/strlen aαあ' ret=6 LC_ALL=en_US.utf8 ble/test 'ble/util/strlen a' ret=1 ble/test 'ble/util/strlen α' ret=2 ble/test 'ble/util/strlen あ' ret=3 ) ( ble/test 'ble/util/substr' ret= ble/test 'ble/util/substr ""' ret= ble/test 'ble/util/substr a' ret= ble/test 'ble/util/substr "" 0' ret= ble/test 'ble/util/substr "" 1' ret= ble/test 'ble/util/substr a 0' ret= ble/test 'ble/util/substr a 1' ret= ble/test 'ble/util/substr a 2' ret= ble/test 'ble/util/substr "" 0 0' ret= ble/test 'ble/util/substr "" 0 1' ret= ble/test 'ble/util/substr "" 1 1' ret= ble/test 'ble/util/substr a 0 0' ret= ble/test 'ble/util/substr a 1 0' ret= ble/test 'ble/util/substr a 0 1' ret=a ble/test 'ble/util/substr a 1 1' ret= ble/test 'ble/util/substr abc 1 0' ret= ble/test 'ble/util/substr abc 1 1' ret=b ble/test 'ble/util/substr abc 1 2' ret=bc ble/test 'ble/util/substr abc 0 0' ret= ble/test 'ble/util/substr abc 0 1' ret=a ble/test 'ble/util/substr abc 0 3' ret=abc ble/test 'ble/util/substr abc 0 4' ret=abc ble/test 'ble/util/substr abc 3 0' ret= ble/test 'ble/util/substr abc 3 1' ret= ble/test 'ble/util/substr abc 4 0' ret= ble/test 'ble/util/substr abc 4 1' ret= ble/test 'ble/util/substr あいう 0 3' ret=あ ble/test 'ble/util/substr あいう 3 6' ret=いう ble/test 'ble/util/substr あいう 0 1' ret=$'\xe3' ble/test 'ble/util/substr あいう 1 2' ret=$'\x81\x82' ble/test 'ble/util/substr あいう 1 4' ret=$'\x81\x82\xe3\x81' ble/test 'ble/util/substr あいう 7 5' ret=$'\x81\x86' ) ( for cmd in ble/path#{remove,remove-glob}; do ble/test code:'ret=; '$cmd' ret' ret= ble/test code:'ret=; '$cmd' ret ""' ret= ble/test code:'ret=a; '$cmd' ret ""' ret=a ble/test code:'ret=a; '$cmd' ret a' ret= ble/test code:'ret=a; '$cmd' ret b' ret=a ble/test code:'ret=a:a:a; '$cmd' ret a' ret= ble/test code:'ret=aa; '$cmd' ret a' ret=aa ble/test code:'ret=xyz:abc; '$cmd' ret ""' ret=xyz:abc ble/test code:'ret=xyz:abc; '$cmd' ret xyz' ret=abc ble/test code:'ret=xyz:abc; '$cmd' ret abc' ret=xyz ble/test code:'ret=xyz:abc:tuv; '$cmd' ret xyz' ret=abc:tuv ble/test code:'ret=xyz:abc:tuv; '$cmd' ret abc' ret=xyz:tuv ble/test code:'ret=xyz:abc:tuv; '$cmd' ret tuv' ret=xyz:abc ble/test code:'ret=xyz:xyz; '$cmd' ret xyz' ret= ble/test code:'ret=xyz:abc:xyz; '$cmd' ret xyz' ret=abc ble/test code:'ret=xyz:abc:xyz; '$cmd' ret abc' ret=xyz:xyz ble/test code:'ret=xyz:xyz:xyz; '$cmd' ret xyz' ret= done ble/test code:'ret=a; ble/path#remove ret \?' ret=a ble/test code:'ret=aa; ble/path#remove ret \?' ret=aa ble/test code:'ret=a:b; ble/path#remove ret \?' ret=a:b ble/test code:'ret=a:b:c; ble/path#remove ret \?' ret=a:b:c ble/test code:'ret=aa:b:cc; ble/path#remove ret \?' ret=aa:b:cc ble/test code:'ret=stdX:stdY:usrZ; ble/path#remove ret "std[a-zX-Z]"' ret=stdX:stdY:usrZ ble/test code:'ret=stdX:usrZ:stdY; ble/path#remove ret "std[a-zX-Z]"' ret=stdX:usrZ:stdY ble/test code:'ret=usrZ:stdX:stdY; ble/path#remove ret "std[a-zX-Z]"' ret=usrZ:stdX:stdY ble/test code:'ret=a; ble/path#remove-glob ret \?' ret= ble/test code:'ret=aa; ble/path#remove-glob ret \?' ret=aa ble/test code:'ret=a:b; ble/path#remove-glob ret \?' ret= ble/test code:'ret=a:b:c; ble/path#remove-glob ret \?' ret= ble/test code:'ret=aa:b:cc; ble/path#remove-glob ret \?' ret=aa:cc ble/test code:'ret=stdX:stdY:usrZ; ble/path#remove-glob ret "std[a-zX-Z]"' ret=usrZ ble/test code:'ret=stdX:usrZ:stdY; ble/path#remove-glob ret "std[a-zX-Z]"' ret=usrZ ble/test code:'ret=usrZ:stdX:stdY; ble/path#remove-glob ret "std[a-zX-Z]"' ret=usrZ ) ( ble/test code:'ret=; ble/path#append ret a' ret=a ble/test code:'ret=a; ble/path#append ret a' ret=a:a ble/test code:'ret=a; ble/path#append ret b' ret=a:b ble/test code:'ret=a:b; ble/path#append ret cd' ret=a:b:cd ble/test code:'ret=; ble/path#prepend ret a' ret=a ble/test code:'ret=a; ble/path#prepend ret a' ret=a:a ble/test code:'ret=a; ble/path#prepend ret b' ret=b:a ble/test code:'ret=a:b; ble/path#prepend ret cd' ret=cd:a:b ble/test code:'ret=a:b:c; ble/path#contains ret a' ble/test code:'ret=a:b:c; ble/path#contains ret b' ble/test code:'ret=a:b:c; ble/path#contains ret c' ble/test code:'ret=a:b:c; ! ble/path#contains ret x' ble/test code:'ret=a:b:c; ! ble/path#contains ret aa' ble/test code:'ret=a:b:c; ! ble/path#contains ret bb' ble/test code:'ret=a:b:c; ! ble/path#contains ret cc' ble/test code:'ret=a:b:c; ! ble/path#contains ret "?"' ble/test code:'ret=a:b:c; ! ble/path#contains ret "*"' ble/test code:'ret=abc:def; ble/path#contains ret abc' ble/test code:'ret=abc:def; ble/path#contains ret def' ble/test code:'ret=abc:def; ! ble/path#contains ret a' ble/test code:'ret=abc:def; ! ble/path#contains ret ab' ble/test code:'ret=abc:def; ! ble/path#contains ret abcdef' ble/test code:'ret=abc:def; ! ble/path#contains ret "???"' ble/test code:'ret=xyz; ble/path#contains ret xyz' ble/test code:'ret=xyz; ! ble/path#contains ret xyz:xyz' ble/test code:'ret=xyz; ! ble/path#contains ret "???"' ) ( builtin eval -- "${_ble_util_dict_declare//NAME/dict1}" builtin eval -- "${_ble_util_gdict_declare//NAME/dict2}" builtin eval -- "${_ble_util_adict_declare//NAME/dict3}" index=1 for Dict in ble/{,g,a}dict; do dict=dict$((index++)) ret=unchanged ble/test '! '$Dict'#has '$dict' banana' ret=unchanged ble/test '! '$Dict'#has '$dict' ""' ret=unchanged $Dict#set $dict apple red $Dict#set $dict banana yellow $Dict#set $dict orange orange $Dict#set $dict melon green ret=unchanged ble/test $Dict'#has '$dict' banana' ret=unchanged # 先頭 ble/test $Dict'#has '$dict' apple' ret=unchanged # 中 ble/test $Dict'#has '$dict' melon' ret=unchanged # 末尾 ble/test '! '$Dict'#has '$dict' pear' ret=unchanged # 存在しない項目 ble/test $Dict'#get '$dict' banana' ret=yellow # 先頭 ble/test $Dict'#get '$dict' apple' ret=red # 中 ble/test $Dict'#get '$dict' melon' ret=green # 末尾 ble/test '! '$Dict'#get '$dict' pear' ret= # 存在しない項目 ble/test '! '$Dict'#has '$dict' ""' # 末尾空要素で引けるか ble/test '! '$Dict'#get '$dict' ""' # 末尾空要素で引けるか $Dict#set $dict '' transparent ble/test $Dict'#has '$dict' ""' # 末尾空要素で引けるか ble/test $Dict'#get '$dict' ""' ret=transparent # 末尾空要素で引けるか $Dict#set $dict 'alpha beta' pink ble/test $Dict'#has '$dict' ""' # 中央空要素で引けるか ble/test $Dict'#has '$dict' "alpha beta"' # 空白を含む見出し ble/test $Dict'#get '$dict' ""' ret=transparent # 中央空要素で引けるか ble/test $Dict'#get '$dict' "alpha beta"' ret=pink # 空白を含む見出し $Dict#set $dict ' apple ' ' red ' ble/test $Dict'#has '$dict' " apple "' # 空白で trim されないか ble/test $Dict'#has '$dict' apple' # 既存項目を破壊していないか ble/test $Dict'#get '$dict' " apple "' ret=' red ' # 空白で trim されないか ble/test $Dict'#get '$dict' apple' ret=red # 既存項目を破壊していないか ble/test '! '$Dict'#has '$dict' "${_ble_term_FS}"' # 単一FS ble/test '! '$Dict'#has '$dict' ":"' # 単一コロン ble/test '! '$Dict'#has '$dict' "apple${_ble_term_FS}banana"' # FSを含む見出し ble/test '! '$Dict'#has '$dict' apple:banana' # コロンを含む見出し ble/test '! '$Dict'#get '$dict' "${_ble_term_FS}"' ret= # 単一FS ble/test '! '$Dict'#get '$dict' ":"' ret= # 単一コロン ble/test '! '$Dict'#get '$dict' "apple${_ble_term_FS}banana"' ret= # FSを含む見出し ble/test '! '$Dict'#get '$dict' apple:banana' ret= # コロンを含む見出し $Dict#set $dict "${_ble_term_FS}" Empty $Dict#set $dict ":" Colon $Dict#set $dict "apple${_ble_term_FS}banana" RedYellow $Dict#set $dict "apple:banana" __red_yellow__ ble/test $Dict'#has '$dict' "${_ble_term_FS}"' # 単一FS ble/test $Dict'#has '$dict' ":"' # 単一コロン ble/test $Dict'#has '$dict' "apple${_ble_term_FS}banana"' # FSを含む見出し ble/test $Dict'#has '$dict' apple:banana' # コロンを含む見出し ble/test $Dict'#get '$dict' "${_ble_term_FS}"' ret=Empty # 単一FS ble/test $Dict'#get '$dict' ":"' ret=Colon # 単一コロン ble/test $Dict'#get '$dict' "apple${_ble_term_FS}banana"' ret=RedYellow # FSを含む見出し ble/test $Dict'#get '$dict' apple:banana' ret=__red_yellow__ # コロンを含む見出し $Dict#unset $dict banana $Dict#unset $dict apple $Dict#unset $dict melon ble/test '! '$Dict'#has '$dict' banana' ble/test '! '$Dict'#has '$dict' apple' ble/test '! '$Dict'#has '$dict' melon' $Dict#unset $dict "" $Dict#unset $dict "alpha beta" $Dict#unset $dict " apple " ble/test '! '$Dict'#has '$dict' ""' # 中央空要素で引けるか ble/test '! '$Dict'#has '$dict' "alpha beta"' # 空白を含む見出し ble/test '! '$Dict'#has '$dict' " apple "' # 空白で trim されないか $Dict#unset $dict "${_ble_term_FS}" $Dict#unset $dict ":" $Dict#unset $dict "apple${_ble_term_FS}banana" $Dict#unset $dict apple:banana ble/test '! '$Dict'#has '$dict' "${_ble_term_FS}"' # 単一FS ble/test '! '$Dict'#has '$dict' ":"' # 単一コロン ble/test '! '$Dict'#has '$dict' "apple${_ble_term_FS}banana"' # FSを含む見出し ble/test '! '$Dict'#has '$dict' apple:banana' # コロンを含む見出し done ) ( blehook/declare FOO ble/test 'blehook --color=never FOO' stdout='blehook FOO=' ble/test 'blehook/has-hook FOO' exit=1 blehook FOO+='echo hello' ble/test 'blehook --color=never FOO' \ stdout="blehook FOO+='echo hello'" ble/test 'blehook/has-hook FOO' blehook FOO+='echo world' ble/test 'blehook --color=never FOO' \ stdout="blehook FOO+='echo hello'" \ stdout="blehook FOO+='echo world'" ble/test 'blehook/has-hook FOO' blehook FOO-='echo hello' ble/test 'blehook --color=never FOO' \ stdout="blehook FOO+='echo world'" ble/test 'blehook/has-hook FOO' blehook FOO-='echo world' ble/test 'blehook --color=never FOO' \ stdout='blehook FOO=' ble/test 'blehook/has-hook FOO' exit=1 blehook FOO+='echo hello' blehook FOO+='echo world' blehook FOO='echo empty' ble/test 'blehook --color=never FOO' \ stdout="blehook FOO+='echo empty'" ble/test 'blehook/has-hook FOO' blehook FOO+='echo hello' blehook FOO+='echo world' blehook FOO= ble/test 'blehook --color=never FOO' \ stdout='blehook FOO=' ble/test 'blehook/has-hook FOO' exit=1 blehook FOO+='echo hello' blehook FOO+='echo world' blehook FOO!='echo hello' ble/test 'blehook --color=never FOO' \ stdout="blehook FOO+='echo hello'${_ble_term_nl}blehook FOO+='echo world'" blehook FOO-+='echo hello' ble/test 'blehook --color=never FOO' \ stdout="blehook FOO+='echo world'${_ble_term_nl}blehook FOO+='echo hello'" blehook FOO+-='echo hello' ble/test 'blehook --color=never FOO' \ stdout="blehook FOO+='echo hello'${_ble_term_nl}blehook FOO+='echo world'" blehook FOO= blehook FOO+='echo hello' blehook FOO+='echo empty' blehook FOO+='echo world' ble/test 'blehook/invoke FOO' \ stdout=hello \ stdout=empty \ stdout=world blehook FOO='echo A$?' blehook FOO+='echo B$?' blehook FOO+='echo C$?' ble/test 'ble/util/setexit 123; blehook/invoke FOO' \ stdout=A123 \ stdout=B123 \ stdout=C123 blehook/declare bar_load blehook bar_load='echo bar_load' ble/test 'blehook/eval-after-load bar "echo yes"' stdout= ble/test 'blehook/invoke bar_load' \ stdout=bar_load \ stdout=yes ble/test 'blehook/eval-after-load bar "echo next"' stdout=next function func { ret="[$1]"; } blehook FOO=func ble/test 'blehook/invoke FOO xQAHbcpMFyFyQ' ret='[xQAHbcpMFyFyQ]' ) ( ble/builtin/trap 'echo TRAPEXIT1' 0 ble/test 'ble/builtin/trap/invoke 0' stdout=TRAPEXIT1 ble/test 'ble/builtin/trap/invoke EXIT' stdout=TRAPEXIT1 ble/builtin/trap 0 ble/test 'ble/builtin/trap/invoke 0' stdout= ble/builtin/trap 'echo TRAPEXIT2' EXIT ble/test 'ble/builtin/trap/invoke 0' stdout=TRAPEXIT2 ble/test 'ble/builtin/trap/invoke EXIT' stdout=TRAPEXIT2 ble/builtin/trap EXIT ble/test 'ble/builtin/trap/invoke 0' stdout= ble/builtin/trap 'echo TRAPHUP1' 1 ble/test 'ble/builtin/trap/invoke 1' stdout=TRAPHUP1 ble/test 'ble/builtin/trap/invoke HUP' stdout=TRAPHUP1 ble/test 'ble/builtin/trap/invoke SIGHUP' stdout=TRAPHUP1 ble/builtin/trap 1 ble/test 'ble/builtin/trap/invoke 1' stdout= ble/builtin/trap 'echo TRAPHUP2' HUP ble/test 'ble/builtin/trap/invoke 1' stdout=TRAPHUP2 ble/test 'ble/builtin/trap/invoke HUP' stdout=TRAPHUP2 ble/test 'ble/builtin/trap/invoke SIGHUP' stdout=TRAPHUP2 ble/builtin/trap HUP ble/test 'ble/builtin/trap/invoke HUP' stdout= ble/builtin/trap 'echo TRAPHUP3' SIGHUP ble/test 'ble/builtin/trap/invoke 1' stdout=TRAPHUP3 ble/test 'ble/builtin/trap/invoke HUP' stdout=TRAPHUP3 ble/test 'ble/builtin/trap/invoke SIGHUP' stdout=TRAPHUP3 ble/builtin/trap SIGHUP ble/test 'ble/builtin/trap/invoke HUP' stdout= ble/builtin/trap/.register 9999 CUSTOM ble/builtin/trap/reserve CUSTOM ble/builtin/trap 'echo custom trap' CUSTOM ble/test 'ble/builtin/trap/invoke CUSTOM' stdout='custom trap' function ble/builtin/trap:CUSTOM { echo "__set_handler__ ($2) $1"; } ble/test 'ble/builtin/trap "echo hello world" CUSTOM' \ stdout='__set_handler__ (CUSTOM) echo hello world' ble/test 'ble/builtin/trap/invoke CUSTOM' stdout='hello world' ) ( ble/test 'ble/util/readfile ret <(echo hello)' \ ret=hello$'\n' ble/test 'ble/util/readfile ret <(echo hello; echo world)' \ ret=hello$'\n'world$'\n' ble/test 'ble/util/readfile ret <(echo hello; echo -n world)' \ ret=hello$'\n'world ble/test 'ble/util/readfile ret <(:)' ret= function status { echo "${#a[*]}:(""${a[*]}"")"; } ble/test "ble/util/mapfile a < <(echo hello); status" stdout='1:(hello)' ble/test "ble/util/mapfile a < <(echo -n hello); status" stdout='1:(hello)' ble/test "ble/util/mapfile a < <(echo hello; echo world); status" stdout='2:(hello world)' ble/test "ble/util/mapfile a < <(echo hello; echo -n world); status" stdout='2:(hello world)' ble/test "ble/util/mapfile a < <(printf '%s\n' h1 h2 h3 h4); status" stdout='4:(h1 h2 h3 h4)' ble/test "ble/util/mapfile a < <(:); status" stdout='0:()' ble/test "ble/util/mapfile a < <(echo); status" stdout='1:()' ble/test "ble/util/mapfile a < <(echo;echo); status" stdout='2:( )' ble/test "ble/util/mapfile a < <(echo a;echo;echo b); status" stdout='3:(a b)' nl=$'\n' ble/test 'ble/util/assign ret ""' ret= ble/test 'ble/util/assign ret ":"' ret= ble/test 'ble/util/assign ret "echo"' ret= ble/test 'ble/util/assign ret "echo hello"' ret=hello ble/test 'ble/util/assign ret "seq 5"' ret="1${nl}2${nl}3${nl}4${nl}5" function f1 { echo stdout; echo stderr >&2; } function nested-assign { ble/util/assign err 'ble/util/assign out f1 2>&1' echo "out=$out err=$err" } ble/test nested-assign stdout='out=stdout err=stderr' ble/test 'ble/util/assign-array a :; status' stdout='0:()' ble/test 'ble/util/assign-array a echo; status' stdout='1:()' ble/test 'ble/util/assign-array a "echo hello"; status' stdout='1:(hello)' ble/test 'ble/util/assign-array a "seq 5"; status' stdout='5:(1 2 3 4 5)' ble/test 'ble/util/assign-array a "echo; echo; echo"; status' stdout='3:( )' ble/test 'ble/util/assign-array a "echo 1; echo; echo 2"; status' stdout='3:(1 2)' ) ( x=($'\177' $'\1' $'\2' $'\32' ' ' $'\a' $'\b' $'\t' $'\n' $'\v' $'\f' $'\r' a \" \' \$ \! \` \~) x[0]=$'\177' x[1]=$'\1' ble/test "ble/util/writearray -d '' x | sha256sum | awk '{print \$1}'" stdout=$(printf '%s\0' "${x[@]}" | sha256sum | awk '{print $1}') ) ( var=variable alias ali=fun function fun { echo yes "$*"; } function ble/fun { echo yes "$*"; return 99; } function ble/fun:type { echo yes "$*"; return 100; } function ble/fun#meth { echo yes "$*"; return 101; } ble/test 'ble/is-function' exit=1 ble/test 'ble/is-function ""' exit=1 ble/test 'ble/is-function fun' ble/test 'ble/is-function ble/fun' ble/test 'ble/is-function ble/fun:type' ble/test 'ble/is-function ble/fun#meth' ble/test 'ble/is-function fun1' exit=1 ble/test 'ble/is-function ble/fun1' exit=1 ble/test 'ble/is-function ble/fun1:type' exit=1 ble/test 'ble/is-function ble/fun1#meth' exit=1 ble/test 'ble/is-function ali' exit=1 ble/test 'ble/is-function var' exit=1 ble/test 'ble/is-function compgen' exit=1 ble/test 'ble/is-function declare' exit=1 ble/test 'ble/is-function mkfifo' exit=1 function compgen { :; } function declare { :; } function mkfifo { :; } ble/test 'ble/is-function compgen' ble/test 'ble/is-function declare' ble/test 'ble/is-function mkfifo' ble/test 'ble/function#try fun 1 2 3' stdout='yes 1 2 3' ble/test 'ble/function#try ble/fun 1 2 3' stdout='yes 1 2 3' exit=99 ble/test 'ble/function#try ble/fun:type 1 2 3' stdout='yes 1 2 3' exit=100 ble/test 'ble/function#try ble/fun#meth 1 2 3' stdout='yes 1 2 3' exit=101 ble/test 'ble/function#try fun1 1 2 3' stdout= exit=127 ble/test 'ble/function#try ble/fun1 1 2 3' stdout= exit=127 ble/test 'ble/function#try ble/fun1:type 1 2 3' stdout= exit=127 ble/test 'ble/function#try ble/fun1#meth 1 2 3' stdout= exit=127 ) ( function f1 { echo original $*; } ble/test f1 stdout='original' ble/function#advice before f1 'echo pre' ble/test f1 stdout={pre,original} ble/function#advice after f1 'echo post' ble/test f1 stdout={pre,original,post} ble/function#advice before f1 'echo A' ble/test f1 stdout={A,original,post} ble/function#advice after f1 'echo B' ble/test f1 stdout={A,original,B} ble/function#advice around f1 'echo [; ble/function#advice/do; echo ]' ble/test f1 stdout={A,[,original,],B} ble/function#advice around f1 ' ADVICE_WORDS[1]=quick echo [; ble/function#advice/do; echo ] ADVICE_EXIT=99' ble/test f1 stdout={A,[,'original quick',],B} exit=99 ble/function#advice remove f1 ble/test f1 stdout='original' exit=0 ble/test 'f1 1' stdout='original 1' exit=0 ) ( ble/test 'echo 1 2 3' stdout='1 2 3' ble/test 'ble/is-function echo' exit=1 ble/function#push echo 'builtin echo "[$*]"' ble/test 'ble/is-function echo' ble/test 'echo 1 2 3' stdout='[1 2 3]' ble/function#push echo 'builtin echo "($*)"' ble/test 'echo 1 2 3' stdout='(1 2 3)' ble/function#push echo 'builtin echo A; ble/function#push/call-top "$@"; builtin echo Z' ble/test 'echo 1 2 3' stdout={A,'(1 2 3)',Z} ble/function#push echo 'builtin echo [; ble/function#push/call-top "$@"; builtin echo ]' ble/test 'echo 1 2 3' stdout={[,A,'(1 2 3)',Z,]} ble/test 'ble/function#pop echo' ble/test 'echo 1 2 3' stdout={A,'(1 2 3)',Z} ble/function#pop echo ble/test 'echo 1 2 3' stdout='(1 2 3)' ble/function#pop echo ble/test 'echo 1 2 3' stdout='[1 2 3]' ble/test 'ble/is-function echo' ble/test 'ble/function#pop echo' ble/test 'ble/is-function echo' exit=1 ble/test 'echo 1 2 3' stdout='1 2 3' ble/test 'ble/function#pop echo' exit=1 ble/test 'echo 1 2 3' stdout='1 2 3' ) ( ble/test 'ble/util/set ret hello' ret='hello' ble/test 'ble/util/set ret "hello world"' ret='hello world' ble/test 'ble/util/set ret ""' ret='' ble/test 'ble/util/set ret " "' ret=' ' ble/test 'ble/util/set ret " a"' ret=' a' ble/test 'ble/util/set ret "a "' ret='a ' ble/test 'ble/util/set ret $'\''\n'\''' ret=$'\n' ble/test 'ble/util/set ret A$'\''\n'\''' ret=A$'\n' ble/test 'ble/util/set ret A$'\''\n'\''B' ret=A$'\n'B ) ( ble/test 'ble/util/sprintf ret "[%s]" 1 2 3' ret='[1][2][3]' ble/test 'ble/util/sprintf ret "[%5s]" 1' ret='[ 1]' ble/test 'ble/util/sprintf ret "[%.2s]" 12345' ret='[12]' ble/test 'ble/util/sprintf ret "[%d,%d]" 1 3' ret='[1,3]' ble/test 'ble/util/sprintf ret "[%x]" 27' ret='[1b]' ble/test 'ble/util/sprintf ret "[%#.2g]" 27' ret='[27.]' ble/test 'ble/util/sprintf ret "[%#.2f]" 27' ret='[27.00]' ) ( shopt -s expand_aliases alias aaa=fun function fun { :; } function ble/fun { :; } function ble/fun:type { :; } function ble/fun#meth { :; } ble/test 'ble/util/type ret aaa' ret=alias ble/test 'ble/util/type ret fun' ret=function ble/test 'ble/util/type ret alias' ret=builtin ble/test 'ble/util/type ret mkfifo' ret=file ble/test 'ble/util/type ret for' ret=keyword ble/test 'ble/util/type ret ble/fun' ret=function ble/test 'ble/util/type ret ble/fun:type' ret=function ble/test 'ble/util/type ret ble/fun#meth' ret=function ble/test 'ble/util/type ret fun1' ret= ble/test 'ble/util/type ret ble/fun1' ret= ble/test 'ble/util/type ret ble/fun1:type' ret= ble/test 'ble/util/type ret ble/fun1#meth' ret= ) ( shopt -s expand_aliases alias aaa1='aaa2 world' ble/test 'ble/alias#expand aaa1' ret='aaa2 world' alias aaa2='aaa3 hello' ble/test 'ble/alias#expand aaa2' ret='aaa3 hello' ble/test 'ble/alias#expand aaa1' ret='aaa2 world' alias aaa3='aaa4' ble/test 'ble/alias#expand aaa3' ret='aaa4' ble/test 'ble/alias#expand aaa2' ret='aaa3 hello' ble/test 'ble/alias#expand aaa1' ret='aaa2 world' alias aaa4='echo' ble/test 'ble/alias#expand aaa4' ret='echo' ble/test 'ble/alias#expand aaa3' ret='aaa4' ble/test 'ble/alias#expand aaa2' ret='aaa3 hello' ble/test 'ble/alias#expand aaa1' ret='aaa2 world' ) if ((_ble_bash>=40000)); then ( ble/test 'echo 1 | { sleep 0.01; ble/util/is-stdin-ready; }' ble/test 'sleep 0.01 | ble/util/is-stdin-ready' exit=1 ble/test 'ble/util/is-stdin-ready <<< a' ble/test 'ble/util/is-stdin-ready <<< ""' ble/test ': | { sleep 0.01; ble/util/is-stdin-ready; }' ble/test 'ble/util/is-stdin-ready < /dev/null' ) fi ble/test ble/util/is-running-in-subshell exit=1 ( ble/test ble/util/is-running-in-subshell ) ( ble/test/chdir function getpid { sh -c 'echo -n $PPID' >| a.txt ble/util/readfile ppid a.txt } dummy=modification_to_environment.1 ble/util/getpid ble/test '[[ $BASHPID != $$ ]]' getpid ble/test code:'ret=$BASHPID' ret="$ppid" pid1=$BASHPID ( dummy=modification_to_environment.2 ble/util/getpid ble/test '[[ $BASHPID != $$ && $BASHPID != $pid1 ]]' getpid ble/test '[[ $BASHPID == $ppid ]]' ) ble/test/rmdir ) ( ble/test 'ble/fd#is-open 1' ble/test 'ble/fd#is-open 2' exec 9>&- ble/test 'ble/fd#is-open 9' exit=1 exec 9>/dev/null ble/test 'ble/fd#is-open 9' exec 9>&- ble/test 'ble/fd#is-open 9' exit=1 ) ( ble/test/chdir ble/fd#alloc fd '> a.txt' echo hello >&$fd echo world >&$fd if ((_ble_bash/100!=301)); then ble/test 'ble/fd#close fd; echo test >&$fd' exit=1 ble/test 'cat a.txt' stdout={hello,world} fi ble/test/rmdir ) ( xv1='' xv2a='a' xv2b='ab' xv3a=' ' xv3b='a b' xv4a=$'\n' xv4b=$'a\nb' xv5a=$'\r' xv5b=$'a\rb' xv6a=$'\x01' xv6b=a$'\x01'b xv7a=$'\x02' xv7b=a$'\x02'b xv8a=$'\x7F' xv8b=a$'\x7F'b eval -- "$( for name in v1 v{2..8}{a,b}; do eval "$name=\$x$name" done ble/util/declare-print-definitions vn v1 v{2..8}{a,b} 2>/dev/null)" ble/test '[[ ! ${vn+set} ]]' for name in v1 v{2..8}{a,b}; do ble/test "declare -p $name x$name | cat -A >&2; [[ \$$name == \$x$name ]]" done function status { eval 'ret="${#'$1'[*]}:(""${'$1'[*]}"")"'; } xa0=() sa0='0:()' xa1=('') sa1='1:()' for k in {2..8}; do eval "xa$k=(); xa$k[0]=\"\$xv${k}a\"; xa$k[1]=\"\$xv${k}b\"" eval "sa$k=\"2:(\$xv${k}a \$xv${k}b)\"" done eval -- "$( for name in a0 a1 a{2..8}; do eval "$name=(\"\${x$name[@]}\")" done ble/util/declare-print-definitions a0 a1 a{2..8} 2>/dev/null)" for name in a0 a1 a{2..8}; do stdout_var=s$name ble/test "status $name" ret="${!stdout_var}" done ) ( function status { builtin eval 'echo "${#'$1'[*]}:(""${'$1'[*]}"")"'; } v1=123 v2=(1 2 3) v3=bbb v4=ccc function f2 { local v3=x v4=y builtin eval -- "$(ble/util/print-global-definitions v{0..4})" ble/test '[[ ! ${v0+set} ]]' ble/test 'status v1' stdout='1:(123)' ble/test 'status v2' stdout='3:(1 2 3)' ble/test 'status v3' stdout='1:(bbb)' ble/test 'status v4' stdout='1:(ccc)' } function f1 { local v0=1 v1=2 v2=3 v4=5 f2 ble/test 'status v1' stdout='1:(2)' ble/test 'status v2' stdout='1:(3)' } f1 value="hello 'world'" ble/test 'ble/util/print-global-definitions value' stdout="declare value='hello '\''world'\'''" ) ( ble/test 'ble/util/has-glob-pattern "a*"' ble/test 'ble/util/has-glob-pattern "a*b"' ble/test 'ble/util/has-glob-pattern "?"' ble/test 'ble/util/has-glob-pattern "a?"' ble/test 'ble/util/has-glob-pattern "a?b"' ble/test 'ble/util/has-glob-pattern "a?b*c"' ble/test 'ble/util/has-glob-pattern "a[a-c]d"' ble/test 'ble/util/has-glob-pattern "a[!a-c]d"' ble/test 'ble/util/has-glob-pattern "*.txt"' ble/test 'ble/util/has-glob-pattern "*.*"' ble/test 'ble/util/has-glob-pattern ""' exit=1 ble/test 'ble/util/has-glob-pattern "a"' exit=1 ble/test 'ble/util/has-glob-pattern "abc"' exit=1 ble/test 'ble/util/has-glob-pattern "/"' exit=1 ble/test 'ble/util/has-glob-pattern "a/c"' exit=1 ble/test 'ble/util/has-glob-pattern "a:b"' exit=1 ble/test 'ble/util/has-glob-pattern "a=b"' exit=1 ble/test 'ble/util/has-glob-pattern "\[xyz\]"' exit=1 ) ble/util/msleep/.calibrate-loop &>/dev/null ble/util/msleep/.calibrate-loop &>/dev/null ble/util/msleep/.calibrate-loop &>/dev/null ( ble/test 'ble-measure -q "ble/util/msleep 100"; echo "$ret usec" >&2; ((msec=ret/1000,90<=msec&&msec<=110))' ble/test 'ble-measure -q "ble/util/sleep 0.1"; echo "$ret usec" >&2; ((msec=ret/1000,90<=msec&&msec<=110))' ) ( time=0 ble/function#push ble/util/msleep '((time+=$1));echo $time' ble/test "ble/util/conditional-sync 'sleep 10' '((time<1000))' 100" \ stdout={1..10}00 ble/test "ble/util/conditional-sync 'sleep 10' '((time<1000))' 100 progressive-weight" \ stdout={1,3,7,15,31,63,{1..10}27} ble/function#pop ble/util/msleep ) ( ble/test ":| ble/util/cat | cat -A" stdout= ble/test "printf a | ble/util/cat | cat -A" stdout=a ble/test "printf '\0' | ble/util/cat | cat -A" stdout=^@ ble/test "printf 'hello\nworld\n'| ble/util/cat | cat -A" stdout={hello\$,world\$} ble/test "printf 'hello\nworld'| ble/util/cat | cat -A" stdout={hello\$,world} ble/test "printf 'hello\0world\0'| ble/util/cat | cat -A" stdout=hello^@world^@ ble/test "printf 'hello\0world'| ble/util/cat | cat -A" stdout=hello^@world ) ( bleopt_pager=xxx PAGER=yyy ble/test 'ble/util/get-pager ret' ret=xxx bleopt_pager=xxx PAGER= ble/test 'ble/util/get-pager ret' ret=xxx bleopt_pager= PAGER=yyy ble/test 'ble/util/get-pager ret' ret=yyy bleopt_pager= PAGER= ble/test 'ble/util/get-pager ret' ret=less ) ( bleopt_pager=cat ble/test 'ble/util/pager <<< hello' stdout=hello ) ( ble/util/buffer.clear ble/test 'ble/util/buffer.flush' stdout= ble/util/buffer hello ble/util/buffer world ble/test 'ble/util/buffer.flush' stdout=helloworld ble/test 'ble/util/buffer.flush' stdout= ble/util/buffer.print hello ble/util/buffer.print world ble/test 'ble/util/buffer.flush' stdout={hello,world} ble/test 'ble/util/buffer.flush' stdout= ble/util/buffer.print hello ble/util/buffer.print world ble/util/buffer.clear ble/test 'ble/util/buffer.flush' stdout= ) ( ubeg=3 uend=10 uend0=5 beg=0 end=5 end0=3 ble/dirty-range#load --prefix=u ble/test 'echo "$beg:$end:$end0"' stdout=3:10:5 ubeg=3 uend=10 uend0=5 ble/dirty-range#clear --prefix=u ble/test 'echo "$ubeg:$uend:$uend0"' stdout=-1:-1:-1 ble/dirty-range#update --prefix=u 0 5 2 ble/test 'echo "$ubeg:$uend:$uend0"' stdout=0:5:2 ble/dirty-range#update --prefix=u 10 10 12 ble/test 'echo "$ubeg:$uend:$uend0"' stdout=0:10:9 ble/dirty-range#clear --prefix=u ble/dirty-range#update --prefix=u 2 2 3 ble/dirty-range#update --prefix=u 2 2 3 ble/test 'echo "$ubeg:$uend:$uend0"' stdout=2:2:4 ble/dirty-range#clear --prefix=u ble/dirty-range#update --prefix=u 1 5 3 ble/dirty-range#update --prefix=u 7 11 9 ble/test 'echo "$ubeg:$uend:$uend0"' stdout=1:11:7 ble/dirty-range#clear --prefix=u ble/dirty-range#update --prefix=u 1 7 5 ble/dirty-range#update --prefix=u 4 15 11 ble/test 'echo "$ubeg:$uend:$uend0"' stdout=1:15:9 ble/dirty-range#clear --prefix=u ble/dirty-range#update --prefix=u 1 7 5 ble/dirty-range#update --prefix=u 3 4 5 ble/test 'echo "$ubeg:$uend:$uend0"' stdout=1:6:5 ble/dirty-range#clear --prefix=u ble/dirty-range#update --prefix=u 4 8 6 ble/dirty-range#update --prefix=u 2 8 10 ble/test 'echo "$ubeg:$uend:$uend0"' stdout=2:8:8 ble/dirty-range#clear --prefix=u ble/dirty-range#update --prefix=u 6 12 8 ble/dirty-range#update --prefix=u 3 7 8 ble/test 'echo "$ubeg:$uend:$uend0"' stdout=3:11:8 ble/dirty-range#clear --prefix=u ble/dirty-range#update --prefix=u 10 13 11 ble/dirty-range#update --prefix=u 3 7 8 ble/test 'echo "$ubeg:$uend:$uend0"' stdout=3:12:11 ) ( ble/test $'ble/util/s2c "\n"' ret=10 ble/test 'ble/util/c2s 10' ret=$'\n' ble/test $'ble/util/s2c "\x1b"' ret=27 ble/test 'ble/util/c2s 27' ret=$'\x1b' ble/test $'ble/util/s2c "\x1F"' ret=31 ble/test 'ble/util/c2s 31' ret=$'\x1F' c=$'\x7F' ble/test 'ble/util/s2c $c' ret=127 # bash-3.0 bug WA ble/test 'ble/util/c2s 127' ret=$'\x7F' ble/test 'ble/util/s2c " "' ret=32 ble/test 'ble/util/c2s 32' ret=' ' ble/test 'ble/util/s2c a' ret=97 ble/test 'ble/util/c2s 97' ret=a ble/test 'ble/util/s2c μ' ret=956 ble/test 'ble/util/c2s 956' ret=μ ble/test 'ble/util/s2c あ' ret=12354 ble/test 'ble/util/c2s 12354' ret=あ ble/test 'ble/util/s2c' ret=0 ble/test 'ble/util/s2c abc' ret=97 ble/test 'ble/util/s2c μν' ret=956 ble/test 'ble/util/s2c あいう' ret=12354 ble/test 'ble/util/c2s.cached 32' ret=' ' ble/test 'ble/util/c2s.cached 97' ret=a ble/test 'ble/util/c2s.cached 956' ret=μ ble/test 'ble/util/c2s.cached 12354' ret=あ LANG=C ble/test 'ble/util/c2s 97' ret=a ble/test 'ble/util/c2s 956; [[ $ret != μ ]]' ble/test 'ble/util/c2s 12354; [[ $ret != あ ]]' ) ( ble/test 'ble/util/c2bc 97' ret=1 ble/test 'ble/util/c2bc 956' ret=2 ble/test 'ble/util/c2bc 12354' ret=3 ble/test 'ble/util/c2bc 0' ret=1 ble/test 'ble/util/c2bc 127' ret=1 ble/test 'ble/util/c2bc 128' ret=2 ble/test 'ble/util/c2bc 2047' ret=2 ble/test 'ble/util/c2bc 2048' ret=3 ble/test 'ble/util/c2bc 65535' ret=3 ble/test 'ble/util/c2bc 65536' ret=4 ) ( ble/test 'ble/util/s2chars AaBbCc; ret="${ret[*]}"' ret='65 97 66 98 67 99' ble/test 'ble/util/chars2s 65 97 66 98 67 99' ret=AaBbCc ble/test 'ble/util/s2chars あいう; ret="${ret[*]}"' ret='12354 12356 12358' ble/test 'ble/util/chars2s 12354 12356 12358' ret=あいう ble/test 'ble/util/s2chars; ret="${ret[*]}"' ret= ble/test 'ble/util/s2chars 0; ret="${ret[*]}"' ret=48 ble/test 'ble/util/s2chars a; ret="${ret[*]}"' ret=97 ble/test 'ble/util/s2chars μ; ret="${ret[*]}"' ret=956 ble/test 'ble/util/s2chars あ; ret="${ret[*]}"' ret=12354 ble/test 'ble/util/chars2s' ret= ble/test 'ble/util/chars2s 48' ret=0 ble/test 'ble/util/chars2s 97' ret=a ble/test 'ble/util/chars2s 956' ret=μ ble/test 'ble/util/chars2s 12354' ret=あ ) ( check1() { local char=$1 keyseq=$2 ble/test "ble/util/c2keyseq $char" ret="$keyseq" ble/test "ble/util/chars2keyseq $char" ret="$keyseq" ble/test "ble/util/keyseq2chars '$keyseq'; ret=\"\${ret[*]}\"" ret="${3:-$char}" ble/test "ble/util/chars2keyseq 98 $char 99" ret="b${keyseq}c" ble/test "ble/util/keyseq2chars 'b${keyseq}c'; ret=\"\${ret[*]}\"" ret="98 ${3:-$char} 99" } check1 '7' '\a' check1 '8' '\b' check1 '9' '\t' check1 '10' '\n' check1 '11' '\v' check1 '12' '\f' check1 '13' '\r' check1 '27' '\e' check1 '127' '\d' check1 '92' '\\' check1 '28' '\x1c' # workaround bashbug \C-\, \C-\\ check1 '156' '\x9c' # workaround bashbug \C-\, \C-\\ check1 '0' '\C-@' check1 '1' '\C-a' check1 '26' '\C-z' check1 '29' '\C-]' check1 '30' '\C-^' check1 '31' '\C-_' check1 '128' '\M-\C-@' '27 0' check1 '64' '@' check1 '97' 'a' check1 '956' 'μ' check1 '12354' 'あ' ble/test ble/util/c2keyseq ret='\C-@' ble/test ble/util/chars2keyseq ret= ble/test ble/util/keyseq2chars ret= ) ( function pack { ret="${bytes[*]}"; } ble/test 'ble/encoding:UTF-8/b2c ' ret=0 ble/test 'ble/encoding:UTF-8/b2c 97' ret=97 ble/test 'ble/encoding:UTF-8/b2c 97 98 99 99' ret=97 ble/test 'ble/encoding:UTF-8/b2c 206 188 99 99' ret=956 ble/test 'ble/encoding:UTF-8/b2c 227 129 130 99' ret=12354 ble/test 'ble/encoding:UTF-8/c2b 97 ; pack' ret=97 ble/test 'ble/encoding:UTF-8/c2b 956 ; pack' ret='206 188' ble/test 'ble/encoding:UTF-8/c2b 12354; pack' ret='227 129 130' ble/test 'ble/encoding:UTF-8/c2b ; pack' ret=0 ble/test 'ble/encoding:UTF-8/c2b 0 ; pack' ret=0 ble/test 'ble/encoding:UTF-8/c2b 127 ; pack' ret=127 ble/test 'ble/encoding:UTF-8/c2b 128 ; pack' ret='194 128' ble/test 'ble/encoding:UTF-8/c2b 2047; pack' ret='223 191' ble/test 'ble/encoding:UTF-8/c2b 2048; pack' ret='224 160 128' ) ( function pack { ret="${bytes[*]}"; } ble/test 'ble/encoding:C/b2c ' ret=0 ble/test 'ble/encoding:C/b2c 97' ret=97 ble/test 'ble/encoding:C/b2c 97 98 99 99' ret=97 ble/test 'ble/encoding:C/b2c 206 188 99 99' ret=206 ble/test 'ble/encoding:C/b2c 227 129 130 99' ret=227 ble/test 'ble/encoding:C/b2c 97 ' ret=97 ble/test 'ble/encoding:C/b2c 956 ' ret=188 ble/test 'ble/encoding:C/b2c 12354 ' ret=66 ble/test 'ble/encoding:C/c2b ; pack' ret=0 ble/test 'ble/encoding:C/c2b 0 ; pack' ret=0 ble/test 'ble/encoding:C/c2b 127 ; pack' ret=127 ble/test 'ble/encoding:C/c2b 128 ; pack' ret=128 ble/test 'ble/encoding:C/c2b 2047; pack' ret=255 ble/test 'ble/encoding:C/c2b 2048; pack' ret=0 ) ( clear-locale() { LC_ALL= LANG= LC_CTYPE=; } for lang in {C,en_US,ja{_JP,}}.{UTF-8,utf8} ja_JP.{utf8,UTF-8}@cjk{wide,narrow,single}; do clear-locale ble/test "LANG=$lang; ble/util/is-unicode-output" clear-locale ble/test "LANG=C LC_CTYPE=$lang; ble/util/is-unicode-output" clear-locale ble/test "LC_CTYPE=C LANG=C LC_ALL=$lang; ble/util/is-unicode-output" done for lang in '' C POSIX UTF-8 utf8 ja_JP.eucJP; do clear-locale ble/test "LANG=$lang; ble/util/is-unicode-output" exit=1 clear-locale ble/test "LANG=C LC_CTYPE=$lang; ble/util/is-unicode-output" exit=1 clear-locale ble/test "LC_CTYPE=C LANG=C LC_ALL=$lang; ble/util/is-unicode-output" exit=1 done ) ble/test/end-section