Files
bibdle/tests/stats.test.ts
George Powell e550965086 add unit tests for core game, bible, share, and stats utilities
146 tests covering evaluateGuess, grading, ordinals, bible data
integrity, section counts, share text generation, and stat
string helpers. Also fixes toOrdinal for 111-113 (was using
>= 11 && <= 13 instead of % 100 check).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-26 15:02:46 -05:00

130 lines
3.6 KiB
TypeScript

import { describe, test, expect } from "bun:test";
import {
formatDate,
getGradeColor,
getPerformanceMessage,
getStreakMessage,
} from "$lib/utils/stats";
describe("getGradeColor", () => {
test("S++ → purple", () => {
expect(getGradeColor("S++")).toBe("text-purple-600 bg-purple-100");
});
test("S+ → yellow", () => {
expect(getGradeColor("S+")).toBe("text-yellow-600 bg-yellow-100");
});
test("A+ → green", () => {
expect(getGradeColor("A+")).toBe("text-green-600 bg-green-100");
});
test("A → light green", () => {
expect(getGradeColor("A")).toBe("text-green-500 bg-green-50");
});
test("B+ → blue", () => {
expect(getGradeColor("B+")).toBe("text-blue-600 bg-blue-100");
});
test("B → light blue", () => {
expect(getGradeColor("B")).toBe("text-blue-500 bg-blue-50");
});
test("C+ → orange", () => {
expect(getGradeColor("C+")).toBe("text-orange-600 bg-orange-100");
});
test("C → red", () => {
expect(getGradeColor("C")).toBe("text-red-600 bg-red-100");
});
test("unknown grade → gray fallback", () => {
expect(getGradeColor("X")).toBe("text-gray-600 bg-gray-100");
expect(getGradeColor("")).toBe("text-gray-600 bg-gray-100");
});
});
describe("formatDate", () => {
test("formats a mid-year date", () => {
expect(formatDate("2024-07-04")).toBe("Jul 4");
});
test("formats a January date", () => {
expect(formatDate("2024-01-15")).toBe("Jan 15");
});
test("formats the last day of the year", () => {
expect(formatDate("2023-12-31")).toBe("Dec 31");
});
test("formats a single-digit day without leading zero", () => {
expect(formatDate("2025-03-01")).toBe("Mar 1");
});
test("year in input does not appear in output", () => {
expect(formatDate("2024-06-20")).not.toContain("2024");
});
});
describe("getStreakMessage", () => {
test("0 → prompt to start", () => {
expect(getStreakMessage(0)).toBe("Start your streak today!");
});
test("1 → encouragement", () => {
expect(getStreakMessage(1)).toBe("Keep it going!");
});
test("2 → X days strong", () => {
expect(getStreakMessage(2)).toBe("2 days strong!");
});
test("6 → X days strong (upper bound of that range)", () => {
expect(getStreakMessage(6)).toBe("6 days strong!");
});
test("7 → week streak message", () => {
expect(getStreakMessage(7)).toBe("7 day streak - amazing!");
});
test("29 → upper bound of week-streak range", () => {
expect(getStreakMessage(29)).toBe("29 day streak - amazing!");
});
test("30 → unstoppable message", () => {
expect(getStreakMessage(30)).toBe("30 days - you're unstoppable!");
});
test("100 → unstoppable message", () => {
expect(getStreakMessage(100)).toBe("100 days - you're unstoppable!");
});
});
describe("getPerformanceMessage", () => {
test("≤ 2 guesses → exceptional", () => {
expect(getPerformanceMessage(1)).toBe("Exceptional performance!");
expect(getPerformanceMessage(2)).toBe("Exceptional performance!");
});
test("≤ 4 guesses → great", () => {
expect(getPerformanceMessage(2.1)).toBe("Great performance!");
expect(getPerformanceMessage(4)).toBe("Great performance!");
});
test("≤ 6 guesses → good", () => {
expect(getPerformanceMessage(4.1)).toBe("Good performance!");
expect(getPerformanceMessage(6)).toBe("Good performance!");
});
test("≤ 8 guesses → room for improvement", () => {
expect(getPerformanceMessage(6.1)).toBe("Room for improvement!");
expect(getPerformanceMessage(8)).toBe("Room for improvement!");
});
test("> 8 guesses → keep practicing", () => {
expect(getPerformanceMessage(8.1)).toBe("Keep practicing!");
expect(getPerformanceMessage(20)).toBe("Keep practicing!");
});
});