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
7 changes: 5 additions & 2 deletions bin/git-forgit
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,11 @@ _forgit_yank_stash_name() {
_forgit_parse_array() {
${IFS+"false"} && unset old_IFS || old_IFS="$IFS"
# read the value of the second argument
# into an array that has the name of the first argument
IFS=" " read -r -a "$1" <<<"$2"
# into an array that has the name of the first argument.
# Split on any whitespace (spaces, tabs, newlines) and use an empty
# delimiter so the whole value is consumed instead of stopping at the
# first line; leading/trailing whitespace is ignored.
IFS=$' \t\n' read -r -d '' -a "$1" <<<"$2"
${old_IFS+"false"} && unset IFS || IFS="$old_IFS"
}

Expand Down
75 changes: 75 additions & 0 deletions tests/parse-array.test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#!/usr/bin/env bash

function set_up_before_script() {
source bin/git-forgit
}

# Asserts that _forgit_parse_array splits the given input string into exactly
# the expected elements.
#
# Usage: assert_parsed_array <input> [expected_element...]
# <input> the raw string passed to _forgit_parse_array
# [expected_element] zero or more elements the input should split into,
# typically passed by expanding an array: "${expected[@]}"
function assert_parsed_array() {
local -r input="$1"
shift
local -r expected=("$@")
local -a actual=()
_forgit_parse_array actual "$input"

assert_same "${#expected[@]}" "${#actual[@]}"

local i
for i in "${!expected[@]}"; do
assert_same "${expected[i]}" "${actual[i]}"
done
}

function test_forgit_parse_array_splits_space_separated_values() {
local -r input="--foo --bar"
local -r expected=("--foo" "--bar")
assert_parsed_array "$input" "${expected[@]}"
}

function test_forgit_parse_array_keeps_single_value() {
local -r input="--force"
local -r expected=("--force")
assert_parsed_array "$input" "${expected[@]}"
}

function test_forgit_parse_array_empty_string_yields_no_elements() {
local -r input=""
local -r expected=()
assert_parsed_array "$input" "${expected[@]}"
}

function test_forgit_parse_array_ignores_surrounding_newlines() {
local -r input="
--force
"
local -r expected=("--force")
assert_parsed_array "$input" "${expected[@]}"
}

function test_forgit_parse_array_splits_values_across_indented_lines() {
local -r input="
--foo
--bar
"
local -r expected=("--foo" "--bar")
assert_parsed_array "$input" "${expected[@]}"
}

function test_forgit_parse_array_splits_on_tabs() {
local -r input=$'\t--foo\t\t--bar\t'
local -r expected=("--foo" "--bar")
assert_parsed_array "$input" "${expected[@]}"
}

function test_forgit_parse_array_whitespace_only_yields_no_elements() {
local -r input="
"
local -r expected=()
assert_parsed_array "$input" "${expected[@]}"
}
Loading