From 55e5d3d69dec433e2aa9950c7c14c15cc7d52dd7 Mon Sep 17 00:00:00 2001 From: Alexandre Gaigalas Date: Mon, 8 Jul 2024 05:43:53 -0300 Subject: [PATCH] Improving *_add and testing more scenarios Lst_add had a bug when adding to existing lists that was not caught before because it was being tested indirectly. Arr_add had a bug on the index counter that was not caught because it was not used anywhere else but the tests, which were incomplete. --- idiom/data.sh | 14 ++++---------- test/_idiom/003-Lst.sh | 14 ++++++++++++++ test/_idiom/004-Set.sh | 14 ++++++++++++++ test/_idiom/005-Arr.sh | 30 ++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 10 deletions(-) diff --git a/idiom/data.sh b/idiom/data.sh index 6c002a9..f4d67f9 100644 --- a/idiom/data.sh +++ b/idiom/data.sh @@ -147,7 +147,7 @@ Lst () { Lst_add () { _R=$1 shift - eval "$_R=\"\${$_R:-}\$*\"" + eval "$_R=\"\$$_R\${$_R:+\$__EOL__}\$*\"" } # The Set pseudotype constructor @@ -173,19 +173,13 @@ Set_add () { Arr () { _A=$((_A + 1)) _R=_A$_A - eval "$_R=-1" - if test $# -gt 0 - then - eval "$_R=-1" - Arr_add $_R "$@" - else - eval "$_R=0" - fi + eval "$_R=0" + test $# -lt 1 || Arr_add $_R "$@" } Arr_add () { _R=$1 - eval "$_R=$(($_R + $#))" + eval "$_R=$(($_R + $# - 1))" while test $# -gt 1 do shift ; eval "${_R}i$(($_R - $#))=\$1" done diff --git a/test/_idiom/003-Lst.sh b/test/_idiom/003-Lst.sh index 011cca8..1a49ea6 100644 --- a/test/_idiom/003-Lst.sh +++ b/test/_idiom/003-Lst.sh @@ -18,3 +18,17 @@ test_Lst_simple () { eval deref=\$$_R tap_assert "foo${__EOL__}bar${__EOL__}baz" "$deref" } + +test_Lst_add_to_existing () { + Lst foo bar baz + Lst_add $_R qux + eval deref=\$$_R + tap_assert "foo${__EOL__}bar${__EOL__}baz${__EOL__}qux" "$deref" +} + +test_Lst_add_to_existing_empty_list () { + Lst + Lst_add $_R foo bar baz + eval deref=\$$_R + tap_assert "foo${__EOL__}bar${__EOL__}baz" "$deref" +} diff --git a/test/_idiom/004-Set.sh b/test/_idiom/004-Set.sh index 1071911..4ae08ee 100644 --- a/test/_idiom/004-Set.sh +++ b/test/_idiom/004-Set.sh @@ -36,3 +36,17 @@ test_Set_uniqueness_C () { eval deref=\$$_R tap_assert "bar${__EOL__}foo" "$deref" } + +test_Set_add_to_existing () { + Set foo bar baz + Set_add $_R baz foo qux bar qux + eval deref=\$$_R + tap_assert "foo${__EOL__}bar${__EOL__}baz${__EOL__}qux" "$deref" +} + +test_Set_add_to_existing_empty_list () { + Set + Set_add $_R foo bar baz + eval deref=\$$_R + tap_assert "foo${__EOL__}bar${__EOL__}baz" "$deref" +} diff --git a/test/_idiom/005-Arr.sh b/test/_idiom/005-Arr.sh index 305f315..432bfe4 100644 --- a/test/_idiom/005-Arr.sh +++ b/test/_idiom/005-Arr.sh @@ -11,10 +11,40 @@ test_Arr_unary_zerolength () { Arr "" eval deref=\$$_R tap_assert "1" "$deref" + eval deref=\$${_R}i0 + tap_assert "" "$deref" } test_Arr_simple () { Arr foo bar baz eval deref=\$$_R tap_assert "3" "$deref" + eval deref=\$${_R}i0 + tap_assert "foo" "$deref" + eval deref=\$${_R}i1 + tap_assert "bar" "$deref" + eval deref=\$${_R}i2 + tap_assert "baz" "$deref" +} + +test_Arr_add_to_existing () { + Arr foo bar baz + Arr_add $_R qux + eval deref=\$$_R + tap_assert "4" "$deref" + eval deref=\$${_R}i3 + tap_assert "qux" "$deref" +} + +test_Arr_add_to_existing_empty_list () { + Arr + Arr_add $_R foo bar baz + eval deref=\$$_R + tap_assert "3" "$deref" + eval deref=\$${_R}i0 + tap_assert "foo" "$deref" + eval deref=\$${_R}i1 + tap_assert "bar" "$deref" + eval deref=\$${_R}i2 + tap_assert "baz" "$deref" }