Files

85 lines
3.0 KiB
Python

from __future__ import annotations
import unittest
from backend.features.heaven.six_yao import (
_palace_map,
build_six_yao_chart,
)
class SixYaoEngineTests(unittest.TestCase):
def test_eight_palaces_cover_every_hexagram_once(self):
palaces = _palace_map()
self.assertEqual(len(palaces), 64)
self.assertEqual(
{item["trigram"] for item in palaces.values()},
{"乾", "兑", "离", "震", "巽", "坎", "艮", "坤"},
)
self.assertEqual(
{item["stage"] for item in palaces.values()},
{"本宫", "一世", "二世", "三世", "四世", "五世", "游魂", "归魂"},
)
def test_pure_qian_uses_standard_najia_and_self_response(self):
chart = build_six_yao_chart(
[7, 7, 7, 7, 7, 7],
"2026-08-04T10:30:00+08:00",
)
self.assertEqual(chart["palace"]["name"], "乾宫")
self.assertEqual(chart["palace"]["stage"], "本宫")
self.assertEqual(chart["palace"]["self_position"], 6)
self.assertEqual(chart["palace"]["response_position"], 3)
self.assertEqual(
[(line["stem"], line["branch"]) for line in chart["lines"]],
[("甲", "子"), ("甲", "寅"), ("甲", "辰"), ("壬", "午"), ("壬", "申"), ("壬", "戌")],
)
self.assertEqual(
[line["relative"] for line in chart["lines"]],
["子孙", "妻财", "父母", "官鬼", "兄弟", "父母"],
)
self.assertEqual(chart["branch_pattern"], "六冲")
def test_pure_kun_uses_standard_najia(self):
chart = build_six_yao_chart(
[8, 8, 8, 8, 8, 8],
"2026-08-04T10:30:00+08:00",
)
self.assertEqual(chart["palace"]["name"], "坤宫")
self.assertEqual(
[(line["stem"], line["branch"]) for line in chart["lines"]],
[("乙", "未"), ("乙", "巳"), ("乙", "卯"), ("癸", "丑"), ("癸", "亥"), ("癸", "酉")],
)
def test_cast_time_drives_day_void_and_six_spirits(self):
chart = build_six_yao_chart(
[7, 7, 7, 7, 7, 7],
"2026-08-04T02:30:00Z",
)
self.assertEqual(chart["cast_at"], "2026-08-04T10:30:00+08:00")
self.assertEqual(chart["calendar"]["day"], "庚戌")
self.assertEqual(chart["calendar"]["day_void"], "寅卯")
self.assertEqual(
[line["spirit"] for line in chart["lines"]],
["白虎", "玄武", "青龙", "朱雀", "勾陈", "螣蛇"],
)
def test_moving_line_has_deterministic_transformation(self):
chart = build_six_yao_chart(
[6, 7, 8, 9, 7, 8],
"2026-08-04T10:30:00+08:00",
)
moving = [line for line in chart["lines"] if line["moving"]]
self.assertEqual([line["position"] for line in moving], [1, 4])
self.assertTrue(all(line.get("transformation") for line in moving))
self.assertFalse(any(line.get("transformation") for line in chart["lines"] if not line["moving"]))
if __name__ == "__main__":
unittest.main()