Add Pathfinder 2e game system mode
Implements PF2e as an alternative game system alongside D&D 5e/5.5e. Settings modal "Game System" selector switches conditions, bestiary, stat block layout, and initiative calculation between systems. - Valued conditions with increment/decrement UX (Clumsy 2, Frightened 3) - 2,502 PF2e creatures from bundled search index (77 sources) - PF2e stat block: level, traits, Perception, Fort/Ref/Will, ability mods - Perception-based initiative rolling - System-scoped source cache (D&D and PF2e sources don't collide) - Backwards-compatible condition rehydration (ConditionId[] → ConditionEntry[]) - Difficulty indicator hidden in PF2e mode (excluded from MVP) Closes dostulata/initiative#19 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
// @vitest-environment jsdom
|
||||
import { act, renderHook } from "@testing-library/react";
|
||||
import { afterEach, describe, expect, it } from "vitest";
|
||||
import { afterEach, describe, expect, it, vi } from "vitest";
|
||||
import { useRulesEdition } from "../use-rules-edition.js";
|
||||
|
||||
const STORAGE_KEY = "initiative:rules-edition";
|
||||
const STORAGE_KEY = "initiative:game-system";
|
||||
const OLD_STORAGE_KEY = "initiative:rules-edition";
|
||||
|
||||
describe("useRulesEdition", () => {
|
||||
afterEach(() => {
|
||||
@@ -11,6 +12,7 @@ describe("useRulesEdition", () => {
|
||||
const { result } = renderHook(() => useRulesEdition());
|
||||
act(() => result.current.setEdition("5.5e"));
|
||||
localStorage.removeItem(STORAGE_KEY);
|
||||
localStorage.removeItem(OLD_STORAGE_KEY);
|
||||
});
|
||||
|
||||
it("defaults to 5.5e", () => {
|
||||
@@ -42,4 +44,31 @@ describe("useRulesEdition", () => {
|
||||
|
||||
expect(r2.current.edition).toBe("5e");
|
||||
});
|
||||
|
||||
it("accepts pf2e as a valid game system", () => {
|
||||
const { result } = renderHook(() => useRulesEdition());
|
||||
|
||||
act(() => result.current.setEdition("pf2e"));
|
||||
|
||||
expect(result.current.edition).toBe("pf2e");
|
||||
expect(localStorage.getItem(STORAGE_KEY)).toBe("pf2e");
|
||||
});
|
||||
|
||||
it("migrates from old storage key on fresh module load", async () => {
|
||||
// Set up old key before re-importing the module
|
||||
localStorage.setItem(OLD_STORAGE_KEY, "5e");
|
||||
localStorage.removeItem(STORAGE_KEY);
|
||||
|
||||
// Force a fresh module so loadEdition() re-runs at init time
|
||||
vi.resetModules();
|
||||
const { useRulesEdition: freshHook } = await import(
|
||||
"../use-rules-edition.js"
|
||||
);
|
||||
|
||||
const { result } = renderHook(() => freshHook());
|
||||
|
||||
expect(result.current.edition).toBe("5e");
|
||||
expect(localStorage.getItem(STORAGE_KEY)).toBe("5e");
|
||||
expect(localStorage.getItem(OLD_STORAGE_KEY)).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user