Files
Aislo/resources/tester/test_370_3_rock_cell.py
T
eomsangdonandClaude Opus 5.5 75f4cc982f fix(B06 횡단): 암 경계선 판정 선을 설계선 판정 아래로 — 사면 발치 겹친 자리는 사면이 먼저 골라짐 (370-3)
- 화면 검증에서 1+0 우 절토 사면 누름이 암 판정 선에 먹힘 · 그리는 차례만 아래로(키 차례 그대로)
- test_370_3 판정 선 「설계선 판정 아래」 확인 · helper insertBefore 참조 자리 따름

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014utrjfoW831Vc5wJUd13kL
2026-10-17 13:16:57 +09:00

94 lines
4.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""PLAN 370-3 — B06 암 경계선 고름 · 방향키 · 세로 끌기 · 아래 띠 공용 칸(요구 240-22).
짝: `B06_Section/B06_Section_UI_Cross_Design_Pick.ts`(rock 축 · 판정 선) ·
`B06_Section/B06_Section_UI_Cross_Line_Cell.ts`(공용 칸) · `B06_Section_UI_Cross_Center.ts`(`bindAxisDrag`).
실제 TS 를 `helper_370_3_rock_cell.cjs` 가 Node 로 돌린다.
"""
from __future__ import annotations
import json
import subprocess
from pathlib import Path
import pytest
ROOT = Path(__file__).resolve().parents[2]
HELPER = Path(__file__).parent / "helper_370_3_rock_cell.cjs"
B06 = ROOT / "B06_Section"
pytestmark = pytest.mark.skipif(
not (ROOT / "config" / "node_modules").is_dir(), reason="프론트엔드 의존성 미설치"
)
@pytest.fixture(scope="module")
def out() -> dict:
done = subprocess.run( # noqa: S603 — 고정 실행 파일
["node", str(HELPER)], cwd=str(ROOT), capture_output=True, text=True, encoding="utf-8"
)
assert done.returncode == 0, done.stderr
return json.loads(done.stdout)
def test_안_고르면_공용_칸은_암_버튼과_값(out: dict) -> None:
idle = out["idle"]
assert idle["title"] == "암 경계선" and idle["value"] == "-0.5m"
assert idle["slots"] == ["up", "reset", "down"]
assert idle["upPassed"] is True # 안 고르면 ▲▼ = 종단 계획고 그대로
assert idle["offsets"] == [0.1, -0.1] and idle["resets"] == 1
def test_암_경계선_판정_선(out: dict) -> None:
hit = out["hit"]
assert hit["found"] and hit["tag"] == "path" and hit["moves"] == 2 # 끊긴 두 토막 한 판정
assert hit["below"] and hit["picked"] == [3] # 설계선 판정 아래 · 키 차례 = 조각 셋 뒤
def test_암_고름은_위아래만_암_키는_암만(out: dict) -> None:
got = out["picked"]
assert got["active"] and got["key"] # 키 rock 으로 기억
assert got["title"] == "암 경계선" and got["slots"] == ["up", "reset", "down"]
assert got["leftBlocked"] and got["rightBlocked"] # ◀▶ 막음
assert got["upTaken"] and got["downTaken"] # ▲▼ = 암(종단으로 안 샘)
assert got["sideValues"] == {"left": 0, "right": 0}
assert got["offsets"][:2] == [0.1, -0.1]
def test_세로_끌기는_놓을_때_한_번(out: dict) -> None:
drag = out["drag"]
assert drag["stopped"] is True # 카드 팬으로 안 번짐
assert drag["during"]["rock"] == drag["during"]["hit"] # 점선 · 판정 선 같이
dy = float(drag["during"]["rock"].split()[1].removesuffix("px"))
assert abs(dy - (-0.3 * 12)) < 1e-9 # 위로 0.3 m(화면 px = m × 12)
assert drag["during"]["value"] == "-0.2m — 놓으면 반영"
assert drag["sent"] == [0.3] # 0.34 m → 걸음 0.1 맞춤 · 한 번
assert drag["clickSwallowed"] is True
assert out["idleDrag"]["stopped"] is False # 안 고르면 끌기 아님
def test_풀면_암_칸_사면_고르면_그_선_칸(out: dict) -> None:
assert out["released"]["title"] == "암 경계선" and out["released"]["upPassed"]
slope = out["slope"]
assert slope["title"] == "사면 이동 (좌)" and slope["slots"] == ["left", "reset", "right"]
assert slope["value"].startswith("길이 ") and "\n" not in slope["value"]
assert slope["arrowSlots"] == slope["slots"] # 숨은 버튼은 방향키 슬롯 없음
def test_토사는_빈_칸_판정_선_없음(out: dict) -> None:
soil = out["soil"]
assert soil["empty"] is True and soil["slots"] == [] and soil["rockHit"] is False
def test_배선_떠_있는_선_조정창_걷음() -> None:
pick = (B06 / "B06_Section_UI_Cross_Design_Pick.ts").read_text(encoding="utf-8")
assert "buildPanelShell" not in pick and "b06-cross-card__line-dims" not in pick
view = (B06 / "B06_Section_UI_Cross_View.ts").read_text(encoding="utf-8")
assert "rockBoundary && rockCellSpec(section, rockBoundary)" in view
chrome = (B06 / "B06_Section_UI_Cross_Card_Chrome.ts").read_text(encoding="utf-8")
assert "if (lineCell) {" in chrome
detail = (B06 / "B06_Section_UI_Cross_Detail_Pick.ts").read_text(encoding="utf-8")
assert ".b06-chart__design-hit:not(.b06-chart__rock-hit)" in detail # 상세 표 강조에 안 섞임
css = (B06 / "B06_Section_UI_Style_Cross.css").read_text(encoding="utf-8")
assert ".b06-cross-card__linecell.is-empty {" in css and "text-overflow: ellipsis;" in css