- 카드 = 로직 이름 · 결과단위 묶음 아래 입력 줄(이름 · 설명 · 단위 · 고르기/범위 · 자동값 흐리게) + 자리 상자 · 처음은 모두 안 씀 - 저장 = 집계표 [저장]에 이어 PUT input-links(자동저장 없음) · 읽기만 층은 상자 잠금 - 면적 · 재료로 고른 입력은 그 시트 알약 줄에 「로직 이름 · 입력 이름」 · 자재 모드에서도 [목록에서 빼기] 막음(고정) - 알약 줄 시험을 합계 줄 아래 자리에 맞춤(25-0 뒤 어긋난 것) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D2nUMUMTsqm93PbQtipo6c
81 lines
3.1 KiB
Python
81 lines
3.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""M02 「선택 입력」 카드(PLAN 25-2c) 셈 회귀검증 — 입력 키 · 알약 키 · 자리 고름 · 줄 만들기 · 알약 목록.
|
|
|
|
같은 이름의 입력도 로직마다 따로(키 `{로직}|{이름}`) · 처음은 모두 「안 씀」(저장 줄 없음) ·
|
|
면적 · 재료로 고른 입력만 그 시트 알약(`입력|{로직}|{이름}` · 「로직 이름 · 입력 이름」).
|
|
Node 헬퍼(`helper_m02_inputs.cjs`)가 TS 를 트랜스파일해 돌리고, 여기서 값을 판정한다.
|
|
"""
|
|
|
|
import json
|
|
import os
|
|
import subprocess
|
|
|
|
import pytest
|
|
|
|
HERE = os.path.dirname(os.path.abspath(__file__))
|
|
ROOT = os.path.join(HERE, "..", "..")
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def results():
|
|
proc = subprocess.run(
|
|
["node", os.path.join(HERE, "helper_m02_inputs.cjs")],
|
|
capture_output=True,
|
|
text=True,
|
|
encoding="utf-8",
|
|
timeout=60,
|
|
)
|
|
assert proc.returncode == 0, proc.stderr
|
|
return json.loads(proc.stdout)
|
|
|
|
|
|
def test_키_모양(results):
|
|
assert results["keys"] == ["GC1|높이", "입력|GC2|높이"]
|
|
|
|
|
|
def test_자리는_고른_것만_안_쓰면_없음(results):
|
|
assert results["seatKeys"] == ["GC1|높이", "GC2|높이", "GC2|배합", "GC9|없는것"]
|
|
assert results["none"] == [] # 처음은 모두 안 씀 — 저장할 줄 없음
|
|
|
|
|
|
def test_로직_수_입력_수(results):
|
|
assert results["count"] == {"logics": 2, "inputs": 4}
|
|
|
|
|
|
def test_같은_이름_입력도_로직마다_따로_알약(results):
|
|
# 높이가 두 로직에 있어도 알약 둘 · 이름은 「로직 이름 · 입력 이름」 · 목록에서 못 뺌(고정)
|
|
assert results["area"] == [
|
|
["입력|GC1|높이", "돌쌓기 · 높이", "m", True],
|
|
["입력|GC2|높이", "타설 · 높이", None, True],
|
|
]
|
|
assert results["material"] == [["입력|GC2|배합", "타설 · 배합"]]
|
|
|
|
|
|
def test_저장_줄은_고른_것만_알약_키_함께(results):
|
|
assert results["lines"] == [
|
|
{"로직": "GC1", "입력": "높이", "자리": "면적", "알약": "입력|GC1|높이"},
|
|
{"로직": "GC1", "입력": "종류", "자리": "선택"}, # 선택은 알약 없음
|
|
{"로직": "GC2", "입력": "높이", "자리": "면적", "알약": "입력|GC2|높이"},
|
|
{"로직": "GC2", "입력": "배합", "자리": "재료", "알약": "입력|GC2|배합"},
|
|
]
|
|
|
|
|
|
def test_고르기_범위_자동값_글(results):
|
|
assert results["hints"] == [
|
|
["0.5 ~ 5", "1.2"],
|
|
["막돌 / 견치돌", ""],
|
|
["0 ~ 3", ""],
|
|
["", ""],
|
|
]
|
|
assert results["seatOptions"] == ["안 씀", "면적산출 알약", "재료산출 알약", "선택"]
|
|
|
|
|
|
def test_카드는_집계표_카드_옆_넷째_그리고_700줄_안():
|
|
page = os.path.join(ROOT, "M02_MasterTemplete")
|
|
src = open(os.path.join(page, "M02_MasterTemplete_Structure.ts"), encoding="utf-8").read()
|
|
assert "inputs.root" in src and "createInputsCard" in src
|
|
for name in os.listdir(page):
|
|
if name.endswith((".ts", ".py")):
|
|
n = len(open(os.path.join(page, name), encoding="utf-8").read().splitlines())
|
|
assert n <= 700, (name, n)
|