Skip to content

Commit

Permalink
echo-count-lines: support args, make tests less flaky
Browse files Browse the repository at this point in the history
  • Loading branch information
balupton committed Nov 11, 2023
1 parent cc23edb commit c3843af
Show file tree
Hide file tree
Showing 5 changed files with 149 additions and 30 deletions.
4 changes: 2 additions & 2 deletions commands/confirm
Original file line number Diff line number Diff line change
Expand Up @@ -139,11 +139,11 @@ function confirm_() (
# cache the first part for the finale
local question="${option_question[0]}"

# generate the promot, the body, and body line count
# generate the prompt, the body, and body line count
local prompt body body_lines
prompt="$question"
body="$(echo-lines -- "${option_question[@]:1}")"
body_lines="$(echo-count-lines --stdin <<<"$body")"
body_lines="$(echo-count-lines -- "$body")"
if test "$option_mode" = 'positive'; then
prompt+=" $(echo-style --blink='(' --blink+green+bold='Y' --blink='/n)')"
elif test "$option_mode" = 'negative'; then
Expand Down
2 changes: 1 addition & 1 deletion commands/dorothy
Original file line number Diff line number Diff line change
Expand Up @@ -1754,7 +1754,7 @@ function dorothy() (
}

# skip bash v3 test on these
if test "$filename" = 'get-installer'; then
if [[ $filename =~ 'get-installer'|'dorothy-config' ]]; then
continue
fi

Expand Down
115 changes: 103 additions & 12 deletions commands/echo-count-lines
Original file line number Diff line number Diff line change
Expand Up @@ -4,35 +4,71 @@ function echo_count_lines_test() (
source "$DOROTHY/sources/bash.bash"
echo-segment --h1="TEST: $0"

eval-tester --name='args, one line, is inline: default' --stdout='1' \
-- echo-count-lines -- 'a'

eval-tester --name='args, one line, is inline: --no-inline' --stdout='0' \
-- echo-count-lines --no-inline -- 'a'

eval-tester --name='args, one line, not inline: default' --stdout='1' \
-- echo-count-lines -- $'a\n'

eval-tester --name='args, one line, not inline: --no-inline' --stdout='1' \
-- echo-count-lines --no-inline -- $'a\n'

eval-tester --name='args, two lines, last is inline: default' --stdout='2' \
-- echo-count-lines -- $'a\nb'

eval-tester --name='args, two lines, last is inline: --no-inline' --stdout='1' \
-- echo-count-lines --no-inline -- $'a\nb'

eval-tester --name='multi args, one line, is inline: default' --stdout='1' \
-- echo-count-lines -- 'a' ''

eval-tester --name='multi args, one line, is inline: --no-inline' --stdout='0' \
-- echo-count-lines --no-inline -- 'a' ''

eval-tester --name='multi args, one line, not inline: default' --stdout='1' \
-- echo-count-lines -- 'a' $'\n'

eval-tester --name='multi args, one line, not inline: --no-inline' --stdout='1' \
-- echo-count-lines --no-inline -- 'a' $'\n'

eval-tester --name='multi args, two lines, last is inline: default' --stdout='2' \
-- echo-count-lines -- 'a' $'\n' 'b'

eval-tester --name='multi args, two lines, last is inline: --no-inline' --stdout='1' \
-- echo-count-lines --no-inline -- 'a' $'\n' 'b'

{
printf '%s' 'a'
} | eval-tester --name='stdin, one line, is inline: default' --stdout='1' \
-- echo-count-lines
-- echo-count-lines --stdin

{
printf '%s' 'a'
} | eval-tester --name='stdin, one line, is inline: --no-inline' --stdout='0' \
-- echo-count-lines --no-inline
-- echo-count-lines --stdin --no-inline

{
printf '%s' $'a\n'
} | eval-tester --name='stdin, one line, not inline: default' --stdout='1' \
-- echo-count-lines
-- echo-count-lines --stdin

{
printf '%s' $'a\n'
} | eval-tester --name='stdin, one line, not inline: --no-inline' --stdout='1' \
-- echo-count-lines --no-inline
-- echo-count-lines --stdin --no-inline

{
printf '%s' $'a\nb'
} | eval-tester --name='stdin, two lines, last is inline: default' --stdout='2' \
-- echo-count-lines
-- echo-count-lines --stdin

{
printf '%s' $'a\nb'
} | eval-tester --name='stdin, two lines, last is inline: --no-inline' --stdout='1' \
-- echo-count-lines --no-inline
-- echo-count-lines --stdin --no-inline

echo-segment --g1="TEST: $0"
return 0
Expand All @@ -49,28 +85,83 @@ function echo_count_lines() (
Output how many lines in the input.
USAGE:
echo-count-lines [...options] [--] ...<input>
echo-lines ...<input> | echo-count-lines [...options]
OPTIONS:
$(stdinargs_options_help --stdin)
$(stdinargs_options_help --)
EXAMPLE:
echo-count-lines -- $'1\n23\n4'
echo-count-lines -- $'1\n2' $'3\n4' ''
3
# exit status: 0
echo-count-lines --no-inline -- $'1\n23\n4'
echo-count-lines --no-inline -- $'1\n2' $'3\n4' ''
2
# exit status: 0
printf '%s' $'1\n2' | echo-count-lines --stdin
2
# exit status: 0
printf '%s' $'1\n2' | echo-count-lines --stdin --no-inline
1
# exit status: 0
echo-lines -- 1 2 | echo-count-lines --stdin
2
# exit status: 0
EOF
return 22 # EINVAL 22 Invalid argument
}

# process
local item option_inline='yes' args=()
while test "$#" -ne 0; do
item="$1"
shift
case "$item" in
'--no-inline' | '--inline=no')
option_inline='no'
;;
'--inline' | '--inline=yes')
option_inline='yes'
;;
*)
args+=("$item")
;;
esac
done

