Files
rippy/rippy-windows/test/kleinkram-550.test.ts
T
HitonabiandClaude Fable 5.1 3dc6798c79 feat(v5): 5.5.0 — Kern und Oberfläche aufgeteilt, Übersicht und Einstellungen neu, Erst-Einrichtung mit Poster-Kulisse
Commander-Wünsche vom 02.09.2026 vor der Freigabe von 5.4.0 (die deshalb nie
veröffentlicht wurde):

Kern: kern/index.ts ist nur noch Bootstrap und Router; Dienste in
kern/dienste/ (Einstellungen, Werkzeuge, Laufwerke, Erkennung, Vorgänge,
Speicher, Benachrichtigung, Automatik), Kontext in kern/kontext.ts,
Protokoll-Datei in gemeinsam/protokoll.ts, Platz-Rechnung in gemeinsam/platz.ts.

Oberfläche: fenster/App.tsx ist nur noch der Rahmen; bausteine.tsx, dialoge/,
uebersicht/ (LaufwerkKachel, KompressionsKarte, SpeicherKarte, VerlaufKarte),
einstellungen/ (Karten je Funktion, SprachAuswahl), einrichtung/
(ErstEinrichtung, PosterHintergrund).

Neu: Bibliothek weg, dafür Verlauf; Speicher-und-Bilanz-Karte (statfs);
LED-Fußleiste; MakeMKV-Kopf in die Einstellungen; Sprach-Chips mit Dropdown
statt Allgemeinem Preset; Karten Automatik/Benachrichtigung/Allgemein/Update;
Durchsuchen bei Werkzeugen; Arbeitsordner lokal (Encode dort, dann in die
Ablage); Platz-Prüfung vor dem Rip (Dialog und Kern); Automatik mit Countdown;
Serien-Merker über Discs; Rettungs-Abbild mit Nullen nur nach gesehenen
Lesefehlern (kern/rip/rettung.ts, Phase rettet, iso:-Quelle); Warteschlange
pausieren; Discord/Telegram-Benachrichtigung; Protokoll-Datei je Tag;
Fensterlage 80 % mittig, gemerkt; Erst-Einrichtung in acht Schritten vor dem
Poster-Grid.

Beweise: 413 Tests (neu: speicher, benachrichtigung, automatik, rettung,
fensterlage, protokoll, kleinkram-550), drei Typprüfungen, Klick-Beweis mit
29 Schritten inklusive Erst-Einrichtung (zweiter Start mit
RIPPY_START_BEREICH=einrichtung), Bilder beweise/klick/01…09.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-02 17:51:15 +02:00

63 lines
3.1 KiB
TypeScript

// Kleine pure Helfer aus 5.5.0: Sprachlisten fürs Dropdown, die Bilanz in
// der Übersicht, der Serien-Merker aus der Einstellung, die Platz-Prüfung
// im Dialog (dieselbe Rechnung wie im Kern).
import { describe, expect, it } from 'vitest'
import { platzUrteil as platzUrteilKern } from '../src/kern/dienste/speicher'
import { platzUrteil } from '../src/gemeinsam/platz'
import { serienMerkerAusJson } from '../src/kern/dienste/erkennung'
import { statistikAus } from '../src/kern/dienste/vorgaenge'
import { sprachName, sprachlisteAus, sprachlisteText } from '../src/gemeinsam/sprachen'
describe('sprachen', () => {
it('sprachlisteAus: trimmt, kleinschreibt, entdoppelt, hält die Reihenfolge', () => {
expect(sprachlisteAus('deu, ENG ,, jpn,deu')).toEqual(['deu', 'eng', 'jpn'])
expect(sprachlisteAus('')).toEqual([])
})
it('sprachName kennt die üblichen, fällt sonst auf den Code zurück', () => {
expect(sprachName('deu')).toBe('Deutsch')
expect(sprachName('jpn')).toBe('Japanisch')
expect(sprachName('xyz')).toBe('xyz')
})
it('sprachlisteText ist die Einstellung, wie der Kern sie liest', () => {
expect(sprachlisteText(['deu', 'eng'])).toBe('deu,eng')
})
})
describe('statistikAus', () => {
it('zählt Discs, Fertige, Bytes und die Dauer nur der Fertigen', () => {
const s = statistikAus([
{ phase: 'fertig', rohBytes: 30e9, fertigBytes: 8e9, begonnen: '2026-09-01T10:00:00Z', beendet: '2026-09-01T11:30:00Z' },
{ phase: 'fertig', rohBytes: 20e9, fertigBytes: 5e9, begonnen: '2026-09-01T12:00:00Z', beendet: '2026-09-01T12:30:00Z' },
{ phase: 'fehler', rohBytes: 10e9, fertigBytes: 0, begonnen: '2026-09-01T13:00:00Z', beendet: '2026-09-01T13:10:00Z' },
{ phase: 'komprimiert', rohBytes: 25e9, fertigBytes: 0, begonnen: '2026-09-01T14:00:00Z', beendet: null },
])
expect(s).toEqual({ discs: 4, fertige: 2, rohBytes: 85e9, fertigBytes: 13e9, dauerS: 7200 })
})
it('leer ist leer', () => {
expect(statistikAus([])).toEqual({ discs: 0, fertige: 0, rohBytes: 0, fertigBytes: 0, dauerS: 0 })
})
})
describe('serienMerkerAusJson', () => {
it('liest gültige Einträge, überspringt kaputte, verträgt Müll', () => {
const m = serienMerkerAusJson('{"tv:46296":{"titel":"Spartacus","staffel":1,"naechsteFolge":5,"wann":"2026-09-01T10:00:00Z"},"tv:1":{"staffel":"eins"},"x":5}')
expect(m).toEqual({ 'tv:46296': { titel: 'Spartacus', staffel: 1, naechsteFolge: 5, wann: '2026-09-01T10:00:00Z' } })
expect(serienMerkerAusJson(null)).toEqual({})
expect(serienMerkerAusJson('')).toEqual({})
expect(serienMerkerAusJson('nicht json')).toEqual({})
expect(serienMerkerAusJson('[1,2]')).toEqual({})
})
})
describe('Platz-Prüfung: eine Rechnung für Kern und Dialog', () => {
it('der Kern reicht dieselbe Funktion durch', () => {
expect(platzUrteilKern).toBe(platzUrteil)
})
it('reicht / knapp / zu wenig', () => {
expect(platzUrteil(60e9, 40e9, true)).toEqual({ text: '', hart: false })
expect(platzUrteil(45e9, 40e9, true).hart).toBe(false)
expect(platzUrteil(45e9, 40e9, true).text.startsWith('Knapp')).toBe(true)
expect(platzUrteil(30e9, 40e9, false).hart).toBe(true)
})
})