mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-06-20 03:13:31 -07:00
108 lines
3.7 KiB
TypeScript
108 lines
3.7 KiB
TypeScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
import {
|
|
MPV_X11_BACKEND_ARGS,
|
|
applyX11EnvOverrides,
|
|
isSupportedWaylandCompositor,
|
|
shouldForceX11MpvBackend,
|
|
shouldForceX11WaylandSession,
|
|
} from './mpv-x11-backend';
|
|
|
|
function withPlatform(platform: NodeJS.Platform, run: () => void): void {
|
|
const original = Object.getOwnPropertyDescriptor(process, 'platform');
|
|
Object.defineProperty(process, 'platform', { configurable: true, value: platform });
|
|
try {
|
|
run();
|
|
} finally {
|
|
if (original) Object.defineProperty(process, 'platform', original);
|
|
}
|
|
}
|
|
|
|
const KDE_WAYLAND = {
|
|
DISPLAY: ':1',
|
|
WAYLAND_DISPLAY: 'wayland-0',
|
|
XDG_SESSION_TYPE: 'wayland',
|
|
XDG_CURRENT_DESKTOP: 'KDE',
|
|
XDG_SESSION_DESKTOP: 'plasma',
|
|
};
|
|
|
|
test('isSupportedWaylandCompositor detects Hyprland and Sway via env or xdg desktop', () => {
|
|
assert.equal(isSupportedWaylandCompositor({ HYPRLAND_INSTANCE_SIGNATURE: 'hypr' }), true);
|
|
assert.equal(isSupportedWaylandCompositor({ SWAYSOCK: '/tmp/sway.sock' }), true);
|
|
assert.equal(isSupportedWaylandCompositor({ XDG_CURRENT_DESKTOP: 'Hyprland' }), true);
|
|
assert.equal(isSupportedWaylandCompositor({ XDG_SESSION_DESKTOP: 'sway' }), true);
|
|
assert.equal(isSupportedWaylandCompositor(KDE_WAYLAND), false);
|
|
});
|
|
|
|
test('shouldForceX11WaylandSession forces X11 for unsupported Wayland sessions only', () => {
|
|
withPlatform('linux', () => {
|
|
assert.equal(shouldForceX11WaylandSession(KDE_WAYLAND), true);
|
|
// GNOME Wayland (also unsupported) → forced.
|
|
assert.equal(
|
|
shouldForceX11WaylandSession({
|
|
DISPLAY: ':0',
|
|
WAYLAND_DISPLAY: 'wayland-0',
|
|
XDG_CURRENT_DESKTOP: 'GNOME',
|
|
}),
|
|
true,
|
|
);
|
|
// Hyprland keeps native Wayland.
|
|
assert.equal(
|
|
shouldForceX11WaylandSession({ ...KDE_WAYLAND, HYPRLAND_INSTANCE_SIGNATURE: 'hypr' }),
|
|
false,
|
|
);
|
|
// No X11 display to fall back to.
|
|
assert.equal(shouldForceX11WaylandSession({ WAYLAND_DISPLAY: 'wayland-0' }), false);
|
|
// Pure X11 session (no Wayland) → nothing to force.
|
|
assert.equal(shouldForceX11WaylandSession({ DISPLAY: ':0', XDG_SESSION_TYPE: 'x11' }), false);
|
|
});
|
|
});
|
|
|
|
test('shouldForceX11WaylandSession is false off Linux', () => {
|
|
withPlatform('darwin', () => {
|
|
assert.equal(shouldForceX11WaylandSession(KDE_WAYLAND), false);
|
|
});
|
|
withPlatform('win32', () => {
|
|
assert.equal(shouldForceX11WaylandSession(KDE_WAYLAND), false);
|
|
});
|
|
});
|
|
|
|
test('shouldForceX11MpvBackend honors explicit x11 and auto modes', () => {
|
|
withPlatform('linux', () => {
|
|
// Explicit x11 forces even without Wayland.
|
|
assert.equal(shouldForceX11MpvBackend('x11', { DISPLAY: ':0' }), true);
|
|
// Auto defers to the session check.
|
|
assert.equal(shouldForceX11MpvBackend('auto', KDE_WAYLAND), true);
|
|
assert.equal(
|
|
shouldForceX11MpvBackend('auto', { ...KDE_WAYLAND, SWAYSOCK: '/tmp/sway.sock' }),
|
|
false,
|
|
);
|
|
// No display at all.
|
|
assert.equal(shouldForceX11MpvBackend('x11', {}), false);
|
|
});
|
|
});
|
|
|
|
test('applyX11EnvOverrides strips Wayland hints and pins session type to x11', () => {
|
|
const env = {
|
|
DISPLAY: ':1',
|
|
WAYLAND_DISPLAY: 'wayland-0',
|
|
XDG_SESSION_TYPE: 'wayland',
|
|
HYPRLAND_INSTANCE_SIGNATURE: 'hypr',
|
|
SWAYSOCK: '/tmp/sway.sock',
|
|
};
|
|
const result = applyX11EnvOverrides(env);
|
|
assert.equal(result, env); // mutates in place
|
|
assert.equal(result.DISPLAY, ':1');
|
|
assert.equal(result.WAYLAND_DISPLAY, undefined);
|
|
assert.equal(result.HYPRLAND_INSTANCE_SIGNATURE, undefined);
|
|
assert.equal(result.SWAYSOCK, undefined);
|
|
assert.equal(result.XDG_SESSION_TYPE, 'x11');
|
|
});
|
|
|
|
test('MPV_X11_BACKEND_ARGS pins the GPU stack to X11', () => {
|
|
assert.deepEqual(
|
|
[...MPV_X11_BACKEND_ARGS],
|
|
['--vo=gpu', '--gpu-api=opengl', '--gpu-context=x11egl,x11'],
|
|
);
|
|
});
|