`- 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>
90 lines
3.3 KiB
TypeScript
90 lines
3.3 KiB
TypeScript
// 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'] });
|
||
});
|