// Tests der Rip-Lauf-Bausteine: Zeilenzerlegung (binär, halbe Zeilen) // und die Auswertung (Fortschritt, Lesefehler, kritische Ursachen) — // alles ohne echtes makemkvcon. import { describe, expect, it } from 'vitest' import { buildInfoArgs, buildRipArgs, RipAuswertung, ZeilenLeser } from '../src/kern/rip/makemkv' describe('Kommandobau', () => { it('info: Robot-Mode ohne Geräte-Scan', () => { expect(buildInfoArgs('\\\\.\\G:')).toEqual(['-r', '--noscan', 'info', 'dev:G:']) }) it('mkv: Fortschritt in denselben Strom', () => { expect(buildRipArgs('\\\\.\\G:', 'C:\\ziel', 'all')).toEqual([ '-r', '--noscan', '--progress=-same', 'mkv', 'dev:G:', 'all', 'C:\\ziel', ]) }) }) describe('ZeilenLeser — binär, halbe Zeilen bleiben liegen', () => { it('setzt Zeilen über Stück-Grenzen zusammen', () => { const leser = new ZeilenLeser() expect(leser.hinzu(Buffer.from('PRGV:1,2,'))).toEqual([]) expect(leser.hinzu(Buffer.from('65536\r\nMSG:1,0,0,"a"\nRest'))).toEqual([ 'PRGV:1,2,65536', 'MSG:1,0,0,"a"', ]) expect(leser.schluss()).toEqual(['Rest']) }) it('dekodiert jede Zeile einzeln — auch cp1252 mitten im Strom', () => { const leser = new ZeilenLeser() const zeilen = leser.hinzu( Buffer.concat([Buffer.from('MSG:5010,0,0,"Das '), Buffer.from('Öffnen', 'latin1'), Buffer.from('"\n')]), ) expect(zeilen).toEqual(['MSG:5010,0,0,"Das Öffnen"']) }) }) describe('RipAuswertung', () => { it('meldet Fortschritt nur bei Änderung', () => { const a = new RipAuswertung() expect(a.verarbeite('PRGV:0,32768,65536')).toEqual({ prozent: 50 }) expect(a.verarbeite('PRGV:0,32769,65536')).toEqual({}) expect(a.verarbeite('PRGV:0,45876,65536')).toEqual({ prozent: 70 }) }) it('erkennt Lesefehler an der sprachfesten URL — auch auf Deutsch', () => { const a = new RipAuswertung() a.verarbeite( 'MSG:2003,0,3,"Encountered 29 errors of type \'Read Error\' - see http://www.makemkv.com/errors/read/","f"', ) expect(a.lesefehler).toBe(true) }) it('sammelt kritische URSACHEN über die Nummer, nicht den Text', () => { const a = new RipAuswertung() a.verarbeite('MSG:5051,0,0,"Der Testzeitraum ist abgelaufen. Erwerben Sie bitte einen Schlüssel"') a.verarbeite('MSG:5010,0,0,"Das Öffnen der Disk schlug fehl"') const fehler = a.fehlerText(11, false) expect(fehler).toContain('Code 11') expect(fehler).toContain('nicht freigeschaltet') expect(fehler).toContain('keine MKV-Datei entstanden') }) it('englische Textmuster bleiben als Rückfall', () => { const a = new RipAuswertung() a.verarbeite('MSG:9999,0,0,"AACS volume key is unknown for this disc"') expect(a.kritischeMeldungen).toHaveLength(1) }) })