feat(유토곡선): 354-2 종단 기준 숨김 — 그리기 횡단 기준만 · 저장된 종단 범례는 횡단으로 맞춤 · 계산 코드 · 묶음 단계 그대로
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QfHKQs7J3hQELKMWQMUJEy
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
/* 354-2 종단 기준 숨김 — 진짜 `readVisible`(B05 유토곡선) · `normalizeVisibleBasis` ·
|
||||
* `computeMassHaulSeries`(공용)를 잘라 돌려 JSON 으로 냄.
|
||||
* · 저장된 범례 = 종단 → 횡단으로 맞춤 · 분배 켬은 그대로
|
||||
* · 기준 ["cross"] = 횡단 계열 하나 · 기본(묶음 단계) = 두 기준 그대로 */
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript"));
|
||||
|
||||
const ROOT = path.join(__dirname, "..", "..");
|
||||
const read = (...p) => fs.readFileSync(path.join(ROOT, ...p), "utf8");
|
||||
const transpile = (code) =>
|
||||
ts.transpileModule(code, {
|
||||
compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 },
|
||||
}).outputText;
|
||||
const block = (src, head) => {
|
||||
const at = src.indexOf(head);
|
||||
if (at < 0) throw new Error(`없음: ${head}`);
|
||||
return src.slice(at, src.indexOf("\n}", at) + 2).replace(/^export /, "");
|
||||
};
|
||||
|
||||
const util = read("common_util", "common_util_mass_haul.ts");
|
||||
const mass = read("B05_Profile", "B05_Profile_UI_Profile_MassHaul.ts");
|
||||
let stored = null;
|
||||
const src = [
|
||||
'const SERIES_BASES = ["cross", "longitudinal"];',
|
||||
'const DEFAULT_VISIBLE = ["cross"];',
|
||||
block(util, "export function normalizeVisibleBasis("),
|
||||
block(mass, "function readVisible(): Set<string> {"),
|
||||
block(util, "export function computeMassHaulSeries("),
|
||||
].join("\n");
|
||||
const api = new Function(
|
||||
"readStateRaw",
|
||||
"designedSections",
|
||||
"crossAreaSamples",
|
||||
"longitudinalAreaSamples",
|
||||
"integrate",
|
||||
`${transpile(src)}; return { readVisible, computeMassHaulSeries };`,
|
||||
)(
|
||||
() => stored,
|
||||
(sections) => sections,
|
||||
() => [{ basis: "cross" }],
|
||||
() => [{ basis: "longitudinal" }],
|
||||
(samples) => ({ from: samples[0].basis }),
|
||||
);
|
||||
|
||||
const visible = (raw) => ((stored = raw), [...api.readVisible()].sort());
|
||||
process.stdout.write(
|
||||
JSON.stringify({
|
||||
longitudinal: visible('["longitudinal"]'),
|
||||
longitudinalBalance: visible('["longitudinal","balance"]'),
|
||||
cross: visible('["cross"]'),
|
||||
empty: visible(null),
|
||||
broken: visible("{"),
|
||||
crossOnly: api.computeMassHaulSeries({}, [], {}, undefined, ["cross"]).map((s) => s.key),
|
||||
both: api.computeMassHaulSeries({}, [], {}).map((s) => s.key),
|
||||
}),
|
||||
);
|
||||
@@ -0,0 +1,59 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""354-2 유토곡선 종단 기준 숨김 — 안 셈 · 안 그림 · 범례 단추 없음(코드 남김).
|
||||
|
||||
- 그리기 = 횡단 기준만(`["cross"]`) · 범례는 낸 계열마다라 종단 단추가 안 섬.
|
||||
- 저장된 범례가 종단(`longitudinal`)이면 횡단으로 맞춤 · 분배 켬은 그대로.
|
||||
- 계산 묶음 단계(MassHaul_Stage)는 두 기준 그대로 · 공용 계산 코드 남김.
|
||||
|
||||
`helper_354_2_masshaul_cross_only.cjs` 가 진짜 TS 를 잘라 돌림.
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
HERE = os.path.dirname(os.path.abspath(__file__))
|
||||
ROOT = Path(HERE).parents[1]
|
||||
|
||||
|
||||
@pytest.fixture(scope="module")
|
||||
def r():
|
||||
proc = subprocess.run(
|
||||
["node", os.path.join(HERE, "helper_354_2_masshaul_cross_only.cjs")],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
encoding="utf-8",
|
||||
timeout=60,
|
||||
)
|
||||
assert proc.returncode == 0, proc.stderr
|
||||
return json.loads(proc.stdout)
|
||||
|
||||
|
||||
def test_저장된_종단_범례는_횡단으로(r):
|
||||
assert r["longitudinal"] == ["cross"]
|
||||
assert r["longitudinalBalance"] == ["balance", "cross"]
|
||||
assert r["cross"] == ["cross"]
|
||||
assert r["empty"] == ["cross"] and r["broken"] == ["cross"]
|
||||
|
||||
|
||||
def test_기준_횡단만_계산(r):
|
||||
assert r["crossOnly"] == ["cross"]
|
||||
assert r["both"] == ["cross", "longitudinal"] # 공용 기본값 = 묶음 단계 그대로
|
||||
|
||||
|
||||
def test_그리기는_횡단만_부름():
|
||||
mass = (ROOT / "B05_Profile/B05_Profile_UI_Profile_MassHaul.ts").read_text(encoding="utf-8")
|
||||
calls = re.findall(r"computeMassHaulSeries\(([^;]*?)\)", mass, re.S)
|
||||
assert calls and all('["cross"]' in call for call in calls)
|
||||
|
||||
|
||||
def test_묶음_단계와_공용_코드는_그대로():
|
||||
stage = (ROOT / "B05_Profile/logic/B05_Profile_MassHaul_Stage.ts").read_text(encoding="utf-8")
|
||||
assert '["cross"]' not in stage
|
||||
util = (ROOT / "common_util/common_util_mass_haul.ts").read_text(encoding="utf-8")
|
||||
assert 'const SERIES_BASES: MassHaulBasis[] = ["cross", "longitudinal"];' in util
|
||||
assert "longitudinalAreaSamples(longitudinal, sections)" in util
|
||||
Reference in New Issue
Block a user