"""Tests der Preset-Auswahl — reine Funktionen, keine Infrastruktur. Die Preset-Namen in den Testdaten sind ECHT: `HandBrakeCLI --preset-list` im Worker-Image der Rippy-VM, 26.07.2026, HandBrake 1.6.1 (AGENTS Regel D). Erfundene Namen hätten hier keinen Wert — genau daran ist das Projekt zweimal gescheitert. """ import presets # Ausschnitt der echten Liste: die Kategorien, aus denen Rippy wählt. PRESETS_ECHT = [ # General/ "Very Fast 2160p60 4K AV1", "Very Fast 1080p30", "HQ 2160p60 4K HEVC Surround", "HQ 1080p30 Surround", "HQ 576p25 Surround", "Super HQ 2160p60 4K HEVC Surround", "Super HQ 1080p30 Surround", # Matroska/ "AV1 MKV 2160p60 4K", "H.265 MKV 2160p60 4K", "H.265 MKV 1080p30", "H.265 MKV 576p25", "H.265 MKV 480p30", "H.264 MKV 1080p30", # Hardware/ — steht auch auf Maschinen OHNE Hardware-Encoder in der Liste "AV1 QSV 2160p 4K", "H.265 NVENC 2160p 4K", "H.265 NVENC 1080p", "H.265 QSV 2160p 4K", "H.265 QSV 1080p", "H.265 VCN 2160p 4K", "H.265 VCN 1080p", "H.265 MF 2160p 4K", "H.265 MF 1080p", ] def worker(name="w", encoders=None, simd="", presets_liste=None): return { "name": name, "encoders": encoders if encoders is not None else ["cpu-x264", "cpu-x265"], "info": { "cpu_simd": simd, "presets": presets_liste if presets_liste is not None else PRESETS_ECHT, }, } # --- Die Rippy-VM: sse4_2, 4 Kerne, kein Hardware-Encoder -------------------- def test_vm_ohne_avx2_bekommt_4k_verlustfrei(): """Gemessen: 4K-HEVC in Software = 28-55 h auf dieser Maschine. Die Empfehlung muss deshalb „nicht komprimieren" lauten, nicht ein 4K-Preset.""" w = [worker(simd="sse4_2")] e = presets.empfehlung("uhd", w) assert e["preset"] == presets.PRESET_KEINE assert "28-55 Stunden" in e["grund"] def test_vm_ohne_avx2_bekommt_h264_fuer_bluray_und_dvd(): w = [worker(simd="sse4_2")] assert presets.empfehlung("bluray", w)["preset"] == "HQ 1080p30 Surround" assert presets.empfehlung("dvd", w)["preset"] == "HQ 576p25 Surround" # --- Der PC des Commanders: avx512f, 16 Kerne, RX 9070 XT ------------------- def test_hardware_av1_wird_bevorzugt_wenn_die_familie_gemeldet_ist(): """Commander-Vorgabe: „wenn der Worker AV1 oder noch besseres kann, immer diesem empfehlen". QSV meldet AV1, also muss das AV1-Preset kommen.""" w = [worker(encoders=["cpu-x265", "qsv", "qsv-av1"], simd="avx512f")] assert presets.empfehlung("uhd", w)["preset"] == "AV1 QSV 2160p 4K" def test_amd_bekommt_das_amd_preset_nicht_das_intel(): """Der Encoder heißt `vce`, das Preset heißt `VCN` — ohne diese Zuordnung liefe die RX 9070 XT des Commanders unter einem Intel-Namen.""" w = [worker(encoders=["cpu-x265", "vce"], simd="avx512f")] assert presets.empfehlung("uhd", w)["preset"] == "H.265 VCN 2160p 4K" assert presets.empfehlung("bluray", w)["preset"] == "H.265 VCN 1080p" def test_hardware_grund_nennt_den_nachteil_auch(): w = [worker(encoders=["vce"], simd="avx512f")] grund = presets.empfehlung("uhd", w)["grund"] assert "VCN" in grund assert "sauberer" in grund # ehrlich: Software hätte etwas mehr Qualität def test_starke_cpu_ohne_hardware_bekommt_h265(): w = [worker(encoders=["cpu-x264", "cpu-x265"], simd="avx2")] assert presets.empfehlung("uhd", w)["preset"] == "H.265 MKV 2160p60 4K" assert presets.empfehlung("bluray", w)["preset"] == "H.265 MKV 1080p30" assert presets.empfehlung("dvd", w)["preset"] == "H.265 MKV 576p25" def test_dvd_bekommt_nie_ein_hardware_preset(): """HandBrake 1.6.1 hat keine Hardware-Presets in DVD-Auflösung — ein erfundenes „H.265 VCN 576p" würde die Kompression scheitern lassen.""" w = [worker(encoders=["vce", "qsv", "nvenc"], simd="avx512f")] assert presets.empfehlung("dvd", w)["preset"] == "H.265 MKV 576p25" # --- Hardware, die KEIN passendes Preset hat -------------------------------- def test_vaapi_faellt_auf_software_zurueck_statt_zu_raten(): """HandBrake 1.6.1 liefert kein VAAPI-Preset mit. Ein VAAPI-Worker darf deshalb keinen Hardware-Namen bekommen (AGENTS Regel D).""" w = [worker(encoders=["cpu-x265", "vaapi"], simd="avx2")] assert presets.empfehlung("uhd", w)["preset"] == "H.265 MKV 2160p60 4K" def test_mf_wird_nie_empfohlen_steht_aber_zur_wahl(): """Media-Foundation-Presets existieren, aber ob die Maschine sie nutzen kann, ist aus der Encoder-Liste nicht ablesbar — nicht empfehlen, nicht verstecken.""" w = [worker(encoders=["cpu-x265"], simd="avx2")] assert "MF" not in presets.empfehlung("uhd", w)["preset"] namen = [a["name"] for a in presets.auswahl("uhd", w)] assert "H.265 MF 2160p 4K" in namen # --- Nur echte Namen, nie geratene ------------------------------------------ def test_unbekannte_handbrake_version_bekommt_keine_erfundene_empfehlung(): """Meldet ein Worker nur Presets, die Rippy nicht kennt, wird ehrlich „selbst wählen" gesagt — statt einen Namen einzustellen, den dieses HandBrake ablehnt.""" w = [worker(simd="avx2", presets_liste=["Irgendwas 4711p", "Noch was"])] e = presets.empfehlung("uhd", w) assert e["gefunden"] is False assert e["preset"] == "" assert "selbst" in e["grund"] def test_ohne_worker_greift_der_rueckfall(): """Kein Worker online (oder alter Worker-Stand ohne Preset-Meldung): die Auswahl darf nicht leer sein, sonst ist die Seite unbenutzbar.""" assert presets.verfuegbare_presets([]) == list(presets.RUECKFALL_PRESETS) assert presets.uebersicht([])["quelle"] == "rueckfall" # ... und der Rückfall muss selbst brauchbar sein: e = presets.empfehlung("bluray", []) assert e["gefunden"] is True assert e["preset"] in presets.RUECKFALL_PRESETS def test_quelle_ist_worker_wenn_einer_meldet(): assert presets.uebersicht([worker(simd="avx2")])["quelle"] == "worker" def test_verfuegbare_presets_vereinigt_ohne_doppelte(): a = worker("a", presets_liste=["H.265 MKV 1080p30", "HQ 1080p30 Surround"]) b = worker("b", presets_liste=["H.265 MKV 1080p30", "H.265 NVENC 1080p"]) assert presets.verfuegbare_presets([a, b]) == [ "H.265 MKV 1080p30", "HQ 1080p30 Surround", "H.265 NVENC 1080p", ] # --- Auswahl-Listen: die 4K-Falle aus v3.12 darf nicht wiederkommen --------- def test_4k_auswahl_zeigt_2160p_presets_zuerst(): w = [worker(simd="avx2")] liste = presets.auswahl("uhd", w) zuerst = [a["name"] for a in liste if not a["verkleinert"]] assert all("2160p" in n for n in zuerst) assert "H.265 MKV 2160p60 4K" in zuerst def test_4k_auswahl_kennzeichnet_das_verkleinern(): """Ein 1080p-Preset für eine 4K-Disc ist eine legitime Wahl, aber eine BEWUSSTE — in v3.12 passierte es aus Versehen und die 4K-Auflösung war weg.""" w = [worker(simd="avx2")] verkleinert = [a["name"] for a in presets.auswahl("uhd", w) if a["verkleinert"]] assert "H.265 MKV 1080p30" in verkleinert assert all("1080p" in n for n in verkleinert) def test_dvd_auswahl_nimmt_beide_pal_und_ntsc_aufloesungen(): w = [worker(simd="avx2")] namen = [a["name"] for a in presets.auswahl("dvd", w)] assert "H.265 MKV 576p25" in namen # PAL assert "H.265 MKV 480p30" in namen # NTSC assert "H.265 MKV 1080p30" not in namen def test_bluray_auswahl_enthaelt_kein_4k(): w = [worker(simd="avx2")] namen = [a["name"] for a in presets.auswahl("bluray", w)] assert namen assert not any("2160p" in n for n in namen) # --- Erkennung der Maschinen-Stärke ---------------------------------------- def test_unbekannte_simd_stufe_gilt_nicht_als_schnell_und_nicht_als_langsam(): """Ein Windows-Worker ohne die Erkennung aus v3.16 meldet `unbekannt`. Er darf nichts behaupten — aber auch keinen schnellen Worker ausbremsen.""" assert presets.simd_schnell([worker(simd="unbekannt")]) is False assert presets.simd_schnell([worker(simd="unbekannt"), worker(simd="avx2")]) is True def test_hardware_kuerzel_nur_bei_echter_meldung(): assert presets.hardware_kuerzel([worker(encoders=["cpu-x265"])]) == [] assert presets.hardware_kuerzel([worker(encoders=["nvenc", "nvenc-av1"])]) == ["NVENC"] # Reihenfolge ist die Vorzugsreihenfolge, nicht die Meldereihenfolge assert presets.hardware_kuerzel([worker(encoders=["vce", "qsv"])]) == ["QSV", "VCN"] def test_uebersicht_liefert_alle_drei_disc_typen(): u = presets.uebersicht([worker(simd="avx2")]) assert set(u["typen"]) == {"uhd", "bluray", "dvd"} for eintrag in u["typen"].values(): assert eintrag["empfehlung"]["preset"] assert eintrag["auswahl"]