Skip to content

Commit

Permalink
add unit tests for constraint, max, min
Browse files Browse the repository at this point in the history
  • Loading branch information
robzr committed Feb 26, 2024
1 parent fd07b7d commit d0eafe1
Show file tree
Hide file tree
Showing 2 changed files with 145 additions and 67 deletions.
115 changes: 78 additions & 37 deletions tests/run_tests.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#!/bin/bash
#set -x
# shellcheck disable=SC2155
set -o errexit -o pipefail

SVER_BIN="$(git rev-parse --show-toplevel)/sver"
TESTS_YAML=tests/tests.yaml
Expand Down Expand Up @@ -28,24 +29,22 @@ test_sort() {
local sort_status=0

presorted=$(sed 's/\+.*//') # filter out build metadata as it is not sorted
presorted_sha=$(_get_sha <<< "$presorted")
cat > "sort-presorted-${presorted_sha}.txt" <<< "$presorted"
presorted_sha=$(_get_sha <<<"$presorted")

if $random ; then
unsorted=$(sort -R -t. -k1 -k2 -k3 <<< "$presorted")
if $random; then
unsorted=$(sort -R -t. -k1 -k2 -k3 <<<"$presorted")
else
unsorted=$(sort -rn -t. -k1 -k2 -k3 <<< "$presorted")
unsorted=$(sort -rn -t. -k1 -k2 -k3 <<<"$presorted")
fi

unsorted_sha=$(_get_sha <<< "$unsorted")
sorted=$($SVER_BIN sort <<< "$unsorted")
sorted_sha=$(_get_sha <<< "$sorted")
cat > "sort-sorted-${sorted_sha}.txt" <<< "$sorted"
unsorted_sha=$(_get_sha <<<"$unsorted")
sorted=$($SVER_BIN sort <<<"$unsorted")
sorted_sha=$(_get_sha <<<"$sorted")

if [ "$sorted_sha" != "$presorted_sha" ] ; then
if [ "$sorted_sha" != "$presorted_sha" ]; then
sort_status=1
cat > "sort-unsorted-${unsorted_sha}.txt" <<< "$unsorted"
cat > "sort-sorted-${sorted_sha}.txt" <<< "$sorted"
cat >"sort-unsorted-${unsorted_sha}.txt" <<<"$unsorted"
cat >"sort-sorted-${sorted_sha}.txt" <<<"$sorted"
fi

printf -- \
Expand All @@ -59,7 +58,7 @@ test_sort() {

TESTS_JSON=$(mktemp)
TESTS_YAML_FULL="$(git rev-parse --show-toplevel)/${TESTS_YAML}"
yq @json "$TESTS_YAML_FULL" > "$TESTS_JSON"
yq @json "$TESTS_YAML_FULL" >"$TESTS_JSON"

EXAMPLES_SORTED=$(_get_split_json "$TESTS_JSON" examples sorted)
EXAMPLES_VALID=$(_get_split_json "$TESTS_JSON" examples valid)
Expand All @@ -70,9 +69,9 @@ TESTS_FAILED=0
echo -n 'Testing filter '
EXAMPLES_VALID_AND_INVALID="${EXAMPLES_VALID}
${EXAMPLES_INVALID}"
sum_filtered=$($SVER_BIN filter <<< "$EXAMPLES_VALID_AND_INVALID" | sum)
sum_valid=$(sum <<< "$EXAMPLES_VALID")
if [ "$sum_filtered" = "$sum_valid" ] ; then
sum_filtered=$($SVER_BIN filter <<<"$EXAMPLES_VALID_AND_INVALID" | sum)
sum_valid=$(sum <<<"$EXAMPLES_VALID")
if [ "$sum_filtered" = "$sum_valid" ]; then
echo '- passed.'
else
echo '- failed!'
Expand All @@ -81,22 +80,23 @@ fi

echo 'Testing sorts'
sort_output=$(mktemp)
test_sort <<< "$EXAMPLES_SORTED" &
for ((x=0; x < 5; x++)) ; do
( test_sort -r <<< "$EXAMPLES_SORTED"
echo $? > "${sort_output}.${x}"
test_sort <<<"$EXAMPLES_SORTED" &
for ((x = 0; x < 5; x++)); do
(
test_sort -r <<<"$EXAMPLES_SORTED"
echo $? >"${sort_output}.${x}"
) &
done
wait
for ((x=0; x < 5; x++)) ; do
for ((x = 0; x < 5; x++)); do
REPLY=$(cat "${sort_output}.${x}")
if [ "$REPLY" != 0 ] ; then ((TESTS_FAILED++)); fi
if [ "$REPLY" != 0 ]; then ((TESTS_FAILED++)); fi
done

echo 'Testing valid example versions'
while read -r line ; do
while read -r line; do
echo -n "- checking \"${line}\" - validate"
if ! $SVER_BIN validate "$line" ; then
if ! $SVER_BIN validate "$line"; then
((TESTS_FAILED++))
echo ' - failed!'
else
Expand All @@ -118,42 +118,83 @@ while read -r line ; do
else
echo ' - passed.'
fi
done <<< "$EXAMPLES_VALID"
done <<<"$EXAMPLES_VALID"

echo 'Testing invalid example versions'
while read -r line ; do
while read -r line; do
echo -n "- checking \"${line}\" - validate"
if $SVER_BIN validate "$line" 2>/dev/null ; then
if $SVER_BIN validate "$line" 2>/dev/null; then
((TESTS_FAILED++))
echo ' - failed!'
else
echo ' - passed.'
fi
done <<< "$EXAMPLES_INVALID"
done <<<"$EXAMPLES_INVALID"

for command in bump get ; do
for subcommand in $(jq -r ".${command} | keys | .[]" "$TESTS_JSON") ; do
for command in bump get; do
for subcommand in $(jq -r ".${command} | keys | .[]" "$TESTS_JSON"); do
echo "Testing ${command} ${subcommand}"
for argument in $(jq -r ".${command}.${subcommand} | keys | .[]" "$TESTS_JSON") ; do
for argument in $(jq -r ".${command}.${subcommand} | keys | .[]" "$TESTS_JSON"); do
EXPECTED_VALUE=$(jq -r ".${command}.${subcommand}[\"${argument}\"]" "$TESTS_JSON")
echo -n "- checking \"${argument}\""
VALUE="$($SVER_BIN ${command} ${subcommand} "${argument}")"
if [ "$VALUE" = "$EXPECTED_VALUE" ] ; then
VALUE="$($SVER_BIN ${command} "${subcommand}" "${argument}")"
if [ "$VALUE" = "$EXPECTED_VALUE" ]; then
echo ' - passed.'
else
((TESTS_FAILED++))
echo " - failed (expected \"${EXPECTED_VALUE}\" got \"${VALUE}\")\!"
echo " - failed (expected \"${EXPECTED_VALUE}\" got \"${VALUE}\")!"
fi
done
done
done

# shellcheck disable=SC2043
for command in constraint; do
while read -r constraint; do
echo "Testing ${command} \"${constraint}\""
for version in $(jq -r ".${command}[\"${constraint}\"] | keys | .[]" "$TESTS_JSON"); do
EXPECTED_VALUE=$(jq -r ".${command}[\"${constraint}\"][\"${version}\"]" "$TESTS_JSON")
echo -n "- checking \"${version}\""
VALUE=false
if $SVER_BIN "$command" "$version" "$constraint" >/dev/null; then
VALUE=true
fi
if [ "$VALUE" = "$EXPECTED_VALUE" ]; then
echo ' - passed.'
else
((TESTS_FAILED++))
echo " - failed (expected \"${EXPECTED_VALUE}\" got \"${VALUE}\")!"
fi
done
done <<<"$(jq -r ".${command} | keys | .[]" "$TESTS_JSON")"
done

echo -n 'Testing max'
VALUE=$($SVER_BIN max <<<"$EXAMPLES_VALID")
EXPECTED_VALUE=$(jq -r .examples.valid_max "$TESTS_JSON")
if [ "$VALUE" = "$EXPECTED_VALUE" ]; then
echo ' - passed.'
else
((TESTS_FAILED++))
echo " - failed (expected \"${EXPECTED_VALUE}\" got \"${VALUE}\")!"
fi

echo -n 'Testing min'
VALUE=$($SVER_BIN min <<<"$EXAMPLES_VALID")
EXPECTED_VALUE=$(jq -r .examples.valid_min "$TESTS_JSON")
if [ "$VALUE" = "$EXPECTED_VALUE" ]; then
echo ' - passed.'
else
((TESTS_FAILED++))
echo " - failed (expected \"${EXPECTED_VALUE}\" got \"${VALUE}\")!"
fi

rm "$TESTS_JSON"

echo
if [ "$TESTS_FAILED" -gt 0 ] ; then
if [ "$TESTS_FAILED" -gt 0 ]; then
echo "Found ${TESTS_FAILED} failures."
exit -1
exit 1
else
echo "All tests passed."
exit 0
Expand Down
97 changes: 67 additions & 30 deletions tests/tests.yaml
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
# Test file for tests/run_tests.sh

# Format is (generally):
# <command>:
# <subcommand>:
# <input_value>: <expected_output>
#
bump:
major:
v0.0.0: 1.0.0
Expand All @@ -18,31 +13,50 @@ bump:
v0.0.0: 0.0.1
v1.2.3-pre+build: 1.2.3
v5.4.3-pre.v1.2.3: 5.4.3 # Because we have a prerelease, bump patch simply drops the prerelease.
get:
major:
v0.0.0: 0
v1.2.3-pre+build: 1
v5.4.3-pre.v1.2.3: 5
minor:
v0.0.0: 0
v1.2.3-pre+build: 2
v5.4.3-pre.v1.2.3: 4
patch:
v0.0.0: 0
v1.2.3-pre+build: 3
v5.4.3-pre.v1.2.3: 3
prerelease:
v0.0.0: ""
v1.2.3-pre+build: pre
v5.4.3-pre.v1.2.3: pre.v1.2.3
build_metadata:
v0.0.0: ""
v1.2.3-pre+build: build
v5.4.3-pre.v1.2.3: ""

# valid and invalid example versions from https://regex101.com/r/Ly7O1x/3/ as per semver.org
#
examples:
constraint:
"> v1":
"0.9.9": false
"1.0.0": false
"1.2.3": false
"1.9.9": false
"2.0.0": true
">= v1":
"0.9.9": false
"1.0.0": true
"1.2.3": true
"1.9.9": true
"2.0.0": true
"< v1":
"0.9.9": true
"1.0.0": false
"1.2.3": false
"1.9.9": false
"2.0.0": false
"<= v1":
"0.9.9": true
"1.0.0": true
"1.2.3": true
"1.9.9": true
"2.0.0": false
"= v1":
"0.9.9": false
"1.0.0": true
"1.2.3": true
"1.9.9": true
"2.0.0": false
"!= v1":
"0.9.9": true
"1.0.0": false
"1.2.3": false
"1.9.9": false
"2.0.0": true
"~> v1.3":
"0.9.9": false
"1.0.0": false
"1.2.3": false
"1.9.9": true
"2.0.0": false
examples: # valid and invalid example versions from https://regex101.com/r/Ly7O1x/3/ as per semver.org
invalid: |
1
1.2
Expand Down Expand Up @@ -148,3 +162,26 @@ examples:
1.0.0+0.build.1-rc.10000aaa-kk-0.1
99999999999999999999999.999999999999999999.99999999999999999
1.0.0-0A.is.legal
valid_max: 99999999999999999999999.999999999999999999.99999999999999999
valid_min: 0.0.4
get:
major:
v0.0.0: 0
v1.2.3-pre+build: 1
v5.4.3-pre.v1.2.3: 5
minor:
v0.0.0: 0
v1.2.3-pre+build: 2
v5.4.3-pre.v1.2.3: 4
patch:
v0.0.0: 0
v1.2.3-pre+build: 3
v5.4.3-pre.v1.2.3: 3
prerelease:
v0.0.0: ""
v1.2.3-pre+build: pre
v5.4.3-pre.v1.2.3: pre.v1.2.3
build_metadata:
v0.0.0: ""
v1.2.3-pre+build: build
v5.4.3-pre.v1.2.3: ""

0 comments on commit d0eafe1

Please sign in to comment.