diff --git a/saju-lab/app/calculator/constants.py b/saju-lab/app/calculator/constants.py new file mode 100644 index 0000000..4a2b103 --- /dev/null +++ b/saju-lab/app/calculator/constants.py @@ -0,0 +1,66 @@ +"""사주 계산 상수 — saju-web/lib/saju-calculator.ts 의 상수와 1:1 매핑.""" + +HEAVENLY_STEMS = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"] +HEAVENLY_STEMS_KR = ["갑", "을", "병", "정", "무", "기", "경", "신", "임", "계"] + +EARTHLY_BRANCHES = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"] +EARTHLY_BRANCHES_KR = ["자", "축", "인", "묘", "진", "사", "오", "미", "신", "유", "술", "해"] + +FIVE_ELEMENTS = { + "甲": "木", "乙": "木", + "丙": "火", "丁": "火", + "戊": "土", "己": "土", + "庚": "金", "辛": "金", + "壬": "水", "癸": "水", + "寅": "木", "卯": "木", + "巳": "火", "午": "火", + "辰": "土", "戌": "土", "丑": "土", "未": "土", + "申": "金", "酉": "金", + "子": "水", "亥": "水", +} + +FIVE_ELEMENTS_KR = { + "木": "목", "火": "화", "土": "토", "金": "금", "水": "수", +} + +IS_YANG_STEM = { + "甲": True, "乙": False, + "丙": True, "丁": False, + "戊": True, "己": False, + "庚": True, "辛": False, + "壬": True, "癸": False, +} + +IS_YANG_BRANCH = { + "子": True, "丑": False, + "寅": True, "卯": False, + "辰": True, "巳": False, + "午": True, "未": False, + "申": True, "酉": False, + "戌": True, "亥": False, +} + +# 지장간: { 지지: [본기, 중기, 여기] (없으면 생략) } +HIDDEN_STEMS = { + "子": ["癸"], + "丑": ["己", "癸", "辛"], + "寅": ["甲", "丙", "戊"], + "卯": ["乙"], + "辰": ["戊", "乙", "癸"], + "巳": ["丙", "庚", "戊"], + "午": ["丁", "己"], + "未": ["己", "丁", "乙"], + "申": ["庚", "壬", "戊"], + "酉": ["辛"], + "戌": ["戊", "辛", "丁"], + "亥": ["壬", "甲"], +} + +# 본기, 중기, 여기 가중치 +HIDDEN_STEM_WEIGHTS = [1.0, 0.5, 0.3] + +# 상생 사이클 (목→화→토→금→수→목) +SHENG_CYCLE = {"木": "火", "火": "土", "土": "金", "金": "水", "水": "木"} + +# 상극 사이클 (목→토→수→화→금→목) +KE_CYCLE = {"木": "土", "土": "水", "水": "火", "火": "金", "金": "木"} diff --git a/saju-lab/tests/test_constants.py b/saju-lab/tests/test_constants.py new file mode 100644 index 0000000..25701fd --- /dev/null +++ b/saju-lab/tests/test_constants.py @@ -0,0 +1,34 @@ +from app.calculator import constants + + +def test_heavenly_stems_10(): + assert len(constants.HEAVENLY_STEMS) == 10 + assert constants.HEAVENLY_STEMS[0] == "甲" + assert constants.HEAVENLY_STEMS[9] == "癸" + + +def test_earthly_branches_12(): + assert len(constants.EARTHLY_BRANCHES) == 12 + assert constants.EARTHLY_BRANCHES[0] == "子" + assert constants.EARTHLY_BRANCHES[11] == "亥" + + +def test_five_elements_mapping(): + assert constants.FIVE_ELEMENTS["甲"] == "木" + assert constants.FIVE_ELEMENTS["丁"] == "火" + assert constants.FIVE_ELEMENTS["亥"] == "水" + assert constants.FIVE_ELEMENTS["申"] == "金" + assert constants.FIVE_ELEMENTS["未"] == "土" + + +def test_hidden_stems(): + assert constants.HIDDEN_STEMS["子"] == ["癸"] + assert constants.HIDDEN_STEMS["丑"] == ["己", "癸", "辛"] + assert constants.HIDDEN_STEMS["寅"] == ["甲", "丙", "戊"] + + +def test_yang_yin_stems(): + assert constants.IS_YANG_STEM["甲"] is True + assert constants.IS_YANG_STEM["乙"] is False + assert constants.IS_YANG_STEM["庚"] is True + assert constants.IS_YANG_STEM["辛"] is False