Files
abdulive/packages/core/src/yaml.test.ts
T
ZeasyAlexandClaude Opus 5.5 b1cf0f8fab YAML: Listen aus Maps
`- titel: X` zerfiel in Zeichenketten wie "titel: X". Jede Kanalpunkt-
Belohnung in der Konfiguration war damit ohne jede Meldung unwirksam, auch
das Beispiel in config.example.yaml.

Ein Listeneintrag der Form `schluessel: wert` beginnt jetzt eine Map; die
folgenden, tiefer eingerueckten Zeilen gehoeren dazu. `- http://x` bleibt
Text, weil nach dem Doppelpunkt kein Leerzeichen steht.

layout.yaml, config.example.yaml und die Hub-Konfiguration werden
nachweislich gleich gelesen wie vorher.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:58:35 +02:00

90 lines
3.3 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Der YAML-Leser ist selbst geschrieben (ADR-0001: keine Abhaengigkeiten) und
// liest die Konfiguration, an der alles haengt - hatte aber bis hierher keinen
// einzigen Test. Geprueft wird genau der Sprachumfang, den config/*.yaml
// benutzt.
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { parseYaml } from './yaml.ts';
test('verschachtelte Maps ueber Einrueckung', () => {
assert.deepEqual(parseYaml('channel:\n login: abdulive_\n language: de\n'),
{ channel: { login: 'abdulive_', language: 'de' } });
});
test('erkennt Zahlen, Wahrheitswerte und Leeres', () => {
const y = parseYaml([
'a: 42', 'b: -7', 'c: 3.5', 'd: true', 'e: false', 'f:', 'g: ~',
].join('\n'));
assert.deepEqual(y, { a: 42, b: -7, c: 3.5, d: true, e: false, f: null, g: null });
});
test('Anfuehrungszeichen bleiben Text', () => {
// Wichtig fuer update.url - sonst wuerde aus "0.5" eine Zahl
const y = parseYaml('update:\n url: "https://git.zeasy.dev/x"\n v: "0.5"\n');
assert.deepEqual(y, { update: { url: 'https://git.zeasy.dev/x', v: '0.5' } });
});
test('Inline-Maps, wie sie im Layout stehen', () => {
const y = parseYaml('crop: { x: 0, y: 0, w: 480, h: 270 }\n');
assert.deepEqual(y, { crop: { x: 0, y: 0, w: 480, h: 270 } });
});
test('Listen aus Skalaren', () => {
const y = parseYaml('chapterScenes: [Gameplay, "Just Chatting"]\n');
assert.deepEqual(y, { chapterScenes: ['Gameplay', 'Just Chatting'] });
});
test('Kommentare und Leerzeilen stoeren nicht', () => {
const y = parseYaml('# Kopfzeile\n\nobs:\n # dazwischen\n url: ws://127.0.0.1:4455\n');
assert.deepEqual(y, { obs: { url: 'ws://127.0.0.1:4455' } });
});
test('Zeilenenden nach Windows-Art', () => {
// config.yaml wird auf dem Stream-PC bearbeitet
assert.deepEqual(parseYaml('a:\r\n b: 1\r\n'), { a: { b: 1 } });
});
test('ein Byte Order Mark verstellt nicht den ersten Schluessel', () => {
// Notepad und `Set-Content -Encoding utf8` unter Windows PowerShell 5.1
// schreiben eines. Ohne Behandlung hiesse der erste Schluessel "channel",
// und die Einstellung wuerde stillschweigend ignoriert - ohne Fehlermeldung.
const y = parseYaml('\uFEFFchannel:\n login: abdulive_\n');
assert.deepEqual(y, { channel: { login: 'abdulive_' } });
assert.ok(!Object.keys(y).some((k) => k.charCodeAt(0) === 0xfeff));
});
test('Listen aus Maps, wie in rewards.belohnungen', () => {
// Frueher zerfiel das in Zeichenketten wie "id: abc", und die Belohnung
// war ohne jede Meldung unwirksam.
const y = parseYaml([
'rewards:',
' enabled: true',
' belohnungen:',
' - id: abc-123',
' titel: Nachricht vorlesen',
' aktion: tts',
' - titel: Konfetti',
' aktion: konfetti',
' tts:',
' blockliste:',
' - sieg heil',
' - http',
' maxZeichen: 200',
].join('\n'));
assert.deepEqual(y, {
rewards: {
enabled: true,
belohnungen: [
{ id: 'abc-123', titel: 'Nachricht vorlesen', aktion: 'tts' },
{ titel: 'Konfetti', aktion: 'konfetti' },
],
tts: { blockliste: ['sieg heil', 'http'], maxZeichen: 200 },
},
});
});
test('Listeneintrag mit Doppelpunkt ohne Leerzeichen bleibt Text', () => {
assert.deepEqual(parseYaml('a:\n - http://x.de\n'), { a: ['http://x.de'] });
});