summaryrefslogtreecommitdiff
path: root/tests/steamLaunchOptions.test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'tests/steamLaunchOptions.test.ts')
-rw-r--r--tests/steamLaunchOptions.test.ts177
1 files changed, 74 insertions, 103 deletions
diff --git a/tests/steamLaunchOptions.test.ts b/tests/steamLaunchOptions.test.ts
index c799907..93d37df 100644
--- a/tests/steamLaunchOptions.test.ts
+++ b/tests/steamLaunchOptions.test.ts
@@ -28,7 +28,7 @@ test("inserts one wrapper immediately before an existing command macro", () => {
});
});
-test("normalizes blank and argument-only fields while refusing ambiguous launchers", () => {
+test("normalizes blank and argument-only shortcut fields", () => {
assert.deepEqual(installWrapperLaunchOption("", wrapper), {
options: `${wrapper} %command%`,
commandTokenAdded: true,
@@ -41,7 +41,7 @@ test("normalizes blank and argument-only fields while refusing ambiguous launche
assert.throws(() => installWrapperLaunchOption('"%command%"', wrapper), /refusing to guess/);
});
-test("preserves assignments, quoting, suffixes, and unrelated values", () => {
+test("preserves assignments quoting suffixes and released wrapper cleanup", () => {
const options = 'FOO="hello world" VK_INSTANCE_LAYERS="one:two" gamemoderun %command% --flag "two words"';
assert.equal(
installWrapperLaunchOption(options, wrapper).options,
@@ -49,36 +49,28 @@ test("preserves assignments, quoting, suffixes, and unrelated values", () => {
);
assert.equal(removeWrapperLaunchOption(`${wrapper} %command% --arg "${wrapper}"`, wrapper, true), `--arg "${wrapper}"`);
assert.equal(normalizeLaunchOptions(" FOO=bar %COMMAND% --flag "), "FOO=bar %COMMAND% --flag");
-});
-
-test("cleans current, legacy, and bare Mako wrappers without touching suffix arguments", () => {
for (const token of ["~/lsfg", "/home/deck/lsfg", "mako-run", "mako-launch"]) {
assert.equal(cleanupLegacyWrapper(`FOO=bar ${token} %command% --arg "${token}"`), `FOO=bar %command% --arg "${token}"`);
}
- assert.equal(cleanupLegacyWrapper(`FOO=bar ${wrapper} %command%`), "FOO=bar %command%");
assert.equal(isLegacyWrapperToken("/home/kurt/lsfg"), true);
assert.equal(isLegacyWrapperToken("/opt/tools/lsfg"), false);
- assert.equal(removeWrapperLaunchOption(`FOO=bar ${wrapper} %command% --arg`, wrapper), "FOO=bar %command% --arg");
});
-test("removes only old plugin assignments and preserves DXVK settings", () => {
+test("removes only managed assignments and preserves unrelated values", () => {
assert.equal(
cleanupPluginAssignments(
'FOO="keep this" ENABLE_GAMESCOPE_WSI=0 DXVK_HDR=0 SteamDeck=0 DISABLE_VKBASALT=1 MESA_LOADER_DRIVER_OVERRIDE=zink DXVK_CONFIG="dxgi.syncInterval = 0; dxvk.maxFrameRate = 30" %command%',
),
'FOO="keep this" DXVK_CONFIG="dxgi.syncInterval = 0" %command%',
);
- assert.equal(
- cleanupPluginLaunchOptions(`DXVK_FRAME_RATE=30 ${wrapper} %command%`, wrapper),
- "%command%",
- );
+ assert.equal(cleanupPluginLaunchOptions(`DXVK_FRAME_RATE=30 ${wrapper} %command%`, wrapper), "%command%");
assert.equal(
cleanupPluginAssignments("PROTON_USE_WOW64=1 MANGOHUD=1 MANGOHUD_CONFIG=alpha %command%"),
"PROTON_USE_WOW64=1 MANGOHUD=1 MANGOHUD_CONFIG=alpha %command%",
);
});
-test("reads the matching app-details field and installs/removes Steam integration", async () => {
+test("uses launch options for Steam and MAKO-style Target wrapping for direct Flatpak", async () => {
const previousWindow = (globalThis as Record<string, unknown>).window;
const previousSteamClient = (globalThis as Record<string, unknown>).SteamClient;
let appOptions = "FOO=bar %command%";
@@ -120,18 +112,22 @@ test("reads the matching app-details field and installs/removes Steam integratio
assert.equal(installed.snapshot.options, `FOO=bar ${wrapper} %command%`.replaceAll(" ", " "));
assert.equal(installed.commandTokenAdded, false);
assert.equal(appWrites.length, 1);
- assert.equal(shortcutWrites.length, 0);
- const shortcut = await installWrapperIntegration(43, true, wrapper, false, { kind: "flatpak", flatpakAppId: "com.example.Game" });
- assert.equal(shortcut.originalExecutable, "/usr/bin/flatpak");
- assert.equal(shortcut.snapshot.target, wrapper);
- assert.deepEqual(targetWrites, [wrapper]);
- const restored = await removeWrapperIntegration(43, true, wrapper, shortcut.originalExecutable, false, { kind: "flatpak", flatpakAppId: "com.example.Game" });
+ const shortcut = await installWrapperIntegration(43, true, wrapper, false, true);
+ assert.equal(shortcut.snapshot.target, '~/.lsfg "/usr/bin/flatpak"');
+ assert.deepEqual(targetWrites, ['~/.lsfg "/usr/bin/flatpak"']);
+ assert.equal(shortcut.snapshot.options, "--windowed");
+ assert.deepEqual(shortcutWrites, []);
+
+ const second = await installWrapperIntegration(43, true, wrapper, false, true);
+ assert.equal(second.changed, false);
+ assert.deepEqual(targetWrites, ['~/.lsfg "/usr/bin/flatpak"']);
+
+ const restored = await removeWrapperIntegration(43, true, wrapper, false, true);
assert.equal(restored.target, "/usr/bin/flatpak");
- assert.deepEqual(targetWrites, [wrapper, "/usr/bin/flatpak"]);
- assert.equal(shortcutWrites.length, 0);
+ assert.deepEqual(targetWrites, ['~/.lsfg "/usr/bin/flatpak"', "/usr/bin/flatpak"]);
- const cleaned = await removeWrapperIntegration(42, false, wrapper, undefined, installed.commandTokenAdded);
+ const cleaned = await removeWrapperIntegration(42, false, wrapper, installed.commandTokenAdded);
assert.equal(cleaned.options, "FOO=bar %command%".replaceAll(" ", " "));
assert.ok(unregisters.includes(42));
assert.ok(unregisters.includes(43));
@@ -143,46 +139,54 @@ test("reads the matching app-details field and installs/removes Steam integratio
}
});
-test("uses shortcut launch options for a host shortcut without changing its Target", async () => {
+test("AppImage and EmuDeck script shortcuts stay launch-option based", async () => {
const previousWindow = (globalThis as Record<string, unknown>).window;
const previousSteamClient = (globalThis as Record<string, unknown>).SteamClient;
- const originalOptions = 'DESKTOPINTEGRATION=1 "/home/deck/AppImages/dusk.appimage"';
- let shortcutOptions = originalOptions;
- let shortcutTarget = "env";
- const shortcutWrites: string[] = [];
- const targetWrites: string[] = [];
- const apps = {
- RegisterForAppDetails(_appId: number, callback: (details: SteamAppDetails) => void) {
- callback({ strShortcutExe: shortcutTarget, strShortcutLaunchOptions: shortcutOptions });
- return { unregister() {} };
+ const cases = [
+ {
+ target: "env",
+ options: 'DESKTOPINTEGRATION=1 "/home/deck/AppImages/dusk.appimage"',
+ expected: 'DESKTOPINTEGRATION=1 ~/.lsfg %command% "/home/deck/AppImages/dusk.appimage"',
},
- SetShortcutLaunchOptions(_appId: number, options: string) {
- shortcutWrites.push(options);
- shortcutOptions = options;
+ {
+ target: '"/home/deck/Emulation/tools/launchers/retroarch.sh" -L core rom.z64',
+ options: "",
+ expected: "~/.lsfg %command%",
},
- SetShortcutExe(_appId: number, executable: string) {
- targetWrites.push(executable);
- shortcutTarget = executable;
- },
- };
+ ];
(globalThis as Record<string, unknown>).window = { setTimeout, clearTimeout };
- (globalThis as Record<string, unknown>).SteamClient = { Apps: apps };
try {
- const installed = await installWrapperIntegration(44, true, wrapper, false, { kind: "host" });
- assert.equal(installed.originalExecutable, undefined);
- assert.equal(installed.snapshot.target, "env");
- assert.equal(installed.snapshot.options, 'DESKTOPINTEGRATION=1 ~/.lsfg %command% "/home/deck/AppImages/dusk.appimage"');
- assert.deepEqual(targetWrites, []);
- assert.deepEqual(shortcutWrites, [installed.snapshot.options]);
-
- const secondInstall = await installWrapperIntegration(44, true, wrapper, false, { kind: "host" });
- assert.equal(secondInstall.snapshot.options, installed.snapshot.options);
- assert.deepEqual(shortcutWrites, [installed.snapshot.options]);
-
- const restored = await removeWrapperIntegration(44, true, wrapper, undefined, installed.commandTokenAdded, { kind: "host" });
- assert.equal(restored.target, "env");
- assert.equal(restored.options, originalOptions);
- assert.deepEqual(targetWrites, []);
+ for (const [index, item] of cases.entries()) {
+ let shortcutTarget = item.target;
+ let shortcutOptions = item.options;
+ const targetWrites: string[] = [];
+ const shortcutWrites: string[] = [];
+ (globalThis as Record<string, unknown>).SteamClient = {
+ Apps: {
+ RegisterForAppDetails(_appId: number, callback: (details: SteamAppDetails) => void) {
+ callback({ strShortcutExe: shortcutTarget, strShortcutLaunchOptions: shortcutOptions });
+ return { unregister() {} };
+ },
+ SetShortcutLaunchOptions(_appId: number, options: string) {
+ shortcutWrites.push(options);
+ shortcutOptions = options;
+ },
+ SetShortcutExe(_appId: number, executable: string) {
+ targetWrites.push(executable);
+ shortcutTarget = executable;
+ },
+ },
+ };
+ const installed = await installWrapperIntegration(100 + index, true, wrapper, false, false);
+ assert.equal(installed.snapshot.target, item.target);
+ assert.equal(installed.snapshot.options, item.expected);
+ assert.deepEqual(targetWrites, []);
+ assert.deepEqual(shortcutWrites, [item.expected]);
+ const restored = await removeWrapperIntegration(100 + index, true, wrapper, installed.commandTokenAdded, false);
+ assert.equal(restored.target, item.target);
+ assert.equal(restored.options, item.options);
+ assert.deepEqual(targetWrites, []);
+ }
} finally {
if (previousWindow === undefined) delete (globalThis as Record<string, unknown>).window;
else (globalThis as Record<string, unknown>).window = previousWindow;
@@ -191,65 +195,32 @@ test("uses shortcut launch options for a host shortcut without changing its Targ
}
});
-test("fails closed when shortcut Target ownership or setters are unavailable", async () => {
+test("direct Flatpak fails closed and rolls Target writes back", async () => {
const previousWindow = (globalThis as Record<string, unknown>).window;
const previousSteamClient = (globalThis as Record<string, unknown>).SteamClient;
+ let shortcutTarget = "/usr/bin/flatpak";
+ const targetWrites: string[] = [];
(globalThis as Record<string, unknown>).window = { setTimeout, clearTimeout };
(globalThis as Record<string, unknown>).SteamClient = {
Apps: {
RegisterForAppDetails(_appId: number, callback: (details: SteamAppDetails) => void) {
- callback({ strShortcutExe: _appId === 99 ? "/usr/bin/flatpak" : "garbage", strShortcutLaunchOptions: "" });
+ callback({ strShortcutExe: shortcutTarget, strShortcutLaunchOptions: "" });
return { unregister() {} };
},
+ SetShortcutExe(_appId: number, executable: string) {
+ targetWrites.push(executable);
+ shortcutTarget = executable;
+ if (executable.startsWith(wrapper)) throw new Error("simulated Target write failure");
+ },
},
};
try {
- await assert.rejects(installWrapperIntegration(98, true, wrapper, false, { kind: "flatpak", flatpakAppId: "com.example.Game" }), /supported executable/);
- await assert.rejects(installWrapperIntegration(99, true, wrapper, false, { kind: "flatpak", flatpakAppId: "com.example.Game" }), /Target API is unavailable/);
- await assert.rejects(removeWrapperIntegration(99, true, wrapper, "/usr/bin/original", false, { kind: "flatpak", flatpakAppId: "com.example.Game" }), /Target changed externally/);
- } finally {
- if (previousWindow === undefined) delete (globalThis as Record<string, unknown>).window;
- else (globalThis as Record<string, unknown>).window = previousWindow;
- if (previousSteamClient === undefined) delete (globalThis as Record<string, unknown>).SteamClient;
- else (globalThis as Record<string, unknown>).SteamClient = previousSteamClient;
- }
-});
-
-test("restores launch options and shortcut Target when a setter fails after changing them", async () => {
- const previousWindow = (globalThis as Record<string, unknown>).window;
- const previousSteamClient = (globalThis as Record<string, unknown>).SteamClient;
- let appOptions = "FOO=bar %command%";
- let shortcutTarget = "/usr/bin/flatpak";
- const appWrites: string[] = [];
- const targetWrites: string[] = [];
- const apps = {
- RegisterForAppDetails(appId: number, callback: (details: SteamAppDetails) => void) {
- callback(appId === 42
- ? { strLaunchOptions: appOptions }
- : { strShortcutExe: shortcutTarget, strShortcutLaunchOptions: "" });
- return { unregister() {} };
- },
- SetAppLaunchOptions(_appId: number, options: string) {
- appWrites.push(options);
- appOptions = options;
- if (options.includes(wrapper)) throw new Error("simulated launch-option write failure");
- },
- SetShortcutExe(_appId: number, executable: string) {
- targetWrites.push(executable);
- shortcutTarget = executable;
- if (executable === wrapper) throw new Error("simulated Target write failure");
- },
- };
- (globalThis as Record<string, unknown>).window = { setTimeout, clearTimeout };
- (globalThis as Record<string, unknown>).SteamClient = { Apps: apps };
- try {
- await assert.rejects(installWrapperIntegration(42, false, wrapper), /simulated launch-option write failure/);
- assert.equal(appOptions, "FOO=bar %command%");
- assert.deepEqual(appWrites, [`FOO=bar ${wrapper} %command%`, "FOO=bar %command%"]);
-
- await assert.rejects(installWrapperIntegration(43, true, wrapper, false, { kind: "flatpak", flatpakAppId: "com.example.Game" }), /simulated Target write failure/);
+ await assert.rejects(installWrapperIntegration(43, true, wrapper, false, true), /simulated Target write failure/);
assert.equal(shortcutTarget, "/usr/bin/flatpak");
- assert.deepEqual(targetWrites, [wrapper, "/usr/bin/flatpak"]);
+ assert.deepEqual(targetWrites, ['~/.lsfg "/usr/bin/flatpak"', "/usr/bin/flatpak"]);
+
+ shortcutTarget = "garbage";
+ await assert.rejects(installWrapperIntegration(43, true, wrapper, false, true), /supported direct Flatpak/);
} finally {
if (previousWindow === undefined) delete (globalThis as Record<string, unknown>).window;
else (globalThis as Record<string, unknown>).window = previousWindow;