Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
- Support for displaying the clock without `perl` (for non-macOS)
- Add `-l|--log-junit <log.xml>` option
- Add `-r|--report-html <report.html>` option
- Foundation to enable strictmode

## [0.13.0](https://github.com/TypedDevs/bashunit/compare/0.12.0...0.13.0) - 2024-06-23

Expand Down
26 changes: 13 additions & 13 deletions src/console_results.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,18 +14,18 @@ function console_results::render_result() {
echo ""

local total_tests=0
((total_tests+=$(state::get_tests_passed)))
((total_tests+=$(state::get_tests_skipped)))
((total_tests+=$(state::get_tests_incomplete)))
((total_tests+=$(state::get_tests_snapshot)))
((total_tests+=$(state::get_tests_failed)))
((total_tests += $(state::get_tests_passed))) || true
((total_tests += $(state::get_tests_skipped))) || true
((total_tests += $(state::get_tests_incomplete))) || true
((total_tests += $(state::get_tests_snapshot))) || true
((total_tests += $(state::get_tests_failed))) || true

local total_assertions=0
((total_assertions+=$(state::get_assertions_passed)))
((total_assertions+=$(state::get_assertions_skipped)))
((total_assertions+=$(state::get_assertions_incomplete)))
((total_assertions+=$(state::get_assertions_snapshot)))
((total_assertions+=$(state::get_assertions_failed)))
((total_assertions += $(state::get_assertions_passed))) || true
((total_assertions += $(state::get_assertions_skipped))) || true
((total_assertions += $(state::get_assertions_incomplete))) || true
((total_assertions += $(state::get_assertions_snapshot))) || true
((total_assertions += $(state::get_assertions_failed))) || true

printf "%sTests: %s" "$_COLOR_FAINT" "$_COLOR_DEFAULT"
if [[ "$(state::get_tests_passed)" -gt 0 ]] || [[ "$(state::get_assertions_passed)" -gt 0 ]]; then
Expand DownExpand Up@@ -108,7 +108,7 @@ function console_results::print_execution_time() {
}

function console_results::print_successful_test() {
((_SUCCESSFUL_TEST_COUNT++))
((_SUCCESSFUL_TEST_COUNT++)) || true

if [[ "$SIMPLE_OUTPUT" == true ]]; then
if (( _SUCCESSFUL_TEST_COUNT % 50 != 0 )); then
Expand DownExpand Up@@ -178,7 +178,7 @@ function console_results::print_failed_snapshot_test() {

function console_results::print_skipped_test() {
local test_name=$1
local reason=$2
local reason=${2-}

printf "${_COLOR_SKIPPED}↷ Skipped${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand All@@ -189,7 +189,7 @@ function console_results::print_skipped_test() {

function console_results::print_incomplete_test() {
local test_name=$1
local pending=$2
local pending=${2-}

printf "${_COLOR_INCOMPLETE}✒ Incomplete${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand Down
44 changes: 9 additions & 35 deletions src/env_configuration.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,38 +5,12 @@ set -o allexport
[[ -f ".env" ]] && source .env set
set +o allexport

if [[ -z "$PARALLEL_RUN" ]]; then
PARALLEL_RUN=$_DEFAULT_PARALLEL_RUN
fi

if [[ -z "$SHOW_HEADER" ]]; then
SHOW_HEADER=$_DEFAULT_SHOW_HEADER
fi

if [[ -z "$HEADER_ASCII_ART" ]]; then
HEADER_ASCII_ART=$_DEFAULT_HEADER_ASCII_ART
fi

if [[ -z "$SIMPLE_OUTPUT" ]]; then
SIMPLE_OUTPUT=$_DEFAULT_SIMPLE_OUTPUT
fi

if [[ -z "$STOP_ON_FAILURE" ]]; then
STOP_ON_FAILURE=$_DEFAULT_STOP_ON_FAILURE
fi

if [[ -z "$SHOW_EXECUTION_TIME" ]]; then
SHOW_EXECUTION_TIME=$_DEFAULT_SHOW_EXECUTION_TIME
fi

if [[ -z "$DEFAULT_PATH" ]]; then
DEFAULT_PATH=$_DEFAULT_DEFAULT_PATH
fi

if [[ -z "$LOG_JUNIT" ]]; then
LOG_JUNIT=$_DEFAULT_LOG_JUNIT
fi

if [[ -z "$REPORT_HTML" ]]; then
REPORT_HTML=$_DEFAULT_REPORT_HTML
fi
: "${PARALLEL_RUN:=$_DEFAULT_PARALLEL_RUN}"
: "${SHOW_HEADER:=$_DEFAULT_SHOW_HEADER}"
: "${HEADER_ASCII_ART:=$_DEFAULT_HEADER_ASCII_ART}"
: "${SIMPLE_OUTPUT:=$_DEFAULT_SIMPLE_OUTPUT}"
: "${STOP_ON_FAILURE:=$_DEFAULT_STOP_ON_FAILURE}"
: "${SHOW_EXECUTION_TIME:=$_DEFAULT_SHOW_EXECUTION_TIME}"
: "${DEFAULT_PATH:=$_DEFAULT_DEFAULT_PATH}"
: "${LOG_JUNIT:=$_DEFAULT_LOG_JUNIT}"
: "${REPORT_HTML:=$_DEFAULT_REPORT_HTML}"
35 changes: 13 additions & 22 deletions src/helpers.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,7 @@ declare -r BASHUNIT_GIT_REPO="https://github.com/TypedDevs/bashunit"
# @return string Eg: "Some logic camelCase"
#
function helper::normalize_test_function_name() {
local original_function_name="$1"
local original_function_name="${1-}"
local result

# Remove "test_" prefix
Expand DownExpand Up@@ -55,37 +55,27 @@ function helper::get_functions_to_run() {
local filter=$2
local function_names=$3

local functions_to_run=()
local filtered_functions=""

for function_name in $function_names; do
if [[ $function_name != ${prefix}* ]]; then
continue
for fn in $function_names; do
if [[ $fn == ${prefix}_${filter}* ]]; then
if [[ $filtered_functions == *" $fn"* ]]; then
return 1
fi
filtered_functions+=" $fn"
fi

local lower_case_function_name
lower_case_function_name=$(echo "$function_name" | tr '[:upper:]' '[:lower:]')
local lower_case_filter
lower_case_filter=$(echo "$filter" | tr '[:upper:]' '[:lower:]')

if [[ -n $filter && $lower_case_function_name != *"$lower_case_filter"* ]]; then
continue
fi

if [[ "${functions_to_run[*]}" =~ ${function_name} ]]; then
return 1
fi

functions_to_run+=("$function_name")
done

echo "${functions_to_run[@]}"
echo "${filtered_functions# }"
}

#
# @param $1 string Eg: "do_something"
#
function helper::execute_function_if_exists() {
"$1" 2>/dev/null
if [[ "$(type -t "$1")" == "function" ]]; then
"$1" 2>/dev/null
fi
}

#
Expand DownExpand Up@@ -133,6 +123,7 @@ function helper::get_provider_data() {
grep -B 1 "function $function_name()" "$script" |\
grep "# data_provider " |\
sed -E -e 's/\ *# data_provider (.*)$/\1/g'\
|| true
)

if [[ -n "$data_provider_function" ]]; then
Expand Down
12 changes: 6 additions & 6 deletions src/runner.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -71,7 +71,7 @@ function runner::call_test_functions() {
echo "Running $script"
fi

helper::check_duplicate_functions "$script"
helper::check_duplicate_functions "$script" || true

for function_name in "${functions_to_run[@]}"; do
local provider_data=()
Expand DownExpand Up@@ -134,11 +134,11 @@ function runner::parse_execution_result() {
sed -E -e 's/.*##ASSERTIONS_SNAPSHOT=([0-9]*)##.*/\1/g'\
)

_ASSERTIONS_PASSED=$((_ASSERTIONS_PASSED + assertions_passed))
_ASSERTIONS_FAILED=$((_ASSERTIONS_FAILED + assertions_failed))
_ASSERTIONS_SKIPPED=$((_ASSERTIONS_SKIPPED + assertions_skipped))
_ASSERTIONS_INCOMPLETE=$((_ASSERTIONS_INCOMPLETE + assertions_incomplete))
_ASSERTIONS_SNAPSHOT=$((_ASSERTIONS_SNAPSHOT + assertions_snapshot))
((_ASSERTIONS_PASSED += assertions_passed)) || true
((_ASSERTIONS_FAILED += assertions_failed)) || true
((_ASSERTIONS_SKIPPED += assertions_skipped)) || true
((_ASSERTIONS_INCOMPLETE += assertions_incomplete)) || true
((_ASSERTIONS_SNAPSHOT += assertions_snapshot)) || true
}

function runner::run_test() {
Expand Down
4 changes: 2 additions & 2 deletions src/skip_todo.sh
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
#!/bin/bash

function skip() {
local reason=$1
local reason=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand All@@ -11,7 +11,7 @@ function skip() {
}

function todo() {
local pending=$1
local pending=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand Down
File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
bashunit [arguments] [options]

Arguments:
Specifies the directory or file containing the tests to run.
If a directory is specified, it will execute the tests within files ending with test.sh.
If you use wildcards, bashunit will run any tests it finds.

Options:
-a|--assert <function ...args>
Run a core assert function standalone without a test context.

-e|--env <file-path>
Load a custom env file overriding the .env environment variables.

-f|--filter <filter>
Filters the tests to run based on the test name.

-l|--log-junit <out.xml>
Create a report JUnit XML file that contains information about the test results.

-r|--report-html <out.html>
Create a report HTML file that contains information about the test results.

-s|simple || -v|verbose
Enables simplified or verbose output to the console.

-S|--stop-on-failure
Force to stop the runner right after encountering one failing test.

--version
Displays the current version of bashunit.

--upgrade
Upgrade to latest version of bashunit.

--help
This message.

See more: https://bashunit.typeddevs.com/command-line
2 changes: 1 addition & 1 deletion tests/functional/multi_invoker_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,7 +15,7 @@ function tear_down_after_script() {
function test_multi_invoker_simple() {
local current_number="$1"
local second_arg="$2"
local third_arg="$3"
local third_arg="${3-}"

local current_iteration=0

Expand Down
4 changes: 2 additions & 2 deletions tests/unit/directory_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -260,8 +260,8 @@ function test_unsuccessful_assert_is_directory_not_writable() {
assert_equals\
"$(console_results::print_failed_test\
"Unsuccessful assert is directory not writable" \
"$a_file" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_file")"
"$a_directory" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_directory")"

rmdir "$a_directory"
}
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Foundation for strictmode by Chemaclass · Pull Request #241 · TypedDevs/bashunit · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
- Support for displaying the clock without `perl` (for non-macOS)
- Add `-l|--log-junit <log.xml>` option
- Add `-r|--report-html <report.html>` option
- Foundation to enable strictmode

## [0.13.0](https://github.com/TypedDevs/bashunit/compare/0.12.0...0.13.0) - 2024-06-23

Expand Down
26 changes: 13 additions & 13 deletions src/console_results.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,18 +14,18 @@ function console_results::render_result() {
echo ""

local total_tests=0
((total_tests+=$(state::get_tests_passed)))
((total_tests+=$(state::get_tests_skipped)))
((total_tests+=$(state::get_tests_incomplete)))
((total_tests+=$(state::get_tests_snapshot)))
((total_tests+=$(state::get_tests_failed)))
((total_tests += $(state::get_tests_passed))) || true
((total_tests += $(state::get_tests_skipped))) || true
((total_tests += $(state::get_tests_incomplete))) || true
((total_tests += $(state::get_tests_snapshot))) || true
((total_tests += $(state::get_tests_failed))) || true

local total_assertions=0
((total_assertions+=$(state::get_assertions_passed)))
((total_assertions+=$(state::get_assertions_skipped)))
((total_assertions+=$(state::get_assertions_incomplete)))
((total_assertions+=$(state::get_assertions_snapshot)))
((total_assertions+=$(state::get_assertions_failed)))
((total_assertions += $(state::get_assertions_passed))) || true
((total_assertions += $(state::get_assertions_skipped))) || true
((total_assertions += $(state::get_assertions_incomplete))) || true
((total_assertions += $(state::get_assertions_snapshot))) || true
((total_assertions += $(state::get_assertions_failed))) || true

printf "%sTests: %s" "$_COLOR_FAINT" "$_COLOR_DEFAULT"
if [[ "$(state::get_tests_passed)" -gt 0 ]] || [[ "$(state::get_assertions_passed)" -gt 0 ]]; then
Expand DownExpand Up@@ -108,7 +108,7 @@ function console_results::print_execution_time() {
}

function console_results::print_successful_test() {
((_SUCCESSFUL_TEST_COUNT++))
((_SUCCESSFUL_TEST_COUNT++)) || true

if [[ "$SIMPLE_OUTPUT" == true ]]; then
if (( _SUCCESSFUL_TEST_COUNT % 50 != 0 )); then
Expand DownExpand Up@@ -178,7 +178,7 @@ function console_results::print_failed_snapshot_test() {

function console_results::print_skipped_test() {
local test_name=$1
local reason=$2
local reason=${2-}

printf "${_COLOR_SKIPPED}↷ Skipped${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand All@@ -189,7 +189,7 @@ function console_results::print_skipped_test() {

function console_results::print_incomplete_test() {
local test_name=$1
local pending=$2
local pending=${2-}

printf "${_COLOR_INCOMPLETE}✒ Incomplete${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand Down
44 changes: 9 additions & 35 deletions src/env_configuration.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,38 +5,12 @@ set -o allexport
[[ -f ".env" ]] && source .env set
set +o allexport

if [[ -z "$PARALLEL_RUN" ]]; then
PARALLEL_RUN=$_DEFAULT_PARALLEL_RUN
fi

if [[ -z "$SHOW_HEADER" ]]; then
SHOW_HEADER=$_DEFAULT_SHOW_HEADER
fi

if [[ -z "$HEADER_ASCII_ART" ]]; then
HEADER_ASCII_ART=$_DEFAULT_HEADER_ASCII_ART
fi

if [[ -z "$SIMPLE_OUTPUT" ]]; then
SIMPLE_OUTPUT=$_DEFAULT_SIMPLE_OUTPUT
fi

if [[ -z "$STOP_ON_FAILURE" ]]; then
STOP_ON_FAILURE=$_DEFAULT_STOP_ON_FAILURE
fi

if [[ -z "$SHOW_EXECUTION_TIME" ]]; then
SHOW_EXECUTION_TIME=$_DEFAULT_SHOW_EXECUTION_TIME
fi

if [[ -z "$DEFAULT_PATH" ]]; then
DEFAULT_PATH=$_DEFAULT_DEFAULT_PATH
fi

if [[ -z "$LOG_JUNIT" ]]; then
LOG_JUNIT=$_DEFAULT_LOG_JUNIT
fi

if [[ -z "$REPORT_HTML" ]]; then
REPORT_HTML=$_DEFAULT_REPORT_HTML
fi
: "${PARALLEL_RUN:=$_DEFAULT_PARALLEL_RUN}"
: "${SHOW_HEADER:=$_DEFAULT_SHOW_HEADER}"
: "${HEADER_ASCII_ART:=$_DEFAULT_HEADER_ASCII_ART}"
: "${SIMPLE_OUTPUT:=$_DEFAULT_SIMPLE_OUTPUT}"
: "${STOP_ON_FAILURE:=$_DEFAULT_STOP_ON_FAILURE}"
: "${SHOW_EXECUTION_TIME:=$_DEFAULT_SHOW_EXECUTION_TIME}"
: "${DEFAULT_PATH:=$_DEFAULT_DEFAULT_PATH}"
: "${LOG_JUNIT:=$_DEFAULT_LOG_JUNIT}"
: "${REPORT_HTML:=$_DEFAULT_REPORT_HTML}"
35 changes: 13 additions & 22 deletions src/helpers.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,7 @@ declare -r BASHUNIT_GIT_REPO="https://github.com/TypedDevs/bashunit"
# @return string Eg: "Some logic camelCase"
#
function helper::normalize_test_function_name() {
local original_function_name="$1"
local original_function_name="${1-}"
local result

# Remove "test_" prefix
Expand DownExpand Up@@ -55,37 +55,27 @@ function helper::get_functions_to_run() {
local filter=$2
local function_names=$3

local functions_to_run=()
local filtered_functions=""

for function_name in $function_names; do
if [[ $function_name != ${prefix}* ]]; then
continue
for fn in $function_names; do
if [[ $fn == ${prefix}_${filter}* ]]; then
if [[ $filtered_functions == *" $fn"* ]]; then
return 1
fi
filtered_functions+=" $fn"
fi

local lower_case_function_name
lower_case_function_name=$(echo "$function_name" | tr '[:upper:]' '[:lower:]')
local lower_case_filter
lower_case_filter=$(echo "$filter" | tr '[:upper:]' '[:lower:]')

if [[ -n $filter && $lower_case_function_name != *"$lower_case_filter"* ]]; then
continue
fi

if [[ "${functions_to_run[*]}" =~ ${function_name} ]]; then
return 1
fi

functions_to_run+=("$function_name")
done

echo "${functions_to_run[@]}"
echo "${filtered_functions# }"
}

#
# @param $1 string Eg: "do_something"
#
function helper::execute_function_if_exists() {
"$1" 2>/dev/null
if [[ "$(type -t "$1")" == "function" ]]; then
"$1" 2>/dev/null
fi
}

#
Expand DownExpand Up@@ -133,6 +123,7 @@ function helper::get_provider_data() {
grep -B 1 "function $function_name()" "$script" |\
grep "# data_provider " |\
sed -E -e 's/\ *# data_provider (.*)$/\1/g'\
|| true
)

if [[ -n "$data_provider_function" ]]; then
Expand Down
12 changes: 6 additions & 6 deletions src/runner.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -71,7 +71,7 @@ function runner::call_test_functions() {
echo "Running $script"
fi

helper::check_duplicate_functions "$script"
helper::check_duplicate_functions "$script" || true

for function_name in "${functions_to_run[@]}"; do
local provider_data=()
Expand DownExpand Up@@ -134,11 +134,11 @@ function runner::parse_execution_result() {
sed -E -e 's/.*##ASSERTIONS_SNAPSHOT=([0-9]*)##.*/\1/g'\
)

_ASSERTIONS_PASSED=$((_ASSERTIONS_PASSED + assertions_passed))
_ASSERTIONS_FAILED=$((_ASSERTIONS_FAILED + assertions_failed))
_ASSERTIONS_SKIPPED=$((_ASSERTIONS_SKIPPED + assertions_skipped))
_ASSERTIONS_INCOMPLETE=$((_ASSERTIONS_INCOMPLETE + assertions_incomplete))
_ASSERTIONS_SNAPSHOT=$((_ASSERTIONS_SNAPSHOT + assertions_snapshot))
((_ASSERTIONS_PASSED += assertions_passed)) || true
((_ASSERTIONS_FAILED += assertions_failed)) || true
((_ASSERTIONS_SKIPPED += assertions_skipped)) || true
((_ASSERTIONS_INCOMPLETE += assertions_incomplete)) || true
((_ASSERTIONS_SNAPSHOT += assertions_snapshot)) || true
}

function runner::run_test() {
Expand Down
4 changes: 2 additions & 2 deletions src/skip_todo.sh
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
#!/bin/bash

function skip() {
local reason=$1
local reason=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand All@@ -11,7 +11,7 @@ function skip() {
}

function todo() {
local pending=$1
local pending=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand Down
File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
bashunit [arguments] [options]

Arguments:
Specifies the directory or file containing the tests to run.
If a directory is specified, it will execute the tests within files ending with test.sh.
If you use wildcards, bashunit will run any tests it finds.

Options:
-a|--assert <function ...args>
Run a core assert function standalone without a test context.

-e|--env <file-path>
Load a custom env file overriding the .env environment variables.

-f|--filter <filter>
Filters the tests to run based on the test name.

-l|--log-junit <out.xml>
Create a report JUnit XML file that contains information about the test results.

-r|--report-html <out.html>
Create a report HTML file that contains information about the test results.

-s|simple || -v|verbose
Enables simplified or verbose output to the console.

-S|--stop-on-failure
Force to stop the runner right after encountering one failing test.

--version
Displays the current version of bashunit.

--upgrade
Upgrade to latest version of bashunit.

--help
This message.

See more: https://bashunit.typeddevs.com/command-line
2 changes: 1 addition & 1 deletion tests/functional/multi_invoker_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,7 +15,7 @@ function tear_down_after_script() {
function test_multi_invoker_simple() {
local current_number="$1"
local second_arg="$2"
local third_arg="$3"
local third_arg="${3-}"

local current_iteration=0

Expand Down
4 changes: 2 additions & 2 deletions tests/unit/directory_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -260,8 +260,8 @@ function test_unsuccessful_assert_is_directory_not_writable() {
assert_equals\
"$(console_results::print_failed_test\
"Unsuccessful assert is directory not writable" \
"$a_file" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_file")"
"$a_directory" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_directory")"

rmdir "$a_directory"
}
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Foundation for strictmode by Chemaclass · Pull Request #241 · TypedDevs/bashunit · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
- Support for displaying the clock without `perl` (for non-macOS)
- Add `-l|--log-junit <log.xml>` option
- Add `-r|--report-html <report.html>` option
- Foundation to enable strictmode

## [0.13.0](https://github.com/TypedDevs/bashunit/compare/0.12.0...0.13.0) - 2024-06-23

Expand Down
26 changes: 13 additions & 13 deletions src/console_results.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,18 +14,18 @@ function console_results::render_result() {
echo ""

local total_tests=0
((total_tests+=$(state::get_tests_passed)))
((total_tests+=$(state::get_tests_skipped)))
((total_tests+=$(state::get_tests_incomplete)))
((total_tests+=$(state::get_tests_snapshot)))
((total_tests+=$(state::get_tests_failed)))
((total_tests += $(state::get_tests_passed))) || true
((total_tests += $(state::get_tests_skipped))) || true
((total_tests += $(state::get_tests_incomplete))) || true
((total_tests += $(state::get_tests_snapshot))) || true
((total_tests += $(state::get_tests_failed))) || true

local total_assertions=0
((total_assertions+=$(state::get_assertions_passed)))
((total_assertions+=$(state::get_assertions_skipped)))
((total_assertions+=$(state::get_assertions_incomplete)))
((total_assertions+=$(state::get_assertions_snapshot)))
((total_assertions+=$(state::get_assertions_failed)))
((total_assertions += $(state::get_assertions_passed))) || true
((total_assertions += $(state::get_assertions_skipped))) || true
((total_assertions += $(state::get_assertions_incomplete))) || true
((total_assertions += $(state::get_assertions_snapshot))) || true
((total_assertions += $(state::get_assertions_failed))) || true

printf "%sTests: %s" "$_COLOR_FAINT" "$_COLOR_DEFAULT"
if [[ "$(state::get_tests_passed)" -gt 0 ]] || [[ "$(state::get_assertions_passed)" -gt 0 ]]; then
Expand DownExpand Up@@ -108,7 +108,7 @@ function console_results::print_execution_time() {
}

function console_results::print_successful_test() {
((_SUCCESSFUL_TEST_COUNT++))
((_SUCCESSFUL_TEST_COUNT++)) || true

if [[ "$SIMPLE_OUTPUT" == true ]]; then
if (( _SUCCESSFUL_TEST_COUNT % 50 != 0 )); then
Expand DownExpand Up@@ -178,7 +178,7 @@ function console_results::print_failed_snapshot_test() {

function console_results::print_skipped_test() {
local test_name=$1
local reason=$2
local reason=${2-}

printf "${_COLOR_SKIPPED}↷ Skipped${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand All@@ -189,7 +189,7 @@ function console_results::print_skipped_test() {

function console_results::print_incomplete_test() {
local test_name=$1
local pending=$2
local pending=${2-}

printf "${_COLOR_INCOMPLETE}✒ Incomplete${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand Down
44 changes: 9 additions & 35 deletions src/env_configuration.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,38 +5,12 @@ set -o allexport
[[ -f ".env" ]] && source .env set
set +o allexport

if [[ -z "$PARALLEL_RUN" ]]; then
PARALLEL_RUN=$_DEFAULT_PARALLEL_RUN
fi

if [[ -z "$SHOW_HEADER" ]]; then
SHOW_HEADER=$_DEFAULT_SHOW_HEADER
fi

if [[ -z "$HEADER_ASCII_ART" ]]; then
HEADER_ASCII_ART=$_DEFAULT_HEADER_ASCII_ART
fi

if [[ -z "$SIMPLE_OUTPUT" ]]; then
SIMPLE_OUTPUT=$_DEFAULT_SIMPLE_OUTPUT
fi

if [[ -z "$STOP_ON_FAILURE" ]]; then
STOP_ON_FAILURE=$_DEFAULT_STOP_ON_FAILURE
fi

if [[ -z "$SHOW_EXECUTION_TIME" ]]; then
SHOW_EXECUTION_TIME=$_DEFAULT_SHOW_EXECUTION_TIME
fi

if [[ -z "$DEFAULT_PATH" ]]; then
DEFAULT_PATH=$_DEFAULT_DEFAULT_PATH
fi

if [[ -z "$LOG_JUNIT" ]]; then
LOG_JUNIT=$_DEFAULT_LOG_JUNIT
fi

if [[ -z "$REPORT_HTML" ]]; then
REPORT_HTML=$_DEFAULT_REPORT_HTML
fi
: "${PARALLEL_RUN:=$_DEFAULT_PARALLEL_RUN}"
: "${SHOW_HEADER:=$_DEFAULT_SHOW_HEADER}"
: "${HEADER_ASCII_ART:=$_DEFAULT_HEADER_ASCII_ART}"
: "${SIMPLE_OUTPUT:=$_DEFAULT_SIMPLE_OUTPUT}"
: "${STOP_ON_FAILURE:=$_DEFAULT_STOP_ON_FAILURE}"
: "${SHOW_EXECUTION_TIME:=$_DEFAULT_SHOW_EXECUTION_TIME}"
: "${DEFAULT_PATH:=$_DEFAULT_DEFAULT_PATH}"
: "${LOG_JUNIT:=$_DEFAULT_LOG_JUNIT}"
: "${REPORT_HTML:=$_DEFAULT_REPORT_HTML}"
35 changes: 13 additions & 22 deletions src/helpers.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,7 @@ declare -r BASHUNIT_GIT_REPO="https://github.com/TypedDevs/bashunit"
# @return string Eg: "Some logic camelCase"
#
function helper::normalize_test_function_name() {
local original_function_name="$1"
local original_function_name="${1-}"
local result

# Remove "test_" prefix
Expand DownExpand Up@@ -55,37 +55,27 @@ function helper::get_functions_to_run() {
local filter=$2
local function_names=$3

local functions_to_run=()
local filtered_functions=""

for function_name in $function_names; do
if [[ $function_name != ${prefix}* ]]; then
continue
for fn in $function_names; do
if [[ $fn == ${prefix}_${filter}* ]]; then
if [[ $filtered_functions == *" $fn"* ]]; then
return 1
fi
filtered_functions+=" $fn"
fi

local lower_case_function_name
lower_case_function_name=$(echo "$function_name" | tr '[:upper:]' '[:lower:]')
local lower_case_filter
lower_case_filter=$(echo "$filter" | tr '[:upper:]' '[:lower:]')

if [[ -n $filter && $lower_case_function_name != *"$lower_case_filter"* ]]; then
continue
fi

if [[ "${functions_to_run[*]}" =~ ${function_name} ]]; then
return 1
fi

functions_to_run+=("$function_name")
done

echo "${functions_to_run[@]}"
echo "${filtered_functions# }"
}

#
# @param $1 string Eg: "do_something"
#
function helper::execute_function_if_exists() {
"$1" 2>/dev/null
if [[ "$(type -t "$1")" == "function" ]]; then
"$1" 2>/dev/null
fi
}

#
Expand DownExpand Up@@ -133,6 +123,7 @@ function helper::get_provider_data() {
grep -B 1 "function $function_name()" "$script" |\
grep "# data_provider " |\
sed -E -e 's/\ *# data_provider (.*)$/\1/g'\
|| true
)

if [[ -n "$data_provider_function" ]]; then
Expand Down
12 changes: 6 additions & 6 deletions src/runner.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -71,7 +71,7 @@ function runner::call_test_functions() {
echo "Running $script"
fi

helper::check_duplicate_functions "$script"
helper::check_duplicate_functions "$script" || true

for function_name in "${functions_to_run[@]}"; do
local provider_data=()
Expand DownExpand Up@@ -134,11 +134,11 @@ function runner::parse_execution_result() {
sed -E -e 's/.*##ASSERTIONS_SNAPSHOT=([0-9]*)##.*/\1/g'\
)

_ASSERTIONS_PASSED=$((_ASSERTIONS_PASSED + assertions_passed))
_ASSERTIONS_FAILED=$((_ASSERTIONS_FAILED + assertions_failed))
_ASSERTIONS_SKIPPED=$((_ASSERTIONS_SKIPPED + assertions_skipped))
_ASSERTIONS_INCOMPLETE=$((_ASSERTIONS_INCOMPLETE + assertions_incomplete))
_ASSERTIONS_SNAPSHOT=$((_ASSERTIONS_SNAPSHOT + assertions_snapshot))
((_ASSERTIONS_PASSED += assertions_passed)) || true
((_ASSERTIONS_FAILED += assertions_failed)) || true
((_ASSERTIONS_SKIPPED += assertions_skipped)) || true
((_ASSERTIONS_INCOMPLETE += assertions_incomplete)) || true
((_ASSERTIONS_SNAPSHOT += assertions_snapshot)) || true
}

function runner::run_test() {
Expand Down
4 changes: 2 additions & 2 deletions src/skip_todo.sh
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
#!/bin/bash

function skip() {
local reason=$1
local reason=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand All@@ -11,7 +11,7 @@ function skip() {
}

function todo() {
local pending=$1
local pending=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand Down
File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
bashunit [arguments] [options]

Arguments:
Specifies the directory or file containing the tests to run.
If a directory is specified, it will execute the tests within files ending with test.sh.
If you use wildcards, bashunit will run any tests it finds.

Options:
-a|--assert <function ...args>
Run a core assert function standalone without a test context.

-e|--env <file-path>
Load a custom env file overriding the .env environment variables.

-f|--filter <filter>
Filters the tests to run based on the test name.

-l|--log-junit <out.xml>
Create a report JUnit XML file that contains information about the test results.

-r|--report-html <out.html>
Create a report HTML file that contains information about the test results.

-s|simple || -v|verbose
Enables simplified or verbose output to the console.

-S|--stop-on-failure
Force to stop the runner right after encountering one failing test.

--version
Displays the current version of bashunit.

--upgrade
Upgrade to latest version of bashunit.

--help
This message.

See more: https://bashunit.typeddevs.com/command-line
2 changes: 1 addition & 1 deletion tests/functional/multi_invoker_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,7 +15,7 @@ function tear_down_after_script() {
function test_multi_invoker_simple() {
local current_number="$1"
local second_arg="$2"
local third_arg="$3"
local third_arg="${3-}"

local current_iteration=0

Expand Down
4 changes: 2 additions & 2 deletions tests/unit/directory_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -260,8 +260,8 @@ function test_unsuccessful_assert_is_directory_not_writable() {
assert_equals\
"$(console_results::print_failed_test\
"Unsuccessful assert is directory not writable" \
"$a_file" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_file")"
"$a_directory" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_directory")"

rmdir "$a_directory"
}
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Foundation for strictmode by Chemaclass · Pull Request #241 · TypedDevs/bashunit · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
- Support for displaying the clock without `perl` (for non-macOS)
- Add `-l|--log-junit <log.xml>` option
- Add `-r|--report-html <report.html>` option
- Foundation to enable strictmode

## [0.13.0](https://github.com/TypedDevs/bashunit/compare/0.12.0...0.13.0) - 2024-06-23

Expand Down
26 changes: 13 additions & 13 deletions src/console_results.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,18 +14,18 @@ function console_results::render_result() {
echo ""

local total_tests=0
((total_tests+=$(state::get_tests_passed)))
((total_tests+=$(state::get_tests_skipped)))
((total_tests+=$(state::get_tests_incomplete)))
((total_tests+=$(state::get_tests_snapshot)))
((total_tests+=$(state::get_tests_failed)))
((total_tests += $(state::get_tests_passed))) || true
((total_tests += $(state::get_tests_skipped))) || true
((total_tests += $(state::get_tests_incomplete))) || true
((total_tests += $(state::get_tests_snapshot))) || true
((total_tests += $(state::get_tests_failed))) || true

local total_assertions=0
((total_assertions+=$(state::get_assertions_passed)))
((total_assertions+=$(state::get_assertions_skipped)))
((total_assertions+=$(state::get_assertions_incomplete)))
((total_assertions+=$(state::get_assertions_snapshot)))
((total_assertions+=$(state::get_assertions_failed)))
((total_assertions += $(state::get_assertions_passed))) || true
((total_assertions += $(state::get_assertions_skipped))) || true
((total_assertions += $(state::get_assertions_incomplete))) || true
((total_assertions += $(state::get_assertions_snapshot))) || true
((total_assertions += $(state::get_assertions_failed))) || true

printf "%sTests: %s" "$_COLOR_FAINT" "$_COLOR_DEFAULT"
if [[ "$(state::get_tests_passed)" -gt 0 ]] || [[ "$(state::get_assertions_passed)" -gt 0 ]]; then
Expand DownExpand Up@@ -108,7 +108,7 @@ function console_results::print_execution_time() {
}

function console_results::print_successful_test() {
((_SUCCESSFUL_TEST_COUNT++))
((_SUCCESSFUL_TEST_COUNT++)) || true

if [[ "$SIMPLE_OUTPUT" == true ]]; then
if (( _SUCCESSFUL_TEST_COUNT % 50 != 0 )); then
Expand DownExpand Up@@ -178,7 +178,7 @@ function console_results::print_failed_snapshot_test() {

function console_results::print_skipped_test() {
local test_name=$1
local reason=$2
local reason=${2-}

printf "${_COLOR_SKIPPED}↷ Skipped${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand All@@ -189,7 +189,7 @@ function console_results::print_skipped_test() {

function console_results::print_incomplete_test() {
local test_name=$1
local pending=$2
local pending=${2-}

printf "${_COLOR_INCOMPLETE}✒ Incomplete${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand Down
44 changes: 9 additions & 35 deletions src/env_configuration.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,38 +5,12 @@ set -o allexport
[[ -f ".env" ]] && source .env set
set +o allexport

if [[ -z "$PARALLEL_RUN" ]]; then
PARALLEL_RUN=$_DEFAULT_PARALLEL_RUN
fi

if [[ -z "$SHOW_HEADER" ]]; then
SHOW_HEADER=$_DEFAULT_SHOW_HEADER
fi

if [[ -z "$HEADER_ASCII_ART" ]]; then
HEADER_ASCII_ART=$_DEFAULT_HEADER_ASCII_ART
fi

if [[ -z "$SIMPLE_OUTPUT" ]]; then
SIMPLE_OUTPUT=$_DEFAULT_SIMPLE_OUTPUT
fi

if [[ -z "$STOP_ON_FAILURE" ]]; then
STOP_ON_FAILURE=$_DEFAULT_STOP_ON_FAILURE
fi

if [[ -z "$SHOW_EXECUTION_TIME" ]]; then
SHOW_EXECUTION_TIME=$_DEFAULT_SHOW_EXECUTION_TIME
fi

if [[ -z "$DEFAULT_PATH" ]]; then
DEFAULT_PATH=$_DEFAULT_DEFAULT_PATH
fi

if [[ -z "$LOG_JUNIT" ]]; then
LOG_JUNIT=$_DEFAULT_LOG_JUNIT
fi

if [[ -z "$REPORT_HTML" ]]; then
REPORT_HTML=$_DEFAULT_REPORT_HTML
fi
: "${PARALLEL_RUN:=$_DEFAULT_PARALLEL_RUN}"
: "${SHOW_HEADER:=$_DEFAULT_SHOW_HEADER}"
: "${HEADER_ASCII_ART:=$_DEFAULT_HEADER_ASCII_ART}"
: "${SIMPLE_OUTPUT:=$_DEFAULT_SIMPLE_OUTPUT}"
: "${STOP_ON_FAILURE:=$_DEFAULT_STOP_ON_FAILURE}"
: "${SHOW_EXECUTION_TIME:=$_DEFAULT_SHOW_EXECUTION_TIME}"
: "${DEFAULT_PATH:=$_DEFAULT_DEFAULT_PATH}"
: "${LOG_JUNIT:=$_DEFAULT_LOG_JUNIT}"
: "${REPORT_HTML:=$_DEFAULT_REPORT_HTML}"
35 changes: 13 additions & 22 deletions src/helpers.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,7 @@ declare -r BASHUNIT_GIT_REPO="https://github.com/TypedDevs/bashunit"
# @return string Eg: "Some logic camelCase"
#
function helper::normalize_test_function_name() {
local original_function_name="$1"
local original_function_name="${1-}"
local result

# Remove "test_" prefix
Expand DownExpand Up@@ -55,37 +55,27 @@ function helper::get_functions_to_run() {
local filter=$2
local function_names=$3

local functions_to_run=()
local filtered_functions=""

for function_name in $function_names; do
if [[ $function_name != ${prefix}* ]]; then
continue
for fn in $function_names; do
if [[ $fn == ${prefix}_${filter}* ]]; then
if [[ $filtered_functions == *" $fn"* ]]; then
return 1
fi
filtered_functions+=" $fn"
fi

local lower_case_function_name
lower_case_function_name=$(echo "$function_name" | tr '[:upper:]' '[:lower:]')
local lower_case_filter
lower_case_filter=$(echo "$filter" | tr '[:upper:]' '[:lower:]')

if [[ -n $filter && $lower_case_function_name != *"$lower_case_filter"* ]]; then
continue
fi

if [[ "${functions_to_run[*]}" =~ ${function_name} ]]; then
return 1
fi

functions_to_run+=("$function_name")
done

echo "${functions_to_run[@]}"
echo "${filtered_functions# }"
}

#
# @param $1 string Eg: "do_something"
#
function helper::execute_function_if_exists() {
"$1" 2>/dev/null
if [[ "$(type -t "$1")" == "function" ]]; then
"$1" 2>/dev/null
fi
}

#
Expand DownExpand Up@@ -133,6 +123,7 @@ function helper::get_provider_data() {
grep -B 1 "function $function_name()" "$script" |\
grep "# data_provider " |\
sed -E -e 's/\ *# data_provider (.*)$/\1/g'\
|| true
)

if [[ -n "$data_provider_function" ]]; then
Expand Down
12 changes: 6 additions & 6 deletions src/runner.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -71,7 +71,7 @@ function runner::call_test_functions() {
echo "Running $script"
fi

helper::check_duplicate_functions "$script"
helper::check_duplicate_functions "$script" || true

for function_name in "${functions_to_run[@]}"; do
local provider_data=()
Expand DownExpand Up@@ -134,11 +134,11 @@ function runner::parse_execution_result() {
sed -E -e 's/.*##ASSERTIONS_SNAPSHOT=([0-9]*)##.*/\1/g'\
)

_ASSERTIONS_PASSED=$((_ASSERTIONS_PASSED + assertions_passed))
_ASSERTIONS_FAILED=$((_ASSERTIONS_FAILED + assertions_failed))
_ASSERTIONS_SKIPPED=$((_ASSERTIONS_SKIPPED + assertions_skipped))
_ASSERTIONS_INCOMPLETE=$((_ASSERTIONS_INCOMPLETE + assertions_incomplete))
_ASSERTIONS_SNAPSHOT=$((_ASSERTIONS_SNAPSHOT + assertions_snapshot))
((_ASSERTIONS_PASSED += assertions_passed)) || true
((_ASSERTIONS_FAILED += assertions_failed)) || true
((_ASSERTIONS_SKIPPED += assertions_skipped)) || true
((_ASSERTIONS_INCOMPLETE += assertions_incomplete)) || true
((_ASSERTIONS_SNAPSHOT += assertions_snapshot)) || true
}

function runner::run_test() {
Expand Down
4 changes: 2 additions & 2 deletions src/skip_todo.sh
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
#!/bin/bash

function skip() {
local reason=$1
local reason=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand All@@ -11,7 +11,7 @@ function skip() {
}

function todo() {
local pending=$1
local pending=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand Down
File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
bashunit [arguments] [options]

Arguments:
Specifies the directory or file containing the tests to run.
If a directory is specified, it will execute the tests within files ending with test.sh.
If you use wildcards, bashunit will run any tests it finds.

Options:
-a|--assert <function ...args>
Run a core assert function standalone without a test context.

-e|--env <file-path>
Load a custom env file overriding the .env environment variables.

-f|--filter <filter>
Filters the tests to run based on the test name.

-l|--log-junit <out.xml>
Create a report JUnit XML file that contains information about the test results.

-r|--report-html <out.html>
Create a report HTML file that contains information about the test results.

-s|simple || -v|verbose
Enables simplified or verbose output to the console.

-S|--stop-on-failure
Force to stop the runner right after encountering one failing test.

--version
Displays the current version of bashunit.

--upgrade
Upgrade to latest version of bashunit.

--help
This message.

See more: https://bashunit.typeddevs.com/command-line
2 changes: 1 addition & 1 deletion tests/functional/multi_invoker_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,7 +15,7 @@ function tear_down_after_script() {
function test_multi_invoker_simple() {
local current_number="$1"
local second_arg="$2"
local third_arg="$3"
local third_arg="${3-}"

local current_iteration=0

Expand Down
4 changes: 2 additions & 2 deletions tests/unit/directory_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -260,8 +260,8 @@ function test_unsuccessful_assert_is_directory_not_writable() {
assert_equals\
"$(console_results::print_failed_test\
"Unsuccessful assert is directory not writable" \
"$a_file" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_file")"
"$a_directory" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_directory")"

rmdir "$a_directory"
}
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Foundation for strictmode by Chemaclass · Pull Request #241 · TypedDevs/bashunit · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
- Support for displaying the clock without `perl` (for non-macOS)
- Add `-l|--log-junit <log.xml>` option
- Add `-r|--report-html <report.html>` option
- Foundation to enable strictmode

## [0.13.0](https://github.com/TypedDevs/bashunit/compare/0.12.0...0.13.0) - 2024-06-23

Expand Down
26 changes: 13 additions & 13 deletions src/console_results.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,18 +14,18 @@ function console_results::render_result() {
echo ""

local total_tests=0
((total_tests+=$(state::get_tests_passed)))
((total_tests+=$(state::get_tests_skipped)))
((total_tests+=$(state::get_tests_incomplete)))
((total_tests+=$(state::get_tests_snapshot)))
((total_tests+=$(state::get_tests_failed)))
((total_tests += $(state::get_tests_passed))) || true
((total_tests += $(state::get_tests_skipped))) || true
((total_tests += $(state::get_tests_incomplete))) || true
((total_tests += $(state::get_tests_snapshot))) || true
((total_tests += $(state::get_tests_failed))) || true

local total_assertions=0
((total_assertions+=$(state::get_assertions_passed)))
((total_assertions+=$(state::get_assertions_skipped)))
((total_assertions+=$(state::get_assertions_incomplete)))
((total_assertions+=$(state::get_assertions_snapshot)))
((total_assertions+=$(state::get_assertions_failed)))
((total_assertions += $(state::get_assertions_passed))) || true
((total_assertions += $(state::get_assertions_skipped))) || true
((total_assertions += $(state::get_assertions_incomplete))) || true
((total_assertions += $(state::get_assertions_snapshot))) || true
((total_assertions += $(state::get_assertions_failed))) || true

printf "%sTests: %s" "$_COLOR_FAINT" "$_COLOR_DEFAULT"
if [[ "$(state::get_tests_passed)" -gt 0 ]] || [[ "$(state::get_assertions_passed)" -gt 0 ]]; then
Expand DownExpand Up@@ -108,7 +108,7 @@ function console_results::print_execution_time() {
}

function console_results::print_successful_test() {
((_SUCCESSFUL_TEST_COUNT++))
((_SUCCESSFUL_TEST_COUNT++)) || true

if [[ "$SIMPLE_OUTPUT" == true ]]; then
if (( _SUCCESSFUL_TEST_COUNT % 50 != 0 )); then
Expand DownExpand Up@@ -178,7 +178,7 @@ function console_results::print_failed_snapshot_test() {

function console_results::print_skipped_test() {
local test_name=$1
local reason=$2
local reason=${2-}

printf "${_COLOR_SKIPPED}↷ Skipped${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand All@@ -189,7 +189,7 @@ function console_results::print_skipped_test() {

function console_results::print_incomplete_test() {
local test_name=$1
local pending=$2
local pending=${2-}

printf "${_COLOR_INCOMPLETE}✒ Incomplete${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand Down
44 changes: 9 additions & 35 deletions src/env_configuration.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,38 +5,12 @@ set -o allexport
[[ -f ".env" ]] && source .env set
set +o allexport

if [[ -z "$PARALLEL_RUN" ]]; then
PARALLEL_RUN=$_DEFAULT_PARALLEL_RUN
fi

if [[ -z "$SHOW_HEADER" ]]; then
SHOW_HEADER=$_DEFAULT_SHOW_HEADER
fi

if [[ -z "$HEADER_ASCII_ART" ]]; then
HEADER_ASCII_ART=$_DEFAULT_HEADER_ASCII_ART
fi

if [[ -z "$SIMPLE_OUTPUT" ]]; then
SIMPLE_OUTPUT=$_DEFAULT_SIMPLE_OUTPUT
fi

if [[ -z "$STOP_ON_FAILURE" ]]; then
STOP_ON_FAILURE=$_DEFAULT_STOP_ON_FAILURE
fi

if [[ -z "$SHOW_EXECUTION_TIME" ]]; then
SHOW_EXECUTION_TIME=$_DEFAULT_SHOW_EXECUTION_TIME
fi

if [[ -z "$DEFAULT_PATH" ]]; then
DEFAULT_PATH=$_DEFAULT_DEFAULT_PATH
fi

if [[ -z "$LOG_JUNIT" ]]; then
LOG_JUNIT=$_DEFAULT_LOG_JUNIT
fi

if [[ -z "$REPORT_HTML" ]]; then
REPORT_HTML=$_DEFAULT_REPORT_HTML
fi
: "${PARALLEL_RUN:=$_DEFAULT_PARALLEL_RUN}"
: "${SHOW_HEADER:=$_DEFAULT_SHOW_HEADER}"
: "${HEADER_ASCII_ART:=$_DEFAULT_HEADER_ASCII_ART}"
: "${SIMPLE_OUTPUT:=$_DEFAULT_SIMPLE_OUTPUT}"
: "${STOP_ON_FAILURE:=$_DEFAULT_STOP_ON_FAILURE}"
: "${SHOW_EXECUTION_TIME:=$_DEFAULT_SHOW_EXECUTION_TIME}"
: "${DEFAULT_PATH:=$_DEFAULT_DEFAULT_PATH}"
: "${LOG_JUNIT:=$_DEFAULT_LOG_JUNIT}"
: "${REPORT_HTML:=$_DEFAULT_REPORT_HTML}"
35 changes: 13 additions & 22 deletions src/helpers.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,7 @@ declare -r BASHUNIT_GIT_REPO="https://github.com/TypedDevs/bashunit"
# @return string Eg: "Some logic camelCase"
#
function helper::normalize_test_function_name() {
local original_function_name="$1"
local original_function_name="${1-}"
local result

# Remove "test_" prefix
Expand DownExpand Up@@ -55,37 +55,27 @@ function helper::get_functions_to_run() {
local filter=$2
local function_names=$3

local functions_to_run=()
local filtered_functions=""

for function_name in $function_names; do
if [[ $function_name != ${prefix}* ]]; then
continue
for fn in $function_names; do
if [[ $fn == ${prefix}_${filter}* ]]; then
if [[ $filtered_functions == *" $fn"* ]]; then
return 1
fi
filtered_functions+=" $fn"
fi

local lower_case_function_name
lower_case_function_name=$(echo "$function_name" | tr '[:upper:]' '[:lower:]')
local lower_case_filter
lower_case_filter=$(echo "$filter" | tr '[:upper:]' '[:lower:]')

if [[ -n $filter && $lower_case_function_name != *"$lower_case_filter"* ]]; then
continue
fi

if [[ "${functions_to_run[*]}" =~ ${function_name} ]]; then
return 1
fi

functions_to_run+=("$function_name")
done

echo "${functions_to_run[@]}"
echo "${filtered_functions# }"
}

#
# @param $1 string Eg: "do_something"
#
function helper::execute_function_if_exists() {
"$1" 2>/dev/null
if [[ "$(type -t "$1")" == "function" ]]; then
"$1" 2>/dev/null
fi
}

#
Expand DownExpand Up@@ -133,6 +123,7 @@ function helper::get_provider_data() {
grep -B 1 "function $function_name()" "$script" |\
grep "# data_provider " |\
sed -E -e 's/\ *# data_provider (.*)$/\1/g'\
|| true
)

if [[ -n "$data_provider_function" ]]; then
Expand Down
12 changes: 6 additions & 6 deletions src/runner.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -71,7 +71,7 @@ function runner::call_test_functions() {
echo "Running $script"
fi

helper::check_duplicate_functions "$script"
helper::check_duplicate_functions "$script" || true

for function_name in "${functions_to_run[@]}"; do
local provider_data=()
Expand DownExpand Up@@ -134,11 +134,11 @@ function runner::parse_execution_result() {
sed -E -e 's/.*##ASSERTIONS_SNAPSHOT=([0-9]*)##.*/\1/g'\
)

_ASSERTIONS_PASSED=$((_ASSERTIONS_PASSED + assertions_passed))
_ASSERTIONS_FAILED=$((_ASSERTIONS_FAILED + assertions_failed))
_ASSERTIONS_SKIPPED=$((_ASSERTIONS_SKIPPED + assertions_skipped))
_ASSERTIONS_INCOMPLETE=$((_ASSERTIONS_INCOMPLETE + assertions_incomplete))
_ASSERTIONS_SNAPSHOT=$((_ASSERTIONS_SNAPSHOT + assertions_snapshot))
((_ASSERTIONS_PASSED += assertions_passed)) || true
((_ASSERTIONS_FAILED += assertions_failed)) || true
((_ASSERTIONS_SKIPPED += assertions_skipped)) || true
((_ASSERTIONS_INCOMPLETE += assertions_incomplete)) || true
((_ASSERTIONS_SNAPSHOT += assertions_snapshot)) || true
}

function runner::run_test() {
Expand Down
4 changes: 2 additions & 2 deletions src/skip_todo.sh
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
#!/bin/bash

function skip() {
local reason=$1
local reason=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand All@@ -11,7 +11,7 @@ function skip() {
}

function todo() {
local pending=$1
local pending=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand Down
File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
bashunit [arguments] [options]

Arguments:
Specifies the directory or file containing the tests to run.
If a directory is specified, it will execute the tests within files ending with test.sh.
If you use wildcards, bashunit will run any tests it finds.

Options:
-a|--assert <function ...args>
Run a core assert function standalone without a test context.

-e|--env <file-path>
Load a custom env file overriding the .env environment variables.

-f|--filter <filter>
Filters the tests to run based on the test name.

-l|--log-junit <out.xml>
Create a report JUnit XML file that contains information about the test results.

-r|--report-html <out.html>
Create a report HTML file that contains information about the test results.

-s|simple || -v|verbose
Enables simplified or verbose output to the console.

-S|--stop-on-failure
Force to stop the runner right after encountering one failing test.

--version
Displays the current version of bashunit.

--upgrade
Upgrade to latest version of bashunit.

--help
This message.

See more: https://bashunit.typeddevs.com/command-line
2 changes: 1 addition & 1 deletion tests/functional/multi_invoker_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,7 +15,7 @@ function tear_down_after_script() {
function test_multi_invoker_simple() {
local current_number="$1"
local second_arg="$2"
local third_arg="$3"
local third_arg="${3-}"

local current_iteration=0

Expand Down
4 changes: 2 additions & 2 deletions tests/unit/directory_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -260,8 +260,8 @@ function test_unsuccessful_assert_is_directory_not_writable() {
assert_equals\
"$(console_results::print_failed_test\
"Unsuccessful assert is directory not writable" \
"$a_file" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_file")"
"$a_directory" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_directory")"

rmdir "$a_directory"
}
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Foundation for strictmode by Chemaclass · Pull Request #241 · TypedDevs/bashunit · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
- Support for displaying the clock without `perl` (for non-macOS)
- Add `-l|--log-junit <log.xml>` option
- Add `-r|--report-html <report.html>` option
- Foundation to enable strictmode

## [0.13.0](https://github.com/TypedDevs/bashunit/compare/0.12.0...0.13.0) - 2024-06-23

Expand Down
26 changes: 13 additions & 13 deletions src/console_results.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,18 +14,18 @@ function console_results::render_result() {
echo ""

local total_tests=0
((total_tests+=$(state::get_tests_passed)))
((total_tests+=$(state::get_tests_skipped)))
((total_tests+=$(state::get_tests_incomplete)))
((total_tests+=$(state::get_tests_snapshot)))
((total_tests+=$(state::get_tests_failed)))
((total_tests += $(state::get_tests_passed))) || true
((total_tests += $(state::get_tests_skipped))) || true
((total_tests += $(state::get_tests_incomplete))) || true
((total_tests += $(state::get_tests_snapshot))) || true
((total_tests += $(state::get_tests_failed))) || true

local total_assertions=0
((total_assertions+=$(state::get_assertions_passed)))
((total_assertions+=$(state::get_assertions_skipped)))
((total_assertions+=$(state::get_assertions_incomplete)))
((total_assertions+=$(state::get_assertions_snapshot)))
((total_assertions+=$(state::get_assertions_failed)))
((total_assertions += $(state::get_assertions_passed))) || true
((total_assertions += $(state::get_assertions_skipped))) || true
((total_assertions += $(state::get_assertions_incomplete))) || true
((total_assertions += $(state::get_assertions_snapshot))) || true
((total_assertions += $(state::get_assertions_failed))) || true

printf "%sTests: %s" "$_COLOR_FAINT" "$_COLOR_DEFAULT"
if [[ "$(state::get_tests_passed)" -gt 0 ]] || [[ "$(state::get_assertions_passed)" -gt 0 ]]; then
Expand DownExpand Up@@ -108,7 +108,7 @@ function console_results::print_execution_time() {
}

function console_results::print_successful_test() {
((_SUCCESSFUL_TEST_COUNT++))
((_SUCCESSFUL_TEST_COUNT++)) || true

if [[ "$SIMPLE_OUTPUT" == true ]]; then
if (( _SUCCESSFUL_TEST_COUNT % 50 != 0 )); then
Expand DownExpand Up@@ -178,7 +178,7 @@ function console_results::print_failed_snapshot_test() {

function console_results::print_skipped_test() {
local test_name=$1
local reason=$2
local reason=${2-}

printf "${_COLOR_SKIPPED}↷ Skipped${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand All@@ -189,7 +189,7 @@ function console_results::print_skipped_test() {

function console_results::print_incomplete_test() {
local test_name=$1
local pending=$2
local pending=${2-}

printf "${_COLOR_INCOMPLETE}✒ Incomplete${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand Down
44 changes: 9 additions & 35 deletions src/env_configuration.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,38 +5,12 @@ set -o allexport
[[ -f ".env" ]] && source .env set
set +o allexport

if [[ -z "$PARALLEL_RUN" ]]; then
PARALLEL_RUN=$_DEFAULT_PARALLEL_RUN
fi

if [[ -z "$SHOW_HEADER" ]]; then
SHOW_HEADER=$_DEFAULT_SHOW_HEADER
fi

if [[ -z "$HEADER_ASCII_ART" ]]; then
HEADER_ASCII_ART=$_DEFAULT_HEADER_ASCII_ART
fi

if [[ -z "$SIMPLE_OUTPUT" ]]; then
SIMPLE_OUTPUT=$_DEFAULT_SIMPLE_OUTPUT
fi

if [[ -z "$STOP_ON_FAILURE" ]]; then
STOP_ON_FAILURE=$_DEFAULT_STOP_ON_FAILURE
fi

if [[ -z "$SHOW_EXECUTION_TIME" ]]; then
SHOW_EXECUTION_TIME=$_DEFAULT_SHOW_EXECUTION_TIME
fi

if [[ -z "$DEFAULT_PATH" ]]; then
DEFAULT_PATH=$_DEFAULT_DEFAULT_PATH
fi

if [[ -z "$LOG_JUNIT" ]]; then
LOG_JUNIT=$_DEFAULT_LOG_JUNIT
fi

if [[ -z "$REPORT_HTML" ]]; then
REPORT_HTML=$_DEFAULT_REPORT_HTML
fi
: "${PARALLEL_RUN:=$_DEFAULT_PARALLEL_RUN}"
: "${SHOW_HEADER:=$_DEFAULT_SHOW_HEADER}"
: "${HEADER_ASCII_ART:=$_DEFAULT_HEADER_ASCII_ART}"
: "${SIMPLE_OUTPUT:=$_DEFAULT_SIMPLE_OUTPUT}"
: "${STOP_ON_FAILURE:=$_DEFAULT_STOP_ON_FAILURE}"
: "${SHOW_EXECUTION_TIME:=$_DEFAULT_SHOW_EXECUTION_TIME}"
: "${DEFAULT_PATH:=$_DEFAULT_DEFAULT_PATH}"
: "${LOG_JUNIT:=$_DEFAULT_LOG_JUNIT}"
: "${REPORT_HTML:=$_DEFAULT_REPORT_HTML}"
35 changes: 13 additions & 22 deletions src/helpers.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,7 @@ declare -r BASHUNIT_GIT_REPO="https://github.com/TypedDevs/bashunit"
# @return string Eg: "Some logic camelCase"
#
function helper::normalize_test_function_name() {
local original_function_name="$1"
local original_function_name="${1-}"
local result

# Remove "test_" prefix
Expand DownExpand Up@@ -55,37 +55,27 @@ function helper::get_functions_to_run() {
local filter=$2
local function_names=$3

local functions_to_run=()
local filtered_functions=""

for function_name in $function_names; do
if [[ $function_name != ${prefix}* ]]; then
continue
for fn in $function_names; do
if [[ $fn == ${prefix}_${filter}* ]]; then
if [[ $filtered_functions == *" $fn"* ]]; then
return 1
fi
filtered_functions+=" $fn"
fi

local lower_case_function_name
lower_case_function_name=$(echo "$function_name" | tr '[:upper:]' '[:lower:]')
local lower_case_filter
lower_case_filter=$(echo "$filter" | tr '[:upper:]' '[:lower:]')

if [[ -n $filter && $lower_case_function_name != *"$lower_case_filter"* ]]; then
continue
fi

if [[ "${functions_to_run[*]}" =~ ${function_name} ]]; then
return 1
fi

functions_to_run+=("$function_name")
done

echo "${functions_to_run[@]}"
echo "${filtered_functions# }"
}

#
# @param $1 string Eg: "do_something"
#
function helper::execute_function_if_exists() {
"$1" 2>/dev/null
if [[ "$(type -t "$1")" == "function" ]]; then
"$1" 2>/dev/null
fi
}

#
Expand DownExpand Up@@ -133,6 +123,7 @@ function helper::get_provider_data() {
grep -B 1 "function $function_name()" "$script" |\
grep "# data_provider " |\
sed -E -e 's/\ *# data_provider (.*)$/\1/g'\
|| true
)

if [[ -n "$data_provider_function" ]]; then
Expand Down
12 changes: 6 additions & 6 deletions src/runner.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -71,7 +71,7 @@ function runner::call_test_functions() {
echo "Running $script"
fi

helper::check_duplicate_functions "$script"
helper::check_duplicate_functions "$script" || true

for function_name in "${functions_to_run[@]}"; do
local provider_data=()
Expand DownExpand Up@@ -134,11 +134,11 @@ function runner::parse_execution_result() {
sed -E -e 's/.*##ASSERTIONS_SNAPSHOT=([0-9]*)##.*/\1/g'\
)

_ASSERTIONS_PASSED=$((_ASSERTIONS_PASSED + assertions_passed))
_ASSERTIONS_FAILED=$((_ASSERTIONS_FAILED + assertions_failed))
_ASSERTIONS_SKIPPED=$((_ASSERTIONS_SKIPPED + assertions_skipped))
_ASSERTIONS_INCOMPLETE=$((_ASSERTIONS_INCOMPLETE + assertions_incomplete))
_ASSERTIONS_SNAPSHOT=$((_ASSERTIONS_SNAPSHOT + assertions_snapshot))
((_ASSERTIONS_PASSED += assertions_passed)) || true
((_ASSERTIONS_FAILED += assertions_failed)) || true
((_ASSERTIONS_SKIPPED += assertions_skipped)) || true
((_ASSERTIONS_INCOMPLETE += assertions_incomplete)) || true
((_ASSERTIONS_SNAPSHOT += assertions_snapshot)) || true
}

function runner::run_test() {
Expand Down
4 changes: 2 additions & 2 deletions src/skip_todo.sh
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
#!/bin/bash

function skip() {
local reason=$1
local reason=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand All@@ -11,7 +11,7 @@ function skip() {
}

function todo() {
local pending=$1
local pending=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand Down
File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
bashunit [arguments] [options]

Arguments:
Specifies the directory or file containing the tests to run.
If a directory is specified, it will execute the tests within files ending with test.sh.
If you use wildcards, bashunit will run any tests it finds.

Options:
-a|--assert <function ...args>
Run a core assert function standalone without a test context.

-e|--env <file-path>
Load a custom env file overriding the .env environment variables.

-f|--filter <filter>
Filters the tests to run based on the test name.

-l|--log-junit <out.xml>
Create a report JUnit XML file that contains information about the test results.

-r|--report-html <out.html>
Create a report HTML file that contains information about the test results.

-s|simple || -v|verbose
Enables simplified or verbose output to the console.

-S|--stop-on-failure
Force to stop the runner right after encountering one failing test.

--version
Displays the current version of bashunit.

--upgrade
Upgrade to latest version of bashunit.

--help
This message.

See more: https://bashunit.typeddevs.com/command-line
2 changes: 1 addition & 1 deletion tests/functional/multi_invoker_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,7 +15,7 @@ function tear_down_after_script() {
function test_multi_invoker_simple() {
local current_number="$1"
local second_arg="$2"
local third_arg="$3"
local third_arg="${3-}"

local current_iteration=0

Expand Down
4 changes: 2 additions & 2 deletions tests/unit/directory_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -260,8 +260,8 @@ function test_unsuccessful_assert_is_directory_not_writable() {
assert_equals\
"$(console_results::print_failed_test\
"Unsuccessful assert is directory not writable" \
"$a_file" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_file")"
"$a_directory" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_directory")"

rmdir "$a_directory"
}
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Foundation for strictmode by Chemaclass · Pull Request #241 · TypedDevs/bashunit · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
- Support for displaying the clock without `perl` (for non-macOS)
- Add `-l|--log-junit <log.xml>` option
- Add `-r|--report-html <report.html>` option
- Foundation to enable strictmode

## [0.13.0](https://github.com/TypedDevs/bashunit/compare/0.12.0...0.13.0) - 2024-06-23

Expand Down
26 changes: 13 additions & 13 deletions src/console_results.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,18 +14,18 @@ function console_results::render_result() {
echo ""

local total_tests=0
((total_tests+=$(state::get_tests_passed)))
((total_tests+=$(state::get_tests_skipped)))
((total_tests+=$(state::get_tests_incomplete)))
((total_tests+=$(state::get_tests_snapshot)))
((total_tests+=$(state::get_tests_failed)))
((total_tests += $(state::get_tests_passed))) || true
((total_tests += $(state::get_tests_skipped))) || true
((total_tests += $(state::get_tests_incomplete))) || true
((total_tests += $(state::get_tests_snapshot))) || true
((total_tests += $(state::get_tests_failed))) || true

local total_assertions=0
((total_assertions+=$(state::get_assertions_passed)))
((total_assertions+=$(state::get_assertions_skipped)))
((total_assertions+=$(state::get_assertions_incomplete)))
((total_assertions+=$(state::get_assertions_snapshot)))
((total_assertions+=$(state::get_assertions_failed)))
((total_assertions += $(state::get_assertions_passed))) || true
((total_assertions += $(state::get_assertions_skipped))) || true
((total_assertions += $(state::get_assertions_incomplete))) || true
((total_assertions += $(state::get_assertions_snapshot))) || true
((total_assertions += $(state::get_assertions_failed))) || true

printf "%sTests: %s" "$_COLOR_FAINT" "$_COLOR_DEFAULT"
if [[ "$(state::get_tests_passed)" -gt 0 ]] || [[ "$(state::get_assertions_passed)" -gt 0 ]]; then
Expand DownExpand Up@@ -108,7 +108,7 @@ function console_results::print_execution_time() {
}

function console_results::print_successful_test() {
((_SUCCESSFUL_TEST_COUNT++))
((_SUCCESSFUL_TEST_COUNT++)) || true

if [[ "$SIMPLE_OUTPUT" == true ]]; then
if (( _SUCCESSFUL_TEST_COUNT % 50 != 0 )); then
Expand DownExpand Up@@ -178,7 +178,7 @@ function console_results::print_failed_snapshot_test() {

function console_results::print_skipped_test() {
local test_name=$1
local reason=$2
local reason=${2-}

printf "${_COLOR_SKIPPED}↷ Skipped${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand All@@ -189,7 +189,7 @@ function console_results::print_skipped_test() {

function console_results::print_incomplete_test() {
local test_name=$1
local pending=$2
local pending=${2-}

printf "${_COLOR_INCOMPLETE}✒ Incomplete${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand Down
44 changes: 9 additions & 35 deletions src/env_configuration.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,38 +5,12 @@ set -o allexport
[[ -f ".env" ]] && source .env set
set +o allexport

if [[ -z "$PARALLEL_RUN" ]]; then
PARALLEL_RUN=$_DEFAULT_PARALLEL_RUN
fi

if [[ -z "$SHOW_HEADER" ]]; then
SHOW_HEADER=$_DEFAULT_SHOW_HEADER
fi

if [[ -z "$HEADER_ASCII_ART" ]]; then
HEADER_ASCII_ART=$_DEFAULT_HEADER_ASCII_ART
fi

if [[ -z "$SIMPLE_OUTPUT" ]]; then
SIMPLE_OUTPUT=$_DEFAULT_SIMPLE_OUTPUT
fi

if [[ -z "$STOP_ON_FAILURE" ]]; then
STOP_ON_FAILURE=$_DEFAULT_STOP_ON_FAILURE
fi

if [[ -z "$SHOW_EXECUTION_TIME" ]]; then
SHOW_EXECUTION_TIME=$_DEFAULT_SHOW_EXECUTION_TIME
fi

if [[ -z "$DEFAULT_PATH" ]]; then
DEFAULT_PATH=$_DEFAULT_DEFAULT_PATH
fi

if [[ -z "$LOG_JUNIT" ]]; then
LOG_JUNIT=$_DEFAULT_LOG_JUNIT
fi

if [[ -z "$REPORT_HTML" ]]; then
REPORT_HTML=$_DEFAULT_REPORT_HTML
fi
: "${PARALLEL_RUN:=$_DEFAULT_PARALLEL_RUN}"
: "${SHOW_HEADER:=$_DEFAULT_SHOW_HEADER}"
: "${HEADER_ASCII_ART:=$_DEFAULT_HEADER_ASCII_ART}"
: "${SIMPLE_OUTPUT:=$_DEFAULT_SIMPLE_OUTPUT}"
: "${STOP_ON_FAILURE:=$_DEFAULT_STOP_ON_FAILURE}"
: "${SHOW_EXECUTION_TIME:=$_DEFAULT_SHOW_EXECUTION_TIME}"
: "${DEFAULT_PATH:=$_DEFAULT_DEFAULT_PATH}"
: "${LOG_JUNIT:=$_DEFAULT_LOG_JUNIT}"
: "${REPORT_HTML:=$_DEFAULT_REPORT_HTML}"
35 changes: 13 additions & 22 deletions src/helpers.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,7 @@ declare -r BASHUNIT_GIT_REPO="https://github.com/TypedDevs/bashunit"
# @return string Eg: "Some logic camelCase"
#
function helper::normalize_test_function_name() {
local original_function_name="$1"
local original_function_name="${1-}"
local result

# Remove "test_" prefix
Expand DownExpand Up@@ -55,37 +55,27 @@ function helper::get_functions_to_run() {
local filter=$2
local function_names=$3

local functions_to_run=()
local filtered_functions=""

for function_name in $function_names; do
if [[ $function_name != ${prefix}* ]]; then
continue
for fn in $function_names; do
if [[ $fn == ${prefix}_${filter}* ]]; then
if [[ $filtered_functions == *" $fn"* ]]; then
return 1
fi
filtered_functions+=" $fn"
fi

local lower_case_function_name
lower_case_function_name=$(echo "$function_name" | tr '[:upper:]' '[:lower:]')
local lower_case_filter
lower_case_filter=$(echo "$filter" | tr '[:upper:]' '[:lower:]')

if [[ -n $filter && $lower_case_function_name != *"$lower_case_filter"* ]]; then
continue
fi

if [[ "${functions_to_run[*]}" =~ ${function_name} ]]; then
return 1
fi

functions_to_run+=("$function_name")
done

echo "${functions_to_run[@]}"
echo "${filtered_functions# }"
}

#
# @param $1 string Eg: "do_something"
#
function helper::execute_function_if_exists() {
"$1" 2>/dev/null
if [[ "$(type -t "$1")" == "function" ]]; then
"$1" 2>/dev/null
fi
}

#
Expand DownExpand Up@@ -133,6 +123,7 @@ function helper::get_provider_data() {
grep -B 1 "function $function_name()" "$script" |\
grep "# data_provider " |\
sed -E -e 's/\ *# data_provider (.*)$/\1/g'\
|| true
)

if [[ -n "$data_provider_function" ]]; then
Expand Down
12 changes: 6 additions & 6 deletions src/runner.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -71,7 +71,7 @@ function runner::call_test_functions() {
echo "Running $script"
fi

helper::check_duplicate_functions "$script"
helper::check_duplicate_functions "$script" || true

for function_name in "${functions_to_run[@]}"; do
local provider_data=()
Expand DownExpand Up@@ -134,11 +134,11 @@ function runner::parse_execution_result() {
sed -E -e 's/.*##ASSERTIONS_SNAPSHOT=([0-9]*)##.*/\1/g'\
)

_ASSERTIONS_PASSED=$((_ASSERTIONS_PASSED + assertions_passed))
_ASSERTIONS_FAILED=$((_ASSERTIONS_FAILED + assertions_failed))
_ASSERTIONS_SKIPPED=$((_ASSERTIONS_SKIPPED + assertions_skipped))
_ASSERTIONS_INCOMPLETE=$((_ASSERTIONS_INCOMPLETE + assertions_incomplete))
_ASSERTIONS_SNAPSHOT=$((_ASSERTIONS_SNAPSHOT + assertions_snapshot))
((_ASSERTIONS_PASSED += assertions_passed)) || true
((_ASSERTIONS_FAILED += assertions_failed)) || true
((_ASSERTIONS_SKIPPED += assertions_skipped)) || true
((_ASSERTIONS_INCOMPLETE += assertions_incomplete)) || true
((_ASSERTIONS_SNAPSHOT += assertions_snapshot)) || true
}

function runner::run_test() {
Expand Down
4 changes: 2 additions & 2 deletions src/skip_todo.sh
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
#!/bin/bash

function skip() {
local reason=$1
local reason=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand All@@ -11,7 +11,7 @@ function skip() {
}

function todo() {
local pending=$1
local pending=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand Down
File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
bashunit [arguments] [options]

Arguments:
Specifies the directory or file containing the tests to run.
If a directory is specified, it will execute the tests within files ending with test.sh.
If you use wildcards, bashunit will run any tests it finds.

Options:
-a|--assert <function ...args>
Run a core assert function standalone without a test context.

-e|--env <file-path>
Load a custom env file overriding the .env environment variables.

-f|--filter <filter>
Filters the tests to run based on the test name.

-l|--log-junit <out.xml>
Create a report JUnit XML file that contains information about the test results.

-r|--report-html <out.html>
Create a report HTML file that contains information about the test results.

-s|simple || -v|verbose
Enables simplified or verbose output to the console.

-S|--stop-on-failure
Force to stop the runner right after encountering one failing test.

--version
Displays the current version of bashunit.

--upgrade
Upgrade to latest version of bashunit.

--help
This message.

See more: https://bashunit.typeddevs.com/command-line
2 changes: 1 addition & 1 deletion tests/functional/multi_invoker_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,7 +15,7 @@ function tear_down_after_script() {
function test_multi_invoker_simple() {
local current_number="$1"
local second_arg="$2"
local third_arg="$3"
local third_arg="${3-}"

local current_iteration=0

Expand Down
4 changes: 2 additions & 2 deletions tests/unit/directory_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -260,8 +260,8 @@ function test_unsuccessful_assert_is_directory_not_writable() {
assert_equals\
"$(console_results::print_failed_test\
"Unsuccessful assert is directory not writable" \
"$a_file" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_file")"
"$a_directory" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_directory")"

rmdir "$a_directory"
}
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Foundation for strictmode by Chemaclass · Pull Request #241 · TypedDevs/bashunit · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
- Support for displaying the clock without `perl` (for non-macOS)
- Add `-l|--log-junit <log.xml>` option
- Add `-r|--report-html <report.html>` option
- Foundation to enable strictmode

## [0.13.0](https://github.com/TypedDevs/bashunit/compare/0.12.0...0.13.0) - 2024-06-23

Expand Down
26 changes: 13 additions & 13 deletions src/console_results.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,18 +14,18 @@ function console_results::render_result() {
echo ""

local total_tests=0
((total_tests+=$(state::get_tests_passed)))
((total_tests+=$(state::get_tests_skipped)))
((total_tests+=$(state::get_tests_incomplete)))
((total_tests+=$(state::get_tests_snapshot)))
((total_tests+=$(state::get_tests_failed)))
((total_tests += $(state::get_tests_passed))) || true
((total_tests += $(state::get_tests_skipped))) || true
((total_tests += $(state::get_tests_incomplete))) || true
((total_tests += $(state::get_tests_snapshot))) || true
((total_tests += $(state::get_tests_failed))) || true

local total_assertions=0
((total_assertions+=$(state::get_assertions_passed)))
((total_assertions+=$(state::get_assertions_skipped)))
((total_assertions+=$(state::get_assertions_incomplete)))
((total_assertions+=$(state::get_assertions_snapshot)))
((total_assertions+=$(state::get_assertions_failed)))
((total_assertions += $(state::get_assertions_passed))) || true
((total_assertions += $(state::get_assertions_skipped))) || true
((total_assertions += $(state::get_assertions_incomplete))) || true
((total_assertions += $(state::get_assertions_snapshot))) || true
((total_assertions += $(state::get_assertions_failed))) || true

printf "%sTests: %s" "$_COLOR_FAINT" "$_COLOR_DEFAULT"
if [[ "$(state::get_tests_passed)" -gt 0 ]] || [[ "$(state::get_assertions_passed)" -gt 0 ]]; then
Expand DownExpand Up@@ -108,7 +108,7 @@ function console_results::print_execution_time() {
}

function console_results::print_successful_test() {
((_SUCCESSFUL_TEST_COUNT++))
((_SUCCESSFUL_TEST_COUNT++)) || true

if [[ "$SIMPLE_OUTPUT" == true ]]; then
if (( _SUCCESSFUL_TEST_COUNT % 50 != 0 )); then
Expand DownExpand Up@@ -178,7 +178,7 @@ function console_results::print_failed_snapshot_test() {

function console_results::print_skipped_test() {
local test_name=$1
local reason=$2
local reason=${2-}

printf "${_COLOR_SKIPPED}↷ Skipped${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand All@@ -189,7 +189,7 @@ function console_results::print_skipped_test() {

function console_results::print_incomplete_test() {
local test_name=$1
local pending=$2
local pending=${2-}

printf "${_COLOR_INCOMPLETE}✒ Incomplete${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand Down
44 changes: 9 additions & 35 deletions src/env_configuration.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,38 +5,12 @@ set -o allexport
[[ -f ".env" ]] && source .env set
set +o allexport

if [[ -z "$PARALLEL_RUN" ]]; then
PARALLEL_RUN=$_DEFAULT_PARALLEL_RUN
fi

if [[ -z "$SHOW_HEADER" ]]; then
SHOW_HEADER=$_DEFAULT_SHOW_HEADER
fi

if [[ -z "$HEADER_ASCII_ART" ]]; then
HEADER_ASCII_ART=$_DEFAULT_HEADER_ASCII_ART
fi

if [[ -z "$SIMPLE_OUTPUT" ]]; then
SIMPLE_OUTPUT=$_DEFAULT_SIMPLE_OUTPUT
fi

if [[ -z "$STOP_ON_FAILURE" ]]; then
STOP_ON_FAILURE=$_DEFAULT_STOP_ON_FAILURE
fi

if [[ -z "$SHOW_EXECUTION_TIME" ]]; then
SHOW_EXECUTION_TIME=$_DEFAULT_SHOW_EXECUTION_TIME
fi

if [[ -z "$DEFAULT_PATH" ]]; then
DEFAULT_PATH=$_DEFAULT_DEFAULT_PATH
fi

if [[ -z "$LOG_JUNIT" ]]; then
LOG_JUNIT=$_DEFAULT_LOG_JUNIT
fi

if [[ -z "$REPORT_HTML" ]]; then
REPORT_HTML=$_DEFAULT_REPORT_HTML
fi
: "${PARALLEL_RUN:=$_DEFAULT_PARALLEL_RUN}"
: "${SHOW_HEADER:=$_DEFAULT_SHOW_HEADER}"
: "${HEADER_ASCII_ART:=$_DEFAULT_HEADER_ASCII_ART}"
: "${SIMPLE_OUTPUT:=$_DEFAULT_SIMPLE_OUTPUT}"
: "${STOP_ON_FAILURE:=$_DEFAULT_STOP_ON_FAILURE}"
: "${SHOW_EXECUTION_TIME:=$_DEFAULT_SHOW_EXECUTION_TIME}"
: "${DEFAULT_PATH:=$_DEFAULT_DEFAULT_PATH}"
: "${LOG_JUNIT:=$_DEFAULT_LOG_JUNIT}"
: "${REPORT_HTML:=$_DEFAULT_REPORT_HTML}"
35 changes: 13 additions & 22 deletions src/helpers.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,7 @@ declare -r BASHUNIT_GIT_REPO="https://github.com/TypedDevs/bashunit"
# @return string Eg: "Some logic camelCase"
#
function helper::normalize_test_function_name() {
local original_function_name="$1"
local original_function_name="${1-}"
local result

# Remove "test_" prefix
Expand DownExpand Up@@ -55,37 +55,27 @@ function helper::get_functions_to_run() {
local filter=$2
local function_names=$3

local functions_to_run=()
local filtered_functions=""

for function_name in $function_names; do
if [[ $function_name != ${prefix}* ]]; then
continue
for fn in $function_names; do
if [[ $fn == ${prefix}_${filter}* ]]; then
if [[ $filtered_functions == *" $fn"* ]]; then
return 1
fi
filtered_functions+=" $fn"
fi

local lower_case_function_name
lower_case_function_name=$(echo "$function_name" | tr '[:upper:]' '[:lower:]')
local lower_case_filter
lower_case_filter=$(echo "$filter" | tr '[:upper:]' '[:lower:]')

if [[ -n $filter && $lower_case_function_name != *"$lower_case_filter"* ]]; then
continue
fi

if [[ "${functions_to_run[*]}" =~ ${function_name} ]]; then
return 1
fi

functions_to_run+=("$function_name")
done

echo "${functions_to_run[@]}"
echo "${filtered_functions# }"
}

#
# @param $1 string Eg: "do_something"
#
function helper::execute_function_if_exists() {
"$1" 2>/dev/null
if [[ "$(type -t "$1")" == "function" ]]; then
"$1" 2>/dev/null
fi
}

#
Expand DownExpand Up@@ -133,6 +123,7 @@ function helper::get_provider_data() {
grep -B 1 "function $function_name()" "$script" |\
grep "# data_provider " |\
sed -E -e 's/\ *# data_provider (.*)$/\1/g'\
|| true
)

if [[ -n "$data_provider_function" ]]; then
Expand Down
12 changes: 6 additions & 6 deletions src/runner.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -71,7 +71,7 @@ function runner::call_test_functions() {
echo "Running $script"
fi

helper::check_duplicate_functions "$script"
helper::check_duplicate_functions "$script" || true

for function_name in "${functions_to_run[@]}"; do
local provider_data=()
Expand DownExpand Up@@ -134,11 +134,11 @@ function runner::parse_execution_result() {
sed -E -e 's/.*##ASSERTIONS_SNAPSHOT=([0-9]*)##.*/\1/g'\
)

_ASSERTIONS_PASSED=$((_ASSERTIONS_PASSED + assertions_passed))
_ASSERTIONS_FAILED=$((_ASSERTIONS_FAILED + assertions_failed))
_ASSERTIONS_SKIPPED=$((_ASSERTIONS_SKIPPED + assertions_skipped))
_ASSERTIONS_INCOMPLETE=$((_ASSERTIONS_INCOMPLETE + assertions_incomplete))
_ASSERTIONS_SNAPSHOT=$((_ASSERTIONS_SNAPSHOT + assertions_snapshot))
((_ASSERTIONS_PASSED += assertions_passed)) || true
((_ASSERTIONS_FAILED += assertions_failed)) || true
((_ASSERTIONS_SKIPPED += assertions_skipped)) || true
((_ASSERTIONS_INCOMPLETE += assertions_incomplete)) || true
((_ASSERTIONS_SNAPSHOT += assertions_snapshot)) || true
}

function runner::run_test() {
Expand Down
4 changes: 2 additions & 2 deletions src/skip_todo.sh
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
#!/bin/bash

function skip() {
local reason=$1
local reason=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand All@@ -11,7 +11,7 @@ function skip() {
}

function todo() {
local pending=$1
local pending=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand Down
File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
bashunit [arguments] [options]

Arguments:
Specifies the directory or file containing the tests to run.
If a directory is specified, it will execute the tests within files ending with test.sh.
If you use wildcards, bashunit will run any tests it finds.

Options:
-a|--assert <function ...args>
Run a core assert function standalone without a test context.

-e|--env <file-path>
Load a custom env file overriding the .env environment variables.

-f|--filter <filter>
Filters the tests to run based on the test name.

-l|--log-junit <out.xml>
Create a report JUnit XML file that contains information about the test results.

-r|--report-html <out.html>
Create a report HTML file that contains information about the test results.

-s|simple || -v|verbose
Enables simplified or verbose output to the console.

-S|--stop-on-failure
Force to stop the runner right after encountering one failing test.

--version
Displays the current version of bashunit.

--upgrade
Upgrade to latest version of bashunit.

--help
This message.

See more: https://bashunit.typeddevs.com/command-line
2 changes: 1 addition & 1 deletion tests/functional/multi_invoker_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,7 +15,7 @@ function tear_down_after_script() {
function test_multi_invoker_simple() {
local current_number="$1"
local second_arg="$2"
local third_arg="$3"
local third_arg="${3-}"

local current_iteration=0

Expand Down
4 changes: 2 additions & 2 deletions tests/unit/directory_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -260,8 +260,8 @@ function test_unsuccessful_assert_is_directory_not_writable() {
assert_equals\
"$(console_results::print_failed_test\
"Unsuccessful assert is directory not writable" \
"$a_file" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_file")"
"$a_directory" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_directory")"

rmdir "$a_directory"
}