# =====================================
# Action

local input_line_count=0
local arg_inputs=''
local stdin_line_count=0
function on_arg {
help 'Use STDIN.'
arg_inputs+="$1"
}
function on_input {
input_line_count="$((input_line_count + 1))"
stdin_line_count="$((stdin_line_count + 1))"
}
function on_finish {
print_line "$input_line_count"
local arg_line_count=0 total_line_count
if test -n "$arg_inputs"; then
arg_line_count="$(printf '%s' "$arg_inputs" | echo-count-lines --stdin --inline="$option_inline")"
fi
total_line_count="$((stdin_line_count + arg_line_count))"
print_line "$total_line_count"
}
stdinargs --stdin "$@"
stdinargs --inline="$option_inline" "${args[@]}"
)

# fire if invoked standalone
Expand Down
54 changes: 39 additions & 15 deletions commands/echo-lines
Original file line number Diff line number Diff line change
Expand Up @@ -4,39 +4,63 @@ function echo_lines_test() (
source "$DOROTHY/sources/bash.bash"
echo-segment --h1="TEST: $0"

eval-tester --name='simple arguments' --stdout=$'a\nb' \
eval-tester --name='args' --stdout=$'a\nb' \
-- echo-lines -- a b

{
print_line a
print_line b
} | eval-tester --name='simple stdin' --stdout=$'a\nb' \
-- echo-lines
} | eval-tester --name='stdin' --stdout=$'a\nb' \
-- echo-lines --stdin

{
print_line c
print_line d
} | eval-tester --name='simple stdin and args' --stdout=$'a\nb\nc\nd' \
print_line e1
print_line f1
} | eval-tester --name='args, ignoring stdin' --stdout=$'a\nb\nc\nd' \
-- echo-lines -- a b c d

{
print_line c
print_line d
} | eval-tester --name='simple stdin and args quoted' --stdout=$'\'a\'\n\'b\'\n\'c\'\n\'d\'' \
print_line e2
print_line f2
} | eval-tester --name='args, with stdin' --stdout=$'a\nb\nc\nd\ne2\nf2' \
-- echo-lines --stdin -- a b c d

{
print_line e3
print_line f3
} | eval-tester --name='args quoted, ignoring stdin' --stdout=$'\'a\'\n\'b\'\n\'c\'\n\'d\'' \
-- echo-lines --quoted -- a b c d

{
print_line c
print_line d
} | eval-tester --name='simple stdin and args indented' --stdout=$'xa\nxb\nxc\nxd' \
print_line e4
print_line f4
} | eval-tester --name='args quoted, with stdin' --stdout=$'\'a\'\n\'b\'\n\'c\'\n\'d\'\n\'e4\'\n\'f4\'' \
-- echo-lines --stdin --quoted -- a b c d

{
print_line e5
print_line f5
} | eval-tester --name='args indented, ignoring stdin' --stdout=$'xa\nxb\nxc\nxd' \
-- echo-lines --indent=x -- a b c d

{
print_line c
print_line d
} | eval-tester --name='simple stdin and args columns' --stdout=$'a\tb\nc\td' \
print_line e6
print_line f6
} | eval-tester --name='args indented, with stdin' --stdout=$'xa\nxb\nxc\nxd\nxe6\nxf6' \
-- echo-lines --stdin --indent=x -- a b c d

{
print_line e7
print_line f7
} | eval-tester --name='args columns, ignoring stdin' --stdout=$'a\tb\nc\td' \
-- echo-lines --columns=2 -- a b c d

{
print_line e8
print_line f8
} | eval-tester --name='args columns, with stdin' --stdout=$'a\tb\nc\td\ne8\tf8' \
-- echo-lines --stdin --columns=2 -- a b c d

echo-segment --g1="TEST: $0"
return 0
)
Expand Down
4 changes: 4 additions & 0 deletions commands/get-github-release
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ function get_github_release_test() (
eval-tester --name='url via tag_name via diy was same as jq' --stdout="$expected" \
-- get-github-release --no-jq --api-url --slug="$slug" --release="$tag_name"

expected="$(get-github-release --jq --api-url --slug="$slug" --release="$release_id")"
eval-tester --name='url via release-id via diy was same as jq' --stdout="$expected" \
-- get-github-release --no-jq --api-url --slug="$slug" --release="$release_id"

expected="$(get-github-release --jq --assets --slug="$slug" --release="$alias")"
eval-tester --name='assets via alias via diy was same as jq' --stdout="$expected" \
-- get-github-release --no-jq --assets --slug="$slug" --release="$alias"
Expand Down

0 comments on commit c3843af

Please sign in to comment.