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>
63 lines
3.1 KiB
TypeScript
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)
|
|
})
|
|
})
|