mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-21 18:52:07 +00:00
* Avoid redirecting error messages in RGBLINK tests We check that RGBLINK prints nothing to stdout, so all that would be captured on stdout is a putative failure message. * Require each RGBLINK test to check error output Otherwise, you can have a test that just... checks nothing! * Document how to add tests Fixes #1300's last remaining item. Also add `checkdiff` rules to remind us to update that doc if any of the test driver scripts are updated.
224 lines
5.5 KiB
Bash
Executable File
224 lines
5.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
export LC_ALL=C
|
|
set -o pipefail
|
|
|
|
otemp="$(mktemp)"
|
|
gbtemp="$(mktemp)"
|
|
gbtemp2="$(mktemp)"
|
|
outtemp="$(mktemp)"
|
|
rc=0
|
|
|
|
# Immediate expansion is the desired behavior.
|
|
# shellcheck disable=SC2064
|
|
trap "rm -f ${otemp@Q} ${gbtemp@Q} ${gbtemp2@Q} ${outtemp@Q}" EXIT
|
|
|
|
bold="$(tput bold)"
|
|
resbold="$(tput sgr0)"
|
|
red="$(tput setaf 1)"
|
|
green="$(tput setaf 2)"
|
|
rescolors="$(tput op)"
|
|
|
|
RGBASM=../../rgbasm
|
|
RGBLINK=../../rgblink
|
|
|
|
startTest () {
|
|
echo "${bold}${green}${i%.asm} assembling...${rescolors}${resbold}"
|
|
}
|
|
|
|
continueTest () {
|
|
echo "${bold}${green}${i%.asm}$1...${rescolors}${resbold}"
|
|
}
|
|
|
|
tryDiff () {
|
|
if ! diff -u --strip-trailing-cr "$1" "$2"; then
|
|
echo "${bold}${red}$1 mismatch!${rescolors}${resbold}"
|
|
false
|
|
fi
|
|
}
|
|
|
|
tryCmp () {
|
|
if ! cmp "$1" "$2"; then
|
|
../../contrib/gbdiff.bash "$1" "$2"
|
|
echo "${bold}${red}${i%.asm}.out.bin mismatch!${rescolors}${resbold}"
|
|
false
|
|
fi
|
|
}
|
|
tryCmpRom () {
|
|
# `printf` lets us keep only the first returned word from `wc`.
|
|
rom_size=$(printf %s $(wc -c <"$1"))
|
|
dd if="$gbtemp" count=1 bs="$rom_size" >"$otemp" 2>/dev/null
|
|
tryCmp "$1" "$otemp"
|
|
}
|
|
|
|
tryCmpRomSize () {
|
|
rom_size=$(printf %s $(wc -c <"$1"))
|
|
if [ "$rom_size" -ne "$2" ]; then
|
|
echo "$bold${red}${i%.asm} binary size mismatch! ${rescolors}${resbold}"
|
|
false
|
|
fi
|
|
}
|
|
|
|
rgblinkQuiet () {
|
|
out="$(env $RGBLINK "$@")" || return $?
|
|
if [[ -n "$out" ]]; then
|
|
echo "$bold${red}Linking shouldn't produce anything on stdout!${rescolors}${resbold}"
|
|
false
|
|
fi
|
|
}
|
|
|
|
for i in *.asm; do
|
|
startTest
|
|
"$RGBASM" -o "$otemp" "$i"
|
|
|
|
# Some tests have variants depending on flags
|
|
ran_flag=false
|
|
for flag in '-d' '-t' '-w'; do
|
|
if [ -f "${i%.asm}-no${flag}.out" ]; then
|
|
continueTest "-no${flag}"
|
|
rgblinkQuiet -o "$gbtemp" "$otemp" 2>"$outtemp"
|
|
tryDiff "${i%.asm}-no${flag}.out" "$outtemp"
|
|
(( rc = rc || $? ))
|
|
ran_flag=true
|
|
fi
|
|
if [ -f "${i%.asm}${flag}.out" ]; then
|
|
continueTest "$flag"
|
|
rgblinkQuiet ${flag} -o "$gbtemp" "$otemp" 2>"$outtemp"
|
|
tryDiff "${i%.asm}${flag}.out" "$outtemp"
|
|
(( rc = rc || $? ))
|
|
ran_flag=true
|
|
fi
|
|
done
|
|
if "$ran_flag"; then
|
|
continue
|
|
fi
|
|
|
|
# Other tests have several linker scripts
|
|
for script in "${i%.asm}"*.link; do
|
|
[[ -e "$script" ]] || break # If the glob doesn't match, it just... doesn't expand!
|
|
|
|
continueTest "${script#${i%.asm}}"
|
|
rgblinkQuiet -l "$script" -o "$gbtemp" "$otemp" 2>"$outtemp"
|
|
tryDiff "${script%.link}.out" "$outtemp"
|
|
(( rc = rc || $? ))
|
|
ran_flag=true
|
|
done
|
|
if "$ran_flag"; then
|
|
continue
|
|
fi
|
|
|
|
# The rest of the tests just links a file, and maybe checks the binary
|
|
continueTest
|
|
rgblinkQuiet -o "$gbtemp" "$otemp" 2>"$outtemp"
|
|
tryDiff "${i%.asm}.out" "$outtemp"
|
|
(( rc = rc || $? ))
|
|
|
|
bin=${i%.asm}.out.bin
|
|
if [ -f "$bin" ]; then
|
|
tryCmpRom "$bin"
|
|
(( rc = rc || $? ))
|
|
fi
|
|
done
|
|
|
|
# These tests do their own thing
|
|
|
|
i="bank-const.asm"
|
|
startTest
|
|
"$RGBASM" -o "$otemp" bank-const/a.asm
|
|
"$RGBASM" -o "$gbtemp2" bank-const/b.asm
|
|
continueTest
|
|
rgblinkQuiet -o "$gbtemp" "$gbtemp2" "$otemp" 2>"$outtemp"
|
|
tryDiff bank-const/out.err "$outtemp"
|
|
(( rc = rc || $? ))
|
|
|
|
for i in fragment-align/*; do
|
|
startTest
|
|
"$RGBASM" -o "$otemp" "$i"/a.asm
|
|
"$RGBASM" -o "$gbtemp2" "$i"/b.asm
|
|
continueTest
|
|
rgblinkQuiet -o "$gbtemp" "$otemp" "$gbtemp2" 2>"$outtemp"
|
|
tryDiff "$i"/out.err "$outtemp"
|
|
(( rc = rc || $? ))
|
|
if [[ -f "$i"/out.gb ]]; then
|
|
tryCmpRom "$i"/out.gb
|
|
(( rc = rc || $? ))
|
|
fi
|
|
done
|
|
|
|
i="high-low.asm"
|
|
startTest
|
|
"$RGBASM" -o "$otemp" high-low/a.asm
|
|
"$RGBASM" -o "$outtemp" high-low/b.asm
|
|
continueTest
|
|
rgblinkQuiet -o "$gbtemp" "$otemp"
|
|
rgblinkQuiet -o "$gbtemp2" "$outtemp"
|
|
tryCmp "$gbtemp" "$gbtemp2"
|
|
(( rc = rc || $? ))
|
|
|
|
i="overlay.asm"
|
|
startTest
|
|
"$RGBASM" -o "$otemp" overlay/a.asm
|
|
continueTest
|
|
rgblinkQuiet -o "$gbtemp" -t -O overlay/overlay.gb "$otemp" 2>"$outtemp"
|
|
tryDiff overlay/out.err "$outtemp"
|
|
(( rc = rc || $? ))
|
|
# This test does not trim its output with 'dd' because it needs to verify the correct output size
|
|
tryCmp overlay/out.gb "$gbtemp"
|
|
(( rc = rc || $? ))
|
|
|
|
i="scramble-romx.asm"
|
|
startTest
|
|
"$RGBASM" -o "$otemp" scramble-romx/a.asm
|
|
continueTest
|
|
rgblinkQuiet -o "$gbtemp" -S romx=3 "$otemp" 2>"$outtemp"
|
|
tryDiff scramble-romx/out.err "$outtemp"
|
|
(( rc = rc || $? ))
|
|
# This test does not compare its exact output with 'tryCmpRom' because no scrambling order is guaranteed
|
|
tryCmpRomSize "$gbtemp" 65536
|
|
(( rc = rc || $? ))
|
|
|
|
i="section-fragment/jr-offset.asm"
|
|
startTest
|
|
"$RGBASM" -o "$otemp" section-fragment/jr-offset/a.asm
|
|
"$RGBASM" -o "$gbtemp2" section-fragment/jr-offset/b.asm
|
|
continueTest
|
|
rgblinkQuiet -o "$gbtemp" "$otemp" "$gbtemp2"
|
|
tryCmpRom section-fragment/jr-offset/ref.out.bin
|
|
(( rc = rc || $? ))
|
|
|
|
i="section-union/good.asm"
|
|
startTest
|
|
"$RGBASM" -o "$otemp" section-union/good/a.asm
|
|
"$RGBASM" -o "$gbtemp2" section-union/good/b.asm
|
|
continueTest
|
|
rgblinkQuiet -o "$gbtemp" -l section-union/good/script.link "$otemp" "$gbtemp2"
|
|
tryCmpRom section-union/good/ref.out.bin
|
|
(( rc = rc || $? ))
|
|
|
|
i="section-union/fragments.asm"
|
|
startTest
|
|
"$RGBASM" -o "$otemp" section-union/fragments/a.asm
|
|
"$RGBASM" -o "$gbtemp2" section-union/fragments/b.asm
|
|
continueTest
|
|
rgblinkQuiet -o "$gbtemp" "$otemp" "$gbtemp2"
|
|
tryCmpRom section-union/fragments/ref.out.bin
|
|
(( rc = rc || $? ))
|
|
|
|
for i in section-union/*.asm; do
|
|
startTest
|
|
"$RGBASM" -o "$otemp" "$i"
|
|
"$RGBASM" -o "$gbtemp2" "$i" -DSECOND
|
|
continueTest
|
|
if rgblinkQuiet "$otemp" "$gbtemp2" 2>"$outtemp"; then
|
|
echo -e "${bold}${red}$i didn't fail to link!${rescolors}${resbold}"
|
|
rc=1
|
|
fi
|
|
echo --- >>"$outtemp"
|
|
# Ensure RGBASM also errors out
|
|
cat "$i" - "$i" <<<'def SECOND equs "1"' | "$RGBASM" - 2>>"$outtemp"
|
|
tryDiff "${i%.asm}.out" "$outtemp"
|
|
(( rc = rc || $? ))
|
|
done
|
|
|
|
exit $rc
|