import {test} from 'node:test';
import assert from 'node:assert/strict';
import {createEmitter} from './main.js';
test('Listener laufen in der Reihenfolge des Hinzufügens, mit den Argumenten von emit', () => {
const e = createEmitter();
const seen = [];
e.on('sale', (item, price) => seen.push('first ' + item + ' ' + price));
e.on('sale', (item) => seen.push('second ' + item));
e.emit('sale', 'tea', 3);
assert.deepEqual(seen, ['first tea 3', 'second tea'], `die Listener sahen ${JSON.stringify(seen)}`);
});
test('emit liefert true mit Listenern und false ohne', () => {
const e = createEmitter();
e.on('sale', () => {});
assert.equal(e.emit('sale'), true, 'emit für ein Event mit Listener sollte true liefern');
assert.equal(e.emit('refund'), false, 'emit für ein Event ohne Listener sollte false liefern');
});
test('off entfernt eine Instanz der Funktion', () => {
const e = createEmitter();
let calls = 0;
const count = () => calls++;
e.on('ping', count);
e.on('ping', count);
e.off('ping', count);
e.emit('ping');
assert.equal(calls, 1, `count lief nach zweimal on und einmal off ${calls}-mal; erwartet war 1-mal`);
e.off('ping', count);
assert.equal(e.emit('ping'), false, 'nach dem Entfernen beider Instanzen sollte emit false liefern');
});
test('Ein once-Listener läuft nur beim nächsten emit', () => {
const e = createEmitter();
let calls = 0;
e.once('ring', (n) => (calls += n));
assert.equal(e.emit('ring', 5), true, 'das erste emit sollte den once-Listener finden');
assert.equal(e.emit('ring', 5), false, 'das zweite emit sollte keinen Listener finden');
assert.equal(calls, 5, `der once-Listener kam auf ${calls}; erwartet war 5`);
});
test('Ein Listener, der sich selbst entfernt, lässt den nächsten nicht ausfallen', () => {
const e = createEmitter();
const seen = [];
const first = () => {
seen.push('first');
e.off('open', first);
};
e.on('open', first);
e.on('open', () => seen.push('second'));
e.emit('open');
assert.deepEqual(seen, ['first', 'second'], `gelaufen sind die Listener ${JSON.stringify(seen)}`);
});