Files
Pier_v1/tests/footing-rebar-settings.test.ts
T
ypshimandClaude Haiku 5.5 48e6811600 feat(rebar): 확대기초 패널 규칙 값 표시 (상면·2단, B2·B6 디리, B9, 조립 단 수) 및 "규칙" 표기
- footingRuleValues: 패널 표시값을 계산 함수에서 직접 읽음 (새 공식 없음)
- B2·B6 디리 두 값, 조립 단 수(3단) 표시
- "(고정)"은 Δ₂ 100에만 사용, 4s·2s·상면 2s는 "(규칙)"으로 표기
- 테스트: 기본값 P1에서 250 · 100 · 1723 · 500·250 · 500·3단 @400

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-26 17:23:57 +09:00

78 lines
4.2 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 { assemblyJs, footingRuleValues, gridPositions } from '../src/core/rebar/footing';
import { DEFAULT_FOOTING_REBAR, FOOTING_REBAR_RANGES, footingSettingsIssues } from '../src/core/rebar/footing-settings';
import { rebarSummary } from '../src/core/rebar/summary';
import { loadP1 } from './helpers';
describe('확대기초 배근 입력 (승인 2026-10-26, 시안 ③ 확대기초)', () => {
it('the defaults are inside every range and raise no issue', () => {
expect(footingSettingsIssues(DEFAULT_FOOTING_REBAR)).toEqual([]);
for (const [key, [lo, hi]] of Object.entries(FOOTING_REBAR_RANGES)) {
const v = DEFAULT_FOOTING_REBAR[key as keyof typeof DEFAULT_FOOTING_REBAR];
expect(v >= lo && v <= hi, key).toBe(true);
}
});
it('a value outside its range gives FT01; a non-integer n gives FT02', () => {
expect(footingSettingsIssues({ ...DEFAULT_FOOTING_REBAR, cTop: 151 })).toEqual([expect.objectContaining({ code: 'FT01', key: 'cTop' })]);
expect(footingSettingsIssues({ ...DEFAULT_FOOTING_REBAR, n: 2.5 })).toEqual([expect.objectContaining({ code: 'FT02', key: 'n' })]);
});
it('the grid spacing s reaches the grid positions and the rebar table', () => {
const m = buildPier({ ...loadP1(), footingRebar: { sAxis: 150 } });
expect(m.footingRebar.sAxis).toBe(150);
const xs = gridPositions(8000, m.footingRebar);
expect(xs[1] - xs[0]).toBeCloseTo(150, 6);
const b4 = rebarSummary(m).rows.find((r) => r.name === 'B4')!;
const b4Default = rebarSummary(buildPier(loadP1())).rows.find((r) => r.name === 'B4')!;
expect(b4.count).not.toBe(b4Default.count);
});
it('철근표 간격: P1 기본값 B2 250 / 125 · B10-1 200 (기본값); s 150 → B2 300 / 150 · B1 300 (입력)', () => {
const base = rebarSummary(buildPier(loadP1())).rows;
const b2 = base.find((r) => r.name === 'B2')!;
expect([b2.spacing, b2.actual, b2.basis]).toEqual(['250', '125', 'default']);
const b10 = base.find((r) => r.name === 'B10-1')!;
expect([b10.spacing, b10.basis]).toEqual(['200', 'default']);
const rows = rebarSummary(buildPier({ ...loadP1(), footingRebar: { sAxis: 150 } })).rows;
const b2s = rows.find((r) => r.name === 'B2')!;
expect([b2s.spacing, b2s.actual, b2s.basis]).toEqual(['300', '150', 'input']);
const b1s = rows.find((r) => r.name === 'B1')!;
expect([b1s.spacing, b1s.actual]).toEqual(['300', '300']);
expect(rows.find((r) => r.name === 'B10-1')!.basis).toBe('default');
});
it('교각축 직각 값은 B5–B8·B11·B12에만, 교각축 값은 B1–B4·B9에 적용 (승인 2026-10-26)', () => {
const rows = rebarSummary(buildPier({ ...loadP1(), footingRebar: { sPerp: 150 } })).rows;
const b5 = rows.find((r) => r.name === 'B5')!;
expect([b5.spacing, b5.basis]).toEqual(['300', 'input']);
const b12 = rows.find((r) => r.name === 'B12')!;
expect([b12.spacing, b12.basis]).toEqual(['600 (4s)', 'input']);
expect(rows.find((r) => r.name === 'B1')!.basis).toBe('default');
expect(rows.find((r) => r.name === 'B9')!.basis).toBe('default');
const rowsAxis = rebarSummary(buildPier({ ...loadP1(), footingRebar: { sAxis: 150 } })).rows;
expect(rowsAxis.find((r) => r.name === 'B9')!.spacing).toBe('600 (4s)');
expect(rowsAxis.find((r) => r.name === 'B5')!.basis).toBe('default');
});
it('패널 규칙 값 (P1, H 2000): 상면·2단 250 · Δ₂ 100 · B2·B6 1723 · B9 500·250 · 조립 500 · 3단 @400', () => {
const r = footingRuleValues(2000, DEFAULT_FOOTING_REBAR);
expect([r.upper2sAxis, r.upper2sPerp, r.delta2]).toEqual([250, 250, 100]);
expect(r.b2Leg).toBeCloseTo(1723, 0);
expect(r.b6Leg).toBeCloseTo(1723, 0);
expect([r.b9Pitch, r.b9Stagger]).toEqual([500, 250]);
expect([r.assemblyPlanPitch, r.assemblyVertical, r.assemblyLevels]).toEqual([500, 400, 3]);
});
it('the 조립 단 배수 n reaches the assembly levels', () => {
const H = 2000;
const base = assemblyJs(H, DEFAULT_FOOTING_REBAR);
const wider = assemblyJs(H, { ...DEFAULT_FOOTING_REBAR, n: 3 });
expect(wider.length).toBeLessThan(base.length);
expect(wider.every((j) => j % 3 === 0)).toBe(true);
});
});