Ampel / ampel (push) Successful in 1m21s
kern/laufwerk in drei Schichten: codes.ts (Steuercodes HERGELEITET wie win_ioctl.py, gegen die Doku-Zahlen getestet), win32.ts (der einzige koffi-Ort im Kern, Muster aus beweise/laufwerk.js), disc.ts (Logik gegen die LaufwerkApi-Schnittstelle — classify mit den cdrom.py-Schwellen, Geraete-Info mit ready/empty/unknown + Klartext-Grund, Auswurf als entriegeln→auswerfen→NACHSEHEN mit injizierbarem Warten). Dazu wache.ts im 3-Sekunden-Takt (§ 5 Plan A): Uebergangslogik pur, gescheiterte Runde behaelt den Stand (R2) und meldet laut (R4). Fenster zeigt Laufwerke live (Modell, Typ, Groesse, Grund) mit Auswerfen-Knopf; Ereigniszeilen fuer Disc rein/raus und Fehler. Bündel-Falle gefunden und behoben: Ein woertliches require überlebt Rollup nicht — win32 wird per dynamischem import() als eigener Chunk gebaut; der Fehler war dank R4 im Fenster sichtbar statt still. Gemessen am echten BU40N (30.08.2026, RIPPY_MESSUNG=1): Laufwerk G: status=ready typ=bluray groesse=33759690752 modell=HL-DT-ST BD-RE BU40N 1.03 serial=0025114C0149 Der Auswurf-Beweis (messung.auswurf) folgt am Ende der Sitzung — der BU40N kann die Schublade nicht selbst einziehen. 52 Tests gruen (Steuercodes, classify, Auswurf-Ablauf, Geraete-Info, Wache, Smoke weiterhin gruen mit Laufwerks-Kachel im Bild). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
48 lines
2.0 KiB
TypeScript
48 lines
2.0 KiB
TypeScript
// AUSWURF-MESSUNG an echter Hardware — der W-1-Beweis „Auswerfen wirkt
|
|
// (nachgemessen, nicht geglaubt)". Läuft NUR auf ausdrückliches Verlangen:
|
|
//
|
|
// RIPPY_MESSUNG_AUSWURF=1 npx vitest run test/messung.auswurf.test.ts
|
|
//
|
|
// ⚠ Wirft die Disc im ersten optischen Laufwerk WIRKLICH aus. Der BU40N
|
|
// kann die Schublade nicht selbst einziehen (LOAD_MEDIA →
|
|
// ERROR_INVALID_FUNCTION, windows.py 28.08.2026) — nach dem Lauf bleibt
|
|
// der Tray offen. Deshalb getrennt von messung.laufwerk (nur lesend).
|
|
import { describe, expect, it } from 'vitest'
|
|
|
|
const messen = process.env.RIPPY_MESSUNG_AUSWURF === '1' && process.platform === 'win32'
|
|
|
|
describe.skipIf(!messen)('Auswurf am echten Laufwerk — Zustand davor und danach', () => {
|
|
it('entriegelt, wirft aus und SIEHT NACH', async () => {
|
|
const { win32Api } = await import('../src/kern/laufwerk/win32')
|
|
const { auswerfenMitGrund, geraeteInfo, listOptischeLaufwerke } = await import('../src/kern/laufwerk/disc')
|
|
|
|
const api = win32Api()
|
|
const geraete = listOptischeLaufwerke(api)
|
|
expect(geraete.length).toBeGreaterThan(0)
|
|
const geraet = geraete[0]
|
|
|
|
const davor = geraeteInfo(api, geraet)
|
|
console.log(`MESSUNG davor: status=${davor.status} typ=${davor.typ}`)
|
|
expect(davor.status).toBe('ready') // ohne Disc misst dieser Lauf nichts
|
|
|
|
const start = Date.now()
|
|
const { grund, fehler } = await auswerfenMitGrund(api, geraet)
|
|
const dauerMs = Date.now() - start
|
|
console.log(`MESSUNG auswurf: grund=${grund} fehler=${fehler ?? '-'} dauer=${dauerMs}ms`)
|
|
|
|
const danach = geraeteInfo(api, geraet)
|
|
console.log(`MESSUNG danach: status=${danach.status}`)
|
|
|
|
// Der eigentliche Beweis ist der ZUSTAND davor/danach — nicht der
|
|
// Rückgabewert des Steuercodes (windows.py: 4 → 1 am echten Gerät).
|
|
expect(grund).toBe('ok')
|
|
expect(danach.status).toBe('empty')
|
|
})
|
|
})
|
|
|
|
describe.skipIf(messen)('Auswurf-Messung übersprungen', () => {
|
|
it('läuft nur mit RIPPY_MESSUNG_AUSWURF=1 unter Windows', () => {
|
|
expect(true).toBe(true)
|
|
})
|
|
})
|