fix(M01): 식 해석기 흠 셋 — 단위 없는 맨 수 · 「식 = 이름」 꼴 · 비목 안 고른 덧줄
· 단위 칸에 「없음」(맨수 · - · % · 빈 글)을 골라 무차원으로 둘 수 있게 함 — 횟수·배율을 「회」 로 두어 「원/회」 가 남던 덧셈 검사 걸림을 풂 · 같은 단위끼리 나누면 맨 수가 되는 것도 맞음 · 줄을 「이름 = 식」 과 「식 = 이름」(A * B = C) 둘 다 받음 — 한쪽이 값 이름 하나면 그쪽이 이름 · 양쪽이 다 식이면 그 줄의 등호 자리를 짚음 · 괄호 안 등호와 비교 기호는 안 가름 · 비목 안 고른 덧줄을 「못 옮김」 으로 막지 않고 그 값의 「정할것」 에 「비목」 을 얹어 짚어 줌 · 돈 아닌 로직은 덧줄이 없어 안 물음 · 계약 _화면_계약.md 8장(다른 창이 7장을 먼저 씀) · 시험 test_m01_draft.py 18개 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V1MKKZKpUHTPKb513FneU8
This commit is contained in:
@@ -133,6 +133,31 @@ def test_만약과_최소는_갈래마다_단위가_같아야_한다() -> None:
|
||||
assert md.read("값 = 최소(길이, 길이 * 2)", 정함)["문제"] == []
|
||||
|
||||
|
||||
def test_단위_없음을_골라_맨_수로_다룬다() -> None:
|
||||
"""횟수 · 배율 — 단위 칸에 「없음」 을 고르면 무차원(3-3 화면 흠 ①)."""
|
||||
회 = {"금액": {"무엇": "설계입력", "단위": "원"}, "전용": {"무엇": "설계입력", "단위": "회"}}
|
||||
got = md.read("몫 = 금액 / 전용\n계금액 = 몫 + 금액", 회)
|
||||
assert _var(got, "몫")["단위"] == "원/회" # 「회」 로 두면 덧셈에서 걸림
|
||||
assert [x["갈래"] for x in got["문제"]] == ["단위"]
|
||||
|
||||
맨수 = dict(회, 전용={"무엇": "설계입력", "단위": "없음"})
|
||||
깨끗 = md.read("몫 = 금액 / 전용\n계금액 = 몫 + 금액", 맨수)
|
||||
assert _var(깨끗, "몫")["단위"] == "원" and 깨끗["문제"] == []
|
||||
assert _var(깨끗, "전용")["단위"] == "" and _var(깨끗, "전용")["정할것"] == []
|
||||
for 글 in ("", "맨수", "-", "%"):
|
||||
쓴 = dict(회, 전용={"무엇": "설계입력", "단위": 글})
|
||||
assert md.read("몫 = 금액 / 전용\n계금액 = 몫 + 금액", 쓴)["문제"] == [], 글
|
||||
없으면 = dict(회, 전용={"무엇": "설계입력"}) # 단위 칸 자체가 없으면 아직 안 정한 것
|
||||
assert _var(md.read("몫 = 금액 / 전용", 없으면), "전용")["정할것"] == ["단위"]
|
||||
|
||||
|
||||
def test_나눗셈으로_단위가_없어진다() -> None:
|
||||
정함 = {"길이": {"무엇": "설계입력", "단위": "m"}, "넓이": {"무엇": "설계입력", "단위": "㎡"}}
|
||||
assert _var(md.read("폭 = 넓이 / 길이", 정함), "폭")["단위"] == "m"
|
||||
assert _var(md.read("비 = 길이 / 길이", 정함), "비")["단위"] == "" # 같은 단위끼리 나누면 맨 수
|
||||
assert md.read("합 = 길이 / 길이 + 2", 정함)["문제"] == []
|
||||
|
||||
|
||||
# ── ③ 그 밖 검사 ──────────────────────────────────────────────────────
|
||||
def test_서로_물고_도는_식을_잡는다() -> None:
|
||||
kinds = [x["갈래"] for x in md.read(LOOP)["문제"]]
|
||||
@@ -152,6 +177,29 @@ def test_두_번_정의_안_쓰임_결과_하나() -> None:
|
||||
assert md.read("이건 식이 아님")["문제"][0]["갈래"] == "못읽음"
|
||||
|
||||
|
||||
def test_식이_왼쪽에_와도_받는다() -> None:
|
||||
"""「A * B = C」 로 적는 사용자도 있음(3-3 화면 흠 ②)."""
|
||||
정함 = {"길이": {"무엇": "설계입력", "단위": "m"}, "폭": {"무엇": "설계입력", "단위": "m"}}
|
||||
got = md.read("길이 * 폭 = 넓이", 정함)
|
||||
assert got["문제"] == [] and got["결과"] == "넓이"
|
||||
assert _var(got, "넓이")["갈래"] == "정의됨" and _var(got, "넓이")["단위"] == "㎡"
|
||||
assert got["줄"][0]["식"] == "길이 * 폭"
|
||||
assert md.read("넓이 = 길이 * 폭", 정함)["변수"] == got["변수"] # 어느 쪽으로 적든 같음
|
||||
|
||||
양쪽 = md.read("길이 * 폭 = 넓이 * 2", 정함)["문제"]
|
||||
assert 양쪽[0]["갈래"] == "못읽음" and "양쪽이 다 식" in 양쪽[0]["말"]
|
||||
assert 양쪽[0]["자리"] == "길이 * 폭 = 넓이 * 2".index("=")
|
||||
assert md.read("길이 * 폭 = 4", 정함)["문제"][0]["갈래"] == "못읽음" # 맨 수는 이름이 아님
|
||||
|
||||
|
||||
def test_비교_기호와_찾기_안_등호는_안_가른다() -> None:
|
||||
정함 = {"높이": {"무엇": "설계입력", "단위": "m"}}
|
||||
assert md.read("값 = 만약(높이 <= 3, 1, 2)", 정함)["문제"] == []
|
||||
assert md.read("값 = 만약(높이 == 3, 1, 2)", 정함)["문제"] == []
|
||||
안쪽 = md.read("품 = 찾기(QF000421, 뒷길이=높이).석공", 정함)
|
||||
assert 안쪽["문제"] == [] and 안쪽["줄"][0]["이름"] == "품"
|
||||
|
||||
|
||||
# ── ⑤ 로직 틀로 옮기기 ────────────────────────────────────────────────
|
||||
def test_다_정하면_로직_틀로_옮긴다() -> None:
|
||||
row, bad = md.옮기기(GOOD, GOOD_정함, GOOD_머리)
|
||||
@@ -192,6 +240,22 @@ def test_덜_정했으면_안_옮긴다() -> None:
|
||||
assert row == {} and any(x["갈래"] == "덜정함" for x in bad)
|
||||
|
||||
|
||||
def test_비목_안_고른_덧줄은_막지_않고_짚어_준다() -> None:
|
||||
"""「못 옮김」 으로 막지 않고 그 값에 「비목」 을 정할 것으로 얹음(3-3 화면 흠 ③)."""
|
||||
빼기 = {k: v for k, v in GOOD_정함.items() if k != "잡재료비"}
|
||||
got = md.read(GOOD, 빼기, GOOD_머리)
|
||||
assert _var(got, "잡재료비")["정할것"] == ["비목"] and got["다됨"] is False
|
||||
assert [x["갈래"] for x in got["문제"]] == [] # 검사에는 안 걸림 — 고를 것이 남았을 뿐
|
||||
|
||||
row, bad = md.옮기기(GOOD, 빼기, GOOD_머리)
|
||||
assert row == {} and [x["갈래"] for x in bad] == ["덜정함"]
|
||||
assert "잡재료비" in bad[0]["말"] and "비목" in bad[0]["말"]
|
||||
assert _var(md.read(GOOD, GOOD_정함, GOOD_머리), "잡재료비")["정할것"] == []
|
||||
|
||||
안돈 = md.read(GOOD, 빼기, {"이름": "수량만", "결과단위": "㎥"}) # 돈 아닌 로직은 덧줄이 없음
|
||||
assert _var(안돈, "잡재료비")["정할것"] == []
|
||||
|
||||
|
||||
# ── 서버 길 ───────────────────────────────────────────────────────────
|
||||
def test_서버_길이_변수와_문제를_돌려_준다(client: TestClient) -> None:
|
||||
got = _post(client, {"text": GOOD, "decided": GOOD_정함})
|
||||
|
||||
Reference in New Issue
Block a user