// 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) }) })