Files
Pier_v1/tests/bearing-table.test.ts
T
ypshimandClaude Opus 5.5 3bd2340609 feat(bearing): 솔플레이트 표에 '방위각 검사 (″)' 열 (Q-SH4)
교각·교대 솔플레이트 상세 TABLE에 받침별로 엑셀 방위각과 짝 받침 방향의 차이(초)를 보인다.
10″ 이하 "≤ 10″", 넘으면 WS01, 짝이 없으면 "— (짝 없음)".
- BearingSole.azimuthCheckSec (짝의 from/to 쪽에 맞는 값), 표 행 azimuthSec
- 테스트: P1 전열 ≤ 0.5″ · 후열 없음, A1 ≤ 0.5″, P1 ③ 방위각 75°59′ 오타 → 약 87″ · WS01 그 받침만
- 브라우저 확인(운곡교 완도·광주 데이터): P1-광주 전열 짝 A1-광주 0.0–0.3″, 후열 짝 P2-광주 0.0–0.1″

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 15:39:42 +09:00

84 lines
3.7 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 { describe, expect, it } from 'vitest';
import { buildPier } from '../src/core/geometry';
import { elevationRows, pairCopingSpans, solplateRows } from '../src/core/bearing-table';
import { loadP1, p1Pairs } from './helpers';
// Bridge context (A1 ↔ P1 girder pairs) as in the app, so the solplate slope is computed (2026-11-06).
const P1CTX = { pairs: p1Pairs() };
const model = buildPier(loadP1(), P1CTX);
const integrated = buildPier({ ...loadP1(), bearingLayout: '일체' }, P1CTX);
describe('교량받침 ELEVATION TABLE (모델값, 2026-11-03)', () => {
const rows = elevationRows(model);
it('one row per bearing; EL.X is the Excel z (mortar top)', () => {
expect(rows.length).toBe(10);
expect(rows[0].elx).toBeCloseTo(43.561, 3);
expect(rows[5].elx).toBeCloseTo(43.611, 3);
});
it('front block 100 mm, back block 150 mm; mortar 50; bearing 181; solplate 30 (T = T_ref → no drop); E = sum', () => {
expect(rows[0]).toMatchObject({ h1: 100, h2: 50, h3: 181, h4: 30, E: 361 });
expect(rows[5]).toMatchObject({ h1: 150, h2: 50, h3: 181, h4: 30, E: 411 });
});
it('C1 is 600 for a 분리 bearing; C6 is the 1200 block depth; C4 and C5 are 600 each', () => {
expect(rows.every((r) => r.C1 === 600)).toBe(true);
expect(rows.every((r) => r.C6 === 1200)).toBe(true);
expect(rows[0]).toMatchObject({ C4: 600, C5: 600 });
});
it('C2 and C3 sit on the front row only: C2 is the bearing distance along 교축, C3 = C2 + 1200', () => {
expect(rows[0].C2).toBeGreaterThan(1000);
expect(rows[0].C3).toBe(rows[0].C2! + 1200);
expect(rows[5].C2).toBeNull();
expect(rows[5].C3).toBeNull();
});
it('S1 and S2 come from the block rebar: 8 bars of 2500 each on a 분리 block', () => {
expect(rows[0].S1).toEqual({ count: 8, length: 2500 });
expect(rows[0].S2).toEqual({ count: 8, length: 2500 });
});
it('일체: the pair block gives C3 = 2500 on the front row and the bars on the front row only', () => {
const ir = elevationRows(integrated);
expect(ir[0].C3).toBe(2500);
expect(ir[5].S1).toBeNull();
expect(ir[0].S1).not.toBeNull();
});
});
describe('솔플레이트 TABLE (모델값, 2026-11-03)', () => {
it('10 rows: S from the A1 pair (−1.908 %), L 800, W 740, T 30, T1 38, T2 22; W08 holds within 1 mm (2026-11-06)', () => {
const rows = solplateRows(model);
expect(rows.length).toBe(10);
expect(rows[0]).toMatchObject({ L: 800, W: 740, T: 30, T1: 38, T2: 22, ok: true, pair: 'A1-①', source: '계산' });
expect(rows[0].S).toBeCloseTo(-1.908, 3);
expect(rows[0].checkLhs).toBe(16);
expect(rows[0].checkRhs).toBeCloseTo(15.265, 2);
// 후열 ⑥: no pair (P2 not loaded) → the front twin ① value, 가정 + WS03.
expect(rows[5]).toMatchObject({ source: '가정', pair: undefined, T: 30 });
// 방위각 검사 (″, Q-SH4): front row against the A1 direction ≤ 0.5″, back row has no pair.
expect(rows.slice(0, 5).every((r) => r.azimuthSec !== undefined && r.azimuthSec <= 0.5)).toBe(true);
expect(rows[5].azimuthSec).toBeUndefined();
expect(rows[5].warnings).toContain('WS03');
});
});
describe('S1·S2 코핑 치수 (2026-11-03)', () => {
it('S1 + S2 + S1 = the coping width B (3100); S1 is bearing centre to the coping edge', () => {
const s = pairCopingSpans(model, 0)!;
expect(s.copingWidth).toBe(3100);
expect(s.S1Low + s.S2 + s.S1High).toBe(3100);
// Pair 1 · 6 (P1): the 후열 sits at n −0.600 (low side), the 전열 at n +0.698 (high side). S1 low 950 (후열), S2 1298, S1 high 852 (전열).
expect(s.S1Low).toBe(950);
expect(s.S2).toBe(1298);
expect(s.S1High).toBe(852);
});
it('an unknown pair gives null', () => {
expect(pairCopingSpans(model, 99)).toBeNull();
});
});