import {test} from 'node:test';
import assert from 'node:assert/strict';
import {TodoList} from './main.js';
// Collects every event of a list as [event, number, text, done].
const record = (list) => {
const events = [];
list.on('added', (item, n) => events.push(['added', n, item.text, item.done]));
list.on('done', (item, n) => events.push(['done', n, item.text, item.done]));
return events;
};
test('add speichert das To-do und löst added mit Eintrag und Nummer aus', () => {
const list = new TodoList();
const events = record(list);
list.add('tea');
list.add('milk');
assert.deepEqual(list.items, [{text: 'tea', done: false}, {text: 'milk', done: false}], 'items ist ' + JSON.stringify(list.items));
assert.deepEqual(events, [['added', 1, 'tea', false], ['added', 2, 'milk', false]], 'die Events waren ' + JSON.stringify(events));
});
test('add mit leerem Text wirft und ändert nichts', () => {
const list = new TodoList();
const events = record(list);
assert.throws(() => list.add(''), {message: 'add needs a text, such as add buy milk'}, "add('') sollte werfen: add needs a text, such as add buy milk");
assert.equal(list.items.length + events.length, 0, "add('') sollte weder ein To-do speichern noch ein Event auslösen");
});
test('done markiert das To-do und löst done mit Eintrag und Nummer aus', () => {
const list = new TodoList();
const events = record(list);
list.add('tea');
list.add('milk');
list.done('2');
assert.deepEqual(events.slice(2), [['done', 2, 'milk', true]], 'nach done 2 waren die Events ' + JSON.stringify(events.slice(2)));
assert.equal(list.items[0].done, false, 'done 2 sollte tea unerledigt lassen');
});
test('ein zweites done für dasselbe To-do löst nichts aus', () => {
const list = new TodoList();
const events = record(list);
list.add('tea');
list.done('1');
list.done('1');
assert.equal(events.filter((e) => e[0] === 'done').length, 1, 'zweimal done 1 sollte done einmal auslösen');
});
test('done mit falscher Nummer wirft einen RangeError und ändert nichts', () => {
const list = new TodoList();
list.add('tea');
for (const arg of ['0', '2', 'x', '']) {
assert.throws(() => list.done(arg), {name: 'RangeError', message: 'no to-do "' + arg + '"'}, 'done(' + JSON.stringify(arg) + ') sollte RangeError: no to-do "' + arg + '" werfen');
}
assert.equal(list.items[0].done, false, 'tea sollte noch unerledigt sein');
});