- 레인 쌓임 층 풂 · 라벨 z 6 — ▲▼ 단추층 · 고정 Y축 · 테이블 · 유토곡선 위 - 라벨을 그래프 바닥 ▼ 단추 높이만큼 위로 · 위가 잘리면 덜 잘리는 쪽(알약 아래) - 줄 = 종류 이름 · 기준 측점 · 좌측 폼 컨테이너마다 첫 옵션 값 · 빈 값 (기본) · auto (자동) · 메모 뺌 - B05 · B06 공용 레인 한 곳 · 시험 test_54_14_balloon_lines · ORCA 시나리오 54-14_알약_라벨 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MPcuokNm1ZR2kqgGGDfaJA
100 lines
3.9 KiB
Python
100 lines
3.9 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""54-14 종단 구조물 알약 정보 라벨 — 중요한 것만.
|
||
|
||
• 줄 = 이름 · 기준 측점 · 컨테이너마다 첫 옵션 값 한 줄(컨테이너가 없으면 앞 두 줄만)
|
||
• 컨테이너 = 좌측 패널 폼과 같은 상자(명세 컨테이너 · 선택 컨테이너는 인스턴스마다 · 정의 옵션 그룹)
|
||
• 빈 값 = 등록부 기본값 「(기본)」 · 값 auto = 「(자동)」 · 그것도 없으면 「—」 · 메모 · 그 밖 옵션은 안 씀
|
||
• 라벨은 ▲▼ 단추층 위 · 단추 높이만큼 위로 비킴 · B05 · B06 은 같은 레인 — 실제 화면은 ORCA 로 따로 본다.
|
||
화면 그릇 없이 Node 헬퍼가 TS 를 트랜스파일해 돌린다(`helper_54_14_balloon_lines.cjs`).
|
||
"""
|
||
|
||
import json
|
||
import os
|
||
import subprocess
|
||
|
||
import pytest
|
||
|
||
HERE = os.path.dirname(os.path.abspath(__file__))
|
||
ROOT = os.path.abspath(os.path.join(HERE, "..", ".."))
|
||
MARKS = os.path.join(ROOT, "B05_Profile", "B05_Profile_UI_Structures_Marks.ts")
|
||
STYLE = os.path.join(ROOT, "B05_Profile", "B05_Profile_UI_Style_Structures.css")
|
||
|
||
|
||
@pytest.fixture(scope="module")
|
||
def out():
|
||
proc = subprocess.run(
|
||
["node", os.path.join(HERE, "helper_54_14_balloon_lines.cjs")],
|
||
capture_output=True,
|
||
text=True,
|
||
encoding="utf-8",
|
||
timeout=60,
|
||
)
|
||
assert proc.returncode == 0, proc.stderr
|
||
return json.loads(proc.stdout)
|
||
|
||
|
||
def test_배관_컨테이너마다_첫_값_한_줄(out):
|
||
assert out["pipeFull"] == [
|
||
"이름",
|
||
"5+0",
|
||
"관: 관경 1200",
|
||
"관 보호공(유입): 구조 집수정",
|
||
"관 보호공(유출): 구조 흙막이",
|
||
"흙막이 1: 구조 흙막이",
|
||
"도수로/돌붙임 1: 구조 도수로",
|
||
]
|
||
|
||
|
||
def test_빈_값은_등록부_기본값에_기본_표시(out):
|
||
assert out["pipeBlank"] == [
|
||
"이름",
|
||
"5+0",
|
||
"관: 관경 1000 (기본)",
|
||
"관 보호공(유입): 구조 흙막이 (기본)",
|
||
"관 보호공(유출): 구조 —",
|
||
]
|
||
|
||
|
||
def test_흙막이_상자_수는_밖에서_정한_단_수(out):
|
||
assert out["pipeCount"][-2:] == ["흙막이 1: 구조 흙막이", "흙막이 2: 구조 —"]
|
||
assert len(out["pipeCount"]) == 2 + 3 + 2
|
||
|
||
|
||
def test_박스_본체_규격은_폭_높이로_되찾음(out):
|
||
assert out["boxPreset"] == [
|
||
"이름",
|
||
"5+0",
|
||
"본체: 본체 규격 3.0 × 3.0",
|
||
"유입 구조: 구조 날개벽",
|
||
"유출 구조: 구조 —",
|
||
]
|
||
assert out["boxBlank"][2] == "본체: 본체 규격 2.0 × 2.0 (기본)"
|
||
|
||
|
||
def test_정의_옵션_그룹은_그룹마다_첫_켜진_옵션(out):
|
||
assert out["underdrain"] == ["이름", "5+0", "맹암거: 높이 0.6m"]
|
||
assert out["underdrainBlank"] == ["이름", "5+0", "맹암거: 높이 —"]
|
||
# 끈 칸(높이)은 건너뜀 · 빈 값은 기본값
|
||
assert out["wall"] == ["이름", "5+0", "상세 내용: 길이 10m (기본)"]
|
||
assert out["wallAuto"] == ["이름", "5+0", "상세 내용: 길이 (자동)"]
|
||
|
||
|
||
def test_컨테이너가_없으면_이름과_기준_측점만(out):
|
||
assert out["mirror"] == ["이름", "5+0"]
|
||
assert out["etcEmpty"] == ["이름", "5+0"]
|
||
assert out["etcNote"] == ["이름", "5+0", "상세 내용 1: 비고 시험 비고"]
|
||
|
||
|
||
def test_라벨은_단추층_위로_비켜_뜬다():
|
||
with open(MARKS, encoding="utf-8") as handle:
|
||
marks = handle.read()
|
||
with open(STYLE, encoding="utf-8") as handle:
|
||
style = handle.read()
|
||
assert "EDIT_BUTTON_CLEARANCE_PX = 21" in marks
|
||
assert "ROW_GAP_PX + EDIT_BUTTON_CLEARANCE_PX" in marks
|
||
assert "balloonLines(" in marks and "structure.memo" not in marks
|
||
lane = style.split(".b05-structure__lane {", 1)[1].split("}", 1)[0]
|
||
assert "z-index" not in lane # 레인이 쌓임 층을 만들면 라벨이 그 안에 갇힘
|
||
balloon = style.split(".b05-structure__balloon {", 1)[1].split("}", 1)[0]
|
||
assert balloon.count("z-index") == 1 and "z-index: 6;" in balloon
|