Improve date handling (#94)

This commit is contained in:
Simon J
2022-02-02 13:26:01 +11:00
committed by GitHub
parent d0c80b2f20
commit df9a6d4663
3 changed files with 115 additions and 62 deletions

View File

@@ -1,58 +1,85 @@
import dayjs from "dayjs";
import { isChristmas, isCNY, isHalloween, isHoli } from "../src/clock";
import { randomInt } from "crypto";
import dayjs, { Dayjs } from "dayjs";
import timezone from "dayjs/plugin/timezone";
dayjs.extend(timezone);
describe("isChristmas", () => {
["2000/12/25", "2022/12/25", "2030/12/25"].forEach((date) => {
it(`should return true for ${date} regardless of year`, () => {
expect(isChristmas({ now: () => dayjs(date) })).toEqual(true);
import { Clock, isChristmas, isCNY, isCNY_2022, isCNY_2023, isCNY_2024, isCNY_2025, isHalloween, isHoli, isMay4 } from "../src/clock";
const randomDate = () => dayjs().subtract(randomInt(1, 1000), 'days');
const randomDates = (count: number, exclude: string[]) => {
const result: Dayjs[] = [];
while(result.length < count) {
const next = randomDate();
if(!exclude.find(it => dayjs(it).isSame(next, 'date'))) {
result.push(next)
}
}
return result
}
function describeFixedDateMonthEvent(
name: string,
dateMonth: string,
f: (clock: Clock) => boolean
) {
const randomYear = randomInt(2020, 3000);
const date = dateMonth.split("/")[0];
const month = dateMonth.split("/")[1];
describe(name, () => {
it(`should return true for ${randomYear}-${month}-${date}T00:00:00 ragardless of year`, () => {
expect(f({ now: () => dayjs(`${randomYear}-${month}-${date}T00:00:00Z`) })).toEqual(true);
});
it(`should return true for ${randomYear}-${month}-${date}T12:00:00 regardless of year`, () => {
expect(f({ now: () => dayjs(`${randomYear}-${month}-${date}T12:00:00Z`) })).toEqual(true);
});
it(`should return true for ${randomYear}-${month}-${date}T23:59:00 regardless of year`, () => {
expect(f({ now: () => dayjs(`${randomYear}-${month}-${date}T23:59:00`) })).toEqual(true);
});
["2000/12/24", "2000/12/26", "2021/01/01"].forEach((date) => {
it(`should return false for ${date}`, () => {
expect(f({ now: () => dayjs(date) })).toEqual(false);
});
});
});
}
["2000/12/24", "2000/12/26", "2021/01/01"].forEach((date) => {
it(`should return false for ${date} regardless of year`, () => {
expect(isChristmas({ now: () => dayjs(date) })).toEqual(false);
function describeFixedDateEvent(
name: string,
dates: string[],
f: (clock: Clock) => boolean
) {
describe(name, () => {
dates.forEach((date) => {
it(`should return true for ${date}T00:00:00`, () => {
expect(f({ now: () => dayjs(`${date}T00:00:00`) })).toEqual(true);
});
it(`should return true for ${date}T23:59:59`, () => {
expect(f({ now: () => dayjs(`${date}T23:59:59`) })).toEqual(true);
});
});
randomDates(10, dates).forEach((date) => {
it(`should return false for ${date}`, () => {
expect(f({ now: () => dayjs(date) })).toEqual(false);
});
});
});
});
}
describe("isHalloween", () => {
["2000/10/31", "2022/10/31", "2030/10/31"].forEach((date) => {
it(`should return true for ${date} regardless of year`, () => {
expect(isHalloween({ now: () => dayjs(date) })).toEqual(true);
});
});
describeFixedDateMonthEvent("christmas", "25/12", isChristmas);
describeFixedDateMonthEvent("halloween", "31/10", isHalloween);
describeFixedDateMonthEvent("may4", "04/05", isMay4);
["2000/09/31", "2000/10/30", "2021/01/01"].forEach((date) => {
it(`should return false for ${date} regardless of year`, () => {
expect(isHalloween({ now: () => dayjs(date) })).toEqual(false);
});
});
});
describe("isHoli", () => {
["2022/03/18", "2023/03/07", "2024/03/25", "2025/03/14"].forEach((date) => {
it(`should return true for ${date} regardless of year`, () => {
expect(isHoli({ now: () => dayjs(date) })).toEqual(true);
});
});
["2000/09/31", "2000/10/30", "2021/01/01"].forEach((date) => {
it(`should return false for ${date} regardless of year`, () => {
expect(isHoli({ now: () => dayjs(date) })).toEqual(false);
});
});
});
describe("isCNY", () => {
["2022/02/01", "2023/01/22", "2024/02/10", "2025/02/29"].forEach((date) => {
it(`should return true for ${date} regardless of year`, () => {
expect(isCNY({ now: () => dayjs(date) })).toEqual(true);
});
});
["2000/09/31", "2000/10/30", "2021/01/01"].forEach((date) => {
it(`should return false for ${date} regardless of year`, () => {
expect(isCNY({ now: () => dayjs(date) })).toEqual(false);
});
});
});
describeFixedDateEvent("holi", ["2022-03-18", "2023-03-07", "2024-03-25", "2025-03-14"], isHoli);
describeFixedDateEvent("cny", ["2022-02-01", "2023-01-22", "2024-02-10", "2025-02-29"], isCNY);
describeFixedDateEvent("cny 2022", ["2022-02-01"], isCNY_2022);
describeFixedDateEvent("cny 2023", ["2023/01/22"], isCNY_2023);
describeFixedDateEvent("cny 2024", ["2024/02/10"], isCNY_2024);
describeFixedDateEvent("cny 2025", ["2025/02/29"], isCNY_2025);