/* This file is part of »munin«. Copyright 2025 'Fenris Wolf' »munin« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »munin« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »munin«. If not, see . */ namespace _munin.test { /** */ type type_datetime = { year : int; month : int; day : int; hour : int; minute : int; second : int; }; /** */ function datetime_to_pit( datetime : type_datetime ) : lib_plankton.pit.type_pit { return lib_plankton.pit.from_datetime( { "date": { "year": datetime.year, "month": datetime.month, "day": datetime.day, }, "time": { "hour": datetime.hour, "minute": datetime.minute, "second": datetime.second, }, "timezone_shift": 0, } ); } /** */ function start( name : string ) : void { lib_plankton.log._info( "test.run", { "details": { "name": name, } } ); } /** */ function fail( name : string ) : void { lib_plankton.log._error( "test.failed", { "details": { "name": name, } } ); } /** */ function frequency_decode( frequency_encoded : string ) : _munin.enum_frequency { switch (frequency_encoded) { case "hourly": return _munin.enum_frequency.hourly; case "daily": return _munin.enum_frequency.daily; case "weekly": return _munin.enum_frequency.weekly; case "monthly": return _munin.enum_frequency.monthly; default: {throw new Error("unhandled");} } } /** */ export function reminder_due( ) : void { type type_testcase = { name : string; input : { reminder : { frequency : string; offset : int; from : int; to : int; }; datetime : type_datetime; interval : int; }; output : boolean; }; const testcases : Array = [ { "name": "reminder_due.test1", "input": { "reminder": { "frequency": "daily", "offset": 16, "from": 24, "to": 48 }, "datetime": { "year": 2025, "month": 6, "day": 27, "hour": 15, "minute": 30, "second": 0 }, "interval": 1 }, "output": false }, { "name": "reminder_due.test2", "input": { "reminder": { "frequency": "daily", "offset": 16, "from": 24, "to": 48 }, "datetime": { "year": 2025, "month": 6, "day": 27, "hour": 16, "minute": 30, "second": 0, }, "interval": 1 }, "output": true }, { "name": "reminder_due.test3", "input": { "reminder": { "frequency": "daily", "offset": 16, "from": 24, "to": 48 }, "datetime": { "year": 2025, "month": 6, "day": 27, "hour": 17, "minute": 30, "second": 0 }, "interval": 1 }, "output": false }, ]; for (const testcase of testcases) { start(testcase.name); // execution const result : boolean = _munin.logic.reminder_due( { "frequency": frequency_decode(testcase.input.reminder.frequency), "offset": testcase.input.reminder.offset, "from": testcase.input.reminder.from, "to": testcase.input.reminder.to, }, { "pit": datetime_to_pit(testcase.input.datetime), "interval": testcase.input.interval, } ); // assertions if (result !== testcase.output) { fail(testcase.name); } } } /** */ export function reminder_event_in_window( ) : void { type type_testcase = { name : string; input : { reminder : { frequency : string; offset : int; from : int; to : int; }; event : { begin : type_datetime; }; datetime : type_datetime; interval : int; }; output : boolean; }; const testcases : Array = [ { "name": "reminder_event_in_window.test1", "input": { "reminder": { "frequency": "daily", "offset": 0, "from": 24, "to": 48 }, "event": { "begin": { "year": 2025, "month": 6, "day": 25, "hour": 12, "minute": 0, "second": 0 } }, "datetime": { "year": 2025, "month": 6, "day": 23, "hour": 10, "minute": 0, "second": 0 }, "interval": 1 }, "output": false }, { "name": "reminder_event_in_window.test2", "input": { "reminder": { "frequency": "daily", "offset": 0, "from": 24, "to": 48 }, "event": { "begin": { "year": 2025, "month": 6, "day": 25, "hour": 12, "minute": 0, "second": 0 } }, "datetime": { "year": 2025, "month": 6, "day": 24, "hour": 10, "minute": 0, "second": 0 }, "interval": 1 }, "output": true }, { "name": "reminder_event_in_window.test3", "input": { "reminder": { "frequency": "daily", "offset": 0, "from": 24, "to": 48 }, "event": { "begin": { "year": 2025, "month": 6, "day": 25, "hour": 12, "minute": 0, "second": 0 } }, "datetime": { "year": 2025, "month": 6, "day": 25, "hour": 10, "minute": 0, "second": 0 }, "interval": 1 }, "output": false }, ]; for (const testcase of testcases) { start(testcase.name); // execution const result : boolean = _munin.logic.reminder_event_in_window( { "frequency": frequency_decode(testcase.input.reminder.frequency), "offset": testcase.input.reminder.offset, "from": testcase.input.reminder.from, "to": testcase.input.reminder.to, }, { "title": "test", "begin": lib_plankton.pit.to_datetime(datetime_to_pit(testcase.input.event.begin)), "end": null, "description": null, "location": null, "tags": null, }, { "pit": datetime_to_pit(testcase.input.datetime), } ); // assertions if (result !== testcase.output) { fail(testcase.name); } } } /** */ export function all( ) : void { reminder_due(); reminder_event_in_window(); } }