// Generated, do not edit. sha256:415ae19f3cfe2e0ac5a4506d3d7d7f1611e2eb531e32c2abb96255b051ae85dd import { describe, it } from 'node:test'; import assert from 'node:assert/strict'; import { durationParts, exchangeStatus, localClock, wallToInstant } from '../../client/widgets/exchange-times.js'; import { CLOCKS } from '../../shared/config.js'; const NYSE = CLOCKS.EXCHANGES.find(e => e.key === 'nyse'); const TSE = CLOCKS.EXCHANGES.find(e => e.key === 'tse'); const iso = (d) => d.toISOString().slice(0, 16); const at = (s) => new Date(`${s}:00Z`); describe('wallToInstant', () => { it('rekent de muurtijd van een zone om naar een tijdstip, met en zonder zomertijd', () => { assert.equal(iso(wallToInstant('America/New_York', 2026, 3, 2, 9, 30)), '2026-03-02T14:30', 'EST, UTC-5'); assert.equal(iso(wallToInstant('America/New_York', 2026, 3, 16, 9, 30)), '2026-03-16T13:30', 'EDT, UTC-4'); assert.equal(iso(wallToInstant('Asia/Tokyo', 2026, 7, 1, 9, 0)), '2026-07-01T00:00', 'Tokio kent geen zomertijd'); }); }); describe('exchangeStatus', () => { it('is dicht vóór de opening en noemt het tijdstip', () => { const s = exchangeStatus(NYSE, at('2026-03-16T13:00')); assert.equal(s.isOpen, false); assert.equal(iso(s.opensAt), '2026-03-16T13:30'); }); it('is open tijdens de sessie en noemt opening en sluiting', () => { const s = exchangeStatus(NYSE, at('2026-03-16T15:00')); assert.equal(s.isOpen, true); assert.equal(iso(s.openedAt), '2026-03-16T13:30'); assert.equal(iso(s.closesAt), '2026-03-16T20:00'); assert.equal(s.opensAt, null); }); it('springt na de sluiting op vrijdag en in het weekend naar maandag', () => { assert.equal(iso(exchangeStatus(NYSE, at('2026-03-20T21:00')).opensAt), '2026-03-23T13:30', 'vrijdag na de sluiting'); assert.equal(iso(exchangeStatus(NYSE, at('2026-03-21T15:00')).opensAt), '2026-03-23T13:30', 'zaterdag'); }); it('neemt de kalenderdag van de BEURS en niet die van UTC', () => { const s = exchangeStatus(TSE, at('2026-03-15T21:00')); assert.equal(s.isOpen, false); assert.equal(iso(s.opensAt), '2026-03-16T00:00'); }); }); describe('localClock: de opening in een andere zone, per dag omgerekend', () => { it('zet New York in Amsterdam op 15:30, behalve in de weken dat alleen de VS al zomertijd heeft', () => { const nu = at('2026-01-01T00:00'); const ams = (instant) => localClock(instant, nu, 'Europe/Amsterdam').time; assert.equal(ams(exchangeStatus(NYSE, at('2026-03-02T12:00')).opensAt), '15:30', 'begin maart: allebei wintertijd'); assert.equal(ams(exchangeStatus(NYSE, at('2026-03-16T12:00')).opensAt), '14:30', 'half maart: alleen de VS op zomertijd'); assert.equal(ams(exchangeStatus(NYSE, at('2026-04-06T12:00')).opensAt), '15:30', 'april: allebei zomertijd'); }); it('zegt of het tijdstip op een andere dag valt, met de weekdag erbij', () => { const nu = at('2026-03-21T15:00'); const c = localClock(exchangeStatus(NYSE, nu).opensAt, nu, 'Europe/Amsterdam'); assert.equal(c.otherDay, true); assert.match(c.weekday, /^ma/); assert.equal(localClock(at('2026-03-21T16:00'), nu, 'Europe/Amsterdam').otherDay, false); }); }); describe('durationParts', () => { it('kiest de eenheid naar de lengte, en rondt naar boven af op de minuut', () => { const m = (n) => n * 60 * 1000; assert.deepEqual(durationParts(30 * 1000), { unit: 'min', n: 1 }, 'nooit "0 min" zolang hij dicht is'); assert.deepEqual(durationParts(m(40)), { unit: 'min', n: 40 }); assert.deepEqual(durationParts(m(100)), { unit: 'hourMin', n: 1, m: 40 }, '"1 uur" voor 1:40 zou misleiden'); assert.deepEqual(durationParts(m(200)), { unit: 'hours', n: 3 }); assert.deepEqual(durationParts(m(26 * 60)), { unit: 'days', n: 1 }); }); });