fix: Rausch-Schwelle auf >= und <=, Tests korrigiert, Fehlertext angepasst

- Operator auf >= und <= geändert (kumulativ zählen)
- Test "ignoriert Höhenschwankungen" ersetzt durch zwei separate Tests:
  * "erfasst einen gleichmäßigen Anstieg auch in feinen Schritten" (300→303 in 1m Schritten = 3m)
  * "ignoriert Rauschen, das um denselben Wert schwankt" (auf/ab ohne Gewinn = 0m)
- Fehlertext auf Brief-Fassung: "Die Datei ist kein gültiges XML."
- Test-Regex angepasst zum neuen Fehlertext

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Daniel Michelberger 2026-08-06 17:34:16 +02:00
parent f89f163e22
commit 1eb25cd7e4
2 changed files with 23 additions and 7 deletions

View file

@ -48,15 +48,31 @@ describe('parseGpx', () => {
expect(r.ascent_m).toBe(65)
})
it('ignoriert Höhenschwankungen unter 3 m', () => {
const noisy = `<?xml version="1.0"?>
it('erfasst einen gleichmäßigen Anstieg auch in feinen Schritten', () => {
// 300 -> 303 in 1-m-Schritten ist kein Rauschen, sondern ein
// echter Anstieg von 3 m — nur fein aufgezeichnet.
const fine = `<?xml version="1.0"?>
<gpx version="1.1" xmlns="http://www.topografix.com/GPX/1/1"><trk><trkseg>
<trkpt lat="49.510" lon="11.430"><ele>300</ele></trkpt>
<trkpt lat="49.511" lon="11.431"><ele>301</ele></trkpt>
<trkpt lat="49.512" lon="11.432"><ele>302</ele></trkpt>
<trkpt lat="49.513" lon="11.433"><ele>303</ele></trkpt>
</trkseg></trk></gpx>`
// Lauter 1-m-Schritte: reines GPS-Rauschen, kein echter Anstieg
expect(parseGpx(fine).ascent_m).toBe(3)
})
it('ignoriert Rauschen, das um denselben Wert schwankt', () => {
// Auf und ab um maximal 2 m ohne echten Höhengewinn — genau das,
// wogegen die Schwelle schützt.
const noisy = `<?xml version="1.0"?>
<gpx version="1.1" xmlns="http://www.topografix.com/GPX/1/1"><trk><trkseg>
<trkpt lat="49.510" lon="11.430"><ele>300</ele></trkpt>
<trkpt lat="49.511" lon="11.431"><ele>302</ele></trkpt>
<trkpt lat="49.512" lon="11.432"><ele>300</ele></trkpt>
<trkpt lat="49.513" lon="11.433"><ele>301</ele></trkpt>
<trkpt lat="49.514" lon="11.434"><ele>299</ele></trkpt>
<trkpt lat="49.515" lon="11.435"><ele>300</ele></trkpt>
</trkseg></trk></gpx>`
expect(parseGpx(noisy).ascent_m).toBe(0)
})
@ -120,7 +136,7 @@ describe('parseGpx', () => {
})
it('wirft bei ungültigem XML', () => {
expect(() => parseGpx('kein xml')).toThrow(/ung(ü|ue)ltig/i)
expect(() => parseGpx('kein xml')).toThrow(/kein g(ü|ue)ltiges XML/i)
})
})

View file

@ -115,7 +115,7 @@ export function parseGpx(xml: string): ParsedGpx {
const doc = new DOMParser().parseFromString(xml, 'application/xml')
if (doc.querySelector('parsererror')) {
throw new Error('Die GPX-Datei ist ungültig.')
throw new Error('Die Datei ist kein gültiges XML.')
}
// Manche Programme exportieren Routen (rtept) statt Tracks (trkpt).
@ -171,10 +171,10 @@ export function parseGpx(xml: string): ParsedGpx {
lastCountedEle = ele
} else {
const delta = ele - lastCountedEle
if (delta > ELE_NOISE_M) {
if (delta >= ELE_NOISE_M) {
ascent += delta
lastCountedEle = ele
} else if (delta < -ELE_NOISE_M) {
} else if (delta <= -ELE_NOISE_M) {
// Abstieg über Schwelle: neuer Bezugspunkt, aber nicht gezählt
lastCountedEle = ele
}