// 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'] }); });