Skip to content

Commit cea7daa

Browse files
authored
test(unit): add unit tests for untested source files (#609)
1 parent 3ff5963 commit cea7daa

8 files changed

Lines changed: 482 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
- Add duration assertions: `assert_duration`, `assert_duration_less_than`, `assert_duration_greater_than`
2525
- Add `--tag` and `--exclude-tag` CLI flags for filtering tests by `# @tag` annotations
2626

27+
### Tests
28+
- Add unit tests for `env.sh`, `math.sh`, `colors.sh`, `test_title.sh`, `console_header.sh`, and `doc.sh`
29+
2730
### Changed
2831
- Optimize Claude Code config for agentic efficiency: trim rules/skills, add shellcheck hook, path-scoped rule loading
2932
- Split Windows CI test jobs into parallel chunks to avoid timeouts

tests/unit/colors_test.sh

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/usr/bin/env bash
2+
3+
# shellcheck disable=SC2155
4+
5+
function test_sgr_with_no_arguments_returns_reset() {
6+
local result
7+
result=$(bashunit::sgr)
8+
9+
assert_equals $'\e[0m' "$result"
10+
}
11+
12+
function test_sgr_with_single_code() {
13+
local result
14+
result=$(bashunit::sgr 31)
15+
16+
assert_equals $'\e[31m' "$result"
17+
}
18+
19+
function test_sgr_with_multiple_codes() {
20+
local result
21+
result=$(bashunit::sgr 1 31)
22+
23+
assert_equals $'\e[1;31m' "$result"
24+
}
25+
26+
function test_sgr_with_three_codes() {
27+
local result
28+
result=$(bashunit::sgr 1 4 32)
29+
30+
assert_equals $'\e[1;4;32m' "$result"
31+
}
32+
33+
function test_sgr_bold_code() {
34+
local result
35+
result=$(bashunit::sgr 1)
36+
37+
assert_equals $'\e[1m' "$result"
38+
}

tests/unit/console_header_test.sh

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
#!/usr/bin/env bash
2+
3+
# shellcheck disable=SC2155
4+
5+
function test_print_help_contains_usage() {
6+
local output
7+
output=$(bashunit::console_header::print_help)
8+
9+
assert_contains "Usage:" "$output"
10+
assert_contains "bashunit" "$output"
11+
}
12+
13+
function test_print_help_contains_commands() {
14+
local output
15+
output=$(bashunit::console_header::print_help)
16+
17+
assert_contains "Commands:" "$output"
18+
assert_contains "test" "$output"
19+
assert_contains "bench" "$output"
20+
assert_contains "assert" "$output"
21+
assert_contains "doc" "$output"
22+
assert_contains "init" "$output"
23+
assert_contains "learn" "$output"
24+
assert_contains "watch" "$output"
25+
assert_contains "upgrade" "$output"
26+
}
27+
28+
function test_print_help_contains_examples() {
29+
local output
30+
output=$(bashunit::console_header::print_help)
31+
32+
assert_contains "Examples:" "$output"
33+
}
34+
35+
function test_print_test_help_contains_options() {
36+
local output
37+
output=$(bashunit::console_header::print_test_help)
38+
39+
assert_contains "Options:" "$output"
40+
assert_contains "--filter" "$output"
41+
assert_contains "--parallel" "$output"
42+
assert_contains "--verbose" "$output"
43+
assert_contains "Coverage:" "$output"
44+
}
45+
46+
function test_print_bench_help_contains_usage() {
47+
local output
48+
output=$(bashunit::console_header::print_bench_help)
49+
50+
assert_contains "Usage: bashunit bench" "$output"
51+
assert_contains "Examples:" "$output"
52+
}
53+
54+
function test_print_doc_help_contains_usage() {
55+
local output
56+
output=$(bashunit::console_header::print_doc_help)
57+
58+
assert_contains "Usage: bashunit doc" "$output"
59+
assert_contains "filter" "$output"
60+
}
61+
62+
function test_print_init_help_contains_usage() {
63+
local output
64+
output=$(bashunit::console_header::print_init_help)
65+
66+
assert_contains "Usage: bashunit init" "$output"
67+
assert_contains "bootstrap.sh" "$output"
68+
}
69+
70+
function test_print_learn_help_contains_lessons() {
71+
local output
72+
output=$(bashunit::console_header::print_learn_help)
73+
74+
assert_contains "Usage: bashunit learn" "$output"
75+
assert_contains "tutorial" "$output"
76+
}
77+
78+
function test_print_upgrade_help_contains_usage() {
79+
local output
80+
output=$(bashunit::console_header::print_upgrade_help)
81+
82+
assert_contains "Usage: bashunit upgrade" "$output"
83+
}
84+
85+
function test_print_assert_help_contains_examples() {
86+
local output
87+
output=$(bashunit::console_header::print_assert_help)
88+
89+
assert_contains "Usage: bashunit assert" "$output"
90+
assert_contains "equals" "$output"
91+
}
92+
93+
function test_print_watch_help_contains_requirements() {
94+
local output
95+
output=$(bashunit::console_header::print_watch_help)
96+
97+
assert_contains "Usage: bashunit watch" "$output"
98+
assert_contains "fswatch" "$output"
99+
assert_contains "inotifywait" "$output"
100+
}
101+
102+
function test_print_version_with_env_returns_empty_when_header_disabled() {
103+
local original="$BASHUNIT_SHOW_HEADER"
104+
export BASHUNIT_SHOW_HEADER="false"
105+
106+
local output
107+
output=$(bashunit::console_header::print_version_with_env "")
108+
109+
assert_empty "$output"
110+
111+
export BASHUNIT_SHOW_HEADER="$original"
112+
}
113+
114+
function test_print_version_shows_version_string() {
115+
local output
116+
output=$(bashunit::console_header::print_version "" "dummy_file.sh")
117+
118+
assert_contains "$BASHUNIT_VERSION" "$output"
119+
}

tests/unit/doc_test.sh

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#!/usr/bin/env bash
2+
3+
# shellcheck disable=SC2155
4+
5+
function test_print_asserts_outputs_assertion_names() {
6+
bashunit::mock bashunit::doc::get_embedded_docs \
7+
cat ./tests/unit/fixtures/doc_sample.md
8+
9+
local output
10+
output=$(bashunit::doc::print_asserts)
11+
12+
assert_contains "assert_equals" "$output"
13+
assert_contains "assert_contains" "$output"
14+
}
15+
16+
function test_print_asserts_with_filter_matches() {
17+
bashunit::mock bashunit::doc::get_embedded_docs \
18+
cat ./tests/unit/fixtures/doc_sample.md
19+
20+
local output
21+
output=$(bashunit::doc::print_asserts "contains")
22+
23+
assert_contains "assert_contains" "$output"
24+
assert_not_contains "assert_equals" "$output"
25+
}
26+
27+
function test_print_asserts_with_no_matching_filter() {
28+
bashunit::mock bashunit::doc::get_embedded_docs \
29+
cat ./tests/unit/fixtures/doc_sample.md
30+
31+
local output
32+
output=$(bashunit::doc::print_asserts "nonexistent")
33+
34+
assert_empty "$output"
35+
}
36+
37+
function test_print_asserts_strips_markdown_links() {
38+
bashunit::mock bashunit::doc::get_embedded_docs \
39+
cat ./tests/unit/fixtures/doc_sample.md
40+
41+
local output
42+
output=$(bashunit::doc::print_asserts "contains")
43+
44+
assert_not_contains "[" "$output"
45+
assert_not_contains "]" "$output"
46+
}
47+
48+
function test_get_embedded_docs_returns_content() {
49+
local output
50+
output=$(bashunit::doc::get_embedded_docs)
51+
52+
assert_not_empty "$output"
53+
}

tests/unit/env_test.sh

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
#!/usr/bin/env bash
2+
3+
# shellcheck disable=SC2155
4+
5+
# @data_provider provide_boolean_flags_true
6+
function test_env_flag_returns_success_when_true() {
7+
local var_name="$1"
8+
local fn_name="$2"
9+
10+
local original_value="${!var_name}"
11+
eval "export $var_name=true"
12+
13+
"$fn_name"
14+
assert_successful_code "$?"
15+
16+
eval "export $var_name='$original_value'"
17+
}
18+
19+
function provide_boolean_flags_true() {
20+
bashunit::data_set "BASHUNIT_PARALLEL_RUN" "bashunit::env::is_parallel_run_enabled"
21+
bashunit::data_set "BASHUNIT_SHOW_HEADER" "bashunit::env::is_show_header_enabled"
22+
bashunit::data_set "BASHUNIT_HEADER_ASCII_ART" "bashunit::env::is_header_ascii_art_enabled"
23+
bashunit::data_set "BASHUNIT_SIMPLE_OUTPUT" "bashunit::env::is_simple_output_enabled"
24+
bashunit::data_set "BASHUNIT_STOP_ON_FAILURE" "bashunit::env::is_stop_on_failure_enabled"
25+
bashunit::data_set "BASHUNIT_SHOW_EXECUTION_TIME" "bashunit::env::is_show_execution_time_enabled"
26+
bashunit::data_set "BASHUNIT_INTERNAL_LOG" "bashunit::env::is_internal_log_enabled"
27+
bashunit::data_set "BASHUNIT_VERBOSE" "bashunit::env::is_verbose_enabled"
28+
bashunit::data_set "BASHUNIT_BENCH_MODE" "bashunit::env::is_bench_mode_enabled"
29+
bashunit::data_set "BASHUNIT_NO_OUTPUT" "bashunit::env::is_no_output_enabled"
30+
bashunit::data_set "BASHUNIT_SHOW_SKIPPED" "bashunit::env::is_show_skipped_enabled"
31+
bashunit::data_set "BASHUNIT_SHOW_INCOMPLETE" "bashunit::env::is_show_incomplete_enabled"
32+
bashunit::data_set "BASHUNIT_STRICT_MODE" "bashunit::env::is_strict_mode_enabled"
33+
bashunit::data_set "BASHUNIT_STOP_ON_ASSERTION_FAILURE" "bashunit::env::is_stop_on_assertion_failure_enabled"
34+
bashunit::data_set "BASHUNIT_SKIP_ENV_FILE" "bashunit::env::is_skip_env_file_enabled"
35+
bashunit::data_set "BASHUNIT_LOGIN_SHELL" "bashunit::env::is_login_shell_enabled"
36+
bashunit::data_set "BASHUNIT_FAILURES_ONLY" "bashunit::env::is_failures_only_enabled"
37+
bashunit::data_set "BASHUNIT_SHOW_OUTPUT_ON_FAILURE" "bashunit::env::is_show_output_on_failure_enabled"
38+
bashunit::data_set "BASHUNIT_NO_PROGRESS" "bashunit::env::is_no_progress_enabled"
39+
bashunit::data_set "BASHUNIT_NO_COLOR" "bashunit::env::is_no_color_enabled"
40+
bashunit::data_set "BASHUNIT_COVERAGE" "bashunit::env::is_coverage_enabled"
41+
}
42+
43+
# @data_provider provide_boolean_flags_false
44+
function test_env_flag_returns_failure_when_false() {
45+
local var_name="$1"
46+
local fn_name="$2"
47+
48+
local original_value="${!var_name}"
49+
eval "export $var_name=false"
50+
51+
if "$fn_name"; then
52+
eval "export $var_name='$original_value'"
53+
fail "Expected $fn_name to return failure when $var_name=false"
54+
return
55+
fi
56+
57+
eval "export $var_name='$original_value'"
58+
}
59+
60+
function provide_boolean_flags_false() {
61+
bashunit::data_set "BASHUNIT_PARALLEL_RUN" "bashunit::env::is_parallel_run_enabled"
62+
bashunit::data_set "BASHUNIT_SHOW_HEADER" "bashunit::env::is_show_header_enabled"
63+
bashunit::data_set "BASHUNIT_SIMPLE_OUTPUT" "bashunit::env::is_simple_output_enabled"
64+
bashunit::data_set "BASHUNIT_STOP_ON_FAILURE" "bashunit::env::is_stop_on_failure_enabled"
65+
bashunit::data_set "BASHUNIT_VERBOSE" "bashunit::env::is_verbose_enabled"
66+
bashunit::data_set "BASHUNIT_NO_OUTPUT" "bashunit::env::is_no_output_enabled"
67+
bashunit::data_set "BASHUNIT_STRICT_MODE" "bashunit::env::is_strict_mode_enabled"
68+
bashunit::data_set "BASHUNIT_NO_COLOR" "bashunit::env::is_no_color_enabled"
69+
bashunit::data_set "BASHUNIT_COVERAGE" "bashunit::env::is_coverage_enabled"
70+
}
71+
72+
function test_is_dev_mode_enabled_when_dev_log_set() {
73+
local original="$BASHUNIT_DEV_LOG"
74+
export BASHUNIT_DEV_LOG="/tmp/dev.log"
75+
76+
bashunit::env::is_dev_mode_enabled
77+
assert_successful_code "$?"
78+
79+
export BASHUNIT_DEV_LOG="$original"
80+
}
81+
82+
function test_is_dev_mode_disabled_when_dev_log_empty() {
83+
local original="$BASHUNIT_DEV_LOG"
84+
export BASHUNIT_DEV_LOG=""
85+
86+
if bashunit::env::is_dev_mode_enabled; then
87+
export BASHUNIT_DEV_LOG="$original"
88+
fail "Expected is_dev_mode_enabled to return failure when BASHUNIT_DEV_LOG is empty"
89+
return
90+
fi
91+
92+
export BASHUNIT_DEV_LOG="$original"
93+
}
94+
95+
function test_is_tap_output_enabled_when_format_is_tap() {
96+
local original="$BASHUNIT_OUTPUT_FORMAT"
97+
export BASHUNIT_OUTPUT_FORMAT="tap"
98+
99+
bashunit::env::is_tap_output_enabled
100+
assert_successful_code "$?"
101+
102+
export BASHUNIT_OUTPUT_FORMAT="$original"
103+
}
104+
105+
function test_is_tap_output_disabled_when_format_is_not_tap() {
106+
local original="$BASHUNIT_OUTPUT_FORMAT"
107+
export BASHUNIT_OUTPUT_FORMAT=""
108+
109+
if bashunit::env::is_tap_output_enabled; then
110+
export BASHUNIT_OUTPUT_FORMAT="$original"
111+
fail "Expected is_tap_output_enabled to return failure when format is empty"
112+
return
113+
fi
114+
115+
export BASHUNIT_OUTPUT_FORMAT="$original"
116+
}
117+
118+
function test_active_internet_connection_returns_failure_when_no_network() {
119+
local original="${BASHUNIT_NO_NETWORK:-}"
120+
export BASHUNIT_NO_NETWORK="true"
121+
122+
if bashunit::env::active_internet_connection; then
123+
export BASHUNIT_NO_NETWORK="$original"
124+
fail "Expected active_internet_connection to fail when BASHUNIT_NO_NETWORK=true"
125+
return
126+
fi
127+
128+
export BASHUNIT_NO_NETWORK="$original"
129+
}
130+
131+
function test_find_terminal_width_returns_a_number() {
132+
local result
133+
result=$(bashunit::env::find_terminal_width)
134+
135+
assert_matches "^[0-9]+$" "$result"
136+
}
137+
138+
function test_find_terminal_width_fallback_returns_100() {
139+
bashunit::mock tput true
140+
bashunit::mock stty true
141+
142+
local result
143+
result=$(bashunit::env::find_terminal_width)
144+
145+
assert_equals "100" "$result"
146+
}
147+
148+
function test_print_verbose_outputs_env_var_names() {
149+
local original="$BASHUNIT_VERBOSE"
150+
export BASHUNIT_VERBOSE="true"
151+
152+
local output
153+
output=$(bashunit::env::print_verbose)
154+
155+
assert_contains "BASHUNIT_DEFAULT_PATH" "$output"
156+
assert_contains "BASHUNIT_PARALLEL_RUN" "$output"
157+
assert_contains "BASHUNIT_VERBOSE" "$output"
158+
assert_contains "BASHUNIT_COVERAGE" "$output"
159+
160+
export BASHUNIT_VERBOSE="$original"
161+
}

0 commit comments

Comments
 (0)