feat(v5): Etappe W-1 — Laufwerk: Wache, Typ, Auswerfen mit Nachsehen
Ampel / ampel (push) Successful in 1m21s
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>
This commit is contained in:
co-authored by
Claude Fable 5
parent
6ed8035dcc
commit
a45069af5e
@@ -0,0 +1,42 @@
|
||||
// MESSUNG an echter Hardware — läuft nur auf Verlangen:
|
||||
//
|
||||
// RIPPY_MESSUNG=1 npx vitest run test/messung.laufwerk.test.ts
|
||||
//
|
||||
// In der Ampel (Linux, kein Laufwerk) wird sie übersprungen; die Ergebnisse
|
||||
// werden im SAVEPOINT.md mit Ausgabe dokumentiert (beweisen statt
|
||||
// behaupten). NUR LESEND — kein Auswerfen, kein Verriegeln; der
|
||||
// Auswurf-Beweis ist ein eigener, ausdrücklicher Lauf (messung.auswurf).
|
||||
import { describe, expect, it } from 'vitest'
|
||||
|
||||
const messen = process.env.RIPPY_MESSUNG === '1' && process.platform === 'win32'
|
||||
|
||||
describe.skipIf(!messen)('Messung am echten Laufwerk', () => {
|
||||
it('listet Laufwerke und liest ihren Zustand', async () => {
|
||||
// koffi erst hier laden — beim Einsammeln der Tests bleibt alles rein.
|
||||
const { win32Api } = await import('../src/kern/laufwerk/win32')
|
||||
const { geraeteInfo, listOptischeLaufwerke } = await import('../src/kern/laufwerk/disc')
|
||||
|
||||
const api = win32Api()
|
||||
const geraete = listOptischeLaufwerke(api)
|
||||
console.log(`MESSUNG optische Laufwerke: ${JSON.stringify(geraete)}`)
|
||||
expect(Array.isArray(geraete)).toBe(true)
|
||||
|
||||
for (const geraet of geraete) {
|
||||
const info = geraeteInfo(api, geraet)
|
||||
console.log(
|
||||
`MESSUNG ${info.name} status=${info.status} typ=${info.typ} ` +
|
||||
`groesse=${info.groesseBytes} modell="${info.modell}" ` +
|
||||
`serial=${info.seriennummer}${info.grund.length > 0 ? ` grund="${info.grund}"` : ''}`,
|
||||
)
|
||||
expect(info.id.length).toBeGreaterThan(0)
|
||||
expect(['ready', 'empty', 'unknown']).toContain(info.status)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
// Ohne Messung ist die Datei trotzdem ein gültiges Test-Modul.
|
||||
describe.skipIf(messen)('Messung übersprungen', () => {
|
||||
it('läuft nur mit RIPPY_MESSUNG=1 unter Windows', () => {
|
||||
expect(true).toBe(true)
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user