Fix remaining UI state and shutdown edge cases

Keep the loaded cutter layout stable across supported window sizes, preserve recovered encoder choices during capability discovery, and reject unsupported video selections without changing the active project.

Honor the Windows system theme, fully localize runtime metrics, invalidate imported System Check state safely, and bound child-process shutdown waits when close events never arrive.

Extend focused and Electron smoke coverage and prepare the v1.0.17 public release metadata.
This commit is contained in:
Sucukdeluxe
2026-08-13 11:24:48 +02:00
parent 2ee10a98dd
commit c66e9c9ab1
21 changed files with 1117 additions and 120 deletions
+35
View File
@@ -25,6 +25,19 @@ function createInput(value = '', checked = false): Input {
return { value, checked };
}
function loadRuntimeErrorFormatter(language: 'de' | 'en'): (errorClass: string | null) => string {
const localeName = language === 'de' ? 'UI_TEXT_DE' : 'UI_TEXT_EN';
const localeSource = fs.readFileSync(path.join(process.cwd(), 'src', `renderer-locale-${language}.ts`), 'utf8');
const settingsSource = fs.readFileSync(path.join(process.cwd(), 'src', 'renderer-settings.ts'), 'utf8');
const compiled = ts.transpileModule(
`${localeSource}\nlet UI_TEXT = ${localeName};\n${settingsSource}\nglobalThis.__getRuntimeErrorClassLabel = getRuntimeErrorClassLabel;`,
{ compilerOptions: { target: ts.ScriptTarget.ES2022, module: ts.ModuleKind.None } }
).outputText;
const context = vm.createContext({ console, window: {} });
vm.runInContext(compiled, context);
return context.__getRuntimeErrorClassLabel as (errorClass: string | null) => string;
}
describe('renderer settings autosave orchestration', () => {
it('persists a pure download policy change through the real autosave fingerprint', async () => {
const inputs = new Map(inputIds.map((id) => [id, createInput()]));
@@ -128,3 +141,25 @@ describe('renderer settings autosave orchestration', () => {
expect(saveConfigCalls).toHaveLength(2);
});
});
describe('renderer runtime metrics localization', () => {
it('renders every runtime error class and unknown values as human-readable German and English labels', () => {
const german = loadRuntimeErrorFormatter('de');
const english = loadRuntimeErrorFormatter('en');
const cases = [
{ errorClass: 'network', german: 'Netzwerk', english: 'Network' },
{ errorClass: 'rate_limit', german: 'Anfragelimit', english: 'Rate limit' },
{ errorClass: 'auth', german: 'Authentifizierung', english: 'Authentication' },
{ errorClass: 'tooling', german: 'Externe Tools', english: 'External tools' },
{ errorClass: 'integrity', german: 'Integrität', english: 'Integrity' },
{ errorClass: 'io', german: 'Dateisystem', english: 'File system' },
{ errorClass: 'validation', german: 'Validierung', english: 'Validation' },
{ errorClass: 'unknown', german: 'Unbekannt', english: 'Unknown' },
{ errorClass: 'future_error_class', german: 'Unbekannt', english: 'Unknown' },
{ errorClass: null, german: '-', english: '-' }
];
expect(cases.map(({ errorClass }) => german(errorClass))).toEqual(cases.map(({ german: label }) => label));
expect(cases.map(({ errorClass }) => english(errorClass))).toEqual(cases.map(({ english: label }) => label));
});
});