Files
Vasilii Rogin eac3739a2f Fix Linux .tmp file leftover (#20)
* Fix tmp file leftovers
* Add failing test
2025-06-18 09:29:44 +08:00

207 lines
6.5 KiB
Bash

set -e
set -u
SSLC_FLAGS="-q -p -l -O2 -d -s -n"
clear_test_snapshots() {
echo "== Removing test snapshots in $(pwd) =="
find . -type f -iname '*.expected' -delete -print
echo "Done"
}
NEW_LINE='
'
make_test_snapshots() {
REFERENCE_COMPILE_EXE=$1 # Note: it have to be full path to sslc executable
INCLUDE_HEADERS_DIR=$2 # Note: it have to be full path or relative to .ssl file
WINE_IS_INSTALLED=""
if ! which apt >/dev/null 2>&1; then
echo "Runnion on Windows, not using wine"
WINE=""
else
echo "Running on Linux, using wine"
WINE="wine"
fi
COMPILER_IS_CHECKED=""
echo "== Building test snapshots in $(pwd) =="
COMPILATION_FAILED_FILES=""
for f in $(find . -type f -iname '*.ssl') ; do
OLD_PWD=$(pwd)
DIR=$(dirname $f)
FBASE=$(basename -s .ssl $f)
FNAME=$(basename $f)
cd "$DIR"
if [[ -f "$FBASE.stdout.expected" && -f "$FBASE.returncode.expected" ]]; then
echo "$DIR/$FNAME: already built, skipping"
else
echo "$DIR/$FNAME: building reference snapshot"
set +e
if [[ ! -n "$WINE_IS_INSTALLED" && -n "$WINE" ]]; then
if ! which wine >/dev/null; then
echo "Installing wine"
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install -y wine32
else
echo "Wine is already installed"
fi
WINE_IS_INSTALLED="yes"
fi
if [[ ! -n "$COMPILER_IS_CHECKED" ]]; then
echo "Checking compiler"
if $WINE $REFERENCE_COMPILE_EXE | grep -q "Startrek Scripting Language compiler"; then
echo "Compiler is ok"
else
echo "Compiler is not working, please check your modderspack installation"
exit 1
fi
COMPILER_IS_CHECKED="yes"
fi
$WINE $REFERENCE_COMPILE_EXE $SSLC_FLAGS \
"-I$INCLUDE_HEADERS_DIR" \
"$FNAME" -o "$FBASE.int.expected" > "$FBASE.stdout.expected"
RETURN_CODE_EXPECTED=$?
echo -n "$RETURN_CODE_EXPECTED" > "$FBASE.returncode.expected"
set -e
sed -i 's/\r//g' $FBASE.stdout.expected
# sed -i 's#[a-zA-Z0-9\/\:]*/test/gamescripts/Fallout2_Restoration_Project/scripts_src/#/scripts_src/#g' "$FBASE.stdout.expected" # On wine absolute paths can be different
sed -i 's#[a-zA-Z0-9\/\:]*/test/gamescripts/#/#g' "$FBASE.stdout.expected" # On wine absolute paths can be different
sed -i 's#[a-zA-Z0-9\/\:]*/test/embedded/#/#g' "$FBASE.stdout.expected" # On wine absolute paths can be different
echo " Done, return code $RETURN_CODE_EXPECTED"
if [ "$RETURN_CODE_EXPECTED" -ne 0 ]; then
COMPILATION_FAILED_FILES="$COMPILATION_FAILED_FILES$DIR/$FNAME$NEW_LINE"
fi
fi
cd "$OLD_PWD"
done
if [ -n "$COMPILATION_FAILED_FILES" ]; then
echo "=== Compilation errors found in the following files: ==="
echo "$COMPILATION_FAILED_FILES"
fi
}
run_tests() {
TESTING_SSLC=$1 # Note: it have to be full path to testing sslc executable
INCLUDE_HEADERS_DIR=$2 # Note: it have to be full path or relative to .ssl file
if [[ ! -f "$TESTING_SSLC" ]]; then
echo "ERROR: No compiler executable found at $TESTING_SSLC"
exit 1
fi
TEST_FAILED_FILES=""
TESTS_FAILED_COUNT=0
TESTS_SUCCESS_COUNT=0
EXPECTED_SUCCESSFULL_COMPILED_FILES=0
for f in $(find . -type f -iname '*.ssl') ; do
if [ "$f" != "./epa/epac8.ssl" ]; then
# continue # Debugging
true
fi
DIR=$(dirname $f)
FBASE=$(basename -s .ssl $f)
FNAME=$(basename $f)
OLD_PWD=$(pwd)
echo "======================= $DIR/$FNAME ========================"
cd "$DIR"
# Expected build
if [ ! -f "$FBASE.returncode.expected" ]; then
echo "ERROR: NO EXPECTED RETURN CODE FILE $FBASE.returncode.expected"
echo "Please run test/test_on_fallout2_rpu_setup.bash first"
echo ""
echo "If this error appears on CI then try to bump cache version in all actions/cache@v4"
exit 1
fi
RETURN_CODE_EXPECTED=$(cat "$FBASE.returncode.expected")
if [ "$RETURN_CODE_EXPECTED" -eq 0 ]; then
EXPECTED_SUCCESSFULL_COMPILED_FILES=$((EXPECTED_SUCCESSFULL_COMPILED_FILES + 1))
fi
# On Windows it might checkout files and automatically use CLRF line endings
sed -i 's/\r//g' "$FBASE.stdout.expected"
# Obvserved build
set +e
$TESTING_SSLC $SSLC_FLAGS \
"-I$INCLUDE_HEADERS_DIR" \
"$FNAME" -o "$FBASE.int.observed" > "$FBASE.stdout.observed"
RETURN_CODE_OBSERVED=$?
set -e
sed -i 's/\r//g' "$FBASE.stdout.observed"
sed -i 's#[a-zA-Z0-9\/\:]*/test/gamescripts/#/#g' "$FBASE.stdout.observed" # On wine absolute paths can be different
sed -i 's#[a-zA-Z0-9\/\:]*/test/embedded/#/#g' "$FBASE.stdout.observed" # On wine absolute paths can be different
if [ "$RETURN_CODE_OBSERVED" -ne "$RETURN_CODE_EXPECTED" ]; then
echo " > FAIL: Return code mismatch, want $RETURN_CODE_EXPECTED got $RETURN_CODE_OBSERVED ==="
TEST_FAILED_FILES="$TEST_FAILED_FILES$DIR/$FNAME=RETURNCODE$NEW_LINE"
TESTS_FAILED_COUNT=$((TESTS_FAILED_COUNT + 1))
else
if [ "$RETURN_CODE_EXPECTED" -eq 0 ] && ! diff "$FBASE.int.expected" "$FBASE.int.observed" ; then
echo " > FAIL: .INT files mismatch"
TEST_FAILED_FILES="$TEST_FAILED_FILES$DIR/$FNAME=INT$NEW_LINE"
TESTS_FAILED_COUNT=$((TESTS_FAILED_COUNT + 1))
elif ! diff -q $FBASE.stdout.expected $FBASE.stdout.observed ; then
echo " > FAIL: STDOUT mismatch"
set +e
diff "$FBASE.stdout.expected" "$FBASE.stdout.observed"
set -e
TEST_FAILED_FILES="$TEST_FAILED_FILES$DIR/$FNAME=STDOUT$NEW_LINE"
TESTS_FAILED_COUNT=$((TESTS_FAILED_COUNT + 1))
elif ls *.tmp 1> /dev/null 2>&1; then
echo " > FAIL: Temporary files found, please check the test"
TEST_FAILED_FILES="$TEST_FAILED_FILES$DIR/$FNAME=TMPFILES$NEW_LINE"
TESTS_FAILED_COUNT=$((TESTS_FAILED_COUNT + 1))
else
TESTS_SUCCESS_COUNT=$((TESTS_SUCCESS_COUNT + 1))
echo " > OK"
fi
fi
cd "$OLD_PWD"
done
echo "=== Total tests: $((TESTS_SUCCESS_COUNT + TESTS_FAILED_COUNT)) ==="
echo "=== Successful tests: $TESTS_SUCCESS_COUNT ==="
echo "=== Failed tests: $TESTS_FAILED_COUNT ==="
if [ "$EXPECTED_SUCCESSFULL_COMPILED_FILES" -eq 0 ]; then
echo "ERROR: No files were expected to compile successfully, please check the setup."
exit 1
fi
if [ -n "$TEST_FAILED_FILES" ]; then
echo "=== Errors found in the following files: ==="
echo "$TEST_FAILED_FILES"
exit 1
else
echo "=== All tests passed successfully! ==="
fi
}