'use strict'; const test = require('node:test'); const assert = require('node:assert/strict'); const { buildXmltv, xmlEscape, xmltvDate } = require('../src/epg'); function event(key, title, startIso, endIso, league = 'Jupiler Pro League') { return { key, title, league, language: 'nl', startAt: new Date(startIso), endAt: new Date(endIso), sources: [], }; } test('builds XMLTV with channels and projected programmes', () => { const a = event('a', 'Standard de Liège - SK Beveren', '2026-11-06T18:25:00Z', '2026-11-06T20:55:00Z'); const b = event('b', 'Anderlecht & Genk', '2026-11-06T20:55:00Z', '2026-11-06T23:25:00Z'); const c = event('c', 'Club Brugge - Antwerp', '2026-11-06T20:55:00Z', '2026-11-06T23:25:00Z'); const state = { slots: [{ eventKey: 'a' }, { eventKey: null }, { eventKey: null }], events: new Map([['a', a]]), upcoming: [a, b, c], }; const scheduler = { state, getSlotCount: () => 3 }; const xml = buildXmltv(scheduler, Date.parse('2026-11-06T19:00:00Z')); assert.ok(xml.startsWith('')); assert.ok(xml.includes('')); assert.ok(xml.includes('')); assert.ok(xml.includes('start="20261106182500 +0000"')); assert.ok(xml.includes('stop="20261106205500 +0000"')); assert.ok(xml.includes('channel="jupiler-1"')); assert.ok(xml.includes('Standard de Liège') === false); assert.ok(xml.includes('Standard de Liège - SK Beveren')); assert.ok(xml.includes('Anderlecht & Genk')); assert.ok(xml.includes('Club Brugge - Antwerp')); }); test('escapes XML and formats UTC dates', () => { assert.equal(xmlEscape('a & "c" \'d\''), 'a & <b> "c" 'd''); assert.equal(xmltvDate(new Date('2026-11-06T18:25:00Z')), '20261106182500 +0000'); });