libexec/shellspec-reporter.sh
#!/bin/sh
#shellcheck disable=SC2004,SC2016
set -euf
interrupt=''
"$SHELLSPEC_TRAP" '[ "$interrupt" ] && exit 130; interrupt=1' INT
"$SHELLSPEC_TRAP" '' TERM
echo $$ > "$SHELLSPEC_REPORTER_PID"
# shellcheck source=lib/libexec/reporter.sh
. "${SHELLSPEC_LIB:-./lib}/libexec/reporter.sh"
import "formatter"
import "color_schema"
color_constants
found_focus='' no_examples='' aborted=1 repetition='' coverage_failed='' \
fail_fast='' fail_fast_count=${SHELLSPEC_FAIL_FAST_COUNT:-999999} reason='' \
current_example_index=0 example_index='' \
last_example_no='' last_skip_id='' not_enough_examples=''
# shellcheck disable=SC2034
specfile_count=0 expected_example_count=0 example_count=0 \
succeeded_count='' failed_count='' warned_count='' error_count='' \
todo_count='' fixed_count='' skipped_count='' error_index='' \
suppressed_todo_count='' suppressed_fixed_count='' suppressed_skipped_count=''
# shellcheck disable=SC2034
field_id='' field_type='' field_tag='' field_example_no='' field_focused='' \
field_temporary='' field_skipid='' field_pending='' field_message='' \
field_quick='' field_specfile='' field_stdout='' field_stderr=''
init_quick_data
[ "$SHELLSPEC_GENERATORS" ] && mkdir -p "$SHELLSPEC_REPORTDIR"
# shellcheck disable=SC2086
load_formatter "${SHELLSPEC_FORMATTER:-debug}" $SHELLSPEC_GENERATORS
formatters initialize "$@"
generators prepare "$@"
[ "$SHELLSPEC_XTRACE" ] && require_formatters trace
output_formatters begin
reporter_callback() {
case $field_type in
begin)
field_example_count='' last_example_no=0 \
last_skip_id='' suppress_pending=''
inc specfile_count
# shellcheck disable=SC2034
example_count_per_file=0 succeeded_count_per_file=0 \
failed_count_per_file=0 warned_count_per_file=0 todo_count_per_file=0 \
fixed_count_per_file=0 skipped_count_per_file=0 error_count_per_file=0
;;
example)
# shellcheck disable=SC2034
field_evaluation='' field_pending='' reason='' temporary_skip=0
[ "$field_example_no" -le "$last_example_no" ] && repetition=1 && return 0
[ "$field_focused" = "focus" ] && found_focus=1
example_index='' last_example_no=$field_example_no
;;
statement)
while :; do
# Do not add references if example_index is blank
case $field_tag in
evaluation) break ;;
good)
[ "$field_pending" ] || break
[ ! "$suppress_pending" ] || break
;;
bad) [ ! "$suppress_pending" ] || break ;;
pending)
suppress_pending=1
case $SHELLSPEC_PENDING_MESSAGE in (quiet)
[ "$field_temporary" ] || break
esac
suppress_pending=''
;;
skip)
case $SHELLSPEC_SKIP_MESSAGE in (quiet)
[ "$field_temporary" ] || break
esac
case $SHELLSPEC_SKIP_MESSAGE in (moderate | quiet)
[ ! "$field_skipid" = "$last_skip_id" ] || break
last_skip_id=$field_skipid
esac
inc temporary_skip
esac
# shellcheck disable=SC2034
case $field_tag in (pending | skip)
reason=$field_message
esac
if [ ! "$example_index" ]; then
inc current_example_index
example_index=$current_example_index
fi
break
done
;;
result)
inc example_count example_count_per_file
inc "${field_tag}_count" "${field_tag}_count_per_file"
[ "${failed_count:-0}" -ge "$fail_fast_count" ] && aborted='' fail_fast=1
case $field_tag in (skipped | fixed | todo)
[ "$example_index" ] || inc "suppressed_${field_tag}_count"
esac
add_quick_data "$field_specfile:@$field_id" "$field_tag" "$field_quick"
;;
end)
# field_example_count not provided when range or filter option specified
field_example_count=${field_example_count:-$example_count_per_file}
expected_example_count=$(($expected_example_count + $field_example_count))
if [ "$example_count_per_file" -ne "$field_example_count" ]; then
not_enough_examples=${not_enough_examples:-0}
not_enough_examples=$(($not_enough_examples + $field_example_count))
not_enough_examples=$(($not_enough_examples - $example_count_per_file))
fi
;;
error)
inc error_count error_count_per_file
base26 error_index "$error_count"
;;
finished)
aborted=''
if [ "$SHELLSPEC_FAIL_NO_EXAMPLES" ]; then
[ "$example_count" -gt 0 ] || no_examples=1
fi
esac
color_schema
output_formatters each "$@"
[ ! "${fail_fast}${interrupt}${repetition}" ]
}
tssv_parse "field" reporter_callback ||:
timeout 1 read_time_log "time" "$SHELLSPEC_TIME_LOG" ||:
read_time_log "time" "$SHELLSPEC_TIME_LOG" ||:
output_formatters end
generators cleanup "$@"
formatters finalize "$@"
if [ "$repetition" ]; then
error "Illegal executed same example" \
"in ${field_specfile:-} line ${field_lineno_range:-}${LF}" \
"(Use 'parameterized example' instead of running the example in a loop)$LF"
fi
if [ "${SHELLSPEC_FOCUS_FILTER:-}" ]; then
if [ ! "$found_focus" ]; then
notice "You specified --focus option, but not found any focused examples."
notice "To focus, prepend 'f' to groups / examples. (e.g. fDescribe, fIt)$LF"
fi
else
if [ "$found_focus" ]; then
notice "You need to specify --focus option" \
"to run focused (underlined) example(s) only.$LF"
fi
fi
if [ -e "$SHELLSPEC_QUICK_FILE" ] && [ ! "$interrupt" ]; then
quick_file="$SHELLSPEC_QUICK_FILE" done=1
[ "${aborted}${not_enough_examples}${fail_fast}" ] && done=''
[ -e "$quick_file" ] && in_quick_file=$quick_file || in_quick_file=/dev/null
quick_file_data=$(filter_quick_file "$done" "$@" < "$in_quick_file")
if [ -s "$quick_file" ] && [ ! "$quick_file_data" ]; then
notice "All examples have been passed. Rerun to prevent regression.$LF"
fi
puts "$quick_file_data${quick_file_data:+"$LF"}" | sort > "$quick_file"
fi
if [ -e "$SHELLSPEC_DEPRECATION_LOGFILE" ]; then
count=0 found='Found '
while IFS= read -r line && inc count; do
[ "$SHELLSPEC_DEPRECATION_LOG" ] && notice "$line" 2>&1
done < "$SHELLSPEC_DEPRECATION_LOGFILE"
pluralize found "$count deprecation"
if [ "$SHELLSPEC_DEPRECATION_LOG" ]; then
notice "$found. Use --hide-deprecations to hide the details."
else
notice "$found. Use --show-deprecations to show the details."
fi
fi
if [ "$repetition" ]; then
exit_status=$SHELLSPEC_ERROR_EXIT_CODE
elif [ "$interrupt" ]; then
exit_status=130
elif [ "$aborted" ]; then
exit_status=1
elif [ "$SHELLSPEC_FAIL_LOW_COVERAGE" ] && [ "$coverage_failed" ]; then
exit_status=$SHELLSPEC_FAILURE_EXIT_CODE
elif [ "$SHELLSPEC_WARNING_AS_FAILURE" ] && [ "$warned_count" ]; then
exit_status=$SHELLSPEC_FAILURE_EXIT_CODE
elif [ "${failed_count}${error_count}${fixed_count}" ]; then
exit_status=$SHELLSPEC_FAILURE_EXIT_CODE
elif [ "${not_enough_examples}${no_examples}" ]; then
exit_status=$SHELLSPEC_FAILURE_EXIT_CODE
else
exit_status=0
fi
exit "$exit_status"