// Tests der Laufwerks-Gesundheit (kern/laufwerk/ereignisse.ts, 5.4.0) —
// an der ECHTEN wevtutil-Ausgabe dieses PCs (01.09.2026): cdrom 7
// (fehlerhafter Block, der Spartacus-Defekt), cdrom 11 (Controllerfehler,
// der USB-Aussetzer).
import { describe, expect, it } from 'vitest'
import { beurteilen, buildWevtutilArgs, ereignisseAusXml, xpathFuer } from '../src/kern/laufwerk/ereignisse'
/** Drei Ereignisse, so wie wevtutil /f:xml sie schreibt — ohne Zeilenumbrüche. */
const XML =
"702135751SystemTobisNicerPC\\Device\\CdRom00300" +
"7System\\Device\\CdRom0" +
"11System\\Device\\CdRom0"
describe('ereignisseAusXml', () => {
it('liest Provider, ID, Zeit und Gerät je Ereignis', () => {
const e = ereignisseAusXml(XML)
expect(e).toHaveLength(3)
expect(e[0]).toEqual({ zeit: '2026-09-01T18:32:42.3868580Z', provider: 'cdrom', id: 7, geraet: '\\Device\\CdRom0' })
expect(e[2].id).toBe(11)
})
it('leere Ausgabe = keine Ereignisse', () => {
expect(ereignisseAusXml('')).toEqual([])
expect(ereignisseAusXml('\r\n')).toEqual([])
})
})
describe('beurteilen — Disc oder Hardware?', () => {
const alle = ereignisseAusXml(XML)
it('ein Controllerfehler dabei: Hardware — Port am Mainboard probieren', () => {
const b = beurteilen(alle, 24)
expect(b.urteil).toBe('hardware')
expect(b.controllerfehler).toBe(1)
expect(b.fehlerhafteBloecke).toBe(2)
expect(b.text).toContain('Mainboard')
expect(b.letzte).toHaveLength(3)
expect(b.letzte[0]).toContain('fehlerhafter Block')
})
it('nur fehlerhafte Blöcke: die Disc', () => {
const b = beurteilen(alle.filter((e) => e.id === 7), 24)
expect(b.urteil).toBe('disc')
expect(b.text).toContain('DISC')
})
it('nichts: ruhig', () => {
const b = beurteilen([], 24)
expect(b.urteil).toBe('ruhig')
expect(b.text).toContain('nichts')
})
it('seit einem Zeitpunkt: nur die jüngeren zählen', () => {
const b = beurteilen(alle, 24, new Date('2026-09-01T18:30:00Z'))
expect(b.controllerfehler).toBe(0)
expect(b.urteil).toBe('disc')
})
})
describe('die wevtutil-Argumente (Regel D: so gemessen)', () => {
it('XPath auf cdrom/disk mit Zeitfenster, XML, neueste zuerst', () => {
expect(xpathFuer(24)).toBe("*[System[Provider[@Name='cdrom' or @Name='disk'] and TimeCreated[timediff(@SystemTime) <= 86400000]]]")
const args = buildWevtutilArgs(24, 50)
expect(args[0]).toBe('qe')
expect(args[1]).toBe('System')
expect(args[2]).toBe(`/q:${xpathFuer(24)}`)
expect(args).toContain('/f:xml')
expect(args).toContain('/c:50')
expect(args).toContain('/rd:true')
})
})