Skip to content

Commit 753fa61

Browse files
authored
Merge pull request #642 from SauronBot/feat/issue-639-assert-arrays-equal
feat(assert): add arrays equal assertion
2 parents 153d53f + 1c46b4e commit 753fa61

4 files changed

Lines changed: 121 additions & 0 deletions

File tree

docs/assertions.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,31 @@ function test_interactive_prompt() {
560560
```
561561
:::
562562

563+
## assert_arrays_equal
564+
> `assert_arrays_equal "expected..." -- "actual..."`
565+
566+
Reports an error if the arrays have different lengths or any element differs at the same index.
567+
568+
Use `--` to separate the expected array from the actual array.
569+
570+
::: code-group
571+
```bash [Example]
572+
function test_success() {
573+
local expected=(foo bar baz)
574+
local actual=(foo bar baz)
575+
576+
assert_arrays_equal "${expected[@]}" -- "${actual[@]}"
577+
}
578+
579+
function test_failure() {
580+
local expected=(foo bar baz)
581+
local actual=(foo baz bar)
582+
583+
assert_arrays_equal "${expected[@]}" -- "${actual[@]}"
584+
}
585+
```
586+
:::
587+
563588
## assert_array_contains
564589
> `assert_array_contains "needle" "haystack"`
565590

src/assert_arrays.sh

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,57 @@
11
#!/usr/bin/env bash
22

3+
function assert_arrays_equal() {
4+
bashunit::assert::should_skip && return 0
5+
6+
local label
7+
label="$(bashunit::assert::label)"
8+
9+
local -a expected_values=()
10+
local -a actual_values=()
11+
local found_separator=false
12+
local argument
13+
14+
for argument in "$@"; do
15+
if [ "$found_separator" = false ] && [ "$argument" = "--" ]; then
16+
found_separator=true
17+
continue
18+
fi
19+
20+
if [ "$found_separator" = true ]; then
21+
actual_values[${#actual_values[@]}]="$argument"
22+
else
23+
expected_values[${#expected_values[@]}]="$argument"
24+
fi
25+
done
26+
27+
if [ "$found_separator" = false ]; then
28+
bashunit::assert::mark_failed
29+
bashunit::console_results::print_failed_test "$label" "--" "but got " "missing array separator"
30+
return
31+
fi
32+
33+
if [ "${#expected_values[@]}" -ne "${#actual_values[@]}" ]; then
34+
bashunit::assert::mark_failed
35+
bashunit::console_results::print_failed_test \
36+
"$label" "${expected_values[*]}" "but got " "${actual_values[*]}" \
37+
"Expected length" "${#expected_values[@]}, actual length ${#actual_values[@]}"
38+
return
39+
fi
40+
41+
local index
42+
for ((index = 0; index < ${#expected_values[@]}; index++)); do
43+
if [ "${expected_values[$index]}" != "${actual_values[$index]}" ]; then
44+
bashunit::assert::mark_failed
45+
bashunit::console_results::print_failed_test \
46+
"$label" "${expected_values[*]}" "but got " "${actual_values[*]}" \
47+
"Different index" "$index"
48+
return
49+
fi
50+
done
51+
52+
bashunit::state::add_assertions_passed
53+
}
54+
355
function assert_array_contains() {
456
bashunit::assert::should_skip && return 0
557

tests/acceptance/snapshots/bashunit_test_sh.test_bashunit_should_display_all_assert_docs.snapshot

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,15 @@ Use `--stdout-contains` / `--stdout-not-contains` (and the `stderr-*` variants)
236236
for substring matching when you don't want to assert against the full output.
237237

238238

239+
## assert_arrays_equal
240+
--------------
241+
> `assert_arrays_equal "expected..." -- "actual..."`
242+
243+
Reports an error if the arrays have different lengths or any element differs at the same index.
244+
245+
Use `--` to separate the expected array from the actual array.
246+
247+
239248
## assert_array_contains
240249
--------------
241250
> `assert_array_contains "needle" "haystack"`

tests/unit/assert_advanced_test.sh

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,41 @@ function test_unsuccessful_assert_array_not_contains() {
118118
"$(assert_array_not_contains "123" "${distros[@]}")"
119119
}
120120

121+
function test_successful_assert_arrays_equal() {
122+
local expected_values
123+
expected_values=(Ubuntu 123 Linux\ Mint)
124+
local actual_values
125+
actual_values=(Ubuntu 123 Linux\ Mint)
126+
127+
assert_empty "$(assert_arrays_equal "${expected_values[@]}" -- "${actual_values[@]}")"
128+
}
129+
130+
function test_unsuccessful_assert_arrays_equal_with_different_lengths() {
131+
local expected_values
132+
expected_values=(Ubuntu 123 Linux\ Mint)
133+
local actual_values
134+
actual_values=(Ubuntu 123)
135+
136+
assert_same \
137+
"$(bashunit::console_results::print_failed_test \
138+
"Unsuccessful assert arrays equal with different lengths" \
139+
"Ubuntu 123 Linux Mint" "but got " "Ubuntu 123" "Expected length" "3, actual length 2")" \
140+
"$(assert_arrays_equal "${expected_values[@]}" -- "${actual_values[@]}")"
141+
}
142+
143+
function test_unsuccessful_assert_arrays_equal_with_different_elements() {
144+
local expected_values
145+
expected_values=(Ubuntu 123 Linux\ Mint)
146+
local actual_values
147+
actual_values=(Ubuntu 321 Linux\ Mint)
148+
149+
assert_same \
150+
"$(bashunit::console_results::print_failed_test \
151+
"Unsuccessful assert arrays equal with different elements" \
152+
"Ubuntu 123 Linux Mint" "but got " "Ubuntu 321 Linux Mint" "Different index" "1")" \
153+
"$(assert_arrays_equal "${expected_values[@]}" -- "${actual_values[@]}")"
154+
}
155+
121156
function test_successful_assert_line_count_empty_str() {
122157
assert_empty "$(assert_line_count 0 "")"
123158
}

0 commit comments

Comments
 (0)