Files
Aislo/resources/tester/test_b09_expression.py
T
eomsangdonandClaude Opus 5 c3618fe872 feat(b09): 2차 편집 ② 일위대가·단산 구성행 수정 · ③ Q 식 편집 — 프로젝트 단위 · 서버가 다시 계산 · ↺
- 구성행(sheet_rows): 수량 고치기 · 줄 빼기(수량 0, 흐리게) · 줄 더하기(단가표 고르개) — 비율 줄·돌림 참조는 받지 않음
- Q 식(price_basis_q): 식은 명세 13장 식 언어 — B08 구조물도 풀이기(evaluate_sheets, Node 한 벌)를 그대로 부름 ·
  소수 2자리 사사오입 확정 → 새 수량 = 수량 × 옛 Q ÷ 새 Q · 비고에 「Q(사용자) = 식 = 값」
  · PriceDetail.output(시공능력 Q)을 Q 로 선 장비 줄 넷 자리(굴착기·도자·직접 작업량·암 잎)에서 실음 · 저장 모양에도 실음
- 따로 짰던 파이썬 식 셈(B09_Estimation_Expression)은 걷어냄 — 식 풀이 두 벌 금지(브레인 판정)
- 새 문: GET /estimation/edits/sheet/{code}(본표 + 줄마다 고친 값 표시) · GET /estimation/edits/search(줄 더하기 고르개)
- 화면: 본표 [편집] — 수량 칸 · ✕ · Q 식 칸 · 줄 더하기 · 고친 줄 「사용자」 + ↺
- 검증: 시험 1664 통과 · 골든셋 초록 · ORCA — 제 3 호표 보통인부 0.023→0.046 이면 5,652→9,610 · 내역 본체 122,848,989→122,857,198,
  ↺ 뒤 5,652 · 산근 2호표 Q 58.21→116.42 이면 1,695→847, ↺ 뒤 1,695 · 틀린 식 422 「모르는 이름: abc」 · 고친 값 {} 로 복구

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016VBGFXB9AbJBwXP19z75Qq
2026-09-14 03:37:18 +09:00

36 lines
1.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.
"""B09 Q 식 편집이 쓰는 식 — **명세 13장 식 언어**(B08 구조물도 풀이기 한 벌)로 풀고 소수 2자리 사사오입.
⚠ 2026-09-14 브레인 판정 — 식 풀이를 B09 에 두 벌 짜지 않음. 종전 `B09_Estimation_Expression`(파이썬 셈)은 걷어냄.
"""
from __future__ import annotations
from decimal import Decimal
from B09_Estimation.B09_Estimation_Edits import evaluate_q
def test_실무_Q_식을_명세_13장_언어로_풀고_2자리로_확정한다() -> None:
got = evaluate_q(
{
# 18번 §2.2 — f 는 0.85 로 먼저 확정해 넣음 → 15.708 → 15.71
"a": "3600*0.2*0.7*0.85*0.55/15",
# 울진 대흥 제15호표 되메우기 Q 68.04
"b": "3600*0.7*0.9*(1/1.25)*0.75/20",
# 콘크리트믹서 Q = 60 / t × q × E = 5.40
"c": "60/4*0.45*0.8",
"d": "MAX(12.345, SQRT(100))",
}
)
assert got == {
"a": Decimal("15.71"),
"b": Decimal("68.04"),
"c": Decimal("5.4"),
"d": Decimal("12.35"),
}
def test_모르는_이름·0_이하는_까닭으로_돌려준다() -> None:
got = evaluate_q({"x": "abc+1", "y": "0*5", "z": "1/0"})
assert all(isinstance(value, str) and value for value in got.values()), got