Files

75 lines
3.7 KiB
JavaScript
Raw Permalink Normal View History

2026-10-29 11:57:29 +01:00
// 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 });
});
});