// @vitest-environment node
// Reiner Main-Prozess-Test ohne Fenster; jsdom wird hier nicht gebraucht.

import { describe, expect, it, vi } from 'vitest';

/* `fenster.ts` zieht beim Laden Electron und die Einstellungen herein. Für
   die reine Entscheidungsfunktion genügt eine Attrappe – ein Fenster wird
   hier nie erzeugt. */
vi.mock('electron', () => ({
  BrowserWindow: function BrowserWindowAttrappe(): void {
    /* Nie aufgerufen: Diese Datei prüft eine reine Funktion, kein Fenster. */
  },
  dialog: { showErrorBox: (): void => undefined, showMessageBoxSync: (): number => 0 },
  nativeTheme: { shouldUseDarkColors: false, shouldUseHighContrastColors: false },
  app: { getPath: (): string => '.', isPackaged: false, getAppPath: (): string => '.' },
}));

const { absturzAntwort, NEULADEVERSUCHE, SCHLEIFENFENSTER_MS } =
  await import('../src/main/fenster');

/**
 * Die Antwort auf einen gestorbenen Renderer.
 *
 * Bis 0.22.0 gab es keine: `render-process-gone` löschte nur den Merker der
 * laufenden Prüfung. Der Fehlerauffang der Oberfläche greift bei Ausnahmen im
 * Renderbaum – stirbt der Renderer-Prozess selbst, kommt er nicht mehr zum
 * Zuge, und es blieb ein weißes Fenster ohne Text, Fokus oder Ansage stehen.
 * `docs/stand.md` 8.1 führte den Absturzfall als erledigt; gedeckt war nur
 * die eine Hälfte.
 */
describe('Antwort auf einen gestorbenen Renderer', () => {
  it('lädt beim ersten Absturz neu', () => {
    expect(absturzAntwort('crashed', 0, 0)).toBe('neu-laden');
  });

  it('lädt auch beim zweiten Absturz neu', () => {
    expect(absturzAntwort('oom', NEULADEVERSUCHE - 1, 1000)).toBe('neu-laden');
  });

  it('gibt nach dem letzten Versuch auf, statt eine Schleife zu drehen', () => {
    /* Stürzt der Renderer schon beim Laden ab, führte unbegrenztes Neuladen
       zu einem Fenster, das sich nicht mehr bedienen und kaum beenden lässt. */
    expect(absturzAntwort('crashed', NEULADEVERSUCHE, 1000)).toBe('aufgeben');
  });

  it('fängt nach einer langen Ruhe wieder von vorn an', () => {
    /* Ein Absturz von gestern darf den von heute nicht mitzählen: Sonst
       bekäme das dritte Vorkommnis in einem Jahr kein Neuladen mehr. */
    expect(absturzAntwort('crashed', NEULADEVERSUCHE, SCHLEIFENFENSTER_MS + 1)).toBe('neu-laden');
  });

  it.each(['clean-exit', 'killed'])('lässt %s in Ruhe', (grund) => {
    /* Das gewöhnliche Beenden und ein Abschuss von außen sind kein Absturz.
       Sie neu zu laden hieße, ein geschlossenes Fenster wieder aufzumachen. */
    expect(absturzAntwort(grund, 0, 0)).toBe('ruhen');
  });

  it('behandelt jeden anderen Grund als Absturz', () => {
    /* Chromium kennt mehr Gründe als hier aufgezählt (`launch-failed`,
       `integrity-failure`, `crashed`, `oom`). Ein unbekannter Grund darf
       nicht dazu führen, dass das Fenster weiß stehen bleibt. */
    expect(absturzAntwort('launch-failed', 0, 0)).toBe('neu-laden');
    expect(absturzAntwort('integrity-failure', 0, 0)).toBe('neu-laden');
  });
});
