#!/usr/bin/env bash set -euo pipefail repoRoot="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" testRoot="$(mktemp -d)" trap 'rm -rf "$testRoot"' EXIT export HOME="${testRoot}/home" export XDG_DATA_HOME="${HOME}/.local/share" export XDG_CONFIG_HOME="${HOME}/.config" export XDG_CACHE_HOME="${HOME}/.cache" export DISPLAY="" export cache="${XDG_CACHE_HOME}/audiogame-manager" export configFile="${XDG_CONFIG_HOME}/storm-games/audiogame-manager/games.conf" export game="Shadow Line" export scriptDir="$repoRoot" mkdir -p "$cache" "${configFile%/*}" "${testRoot}/bin" touch "$configFile" cat > "${testRoot}/bin/umu-run" <<'STUB' #!/usr/bin/env bash printf '%s|%s|%s|%s\n' "$WINEPREFIX" "$GAMEID" "${STORE:-}" "$*" >> "$UMU_STUB_LOG" if [[ "${1:-}" == "" ]]; then mkdir -p "$WINEPREFIX/drive_c" fi STUB chmod +x "${testRoot}/bin/umu-run" cat > "${testRoot}/bin/wine" <<'STUB' #!/usr/bin/env bash if [[ "${1:-}" == "winepath" || "${1:-}" == "winepath.exe" ]]; then shift fi if [[ "${1:-}" == "-u" ]]; then input="$2" path="${input#c:\\}" path="${path//\\//}" printf '%s/drive_c/%s\n' "$WINEPREFIX" "$path" exit 0 fi printf 'wine %s\n' "$*" >> "$WINE_STUB_LOG" STUB chmod +x "${testRoot}/bin/wine" cat > "${testRoot}/bin/wineserver" <<'STUB' #!/usr/bin/env bash printf 'wineserver %s\n' "$*" >> "$WINE_STUB_LOG" STUB chmod +x "${testRoot}/bin/wineserver" export PATH="${testRoot}/bin:$PATH" export UMU_STUB_LOG="${testRoot}/umu.log" export WINE_STUB_LOG="${testRoot}/wine.log" # shellcheck source=.includes/proton.sh source "${repoRoot}/.includes/proton.sh" assert_equals() { local expected="$1" local actual="$2" local message="$3" if [[ "$expected" != "$actual" ]]; then printf 'FAIL: %s\nexpected: %s\nactual: %s\n' "$message" "$expected" "$actual" >&2 exit 1 fi } assert_file_contains() { local file="$1" local pattern="$2" local message="$3" if ! grep -Fq "$pattern" "$file"; then printf 'FAIL: %s\nmissing pattern: %s\nfile contents:\n' "$message" "$pattern" >&2 cat "$file" >&2 exit 1 fi } test_get_umu_bottle_sets_environment() { get_umu_bottle "shadow-line" assert_equals "${XDG_DATA_HOME}/audiogame-manager/protonBottles/shadow-line" "$WINEPREFIX" "WINEPREFIX points at AGM proton bottle" assert_equals "shadow-line" "$GAMEID" "GAMEID is exported" assert_equals "none" "$STORE" "STORE defaults to none" assert_equals ":0" "$DISPLAY" "DISPLAY defaults to :0" } test_add_umu_launcher_records_backend_and_game_id() { get_umu_bottle "shadow-line" add_umu_launcher "shadow-line" 'c:\Program Files (x86)\GalaxyLaboratory\ShadowRine_FullVoice\play_sr.exe' assert_file_contains "$configFile" 'umu|c:\Program Files (x86)\GalaxyLaboratory\ShadowRine_FullVoice\play_sr.exe|Shadow Line|export umuGameId=shadow-line' "UMU launcher entry is recorded" } test_run_umu_game_uses_converted_path() { get_umu_bottle "shadow-line" mkdir -p "${WINEPREFIX}/drive_c/Program Files (x86)/GalaxyLaboratory/ShadowRine_FullVoice" touch "${WINEPREFIX}/drive_c/Program Files (x86)/GalaxyLaboratory/ShadowRine_FullVoice/play_sr.exe" run_umu_game 'c:\Program Files (x86)\GalaxyLaboratory\ShadowRine_FullVoice\play_sr.exe' assert_file_contains "$UMU_STUB_LOG" "${WINEPREFIX}|shadow-line|none|${WINEPREFIX}/drive_c/Program Files (x86)/GalaxyLaboratory/ShadowRine_FullVoice/play_sr.exe" "UMU launches converted exe path" } test_install_crlf_file_normalizes_line_endings() { local sourceFile="${testRoot}/language_en.dat" local destFile="${testRoot}/installed/language_en.dat" local expectedFile="${testRoot}/expected-language_en.dat" printf 'line one\nline two\n' > "$sourceFile" printf 'line one\r\nline two\r\n' > "$expectedFile" install_crlf_file "$sourceFile" "$destFile" if ! cmp -s "$expectedFile" "$destFile"; then printf 'FAIL: Translation file is installed with CRLF line endings\n' >&2 exit 1 fi } test_get_umu_bottle_sets_environment test_add_umu_launcher_records_backend_and_game_id test_run_umu_game_uses_converted_path test_install_crlf_file_normalizes_line_endings printf 'UMU backend tests passed\n'