신경성 식욕부진증 문서의 검증 코드다. if __name__ == "__main__": 아래가 자체 테스트다.
"""신경성 식욕부진증 문서의 BMI 계산과 심각도 분류를 검증한다.
BMI = 몸무게(kg) / 키(m)^2
DSM-5-TR 성인 심각도: 경도 BMI >= 17, 중등도 16 <= BMI < 17,
고도 15 <= BMI < 16, 극도 BMI < 15.
"""
def bmi(weight_kg: float, height_m: float) -> float:
return weight_kg / height_m ** 2
def severity(b: float) -> str:
if b >= 17:
return "경도"
if b >= 16:
return "중등도"
if b >= 15:
return "고도"
return "극도"
if __name__ == "__main__":
# 문서와 연습 문제에 나오는 사례: (이름, 키 m, 몸무게 kg, 기대 BMI 소수 둘째 자리, 기대 심각도)
cases = [
("FP", 1.60, 38, 14.84, "극도"), # 088 예시, 089 예시
("FU", 1.65, 45, 16.53, "중등도"), # 089 C2
("FV", 1.58, 42, 16.82, "중등도"), # 연습 문제 1
("FW", 1.70, 50, 17.30, "경도"), # 089 C2
("FX", 1.62, 39, 14.86, "극도"), # 연습 문제 4
("FY", 1.58, 38, 15.22, "고도"), # 089 C4
]
for name, h, w, want_b, want_s in cases:
b = bmi(w, h)
assert round(b, 2) == want_b, (name, b)
assert severity(b) == want_s, (name, b, severity(b))
print(f"{name}: BMI {b:.2f} -> {severity(b)}")
# 신경성 폭식증 예시(FZ): 정상 체중 범위(18.5 이상 25 미만)
fz = bmi(55, 1.63)
assert round(fz, 2) == 20.70 and 18.5 <= fz < 25, fz
print(f"FZ: BMI {fz:.2f} -> 정상 범위")
# 섭식장애 사례 연습 문제 2(GP, 정상)와 3(GQ, 비만 30 이상)
gp, gq = bmi(60, 1.65), bmi(95, 1.70)
assert round(gp, 2) == 22.04 and 18.5 <= gp < 25, gp
assert round(gq, 2) == 32.87 and gq >= 30, gq
print(f"GP: BMI {gp:.2f}, GQ: BMI {gq:.2f}")
# 경계값: 17.0은 경도, 16.99는 중등도, 15.0은 고도, 14.99는 극도
assert severity(17.0) == "경도"
assert severity(16.99) == "중등도"
assert severity(16.0) == "중등도"
assert severity(15.99) == "고도"
assert severity(15.0) == "고도"
assert severity(14.99) == "극도"
print("경계값 6개 통과")
print("ALL CHECKS PASSED")