Files
Pier_v1/tests/abut-bearing-table.test.ts
T
ypshimandClaude Opus 5.5 796a267205 refactor(abut): 교량받침 카드에서 받침 종류 · 용량 입력 삭제
- 받침 종류 · 용량 입력칸과 받침 규칙의 kind 값을 제거
- 예전 프로젝트 파일에 저장된 kind 값은 읽을 때 무시 (불러오기 오류 없음)
- 테스트 갱신. 전체 651건 통과, 타입 검사·빌드 통과

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 18:40:16 +09:00

82 lines
3.9 KiB
TypeScript
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.
import { readFileSync } from 'node:fs';
import { fileURLToPath } from 'node:url';
import * as XLSX from 'xlsx';
import { describe, expect, it } from 'vitest';
import { buildAbut } from '../src/core/abut/geometry';
import { parseAbutments, toAbutInput } from '../src/core/abut/parse';
import { buildMembers } from '../src/core/abut/members';
import {
ABUT_BEARING_RULE_DEFAULT,
abutBearingChecks,
abutElevationRows,
abutSolplatePlan,
abutSolplateRows,
resolveBearingRule,
} from '../src/core/abut/bearing-table';
import { applyBearingRule } from '../src/core/abut/edit';
import { checkStoredAbutments } from '../src/core/project';
const RAG = fileURLToPath(new URL('../../../RAG/운곡교P1입력.xlsx', import.meta.url));
const rec = parseAbutments(XLSX.read(readFileSync(RAG), { type: 'buffer' })).abutments[0];
const input = toAbutInput(rec);
const model = buildAbut(input);
const members = buildMembers(model, { bottomEl: input.foundationBottomEl, pileLengthMm: input.pileLengthMm });
const rule = resolveBearingRule();
const H = rec.bearingHeightMm;
describe('교대 받침 카드 (교각 솔플레이트 규칙, 받침높이 H = 교대 시트 값)', () => {
it('the rule defaults are the pier rule: 1000 × 1100 · −0.5 %, H 275 from the 교대 sheet', () => {
expect(ABUT_BEARING_RULE_DEFAULT).toMatchObject({ lengthMm: 1000, widthMm: 1100, slopePct: -0.5 });
expect(H).toBe(275);
// T = ⌈22 + 1000·0.5/200⌉ = 25, h3 = 275 − 25 = 250, T1/T2 = 25 ± 2.5
expect(abutSolplatePlan(rule, H)).toMatchObject({ T: 25, h3: 250, T1: 27.5, T2: 22.5 });
});
it('ELEVATION: block 125 = 75 + 50, E = 75 + 50 + 250 + 25 = 400', () => {
const rows = abutElevationRows(model, rule, H);
expect(rows).toHaveLength(5);
for (const r of rows) {
expect([r.h1, r.h2, r.h3, r.h4, r.E]).toEqual([75, 50, 250, 25, 400]);
expect(r.solplateTopEl).toBeCloseTo(r.seatEl + 0.4, 6);
}
const first = rows.find((r) => r.no === 1)!;
expect(first.seg).toBe('①');
expect(first.seatEl).toBeCloseTo(44.367, 3);
expect(first.z).toBeCloseTo(44.492, 3);
});
it('솔플레이트 TABLE: L 1000, W 1100, S −0.5 %, T 25, T1 27.5 / T2 22.5, check 5.0 = 5.0', () => {
const [r] = abutSolplateRows(model, rule, H);
expect([r.L, r.W, r.S, r.T, r.T1, r.T2]).toEqual([1000, 1100, -0.5, 25, 27.5, 22.5]);
expect(r.check).toBe('5.0 = 5.0');
});
it('the rule inputs change the plan: S −1.91 gives T 32 and h3 243', () => {
const steep = resolveBearingRule({ slopePct: -1.91 });
// T = ⌈22 + 1000·1.91/200⌉ = ⌈31.55⌉ = 32
expect(abutSolplatePlan(steep, H)).toMatchObject({ T: 32, h3: 243 });
expect(abutElevationRows(model, steep, H)[0].E).toBe(75 + 50 + 275);
});
it('checks: W02, W04 (흉벽 ≈ 145 · 전면 255), W03 and I01 all clear for A1', () => {
const lines = abutBearingChecks(model, members, rule, H);
expect(lines).toHaveLength(4);
expect(lines[0]).toContain('W02 없음');
// 시안 145 is bearing ① (lateral 0.745); the smallest gap over the five bearings is 144 (lateral 0.744).
expect(lines[1]).toMatch(/흉벽 14[45]/);
expect(lines[1]).toContain('전면 255');
expect(lines[1]).toContain('W04 없음');
expect(lines[2]).toContain('W03 없음');
expect(lines[3]).toContain('I01 없음');
});
it('the rule edit keeps only changed values, refuses L 0 and a rule thicker than H, and the project file accepts it', () => {
const edited = applyBearingRule(applyBearingRule(rec, 'lengthMm', 900), 'widthMm', 1000);
expect(edited.bearingRule).toEqual({ lengthMm: 900, widthMm: 1000 });
expect(() => applyBearingRule(rec, 'lengthMm', 0)).toThrow('0보다');
expect(() => applyBearingRule(rec, 'slopePct', 60)).toThrow('받침높이');
expect(() => checkStoredAbutments([edited])).not.toThrow();
expect(() => checkStoredAbutments([{ ...edited, bearingRule: { lengthMm: 'x' } }])).toThrow('받침 규칙');
});
});