2025-06-12 15:22:24 +03:00
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 ))
2025-06-18 04:29:44 +03:00
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 ))
2025-06-12 15:22:24 +03:00
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
}