diff --git a/example/data_structures.sh b/example/data_structures.sh new file mode 100644 index 0000000..7d4c065 --- /dev/null +++ b/example/data_structures.sh @@ -0,0 +1,25 @@ +# This example is subject to change + +data_structures () { + local breakfast= fruit_list= fruits_iterator= fruit_reference= fruit= + + # Declaring and working with pseudotypes + val fruit_list = [ Lst ="banana" ="apple" ="orange" ="grape" ] + val breakfast = [ Map :beverage ="coffee" :fruit $fruit_list ] + + # Prints the internal data structure + toenv $breakfast + _print "## Internals\n$REPLY" + + # Dumps it in a human readable way + dump $breakfast + _print "## Dumped\n$REPLY\n\n" + + # How to iterate over a traversable type + val fruits_iterator =@ $fruit_list + for fruit_reference in $fruits_iterator + do + val fruit =@ $fruit_reference + _print "Fruit was served: $fruit\n" + done +} diff --git a/idiom/data.sh b/idiom/data.sh index 5b251c0..f772d9e 100644 --- a/idiom/data.sh +++ b/idiom/data.sh @@ -44,6 +44,10 @@ exp () { Txt|Lst|Set|Arr|Map) _e="${_e:-}${_e:+ }$_t" ;; + =*) + Txt "${_t#\=}" + _e="${_e:-}${_e:+ }$_R" + ;; *) _write "bad expression: '$_t'" exit 1 @@ -145,6 +149,7 @@ toenv () { do eval "toenv \$$1i$item" eval "dump=\"\${dump}$1i$item=\$$1i$item\"\${__EOL__}" + dump="$dump$REPLY${__EOL__}" done ;; *) diff --git a/module/tap/tap.sh b/module/tap/tap.sh index 7954b43..917a563 100644 --- a/module/tap/tap.sh +++ b/module/tap/tap.sh @@ -50,17 +50,15 @@ tap_tap () { val test_name =@ $1 val test_line =@ $2 test_count=$((test_count + 1)) - errors="$(set +x; $test_name 2>&1 || :)" + errors="$(set +x; $test_name 2>&1 || :)" || : if test -z "$errors" then _print "ok ${test_count} - $test_name\n" else fail_count=$((fail_count + 1)) - _print \ - "not ok ${test_count} - $test_name" \ - "${errors}" \ - " # at: $file:$test_line${__TAB__}\n\n" + errors="${errors}${__EOL__} # at: $file:$test_line${__TAB__}${__EOL__}${__EOL__}" + _write "not ok ${test_count} - $test_name${__EOL__}${errors}" fi done diff --git a/test/_idiom/001-stdout.sh b/test/_idiom/001-stdout.sh index 329daf9..8875ec9 100644 --- a/test/_idiom/001-stdout.sh +++ b/test/_idiom/001-stdout.sh @@ -2,21 +2,21 @@ # SPDX-License-Identifier: ISC test_write () { - tap_assert '' "$(_write)" - tap_assert '\0101' "$(_write '\0101')" - tap_assert 'x\\x' "$(_write 'x\\x')" - tap_assert 'x\nx' "$(_write 'x\nx')" - tap_assert 'x\tx' "$(_write 'x\tx')" - tap_assert "123123" "$(_write 123; _write 123)" + tap_assert '' "$(_write)" + tap_assert '\0101' "$(_write '\0101')" + tap_assert 'x\\x' "$(_write 'x\\x')" + tap_assert 'x\nx' "$(_write 'x\nx')" + tap_assert 'x\tx' "$(_write 'x\tx')" + tap_assert "123123" "$(_write 123; _write 123)" } test_print () { - tap_assert '' "$(_print)" - tap_assert 'A' "$(_print '\0101')" - tap_assert 'x\x' "$(_print 'x\\x')" - tap_assert "x${__EOL__}x" "$(_print 'x\nx')" - tap_assert "x${__TAB__}x" "$(_print 'x\tx')" - tap_assert "123123" "$(_print 123; _print 123)" + tap_assert '' "$(_print)" + tap_assert 'A' "$(_print '\0101')" + tap_assert 'x\x' "$(_print 'x\\x')" + tap_assert "x${__EOL__}x" "$(_print 'x\nx')" + tap_assert "x${__TAB__}x" "$(_print 'x\tx')" + tap_assert "123123" "$(_print 123; _print 123)" } test_inline_unary_zerolength () { diff --git a/test/_idiom/002-Txt.sh b/test/_idiom/002-Txt.sh index 21f3536..ad71489 100644 --- a/test/_idiom/002-Txt.sh +++ b/test/_idiom/002-Txt.sh @@ -3,34 +3,34 @@ test_Txt_noargs () { Txt - eval deref=\$$_R - tap_assert "" "$deref" + dump $_R + tap_assert "''" "$REPLY" } test_Txt_unary_zerolength () { Txt "" - eval deref=\$$_R - tap_assert "" "$deref" + dump $_R + tap_assert "''" "$REPLY" } test_Txt_simple () { Txt "Some text" - eval deref=\$$_R - tap_assert "Some text" "$deref" + dump $_R + tap_assert "'Some text'" "$REPLY" } test_Txt_add () { Txt "Some text" - eval deref=\$$_R + dump $_R Txt_add $_R " and some more" - eval deref=\$$_R - tap_assert "Some text and some more" "$deref" + dump $_R + tap_assert "'Some text and some more'" "$REPLY" } test_Txt_add_to_empty_string () { Txt - eval deref=\$$_R + dump $_R Txt_add $_R "Hi" - eval deref=\$$_R - tap_assert "Hi" "$deref" + dump $_R + tap_assert "'Hi'" "$REPLY" } diff --git a/test/_idiom/007-val.sh b/test/_idiom/007-val.sh index cb2d7a2..90dab22 100644 --- a/test/_idiom/007-val.sh +++ b/test/_idiom/007-val.sh @@ -4,20 +4,27 @@ test_val_noargs () { local my_variable= val my_variable = - eval deref=\$$my_variable - tap_assert "" "$deref" + dump $my_variable + tap_assert "''" "$REPLY" } test_val_unary_zerolength () { local my_variable= val my_variable = "" - eval deref=\$$my_variable - tap_assert "" "$deref" + dump $my_variable + tap_assert "''" "$REPLY" } test_val_simple () { local my_variable= val my_variable = "Some text" - eval deref=\$$my_variable - tap_assert "Some text" "$deref" + dump $my_variable + tap_assert "'Some text'" "$REPLY" +} + +test_val_exp_Txt_creation () { + local my_variable= + val my_variable = [ Lst ="foo" ="bar" ] + dump $my_variable + tap_assert "[ Lst 'foo' 'bar' ]" "$REPLY" } diff --git a/test/_idiom/008-dump.sh b/test/_idiom/008-dump.sh index 7253e0b..4df212e 100644 --- a/test/_idiom/008-dump.sh +++ b/test/_idiom/008-dump.sh @@ -96,5 +96,5 @@ test_toenv_Map () { val profile = [ Map :fname $first_name :lname $last_name ] local r3=$_R toenv $profile - tap_assert "$r3='fname${__EOL__}lname'${__EOL__}${r3}ifname=$r1${__EOL__}${r3}ilname=$r2${__EOL__}" "$REPLY" + tap_assert "${r3}='fname${__EOL__}lname'${__EOL__}${r3}ifname=$r1${__EOL__}$r1='Lorem'${__EOL__}${r3}ilname=$r2${__EOL__}$r2='Ipsum'${__EOL__}" "$REPLY" }