test(옛 실패 셋): 551-2 · 346-3 · 449 낡은 단언 고침 (요구 450-2)

- test_551_2: --draw-* 개수 고정(21) 걷음 — 밝음이 전부 정의 · 어두움/시스템 어두움은 밝음 안의 것만 덮음 · 캔버스가 읽는 이름은 세 모드 모두 풀림 (지도 겹 · 차트 색이 늘어 51)
- test_346_3_route_save_screen: [저장] 본문의 route/carry 줄 단언을 정규식으로 — alignment_cleared 칸이 덧붙음
- test_449 헬퍼: 자체 풀이 함수 걷고 공용 불러오기 기본 풀이로 — @ui 로케일 · .css import 를 못 찾아 시작 못 했음

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-30 05:45:35 +09:00
co-authored by Claude Sonnet 5.5
parent 0994ee7124
commit 93f2feed08
3 changed files with 15 additions and 16 deletions
+3 -13
View File
@@ -1,9 +1,7 @@
/* PLAN 449 헬퍼 — [저장] 관 차례 · 노선 저장 뒤 실패(433-7 · 433-12). 실제 `design_save.ts` · 관 초안 창구 · 가게를
* Node 로 · 서버 창구 · 계획고 초안 · 노선 편집 창구만 가짜. 짝 = `test_449_save_pipes.py`. */
const fs = require("fs");
const path = require("path");
const { makeLoader } = require("./helper_ts_stub_loader.cjs");
const CATALOG = require("./helper_322_catalog_module.cjs");
const ROOT = path.join(__dirname, "..", "..");
@@ -27,18 +25,10 @@ globalThis.window = {
};
const STUBS = { "/design_leave": { designSignature: () => "", markDesignClean: () => undefined } };
const { load, loadTs } = makeLoader({
const { load } = makeLoader({
root: ROOT,
requireFor: (full) => (request) => {
if (CATALOG.isCatalogRequest(request)) return CATALOG;
const key = Object.keys(STUBS).find((name) => request.endsWith(name));
if (key) return STUBS[key];
if (request.startsWith("@config/")) return { API_BASE_URL: "http://fake" };
if (request.startsWith("@util/"))
return loadTs(path.join(ROOT, "common_util", `${request.slice(6)}.ts`));
if (request.startsWith(".")) return loadTs(path.join(path.dirname(full), `${request}.ts`));
return require(request);
},
stubs: STUBS,
ui: () => ({ ui_locales: {}, currentLanguageIndex: 0, t: (key) => key }),
});
let calls = [];
@@ -8,6 +8,7 @@
from __future__ import annotations
import json
import re
import subprocess
from pathlib import Path
@@ -118,7 +119,7 @@ def test_노선_반영_단추_없앰_배선():
save = _read("A00_Common/design/design_save.ts")
assert "await pendingRouteSave(ctx.projectId)" in save
# 6-B — 노선 초안 = 한 본문 `route` 칸 · 서버가 맨 앞에서 노선 저장(옛 차례 길 걷음)
assert "route ? { route, carry: carried?.carry } : {}" in save
assert re.search(r"route \? \{ route, carry: carried\?\.carry[^}]*\} : \{\}", save)
assert "carryAfterRouteSave" not in save and "saveRouteDraft" not in save
server = _read("B06_Section/B06_Section_Router_DesignSave.py")
assert server.index('step("route"') < server.index('step("settings"')
+10 -2
View File
@@ -1,6 +1,6 @@
"""551-2 그림 전용 값(--draw-*) 지킴 — 화면 테마 변수(--color-*)를 바꿔도 그림 색은 그대로.
- `ui_template_theme.css` 끝 블록의 --draw-* 는 밝음 · 어두움 · 시스템 어두움 모두 글자 hex.
- `ui_template_theme.css` 끝 블록의 --draw-* 는 밝음 · 어두움 · 시스템 어두움 모두 글자 hex · 어두움 · 시스템 어두움은 밝음에 있는 것만 덮음.
- 그림 CSS(B05 · B06 · B08 SVG)의 stroke · fill 은 --color-* 를 쓰지 않음.
- 지도 · 3D · CAD 캔버스가 읽는 바탕 · 선 색은 --draw-*.
- 옛 변수 값을 일부러 바꿔도 그림 선언의 풀린 색이 같음(밝음 · 어두움 · 시스템 어두움).
@@ -50,6 +50,7 @@ NO_COLOR_READS = [
"B07_DesignDetail/openwebcad/src/drawControllers/screenCanvas.drawController.ts",
]
DRAW_NAMES_READ = {m for _, n in DRAW_READS for m in re.findall(r"--draw-[a-z-]+", n)}
DECL = re.compile(r"^\s*(stroke|fill|stop-color|--b06-tag)\s*:(.*);", re.M)
VAR = re.compile(r"var\((--[a-z0-9-]+)(?:\s*,\s*([^()]*(?:\([^()]*\))?[^()]*))?\)")
HEX = re.compile(r"#[0-9a-f]{6}")
@@ -124,7 +125,14 @@ def test_draw_values_are_literal_hex():
assert draws, mode
for name, value in draws.items():
assert HEX.fullmatch(value), (mode, name, value)
assert len([k for k in blocks["light"] if k.startswith("--draw-")]) == 21
# 밝음 블록이 전부 정의 · 어두움 · 시스템 어두움은 그 안의 것만 덮음(고정 개수 아님)
light = {k for k in blocks["light"] if k.startswith("--draw-")}
for mode in ("dark", "auto"):
assert {k for k in blocks[mode] if k.startswith("--draw-")} <= light, mode
# 캔버스 · 3D 가 읽는 바탕 · 선 색은 세 모드 모두에서 풀림
for mode, env in _modes(THEME.read_text(encoding="utf-8")).items():
for name in DRAW_NAMES_READ:
assert name in env, (mode, name)
def test_drawing_css_uses_no_screen_tokens():