-
-
Notifications
You must be signed in to change notification settings - Fork 15k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
c023d93
commit d94ee96
Showing
8 changed files
with
593 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
65 changes: 65 additions & 0 deletions
65
pkgs/build-support/testers/testEqualArrayOrMap/assert-arrays-are-equal.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
# shellcheck shell=bash | ||
|
||
# Asserts that two arrays are equal, printing out differences if they are not. | ||
# Does not short circuit on the first difference. | ||
assertArraysAreEqual() { | ||
if (($# != 2)); then | ||
nixErrorLog "expected two arguments!" | ||
nixErrorLog "usage: assertArraysAreEqual expectedArrayRef actualArrayRef" | ||
exit 1 | ||
fi | ||
|
||
local -nr expectedArrayRef="$1" | ||
local -nr actualArrayRef="$2" | ||
|
||
if [[ ! ${expectedArrayRef@a} =~ a ]]; then | ||
nixErrorLog "first arugment expectedArrayRef must be an array reference" | ||
exit 1 | ||
fi | ||
|
||
if [[ ! ${actualArrayRef@a} =~ a ]]; then | ||
nixErrorLog "second arugment actualArrayRef must be an array reference" | ||
exit 1 | ||
fi | ||
|
||
local -ir expectedLength=${#expectedArrayRef[@]} | ||
local -ir actualLength=${#actualArrayRef[@]} | ||
|
||
local -i hasDiff=0 | ||
|
||
if ((expectedLength != actualLength)); then | ||
nixErrorLog "arrays differ in length: expectedArray has length $expectedLength but actualArray has length $actualLength" | ||
hasDiff=1 | ||
fi | ||
|
||
local -i idx=0 | ||
local expectedValue | ||
local actualValue | ||
|
||
# We iterate so long as at least one array has indices we've not considered. | ||
# This means that `idx` is a valid index to *at least one* of the arrays. | ||
for ((idx = 0; idx < expectedLength || idx < actualLength; idx++)); do | ||
# Update values for variables which are still in range/valid. | ||
if ((idx < expectedLength)); then | ||
expectedValue="${expectedArrayRef[idx]}" | ||
fi | ||
|
||
if ((idx < actualLength)); then | ||
actualValue="${actualArrayRef[idx]}" | ||
fi | ||
|
||
# Handle comparisons. | ||
if ((idx >= expectedLength)); then | ||
nixErrorLog "arrays differ at index $idx: expectedArray has no such index but actualArray has value '$actualValue'" | ||
hasDiff=1 | ||
elif ((idx >= actualLength)); then | ||
nixErrorLog "arrays differ at index $idx: expectedArray has value '$expectedValue' but actualArray has no such index" | ||
hasDiff=1 | ||
elif [[ $expectedValue != "$actualValue" ]]; then | ||
nixErrorLog "arrays differ at index $idx: expectedArray has value '$expectedValue' but actualArray has value '$actualValue'" | ||
hasDiff=1 | ||
fi | ||
done | ||
|
||
((hasDiff)) && exit 1 || return 0 | ||
} |
96 changes: 96 additions & 0 deletions
96
pkgs/build-support/testers/testEqualArrayOrMap/assert-maps-are-equal.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
# shellcheck shell=bash | ||
|
||
# Asserts that two maps are equal, printing out differences if they are not. | ||
# Does not short circuit on the first difference. | ||
assertMapsAreEqual() { | ||
if (($# != 2)); then | ||
nixErrorLog "expected two arguments!" | ||
nixErrorLog "usage: assertMapsAreEqual expectedMapRef actualMapRef" | ||
exit 1 | ||
fi | ||
|
||
local -nr expectedMapRef="$1" | ||
local -nr actualMapRef="$2" | ||
|
||
if [[ ! ${expectedMapRef@a} =~ A ]]; then | ||
nixErrorLog "first arugment expectedMapRef must be an associative array reference" | ||
exit 1 | ||
fi | ||
|
||
if [[ ! ${actualMapRef@a} =~ A ]]; then | ||
nixErrorLog "second arugment actualMapRef must be an associative array reference" | ||
exit 1 | ||
fi | ||
|
||
# NOTE: | ||
# From the `sort` manpage: "The locale specified by the environment affects sort order. Set LC_ALL=C to get the | ||
# traditional sort order that uses native byte values." | ||
# We specify the environment variable in a subshell to avoid polluting the caller's environment. | ||
|
||
local -a sortedExpectedKeys | ||
mapfile -d '' -t sortedExpectedKeys < <(printf '%s\0' "${!expectedMapRef[@]}" | LC_ALL=C sort --stable --zero-terminated) | ||
|
||
local -a sortedActualKeys | ||
mapfile -d '' -t sortedActualKeys < <(printf '%s\0' "${!actualMapRef[@]}" | LC_ALL=C sort --stable --zero-terminated) | ||
|
||
local -ir expectedLength=${#expectedMapRef[@]} | ||
local -ir actualLength=${#actualMapRef[@]} | ||
|
||
local -i hasDiff=0 | ||
|
||
if ((expectedLength != actualLength)); then | ||
nixErrorLog "maps differ in length: expectedMap has length $expectedLength but actualMap has length $actualLength" | ||
hasDiff=1 | ||
fi | ||
|
||
local -i expectedKeyIdx=0 | ||
local expectedKey | ||
local expectedValue | ||
local -i actualKeyIdx=0 | ||
local actualKey | ||
local actualValue | ||
|
||
# We iterate so long as at least one map has keys we've not considered. | ||
while ((expectedKeyIdx < expectedLength || actualKeyIdx < actualLength)); do | ||
# Update values for variables which are still in range/valid. | ||
if ((expectedKeyIdx < expectedLength)); then | ||
expectedKey="${sortedExpectedKeys["$expectedKeyIdx"]}" | ||
expectedValue="${expectedMapRef["$expectedKey"]}" | ||
fi | ||
|
||
if ((actualKeyIdx < actualLength)); then | ||
actualKey="${sortedActualKeys["$actualKeyIdx"]}" | ||
actualValue="${actualMapRef["$actualKey"]}" | ||
fi | ||
|
||
# In the case we've exhausted the keys from expectedMap, or expectedKey comes after actualKey, | ||
# actualMap has an extra key relative to expectedMap. | ||
if ((expectedKeyIdx >= expectedLength)) || [[ $expectedKey > $actualKey ]]; then | ||
nixErrorLog "maps differ at key '$actualKey': expectedMap has no such key but actualMap has value '$actualValue'" | ||
hasDiff=1 | ||
actualKeyIdx+=1 | ||
|
||
# In the case we've exhausted the keys from actualMap, or expectedKey comes before actualKey, | ||
# expectedMap has an extra key relative to actualMap. | ||
elif ((actualKeyIdx >= actualLength)) || [[ $expectedKey < $actualKey ]]; then | ||
nixErrorLog "maps differ at key '$expectedKey': expectedMap has value '$expectedValue' but actualMap has no such key" | ||
hasDiff=1 | ||
expectedKeyIdx+=1 | ||
|
||
# In the case where both maps have keys we have not processed. | ||
elif [[ $expectedKey == "$actualKey" ]]; then | ||
if [[ $expectedValue != "$actualValue" ]]; then | ||
nixErrorLog "maps differ at key '$expectedKey': expectedMap has value '$expectedValue' but actualMap has value '$actualValue'" | ||
hasDiff=1 | ||
fi | ||
|
||
expectedKeyIdx+=1 | ||
actualKeyIdx+=1 | ||
else | ||
nixErrorLog "this case should be unreachable" | ||
exit 1 | ||
fi | ||
done | ||
|
||
((hasDiff)) && exit 1 || return 0 | ||
} |
Oops, something went wrong.