feat(master_data): 로직마다 시험 계산용 기본 입력 · check_master 계산전부

- 로직 줄에 「시험입력」 칸 — 시험 계산 전용(정본 계산은 화면 값만 씀) · 규격·직경은 원문 표 첫 값 · 자재지역은 울진(모래 줄 없는 넷은 포항)
- check_master 에 `시험입력()` · `calc_all()` · 「계산전부」 모드
- 일괄 시험 계산 통과 1,219 → 1,270 · 멈춤 135 → 84(모두 데이터 결손 — 관리자 값 65 · 품셈재료 규격 미지정 13 · 지역 줄 없음 1 · 고르기 조합 없음 5)
- 시험 둘 추가(test_masterdata_check.py)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
This commit is contained in:
2026-09-20 22:56:28 +09:00
co-authored by Claude Opus 5
parent 2e304f5216
commit c81853b4cd
14 changed files with 121 additions and 0 deletions
@@ -554,6 +554,36 @@ def show(result: dict) -> str:
return "\n".join(rows)
def 시험입력(row: dict) -> dict:
"""일괄 시험 계산용 입력 한 벌 — 고르기 첫 값 · 범위 위끝 · 줄의 「시험입력」 이 이김.
시험 계산 전용 — 정본 계산은 화면이 준 값만 씀."""
given = {}
for spec in row.get("입력", []):
if "고르기" in spec:
given[spec["이름"]] = spec["고르기"][0]
elif "범위" in spec:
given[spec["이름"]] = spec["범위"][1]
else:
given[spec["이름"]] = Decimal(1)
given.update(row.get("시험입력") or {})
return given
def calc_all(files: dict[str, dict], whole: mf.Master) -> tuple[int, list[str]]:
"""로직 전부를 시험 입력으로 돌림 — (통과 수, 멈춘 줄 목록)."""
passed, stuck = 0, []
for data in files.values():
if data.get("그룹") != "로직":
continue
for row in data.get("", []):
try:
mf.run(whole, str(row[""]), 시험입력(row))
passed += 1
except mf.FormulaError as err:
stuck.append(f"{row['']} {row.get('이름')} · {err}")
return passed, stuck
def _value(text: str):
try:
return Decimal(text)
@@ -567,6 +597,13 @@ def main(argv: list[str]) -> int:
given = dict(arg.split("=", 1) for arg in argv[2:])
print(show(mf.run(master(), argv[1], {k: _value(v) for k, v in given.items()})))
return 0
if mode == "계산전부":
files, whole = load(), master()
passed, stuck = calc_all(files, whole)
print(f"(계산) 통과 {passed} · 멈춤 {len(stuck)}")
for line in stuck:
print(" " + line)
return 0
names = argv[1:] or None
files, whole = load(names), master()
report = {}
@@ -13,6 +13,7 @@
"출처": "건설품셈 기계설비 1-1-1",
"소유": "공용",
"비고": "용접접합 자재는 별도 계상(주③) — 원문 1-1-1 재료표 없음 · 크레인·지게차 이동비 별도(주④) · 고소 감산·TIG 가산이 겹치면 공통 1-4-2 할증 중복가산(합산)",
"시험입력": {"규격": 15.0},
"입력": [
{
"이름": "규격",
@@ -70,6 +71,7 @@
"출처": "건설품셈 기계설비 1-2-1",
"소유": "공용",
"비고": "소모재료는 1-2-1 Brazing 소모재료 표(g → ㎏ 환산) · 해석: 용접봉 = 인동납 BCuP-3 · 산소는 대기압 기준량 · 규격 250㎜ 는 원문 재료표에 없음(계산 멈춤) · 크레인·지게차 이동비 별도(주④)",
"시험입력": {"규격": 8.0},
"입력": [
{
"이름": "규격",
@@ -157,6 +159,7 @@
"출처": "건설품셈 기계설비 1-3-1",
"소유": "공용",
"비고": "소모재료는 1-3-1 TIG용접 소모재료 표 — 규격 6·8·10·32㎜ 는 원문 재료표에 없음(계산 멈춤) · 크레인·지게차 이동비 별도(주④)",
"시험입력": {"규격": 65.0},
"입력": [
{
"이름": "규격",
@@ -226,6 +229,7 @@
"출처": "건설품셈 기계설비 1-1-2",
"소유": "공용",
"비고": "옥내일반배관 기준 · 고소 가산과 시공위치 요율이 겹치면 공통 1-4-2 할증 중복가산(합산) · 밸브류는 기계설비 5-1-1 · 인서트는 건축 8-1-4 · 단열·관 지지대 별도 · 크레인·지게차 이동비 별도",
"시험입력": {"관규격": 15.0},
"입력": [
{
"이름": "관규격",
@@ -302,6 +306,7 @@
"출처": "건설품셈 기계설비 1-1-3",
"소유": "공용",
"비고": "옥내일반배관 기준 · 고소 가산과 시공위치 요율이 겹치면 공통 1-4-2 할증 중복가산(합산) · 밸브류는 기계설비 5-1-1 · 인서트는 건축 8-1-4 · 단열·관 지지대 별도 · 크레인·지게차 이동비 별도",
"시험입력": {"관규격": 15.0},
"입력": [
{
"이름": "관규격",
@@ -378,6 +383,7 @@
"출처": "건설품셈 기계설비 1-1-4",
"소유": "공용",
"비고": "옥내일반배관 기준 · 고소 가산과 시공위치 요율이 겹치면 공통 1-4-2 할증 중복가산(합산) · 밸브류는 기계설비 5-1-1 · 인서트는 건축 8-1-4 · 단열·관 지지대 별도 · 크레인·지게차 이동비 별도",
"시험입력": {"관규격": 25.0},
"입력": [
{
"이름": "관규격",
@@ -454,6 +460,7 @@
"출처": "건설품셈 기계설비 1-2-2",
"소유": "공용",
"비고": "옥내일반배관 기준 · 고소 가산과 시공위치 요율이 겹치면 공통 1-4-2 할증 중복가산(합산) · 밸브류는 기계설비 5-1-1 · 인서트는 건축 8-1-4 · 단열·관 지지대 별도 · 크레인·지게차 이동비 별도",
"시험입력": {"관규격": 8.0},
"입력": [
{
"이름": "관규격",
@@ -530,6 +537,7 @@
"출처": "건설품셈 기계설비 1-3-2",
"소유": "공용",
"비고": "옥내일반배관 기준 · 고소 가산과 시공위치 요율이 겹치면 공통 1-4-2 할증 중복가산(합산) · 밸브류는 기계설비 5-1-1 · 인서트는 건축 8-1-4 · 단열·관 지지대 별도 · 크레인·지게차 이동비 별도 · Bending 가공 별도",
"시험입력": {"관규격": 6.0},
"입력": [
{
"이름": "관규격",
@@ -606,6 +614,7 @@
"출처": "건설품셈 기계설비 1-3-3",
"소유": "공용",
"비고": "옥내일반배관 기준 · 고소 가산과 시공위치 요율이 겹치면 공통 1-4-2 할증 중복가산(합산) · 밸브류는 기계설비 5-1-1 · 인서트는 건축 8-1-4 · 단열·관 지지대 별도 · 크레인·지게차 이동비 별도",
"시험입력": {"관규격": 25.0},
"입력": [
{
"이름": "관규격",
@@ -769,6 +778,7 @@
"출처": "건설품셈 기계설비 1-3-5",
"소유": "공용",
"비고": "옥내일반배관 기준 · 인서트는 건축 8-1-4 · 단열·관 지지대 별도 · 크레인·지게차 이동비 별도",
"시험입력": {"관규격": 15.0},
"입력": [
{
"이름": "관규격",
@@ -836,6 +846,7 @@
"출처": "건설품셈 기계설비 1-4-1",
"소유": "공용",
"비고": "옥내일반배관 기준 · 인서트는 건축 8-1-4 · 단열·관 지지대 별도 · 크레인·지게차 이동비 별도",
"시험입력": {"관규격": 50.0},
"입력": [
{
"이름": "관규격",
@@ -903,6 +914,7 @@
"출처": "건설품셈 기계설비 1-4-2",
"소유": "공용",
"비고": "옥내일반배관 기준 · 인서트는 건축 8-1-4 · 단열·관 지지대 별도 · 크레인·지게차 이동비 별도",
"시험입력": {"관규격": 50.0},
"입력": [
{
"이름": "관규격",
@@ -970,6 +982,7 @@
"출처": "건설품셈 기계설비 1-5-1",
"소유": "공용",
"비고": "옥내일반배관 기준 · 인서트는 건축 8-1-4 · 단열·관 지지대 별도 · 크레인·지게차 이동비 별도",
"시험입력": {"관규격": 30.0},
"입력": [
{
"이름": "관규격",
@@ -1037,6 +1050,7 @@
"출처": "건설품셈 기계설비 1-5-2",
"소유": "공용",
"비고": "옥내일반배관 기준 · 인서트는 건축 8-1-4 · 단열·관 지지대 별도 · 크레인·지게차 이동비 별도",
"시험입력": {"관규격": 30.0},
"입력": [
{
"이름": "관규격",
@@ -1104,6 +1118,7 @@
"출처": "건설품셈 기계설비 1-5-3",
"소유": "공용",
"비고": "옥내일반배관 기준 · 인서트는 건축 8-1-4 · 단열·관 지지대 별도 · 크레인·지게차 이동비 별도",
"시험입력": {"관규격": 50.0},
"입력": [
{
"이름": "관규격",
@@ -1171,6 +1186,7 @@
"출처": "건설품셈 기계설비 1-6-1",
"소유": "공용",
"비고": "절단 · 배관 · 고정철물 · 접합 · 배관시험 포함",
"시험입력": {"규격": 16.0},
"입력": [
{
"이름": "규격",
@@ -1226,6 +1242,7 @@
"출처": "건설품셈 기계설비 1-6-2",
"소유": "공용",
"비고": "절단 · 배관 · 고정철물 · 접합 · 배관시험 포함",
"시험입력": {"규격": 16.0},
"입력": [
{
"이름": "규격",
@@ -1281,6 +1298,7 @@
"출처": "건설품셈 기계설비 1-6-3",
"소유": "공용",
"비고": "절단 · 배관 · 고정철물 · 접합 · 배관시험 포함",
"시험입력": {"규격": 16.0},
"입력": [
{
"이름": "규격",
@@ -80,6 +80,7 @@
"출처": "건설품셈 기계설비 2-1-2",
"소유": "공용",
"비고": "제작 완료 덕트 설치 · 벽체통과 콘크리트 깨기 별도 · 크레인·지게차 이동비 별도 · 철판두께는 규격 칸이 정함(0.5∼1.0㎜)",
"시험입력": {"규격": 150.0},
"입력": [
{
"이름": "규격",
@@ -324,6 +325,7 @@
"출처": "건설품셈 기계설비 2-1-6",
"소유": "공용",
"비고": "일반 덕트에 연결 · 원문에 공구손료 주 없음",
"시험입력": {"규격": 100.0},
"입력": [
{
"이름": "규격",
@@ -13,6 +13,7 @@
"출처": "건설품셈 기계설비 3-1-1",
"소유": "공용",
"비고": "비닐감기 감산은 발포폴리에틸렌보온재만 · 가감이 겹치면 공통 1-4-2 할증 중복가산(합산) · 원문에 공구손료 주 없음",
"시험입력": {"배관규격": 15.0},
"입력": [
{
"이름": "배관규격",
@@ -106,6 +107,7 @@
"출처": "건설품셈 기계설비 3-1-2",
"소유": "공용",
"비고": "공장 가공 칼라함석 · 규격은 본관 · 보온두께는 관보온재 설치두께",
"시험입력": {"보온두께": 25.0, "배관규격": 15.0},
"입력": [
{
"이름": "보온두께",
@@ -159,6 +161,7 @@
"출처": "건설품셈 기계설비 3-2-1",
"소유": "공용",
"비고": "부속가산율은 설계자 입력(0∼25%) · 가산이 겹치면 공통 1-4-2 할증 중복가산(합산)",
"시험입력": {"규격": 15.0},
"입력": [
{
"이름": "규격",
@@ -13,6 +13,7 @@
"출처": "건설품셈 기계설비 4-1-1",
"소유": "공용",
"비고": "규격은 표 칸 값으로 고름(칸 = 그 값 이하) · 급수·소방펌프 옥내 인력 운반 설치 · 기초·방진가대·전기배선·주위배관·압력탱크·자동제어설비 제외 · 지게차 등 장비 별도",
"시험입력": {"규격": 0.75},
"입력": [
{
"이름": "규격",
@@ -68,6 +69,7 @@
"출처": "건설품셈 기계설비 4-1-2",
"소유": "공용",
"비고": "규격은 표 칸 값으로 고름(칸 = 그 값 이하) · 자동탈착식 · 인력·윈치 설치 · 기초·전기배선·주위배관·자동제어설비 제외 · 장비 사용 시 별도",
"시험입력": {"규격": 0.75},
"입력": [
{
"이름": "규격",
@@ -123,6 +125,7 @@
"출처": "건설품셈 기계설비 4-1-3",
"소유": "공용",
"비고": "규격은 표 칸 값으로 고름(칸 = 그 값 이하) · 콘크리트(모르타르) 충전 별도 · 원문에 공구손료 주 없음",
"시험입력": {"규격": 0.75},
"입력": [
{
"이름": "규격",
@@ -253,6 +256,7 @@
"출처": "건설품셈 기계설비 4-2-2",
"소유": "공용",
"비고": "전동기 직결형 · 형틀 설치 별도",
"시험입력": {"규격": 200.0},
"입력": [
{
"이름": "규격",
@@ -285,6 +289,7 @@
"출처": "건설품셈 기계설비 4-2-3",
"소유": "공용",
"비고": "규격은 표 칸 값으로 고름(칸 = 그 값 이하) · 원심형 · 플렉시블덕트·댐퍼 별도",
"시험입력": {"규격": 100.0},
"입력": [
{
"이름": "규격",
@@ -329,6 +334,7 @@
"출처": "건설품셈 기계설비 4-2-4",
"소유": "공용",
"비고": "규격은 표 칸 값으로 고름(칸 = 그 값 이하) · 앵커 · 가대조립 · 작동시험 포함",
"시험입력": {"풍량": 1600.0},
"입력": [
{
"이름": "풍량",
@@ -373,6 +379,7 @@
"출처": "건설품셈 기계설비 4-2-5",
"소유": "공용",
"비고": "규격은 표 칸 값으로 고름(칸 = 그 값 이하) · 가정용(최대 풍량 6∼12㎥/분)",
"시험입력": {"규격": 700.0},
"입력": [
{
"이름": "규격",
@@ -13,6 +13,7 @@
"출처": "건설품셈 기계설비 5-1-1",
"소유": "공용",
"비고": "설치위치 선정 · 설치 · 작동시험 · 마무리 포함 · 규격 50㎜ 이하는 보통인부 없음",
"시험입력": {"규격": 25.0},
"입력": [
{
"이름": "규격",
@@ -68,6 +69,7 @@
"출처": "건설품셈 기계설비 5-1-2",
"소유": "공용",
"비고": "바이패스 배관조립 · 배관시험 포함 · 온도조절장치는 본 품 준용 가능(주③)",
"시험입력": {"규격": 15.0},
"입력": [
{
"이름": "규격",
@@ -130,6 +132,7 @@
"출처": "건설품셈 기계설비 5-2-1",
"소유": "공용",
"비고": "고압버킷 · 저압벨로스형 · 바이패스 기타 부속 · 지지대·가대 별도",
"시험입력": {"규격": 15.0},
"입력": [
{
"이름": "규격",
@@ -185,6 +188,7 @@
"출처": "건설품셈 기계설비 5-3-1",
"소유": "공용",
"비고": "지지대 설치 별도",
"시험입력": {"규격": 25.0},
"입력": [
{
"이름": "규격",
@@ -247,6 +251,7 @@
"출처": "건설품셈 기계설비 5-3-2",
"소유": "공용",
"비고": "커넥팅로드 플랜지접합형 · 플랙시블조인트는 본 품 준용 가능(주③)",
"시험입력": {"규격": 25.0},
"입력": [
{
"이름": "규격",
@@ -302,6 +307,7 @@
"출처": "건설품셈 기계설비 5-4-1",
"소유": "공용",
"비고": "50㎜ 이하 나사(삽입)접합식 · 65㎜ 이상 플랜지접합식 · 벽체 홈파내기 별도 · 규격 50㎜ 이하는 보통인부 없음",
"시험입력": {"규격": 25.0},
"입력": [
{
"이름": "규격",
@@ -1009,6 +1009,7 @@
"출처": "건설품셈 공통 6-3-1",
"소유": "공용",
"비고": "해석: 각재도 합판 비율(1회 사용 자재비의 %)을 씀 · 소모자재(박리재 등) = 주자재비(합판·각재)의 % · 해석: 폼타이 1조 = 2본 · 사용 10회(주④㉮) · 동바리 별도 · 해석: 높이·지붕 감률은 더해서 뺌",
"시험입력": {"자재지역": "포항"},
"입력": [
{
"이름": "유형",
@@ -13,6 +13,7 @@
"출처": "건설품셈 기계설비 6-1-1",
"소유": "공용",
"비고": "구분 = 보호통 · 유량계 따로 한 줄씩 · 가산이 겹치면 공통 1-4-2 할증 중복가산(합산)",
"시험입력": {"규격": 15.0},
"입력": [
{
"이름": "규격",
@@ -89,6 +90,7 @@
"출처": "건설품셈 기계설비 6-1-2",
"소유": "공용",
"비고": "밸브·스트레이너·주위배관 · 전선관 배관·입선 · 지시부 별도",
"시험입력": {"규격": 15.0},
"입력": [
{
"이름": "규격",
@@ -194,6 +196,7 @@
"출처": "건설품셈 기계설비 6-2-1",
"소유": "공용",
"비고": "밸브·스트레이너·주위배관 · 전선관 배관·입선 · 지시부 별도",
"시험입력": {"규격": 15.0},
"입력": [
{
"이름": "규격",
@@ -249,6 +252,7 @@
"출처": "건설품셈 기계설비 6-2-2",
"소유": "공용",
"비고": "밸브·스트레이너·주위배관 · 전선관 배관·입선 · 지시부 별도",
"시험입력": {"규격": 50.0},
"입력": [
{
"이름": "규격",
@@ -304,6 +308,7 @@
"출처": "건설품셈 기계설비 6-2-3",
"소유": "공용",
"비고": "집단에너지 시설 · 원문 직종 그대로(플랜트배관공 · 특별인부 · 계장공) · 전선관·밸브·스트레이너 별도 · 열량지시계 매립 별도",
"시험입력": {"규격": 32.0},
"입력": [
{
"이름": "규격",
@@ -276,6 +276,7 @@
"출처": "건설품셈 공통 7-3-1",
"소유": "공용",
"비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 장비 규격은 작업여건에 따라 바꿀 수 있음(주⑤) — 굴착기·집게 설계자 고름 · 해석: 채움콘크리트 = 재료_자체 레미콘 · 전석 재료 원문 표에 없음",
"시험입력": {"자재지역": "울진"},
"입력": [
{ "이름": "기계", "고르기": ["0201-0060", "0201-0080", "0201-0020", "0201-0040", "0201-0070", "0201-0100"] },
{ "이름": "집게", "고르기": ["7206-0070", "7206-0020", "7206-0100"] },
@@ -13,6 +13,7 @@
"출처": "건설품셈 건축 9-1-1",
"소유": "공용",
"비고": "건조시멘트모르타르를 쓰지 않을 때 · 비빔 제외 · 재료는 할증 포함",
"시험입력": {"자재지역": "포항"},
"입력": [
{
"이름": "모래체가름",
@@ -493,6 +494,7 @@
"출처": "건설품셈 건축 9-3-1",
"소유": "공용",
"비고": "방수 코킹은 6-6-1",
"시험입력": {"자재지역": "포항"},
"입력": [{"이름": "자재지역", "비고": "시·군 이름 — 레미콘·골재 시중물가 후보를 고름"}],
"중간": [
{
@@ -526,6 +526,7 @@
"출처": "산림품셈 7-11",
"소유": "공용",
"비고": "해석: 건설기계조종원·운전기사 = 건설노임 건설기계운전사(1048) · 해석: 할증을 인력 · 연료 · 손료(가동일)에 함께 곱함 · 해석: 우드그래플 소모성경비(2-1-3) = Q × (트랙 보강 + 블레이드·실린더) 원/ha ÷ 집재재적 · 기계손료 못 넣음 — 기계 열쇠 「2-2-3 동력상하차기, 임업용 굴착기(우드그래플)」 에 쉼표(식이 열쇠를 끊음) · 경계값(아래 끝 수 그대로)은 못 찾음 — 범위규칙 「이하 · 이상 · 두 수는 양 끝 포함」 을 엔진이 「이하」로만 읽음 · 할인·할증 못 넣음 — 1-4-5 경사도(값 칸 「할인·할증률」) · 1-4-13 주행 장애물 상태(조건 빈칸) — 칸 이름 · 범위규칙 문법",
"시험입력": {"최대집재거리": 40.0, "집재재적": 60.0},
"입력": [
{ "이름": "최대집재거리", "단위": "m" },
{ "이름": "집재재적", "단위": "㎥/ha" },
@@ -1121,6 +1121,7 @@
"출처": "산림품셈 12-9-1",
"소유": "공용",
"비고": "수량은 설계수량(원문 빈칸) · 해석: 「무근,진동기」 = 12-1-1 무근구조물(진동기 경비는 12-1-3 주⑧대로 별도) · 거푸집 단위 「회」 = 합판 4회 사용 ㎡ · 수축줄눈 · 신축이음 · 배수파이프 설치 품 원문 없음 — 빠짐 · 되메우기 별도(주②)",
"시험입력": {"자재지역": "울진"},
"입력": [
{
"이름": "콘크리트량",
@@ -1273,6 +1274,7 @@
"출처": "산림품셈 12-9-2",
"소유": "공용",
"비고": "수량은 설계수량 · 수축줄눈 · 신축이음 품 원문 없음 — 빠짐 · 철근 재료 원문 표에 없음",
"시험입력": {"자재지역": "울진"},
"입력": [
{
"이름": "콘크리트량",
@@ -1446,6 +1448,7 @@
"출처": "산림품셈 12-9-3",
"소유": "공용",
"비고": "수량은 설계수량",
"시험입력": {"자재지역": "울진"},
"입력": [
{
"이름": "콘크리트량",
@@ -2189,6 +2192,7 @@
"출처": "산림품셈 12-12",
"소유": "공용",
"비고": "원문 기준 단위 없음 — 수량 입력한 한 식 · 바닥정리 품 원문 없음 — 빠짐 · 해석: 성토부 할증은 불러온 모든 노무비에",
"시험입력": {"자재지역": "울진"},
"입력": [
{
"이름": "콘크리트량",
@@ -2407,6 +2411,7 @@
"출처": "산림품셈 12-13",
"소유": "공용",
"비고": "기초잡석 구입은 현장발파암 유용(원문 규격)",
"시험입력": {"자재지역": "울진"},
"입력": [
{
"이름": "콘크리트량",
@@ -2692,6 +2697,7 @@
"출처": "산림품셈 12-15",
"소유": "공용",
"비고": "구체 품은 비고 글의 수(콘크리트공 0.24 · 보통인부 0.42인/㎥)를 식에 적음 · 해석: 뚜껑 설치비 = 뚜껑 재료비의 5% · 비목 노무비",
"시험입력": {"자재지역": "울진"},
"입력": [
{
"이름": "구체콘크리트량",
@@ -2908,6 +2914,7 @@
"출처": "산림품셈 12-16",
"소유": "공용",
"비고": "비고 글의 품(구체 0.17 · 0.29 · 원형거푸집 0.16 · 0.45 · 0.20 · 0.60)을 식에 적음 · 「설치비 재료비의 5%」 대상 원문 불명 — 미반영",
"시험입력": {"자재지역": "울진"},
"입력": [
{
"이름": "구체콘크리트량",
@@ -3347,6 +3354,7 @@
"출처": "산림품셈 12-17-1-2 주③",
"소유": "공용",
"비고": "재료량에 할증 포함(원문 주)",
"시험입력": {"자재지역": "울진"},
"입력": [
{
"이름": "배합비",
@@ -3441,6 +3449,7 @@
"출처": "산림품셈 12-17-2",
"소유": "공용",
"비고": "해석: 펌프차 고르기 = 콘크리트펌프차 중 80㎥/hr 이상([80∼95]) 규격(주①⑥) · 해석: 콘크리트다짐 = (펌프카 경비(노무·재료·경비 모두) + 인건비) × 1% — 레미콘 재료비는 뺌",
"시험입력": {"자재지역": "울진"},
"입력": [
{
"이름": "펌프차",
@@ -3532,6 +3541,7 @@
"출처": "산림품셈 12-17-3",
"소유": "공용",
"비고": "해석: 펌프차 고르기 = 콘크리트펌프차 중 80㎥/hr 이상([8095]) 규격(주①⑥) · 50㎥ 이하는 콘크리트 타설품(원문 주)",
"시험입력": {"자재지역": "울진"},
"입력": [
{
"이름": "펌프차",
@@ -289,6 +289,7 @@
"출처": "산림품셈 13-4-1",
"소유": "공용",
"비고": "「원문에 없는 조합: 뒷길이=25 · 돌=견치돌 · 쌓기=골쌓기 / 뒷길이=25 · 돌=견치돌 · 쌓기=켜쌓기 / 뒷길이=25 · 돌=깬돌 · 쌓기=골쌓기 / 뒷길이=25 · 돌=깬돌 · 쌓기=켜쌓기 / 뒷길이=30 · 돌=견치돌 · 쌓기=골쌓기 외 5」",
"시험입력": {"높이": 4.0, "돌": "깬잡석"},
"입력": [
{ "이름": "뒷길이", "단위": "㎝", "고르기": [25, 30, 35, 45, 55, 60, 75] },
{ "이름": "돌", "고르기": ["견치돌", "깬돌", "깬잡석", "호박돌 및 야면석"] },
@@ -420,6 +421,7 @@
"출처": "산림품셈 13-4-4",
"소유": "공용",
"비고": "해석: 채움 콘크리트 = 레디믹스트콘크리트 · 해석: 「호박돌 및 야면석」 = 채움 표 「호박돌」(야면석과 같은 수) · 「원문에 없는 조합: 뒷길이=25 · 돌=깬돌 · 쌓기=골쌓기 / 뒷길이=25 · 돌=깬돌 · 쌓기=켜쌓기 / 뒷길이=25 · 돌=견치돌 · 쌓기=골쌓기 / 뒷길이=25 · 돌=견치돌 · 쌓기=켜쌓기 / 뒷길이=30 · 돌=견치돌 · 쌓기=골쌓기 외 5」",
"시험입력": {"자재지역": "울진"},
"입력": [
{
"이름": "뒷길이",
@@ -499,6 +501,7 @@
"출처": "산림품셈 13-4-5",
"소유": "공용",
"비고": "재료량은 설계수량(주⑦) · 해석: 채움 콘크리트 = 레디믹스트콘크리트 · 줄눈 메꿈 모르타르 수량 원문 없음",
"시험입력": {"자재지역": "울진"},
"입력": [
{
"이름": "뒷길이",
@@ -775,6 +778,7 @@
"출처": "산림품셈 13-5-2",
"소유": "공용",
"비고": "재료량은 설계수량(주⑦) · 해석: 채움 콘크리트 = 레디믹스트콘크리트 · 줄눈 메꿈 모르타르 수량 원문 없음",
"시험입력": {"자재지역": "울진"},
"입력": [
{
"이름": "뒷길이",
@@ -865,6 +869,7 @@
"출처": "산림품셈 13-6-1",
"소유": "공용",
"비고": "흡출방지재·차수시트 시공 값(「( )」 값 칸 「수량( )」)은 식에서 못 가리켜 빠짐 · 건설품셈 공통 8-2-3 계수 필요(0.2㎥ · 0.4㎥ 굴착기를 쓸 때)",
"시험입력": {"직경": 60.0},
"입력": [
{ "이름": "직경", "단위": "㎝" },
{
@@ -944,6 +949,7 @@
"출처": "산림품셈 13-6-2",
"소유": "공용",
"비고": "흡출방지재·차수시트 시공 값(「( )」 값 칸 「수량( )」)은 식에서 못 가리켜 빠짐 · 건설품셈 공통 8-2-3 계수 필요(0.2㎥ · 0.4㎥ 굴착기를 쓸 때)",
"시험입력": {"직경": 60.0},
"입력": [
{ "이름": "직경", "단위": "㎝" },
{ "이름": "물빼기파이프", "고르기": ["설치", "설치 안 함"] },
@@ -1024,6 +1030,7 @@
"출처": "산림품셈 13-6-3",
"소유": "공용",
"비고": "흡출방지재·차수시트 시공 값(「( )」 값 칸 「수량( )」)은 식에서 못 가리켜 빠짐 · 건설품셈 공통 8-2-3 계수 필요(0.2㎥ · 0.4㎥ 굴착기를 쓸 때)",
"시험입력": {"직경": 60.0},
"입력": [
{ "이름": "직경", "단위": "㎝" },
{ "이름": "물빼기파이프", "고르기": ["설치", "설치 안 함"] },
@@ -1104,6 +1111,7 @@
"출처": "산림품셈 13-7-1",
"소유": "공용",
"비고": "흡출방지재·차수시트 시공 값(「( )」 값 칸 「수량( )」)은 식에서 못 가리켜 빠짐 · 건설품셈 공통 8-2-3 계수 필요(0.2㎥ · 0.4㎥ 굴착기를 쓸 때)",
"시험입력": {"직경": 60.0},
"입력": [
{ "이름": "직경", "단위": "㎝" },
{
@@ -1183,6 +1191,7 @@
"출처": "산림품셈 13-7-2",
"소유": "공용",
"비고": "흡출방지재·차수시트 시공 값(「( )」 값 칸 「수량( )」)은 식에서 못 가리켜 빠짐 · 건설품셈 공통 8-2-3 계수 필요(0.2㎥ · 0.4㎥ 굴착기를 쓸 때)",
"시험입력": {"직경": 60.0},
"입력": [
{ "이름": "직경", "단위": "㎝" },
{ "이름": "물빼기파이프", "고르기": ["설치", "설치 안 함"] },
+19
View File
@@ -907,3 +907,22 @@ def test_품셈재료_고르기_칸이_실파일에_있음():
assert rows and all("고르기" in row for row in rows.values())
assert any(isinstance(row["고르기"], dict) for row in rows.values())
assert cm.check_links(whole) == []
def test_로직_일괄_시험계산():
"""로직 전부를 시험 입력으로 돌림 — 멈춤은 데이터 결손(관리자 값·규격 미지정)만."""
files = cm.load()
passed, stuck = cm.calc_all(files, mf.Master(files))
assert passed >= 1270
남은_까닭 = ("관리자가 채울 값", "규격 선택 필요", "지역 값 없음", "맞는 줄")
assert [x for x in stuck if not any(c in x for c in 남은_까닭)] == []
def test_시험입력이_기본값을_이김():
"""「시험입력」 은 시험 계산 전용 칸 — 고르기 첫 값·범위 위끝을 덮어씀."""
row = {
"입력": [{"이름": "지역", "고르기": ["전국평균", "포항"]}, {"이름": "깊이", "범위": [1, 9]}]
}
assert cm.시험입력(row) == {"지역": "전국평균", "깊이": 9}
row["시험입력"] = {"지역": "포항"}
assert cm.시험입력(row)["지역"] == "포항"