Merge remote-tracking branch 'origin/sub_laptop_6' into main_laptop_1
This commit is contained in:
@@ -53,7 +53,7 @@ new Function("exports", "module", "require", js(fs.readFileSync({table}, "utf8")
|
||||
const LAMP_CLASS = {json.dumps(_lamp_class())};
|
||||
const missing = ["", "BOX", ""];
|
||||
const linked = [false, false, false];
|
||||
const LINKED_CLASS = LAMP_CLASS + " is-linked";
|
||||
const LINKED_CLASS = "ui-data-table__lamp " + LAMP_CLASS + " is-linked";
|
||||
const cellClass = {cell.group(1)};
|
||||
const html = box.exports.renderDataTableHtml({{
|
||||
columns: [{{ key: "station", label: "측점" }}, {{ key: "c1", label: "조합" }}],
|
||||
@@ -68,7 +68,10 @@ console.log(JSON.stringify({{
|
||||
"""
|
||||
)
|
||||
assert got["count"] == 1
|
||||
assert f'<td class="is-frozen is-edge {_lamp_class()}"' in got["row1"] # 측점 칸(첫 칸)
|
||||
# 꼴 = 표 부품 칸 램프(557-2) · 표지 = 화면 class
|
||||
assert (
|
||||
f'<td class="is-frozen is-edge ui-data-table__lamp {_lamp_class()}"' in got["row1"]
|
||||
) # 측점 칸(첫 칸)
|
||||
assert _lamp_class() not in got["row0"]
|
||||
|
||||
|
||||
@@ -106,11 +109,8 @@ def test_미지정_열_없음_줄_값_그대로():
|
||||
|
||||
|
||||
def test_램프_경고_노랑_토큰():
|
||||
css = (ROOT / "B08_Quantity" / "B08_Quantity_UI_Page.css").read_text(encoding="utf-8")
|
||||
m = re.search(
|
||||
r'\[data-b08-summary="table"\] td\.' + re.escape(_lamp_class()) + r"::before\s*\{([^}]*)\}",
|
||||
css,
|
||||
)
|
||||
css = (ROOT / "ui_template" / "ui_template_data_table.css").read_text(encoding="utf-8")
|
||||
m = re.search(r"td\.ui-data-table__lamp::before\s*\{([^}]*)\}", css) # 표 부품 칸 램프(557-2)
|
||||
assert m
|
||||
assert re.search(r"background:\s*var\(--color-warning\)", m.group(1))
|
||||
assert "border-radius: 50%" in m.group(1)
|
||||
|
||||
@@ -74,8 +74,12 @@ console.log(JSON.stringify({{ rows: rows.slice(0, 3), tail: html.split("</tbody>
|
||||
"""
|
||||
)
|
||||
lamp = _lamp_class()
|
||||
assert f'class="is-frozen is-edge {lamp} is-linked"' in got["rows"][0] # 0 = 모두 연결
|
||||
assert f'class="is-frozen is-edge {lamp}"' in got["rows"][1] # 20 = 빈 칸 하나 = 노랑
|
||||
assert (
|
||||
f'class="is-frozen is-edge ui-data-table__lamp {lamp} is-linked"' in got["rows"][0]
|
||||
) # 0 = 모두 연결
|
||||
assert (
|
||||
f'class="is-frozen is-edge ui-data-table__lamp {lamp}"' in got["rows"][1]
|
||||
) # 20 = 빈 칸 하나 = 노랑
|
||||
assert lamp not in got["rows"][2] # 40 = 시설 없음
|
||||
assert got["lamps"] == 2 # 합계 줄 없음
|
||||
|
||||
@@ -100,8 +104,9 @@ console.log(JSON.stringify([text(cell(0)), text(cell(1))]));
|
||||
|
||||
|
||||
def test_초록_성공_토큰():
|
||||
css = (ROOT / "B08_Quantity" / "B08_Quantity_UI_Page.css").read_text(encoding="utf-8")
|
||||
m = re.search(r"td\.b08-summary__lamp\.is-linked::before\s*\{([^}]*)\}", css)
|
||||
# 꼴 = 표 부품 칸 램프(557-2)
|
||||
css = (ROOT / "ui_template" / "ui_template_data_table.css").read_text(encoding="utf-8")
|
||||
m = re.search(r"td\.ui-data-table__lamp\.is-linked::before\s*\{([^}]*)\}", css)
|
||||
assert (
|
||||
m
|
||||
and re.search(r"color:\s*var\(--color-success\)", m.group(1))
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
"""PLAN 251-1 — 총괄자재표 → 운반 묶음(거리이정표 행 · B09 운반공 줄 한 원천)."""
|
||||
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
@@ -138,7 +139,11 @@ console.log(JSON.stringify([refText(null),
|
||||
"단가연결 — 일위대가 회사 조합",
|
||||
]
|
||||
# 램프 = 항목 칸 · 우클릭 = [단가연결] · 연결 있으면 [단가연결 풀기] · 창 = B09 와 같은 것
|
||||
assert 'key !== "item" ? null : routeAt(i)?.ref ? `${LAMP} is-linked` : LAMP' in src
|
||||
# 꼴 = 표 부품 칸 램프(557-2) · 표지 = LAMP
|
||||
assert (
|
||||
'key !== "item" ? null : routeAt(i)?.ref ? `ui-data-table__lamp ${LAMP} is-linked` : `ui-data-table__lamp ${LAMP}`'
|
||||
in re.sub(r"\s+", " ", src)
|
||||
)
|
||||
assert "openHaulModal({" in src and '"단가연결 풀기"' in src # 263-1 = 운반 단가 모달 하나
|
||||
diagram = (ROOT / "B08_Quantity" / "B08_Quantity_UI_Milestone_Diagram.ts").read_text("utf-8")
|
||||
assert "Math.abs(h - lastH) > 1" in diagram # 틀 높이 바뀜 = 다시 그림(아래 잘림 없음)
|
||||
|
||||
@@ -35,14 +35,17 @@ def test_램프_칸_class_풍선_머리():
|
||||
body = JS.replace("__ROWS__", json.dumps(ROWS, ensure_ascii=False))
|
||||
out = json.loads(_node(_ts([*SRC, "UI_Tabs_Bill"]) + body))
|
||||
assert out["col"] == {"label": "단가\n연결", "width": 44, "title": "단가연결"}
|
||||
assert out["cls"] == [
|
||||
"b09-bill__lamp is-linked", # 자동 줄 · 호표 연결
|
||||
"b09-bill__lamp", # 연결 없음 = 노랑
|
||||
"b09-bill__lamp is-linked", # 손 줄 · 비고 대가3
|
||||
None, # 자재 줄 = 연결 대상 아님
|
||||
None,
|
||||
None, # 묶음 줄
|
||||
]
|
||||
assert (
|
||||
out["cls"]
|
||||
== [
|
||||
"ui-data-table__lamp ui-data-table__lamp--only b09-bill__lamp is-linked", # 자동 줄 · 호표 연결
|
||||
"ui-data-table__lamp ui-data-table__lamp--only b09-bill__lamp", # 연결 없음 = 노랑
|
||||
"ui-data-table__lamp ui-data-table__lamp--only b09-bill__lamp is-linked", # 손 줄 · 비고 대가3
|
||||
None, # 자재 줄 = 연결 대상 아님
|
||||
None,
|
||||
None, # 묶음 줄
|
||||
]
|
||||
)
|
||||
assert out["tip"] == ["연결됨", "단가연결", "대가3", None, None, None]
|
||||
assert out["other"] is None
|
||||
labels = [g[0] for g in out["groups"]]
|
||||
@@ -52,7 +55,11 @@ def test_램프_칸_class_풍선_머리():
|
||||
|
||||
def test_CSS_램프_초록_노랑_머리_줄바꿈():
|
||||
css = (ROOT / "B09_Estimation" / "B09_Estimation_UI_Page.css").read_text("utf-8")
|
||||
assert "td.b09-bill__lamp::before" in css and "var(--color-warning)" in css
|
||||
assert "td.b09-bill__lamp.is-linked::before" in css and "var(--color-success)" in css
|
||||
part = (ROOT / "ui_template" / "ui_template_data_table.css").read_text(
|
||||
"utf-8"
|
||||
) # 꼴 = 표 부품(557-2)
|
||||
assert "td.ui-data-table__lamp::before" in part and "var(--color-warning)" in part
|
||||
assert "td.ui-data-table__lamp.is-linked::before" in part and "var(--color-success)" in part
|
||||
assert "td.ui-data-table__lamp--only" in part and "b09-bill__lamp" not in css
|
||||
head = css.split("[data-b09-table] thead th {", 1)[1].split("}", 1)[0]
|
||||
assert "white-space: pre-line" in head
|
||||
|
||||
@@ -28,7 +28,9 @@ def test_연결_있으면_운반_모달_없으면_옛_길():
|
||||
|
||||
def test_운반_모달_작게():
|
||||
modal = _src("B09_Estimation/B09_Estimation_UI_Haul_Modal.ts")
|
||||
assert '"--modal-max:min(680px,86vh);width:min(1100px,94vw);height:var(--modal-max)"' in modal
|
||||
assert 'width: "1100px",' in modal # 부품 넓은 중간 창(557-2)
|
||||
part = (ROOT / "ui_template" / "ui_template_modal.css").read_text(encoding="utf-8")
|
||||
assert '.ui-modal.ui-modal--wide[data-width="1100px"]' in part and "min(680px, 86vh)" in part
|
||||
assert "min-height:60vh" not in modal and "flex:1;min-height:0" in modal
|
||||
|
||||
|
||||
|
||||
@@ -38,6 +38,6 @@ def test_옛_보라_이름은_별칭():
|
||||
):
|
||||
assert f"--color-{old}: var(--color-{new});" in root, old
|
||||
assert "--color-accent: #1f7a4d;" in root and "--color-danger: #c0392b;" in root
|
||||
assert "--color-danger-fill: #e5484d;" in root
|
||||
assert "--color-danger-fill: #d6363c;" in root # 557-2 흰 글 대비 4.5 이상
|
||||
dark = THEME[THEME.index(':root[data-theme="dark"]') :]
|
||||
assert "deep-iris" not in dark and "royal-amethyst" not in dark # 어두움도 별칭으로 따라옴
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
"""557-2 부품 · 테마 작은 흠 지킴 시험 — 위험 채움 흰 글 대비 · 계산 줄 · 칸 램프 · 넓은 중간 창 · 값 목록 규칙 꼴 ·
|
||||
구역 머리 · 입력 칸 2열(D01 · E01 이 B02 클래스를 안 빌림)."""
|
||||
|
||||
import re
|
||||
|
||||
from test_552_3_card import ROOT, _text, check_part, kit_line
|
||||
|
||||
|
||||
def _lum(h: str) -> float:
|
||||
c = [int(h[i : i + 2], 16) / 255 for i in (1, 3, 5)]
|
||||
c = [v / 12.92 if v <= 0.03928 else ((v + 0.055) / 1.055) ** 2.4 for v in c]
|
||||
return 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2]
|
||||
|
||||
|
||||
def _ratio(a: str, b: str) -> float:
|
||||
x, y = sorted((_lum(a), _lum(b)), reverse=True)
|
||||
return (x + 0.05) / (y + 0.05)
|
||||
|
||||
|
||||
def _tokens(block: str) -> dict[str, str]:
|
||||
return dict(re.findall(r"--(color-[a-z-]+):\s*(#[0-9a-fA-F]{6})\b", block))
|
||||
|
||||
|
||||
def test_위험_채움_흰_글_대비():
|
||||
theme = _text("ui_template_theme.css")
|
||||
light = _tokens(theme[theme.index(":root {") :].split("\n}\n", 1)[0])
|
||||
dark = _tokens(theme[theme.index(':root[data-theme="dark"]') :].split("\n}\n", 1)[0])
|
||||
# 채운 바탕 위 글 = canvas(밝음 흰 · 어두움 짙은 바탕)
|
||||
assert _ratio(light["color-danger-fill"], light["color-canvas"]) >= 4.5
|
||||
assert _ratio(dark["color-danger-fill"], dark["color-canvas"]) >= 4.5
|
||||
assert _ratio(light["color-danger"], light["color-canvas"]) >= 4.5 # 위험 단추 · 글
|
||||
assert _ratio(dark["color-danger"], dark["color-canvas"]) >= 4.5
|
||||
assert light["color-danger"] == "#c0392b" # 위험 글 색 그대로
|
||||
|
||||
|
||||
def test_계산_줄():
|
||||
check_part(
|
||||
"calc-row",
|
||||
"ui_template_calc_row.ts",
|
||||
["ui_template_calc_row.css"],
|
||||
["createCalcRow", "createCalcFormulaRow", "createCalcFormula"],
|
||||
[
|
||||
"ui-calc-row",
|
||||
"ui-calc-row--formula",
|
||||
"ui-calc-row__label",
|
||||
"ui-calc-row__out",
|
||||
"ui-calc-row__in",
|
||||
],
|
||||
)
|
||||
sheet = (ROOT / "B08_Quantity" / "B08_Quantity_UI_Hydro_Sheet.ts").read_text(encoding="utf-8")
|
||||
css = (ROOT / "B08_Quantity" / "B08_Quantity_UI_Hydro.css").read_text(encoding="utf-8")
|
||||
for old in (
|
||||
"b08-hydro__row",
|
||||
"b08-hydro__label",
|
||||
"b08-hydro__formula",
|
||||
"b08-hydro__out",
|
||||
"b08-hydro__in",
|
||||
):
|
||||
assert old not in sheet and old not in css, old
|
||||
|
||||
|
||||
def test_칸_램프():
|
||||
css = _text("ui_template_data_table.css")
|
||||
assert "td.ui-data-table__lamp::before" in css and "var(--color-warning)" in css
|
||||
assert re.search(r"td\.ui-data-table__lamp\.is-linked::before\s*\{[^}]*content: \"✓\"", css)
|
||||
assert "td.ui-data-table__lamp--only" in css
|
||||
assert "칸 램프" in kit_line("table") and "kitLampTable()" in kit_line("table")
|
||||
for page, old in (
|
||||
("B08_Quantity/B08_Quantity_UI_Page.css", "b08-summary__lamp"),
|
||||
("B08_Quantity/B08_Quantity_UI_Milestone.css", "b08-milestone__lamp"),
|
||||
("B09_Estimation/B09_Estimation_UI_Page.css", "b09-bill__lamp"),
|
||||
):
|
||||
assert old not in (ROOT / page).read_text(encoding="utf-8"), page
|
||||
|
||||
|
||||
def test_넓은_중간_창():
|
||||
css = _text("ui_template_modal.css")
|
||||
assert re.search(
|
||||
r'\.ui-modal\.ui-modal--wide\[data-width="1100px"\]\s*\{[^}]*min\(1100px, 94vw\)', css
|
||||
)
|
||||
assert '"1100px"' in _text("ui_template_modal.ts") and "1100" in kit_line("modal")
|
||||
haul = (ROOT / "B09_Estimation" / "B09_Estimation_UI_Haul_Modal.ts").read_text(encoding="utf-8")
|
||||
assert 'width: "1100px"' in haul and "--modal-max:min(680px" not in haul
|
||||
|
||||
|
||||
def test_값_목록_규칙_꼴():
|
||||
assert "ui-kv--rule" in _text("ui_template_kv.css") and "rule: true" in kit_line("kv")
|
||||
app = (ROOT / "A00_Common" / "app_settings.ts").read_text(encoding="utf-8")
|
||||
assert "createKv(rows, { rule: true })" in app
|
||||
assert "app-settings__rules" not in (ROOT / "A00_Common" / "app_settings.css").read_text(
|
||||
encoding="utf-8"
|
||||
)
|
||||
|
||||
|
||||
def test_구역_머리():
|
||||
ts = _text("ui_template_collapsible.ts")
|
||||
assert "export function createCollapsibleHead" in ts and "kitSection()" in kit_line(
|
||||
"collapsible"
|
||||
)
|
||||
link = (ROOT / "B08_Quantity" / "B08_Quantity_UI_Link.ts").read_text(encoding="utf-8")
|
||||
assert "createCollapsibleHead(" in link and "b08-sheets__title" not in link
|
||||
|
||||
|
||||
def test_입력_칸_2열_안_빌림():
|
||||
css = _text("ui_template_general_layout.css")
|
||||
assert (
|
||||
".ui-form-grid" in css
|
||||
and ".ui-general-layout--narrow" in css
|
||||
and ".ui-general-block__actions--end" in css
|
||||
)
|
||||
for page in (
|
||||
"D01_PlanRegister/D01_PlanRegister_UI_Page.ts",
|
||||
"E01_StabRegister/E01_StabRegister_UI_Page.ts",
|
||||
):
|
||||
src = (ROOT / page).read_text(encoding="utf-8")
|
||||
assert (
|
||||
"b02-proj" not in src
|
||||
and "B02_ProjRegister_UI_Style" not in src
|
||||
and "createFormGrid(" in src
|
||||
), page
|
||||
for scene in ("D01", "E01"):
|
||||
assert "b02-proj" not in (
|
||||
ROOT / "A05_EduDetail" / "guide" / scene / "_scenes.json"
|
||||
).read_text(encoding="utf-8")
|
||||
Reference in New Issue
Block a user