Ampel / ampel (push) Failing after 1m22s
rip/parser.ts: die reine Textverarbeitung mit allen bezahlten Fallen aus dem Docker-Zweig — quelle() (dev:G: statt dev:\.\G:, der 404-Verwandte), textVon() (UTF-8 streng, sonst cp1252 — nie wieder 'Öffnen'), parseMsg (Regex statt split — Meldungen mit Komma), PRGV (-1 vs. echtes 0 %), TINFO/SINFO (Sprache aus Attr 3/4, NICHT 28/29), laengsterTitel mit Play-All-Schutz, episodenTitel, KRITISCHE_CODES (sprachfeste NUMMERN). rip/makemkv.ts: Kommandobau + Lauf — ZeilenLeser (binaer, halbe Zeilen, je Zeile dekodiert), RipAuswertung (pur), rippen() mit AbortSignal, Lesefehler-Flag AUCH bei Rueckgabewert 0. werkzeuge/katalog.ts: die Suchreihenfolge samt %VAR%-Gross/Klein-Falle und Registry-Rueckfall. ablauf/rippen.ts: ein Rip je Laufwerk, Status-Push, 'erst nachsehen, dann rippen' (unbekannt heisst trotzdem rippen). Fenster: Rippen-Knopf, Fortschrittsbalken, Abbrechen; Auswurf waehrend des Rips abgelehnt. Gemessen am echten System (30.08.2026): Katalog findet makemkvcon64 (Program Files x86), HandBrakeCLI und flac (beide im rc11-Werkzeugordner LOCALAPPDATA\Rippy\tools). NEUER BEFUND: Nach dem abgebrochenen rc11-Rip vom Mittag sieht MakeMKV GAR KEIN Laufwerk mehr (MSG 5042, leere DRV-Liste, mit und ohne --noscan), waehrend die Storage-IOCTLs sauber antworten — MakeMKV spricht SCSI direkt. 5042 ist jetzt ein KRITISCHER_CODE mit Klartext-Abhilfe. Der volle Rip-Beweis (messung.rip.test.ts liegt bereit) braucht deshalb erst eine Hand am Geraet: Disc neu einlegen oder USB ab-/anstecken. 96 Tests gruen, Smoke gruen. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
72 lines
3.0 KiB
TypeScript
72 lines
3.0 KiB
TypeScript
// Tests des Werkzeug-Katalogs — Suchreihenfolge und die %VAR%-Falle
|
|
// (Groß/Klein), beides ohne installierte Programme (Prüf-Funktionen
|
|
// werden eingespritzt, Muster aus test_katalog.py).
|
|
import { describe, expect, it } from 'vitest'
|
|
import { entfalten, finden, kandidaten, WERKZEUGE } from '../src/kern/werkzeuge/katalog'
|
|
|
|
describe('entfalten — %VAR% ohne Rücksicht auf Schreibweise', () => {
|
|
it('die gemessene Falle: PROGRAMFILES(X86) trifft %ProgramFiles(x86)%', () => {
|
|
// Windows liefert Umgebungsnamen GROSS; das Muster schreibt sie
|
|
// gemischt. Der strikte Vergleich ließ die bekannten Orte auf einer
|
|
// echten Maschine NIE greifen (katalog.py, 28.08.2026).
|
|
expect(entfalten('%ProgramFiles(x86)%\\MakeMKV', { 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)' })).toBe(
|
|
'C:\\Program Files (x86)\\MakeMKV',
|
|
)
|
|
})
|
|
it('bleibt ein % stehen, ist der Kandidat unbrauchbar', () => {
|
|
expect(entfalten('%GibtEsNicht%\\X', {})).toBe('')
|
|
})
|
|
})
|
|
|
|
describe('kandidaten — Reihenfolge: eigener Ordner vor System', () => {
|
|
it('eigener Ordner zuerst, dann bekannte Orte, 64 Bit zuerst', () => {
|
|
const liste = kandidaten('makemkv', 'C:\\R\\tools', {
|
|
'PROGRAMFILES(X86)': 'C:\\PF86',
|
|
PROGRAMFILES: 'C:\\PF',
|
|
})
|
|
expect(liste[0]).toBe('C:\\R\\tools\\makemkv\\makemkvcon64.exe')
|
|
expect(liste).toContain('C:\\PF86\\MakeMKV\\makemkvcon64.exe')
|
|
expect(liste.indexOf('C:\\R\\tools\\makemkvcon64.exe')).toBeLessThan(
|
|
liste.indexOf('C:\\PF86\\MakeMKV\\makemkvcon64.exe'),
|
|
)
|
|
})
|
|
})
|
|
|
|
describe('finden', () => {
|
|
const umgebung = { 'PROGRAMFILES(X86)': 'C:\\PF86', PATH: '' }
|
|
|
|
it('ein eingestellter Pfad gewinnt — und ein falscher wird NICHT ersetzt', () => {
|
|
const existiert = (p: string): boolean => p === 'D:\\eigen\\makemkvcon64.exe'
|
|
expect(finden('makemkv', 'D:\\eigen\\makemkvcon64.exe', 'C:\\R', umgebung, existiert, () => '')).toBe(
|
|
'D:\\eigen\\makemkvcon64.exe',
|
|
)
|
|
// Tippfehler soll als Fehler sichtbar werden, nicht still anderswo landen.
|
|
expect(finden('makemkv', 'D:\\tippfehler.exe', 'C:\\R', umgebung, existiert, () => '')).toBe('')
|
|
})
|
|
|
|
it('findet über die bekannten Orte', () => {
|
|
const existiert = (p: string): boolean => p === 'C:\\PF86\\MakeMKV\\makemkvcon64.exe'
|
|
expect(finden('makemkv', '', 'C:\\R', umgebung, existiert, () => '')).toBe(
|
|
'C:\\PF86\\MakeMKV\\makemkvcon64.exe',
|
|
)
|
|
})
|
|
|
|
it('fällt zuletzt auf die Registry zurück', () => {
|
|
expect(finden('makemkv', '', 'C:\\R', umgebung, () => false, () => 'C:\\Reg\\makemkvcon64.exe')).toBe(
|
|
'C:\\Reg\\makemkvcon64.exe',
|
|
)
|
|
})
|
|
|
|
it('nichts gefunden ist "", kein Raten', () => {
|
|
expect(finden('makemkv', '', 'C:\\R', umgebung, () => false, () => '')).toBe('')
|
|
})
|
|
})
|
|
|
|
describe('WERKZEUGE — die Pflicht-Markierungen', () => {
|
|
it('nur MakeMKV ist Pflicht; ohne HandBrake/FLAC läuft Rippy eingeschränkt', () => {
|
|
expect(WERKZEUGE.makemkv.pflicht).toBe(true)
|
|
expect(WERKZEUGE.handbrake.pflicht).toBe(false)
|
|
expect(WERKZEUGE.flac.pflicht).toBe(false)
|
|
})
|
|
})
|