Also records the 10-12 rectification batch as merged in the bug history, changelog and task index. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HwMNZEzdzmrbPhuRNmZe3C
60 lines
3.4 KiB
TypeScript
60 lines
3.4 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
|
|
import {
|
|
AYANAMSA_SWITCH_HINT,
|
|
AYANAMSA_VALUES,
|
|
DEFAULT_AYANAMSA,
|
|
isAyanamsaName,
|
|
resolveAyanamsa,
|
|
} from "../src/lib/ayanamsa.ts";
|
|
|
|
test("resolveAyanamsa defaults to Raman and accepts the six product values", () => {
|
|
assert.equal(DEFAULT_AYANAMSA, "raman");
|
|
assert.deepEqual([...AYANAMSA_VALUES], ["raman", "lahiri", "kp", "true_citra", "true_pushya", "fagan_bradley"]);
|
|
assert.equal(resolveAyanamsa(), "raman");
|
|
assert.equal(resolveAyanamsa(null), "raman");
|
|
assert.equal(resolveAyanamsa({}), "raman");
|
|
assert.equal(resolveAyanamsa({ ayanamsa: "lahiri" }), "lahiri");
|
|
assert.equal(resolveAyanamsa({ ayanamsa: "KP" }), "kp");
|
|
assert.equal(resolveAyanamsa({ ayanamsa: "krishnamurti" }), "kp");
|
|
assert.equal(resolveAyanamsa({ ayanamsa: "true-pushya" }), "true_pushya");
|
|
assert.equal(resolveAyanamsa({ ayanamsa: "fagan" }), "raman");
|
|
assert.equal(resolveAyanamsa({ ayanamsa: "djwhal_khul" }), "raman");
|
|
assert.equal(isAyanamsaName("raman"), true);
|
|
assert.equal(isAyanamsaName("sidereal"), false);
|
|
// 原值:/咨询、报告、星盘库和每日星语/;新值:/咨询、报告、星盘库、每日星语/;原因:列举里加了新开的生时校正,顿号接续。
|
|
assert.match(AYANAMSA_SWITCH_HINT, /咨询、报告、星盘库、每日星语/);
|
|
// 原值:/生时校正目前仍固定按 Raman/;新值:新开的校正跟设置、进行中的按开始时;
|
|
// 原因:校正开案时快照用户岁差,打分与段扫描都按快照(BUG-1309、BUG-1310),旧句说反了。
|
|
assert.match(AYANAMSA_SWITCH_HINT, /新开的生时校正会按新岁差算/);
|
|
assert.match(AYANAMSA_SWITCH_HINT, /已经开始的那次校正仍按开始时的岁差/);
|
|
assert.doesNotMatch(AYANAMSA_SWITCH_HINT, /固定按 Raman/);
|
|
});
|
|
|
|
// TASK-chart-types-and-report-buttons-20260928 T6: every offered value must
|
|
// come back unchanged — `resolveAyanamsa` silently falls back to Raman for an
|
|
// unknown value, so a value missing from AYANAMSA_VALUES would quietly turn a
|
|
// user's True Citra chart into a Raman one on every path.
|
|
test("each of the six ayanamsa values resolves to itself, never to the Raman fallback", () => {
|
|
for (const value of ["raman", "lahiri", "kp", "true_citra", "true_pushya", "fagan_bradley"]) {
|
|
assert.equal(resolveAyanamsa({ ayanamsa: value }), value);
|
|
assert.equal(resolveAyanamsa({ ayanamsa: value.toUpperCase().replace(/_/g, "-") }), value);
|
|
}
|
|
// Same alias the engine accepts (`scripts/ayanamsa_utils.py`).
|
|
assert.equal(resolveAyanamsa({ ayanamsa: "true_chitra" }), "true_citra");
|
|
assert.equal(resolveAyanamsa({ ayanamsa: "True-Chitra" }), "true_citra");
|
|
});
|
|
|
|
test("the settings list is exactly the six values in product order, only engine-supported ones", async () => {
|
|
const { AYANAMSA_OPTIONS } = await import("../src/lib/ayanamsa.ts");
|
|
assert.deepEqual(AYANAMSA_OPTIONS.map((option) => option.value), [...AYANAMSA_VALUES]);
|
|
assert.deepEqual(AYANAMSA_OPTIONS.map((option) => option.label), [
|
|
"Raman(默认)", "Lahiri", "KP", "True Citra", "True Pushya", "Fagan-Bradley",
|
|
]);
|
|
const { readFileSync } = await import("node:fs");
|
|
const engine = readFileSync(new URL("../../scripts/ayanamsa_utils.py", import.meta.url), "utf8");
|
|
for (const value of AYANAMSA_VALUES) assert.match(engine, new RegExp(`'${value}': getattr\\(swe`));
|
|
for (const option of AYANAMSA_OPTIONS) assert.ok(option.description.length > 0);
|
|
});
|