// noinspection ES6ConvertRequireIntoImport - this is CJS, not MJS const { test } = require("node:test"); const assert = require("node:assert/strict"); const { DateBuilder } = require("./dateBuilder"); test("DateBuilder should be able to be initialised", () => { const db = new DateBuilder(); assert.equal(db instanceof DateBuilder, true); }); test("DateBuilder should be able to build current date", () => { const now = new Date(); const db = new DateBuilder(); const built = db.build(); assert.equal(built.getFullYear(), now.getFullYear()); assert.equal(built.getMonth(), now.getMonth()); assert.equal(built.getDate(), now.getDate()); assert.equal(built.getHours(), now.getHours()); assert.equal(built.getMinutes(), now.getMinutes()); assert.equal(built.getSeconds(), now.getSeconds()); }); test("DateBuilder should be able to add days", () => { const db = new DateBuilder(new Date(2024, 0, 1)); // Jan 1, 2024 db.addDays(30); const built = db.build(); assert.equal(built.getFullYear(), 2024); assert.equal(built.getMonth(), 0); // January assert.equal(built.getDate(), 31); // January has 31 days }); test("DateBuilder should be able to add months", () => { const db = new DateBuilder(new Date(2024, 0, 1)); // Jan 31, 2024 db.addMonths(1); const built = db.build(); assert.equal(built.getFullYear(), 2024); assert.equal(built.getMonth(), 1); // February }); test("DateBuilder should be able to add years", () => { const db = new DateBuilder(new Date(2020, 1, 1)); db.addYears(1); const built = db.build(); assert.equal(built.getFullYear(), 2021); assert.equal(built.getMonth(), 1); // February assert.equal(built.getDate(), 1); }); test("DateBuilder should be able to set date", () => { const db = new DateBuilder(); db.withDate(2022, 12, 25); // Dec 25, 2022 const built = db.build(); assert.equal(built.getFullYear(), 2022); assert.equal(built.getMonth(), 11); // December assert.equal(built.getDate(), 25); }); test("DateBuilder should be able to set time", () => { const db = new DateBuilder(); db.withTime(15, 30, 45, 123); // 15:30:45.123 const built = db.build(); assert.equal(built.getHours(), 15); assert.equal(built.getMinutes(), 30); assert.equal(built.getSeconds(), 45); assert.equal(built.getMilliseconds(), 123); }); test("DateBuilder should be able to set start of day", () => { const db = new DateBuilder(new Date(2024, 5, 15, 10, 20, 30, 456)); // June 15, 2024, 10:20:30.456 db.atStartOfDay(); const built = db.build(); assert.equal(built.getFullYear(), 2024); assert.equal(built.getMonth(), 5); // June assert.equal(built.getDate(), 15); assert.equal(built.getHours(), 0); assert.equal(built.getMinutes(), 0); assert.equal(built.getSeconds(), 0); assert.equal(built.getMilliseconds(), 0); }); test("DateBuilder should be able to set end of day", () => { const db = new DateBuilder(new Date(2024, 5, 15, 10, 20, 30, 456)); // June 15, 2024, 10:20:30.456 db.atEndOfDay(); const built = db.build(); assert.equal(built.getFullYear(), 2024); assert.equal(built.getMonth(), 5); // June assert.equal(built.getDate(), 15); assert.equal(built.getHours(), 23); assert.equal(built.getMinutes(), 59); assert.equal(built.getSeconds(), 59); assert.equal(built.getMilliseconds(), 999); }); test("DateBuilder should be able to chain methods", () => { const db = new DateBuilder(new Date(2024, 0, 1)); // Jan 1, 2024 db.addDays(1).addMonths(1).addYears(1).withTime(12, 0, 0).atEndOfDay(); const built = db.build(); assert.equal(built.getFullYear(), 2025); assert.equal(built.getMonth(), 1); // March assert.equal(built.getDate(), 2); assert.equal(built.getHours(), 23); assert.equal(built.getMinutes(), 59); assert.equal(built.getSeconds(), 59); assert.equal(built.getMilliseconds(), 999); }); test("DateBuilder should not mutate original date", () => { const original = new Date(2024, 0, 1); // Jan 1, 2024 const db = new DateBuilder(original); db.addDays(10); const built = db.build(); assert.equal(original.getFullYear(), 2024); assert.equal(original.getMonth(), 0); // January assert.equal(original.getDate(), 1); // Original date should remain unchanged assert.equal(built.getFullYear(), 2024); assert.equal(built.getMonth(), 0); // January assert.equal(built.getDate(), 11); // New date should be Jan 11, 2024 }); test("DateBuilder should handle leap years correctly", () => { const db = new DateBuilder(new Date(2020, 1, 29)); // Feb 29, 2020 (leap year) db.addYears(1); const built = db.build(); assert.equal(built.getFullYear(), 2021); assert.equal(built.getMonth(), 2); // March assert.equal(built.getDate(), 1); // March 1, 2021 (not a leap year) }); test("DateBuilder should handle month overflow correctly", () => { const db = new DateBuilder(new Date(2024, 0, 31)); // Jan 31, 2024 db.addDays(1); const built = db.build(); assert.equal(built.getFullYear(), 2024); assert.equal(built.getMonth(), 1); // February assert.equal(built.getDate(), 1); // Feb 29, 2024 (leap year) });