Files
Pier_v1/tests/footing-rebar-settings.test.ts
T
ypshimandClaude Haiku 5.5 ddd6d55a72 feat(rebar): 격자 실간격을 교각축(B1–B4·B9)과 교각축 직각(B5–B8·B11·B12)으로 나눠 입력
- footing-settings: s → sAxis(교각축) · sPerp(교각축 직각), 범위는 동일 (100–150)
- grid·gridPositions가 방향 키를 받음. B1–B4 grid는 sAxis, B5–B8 grid는 sPerp, B9 행·열은 sAxis, B11·B12는 sPerp
- 철근표 간격·실간격과 근거가 방향별 값을 씀 (B12는 교각축 직각 값, 승인 2026-10-26)
- 3D 확대기초 그림의 위치도 방향별 값을 씀
- 패널 입력 두 칸으로 분리

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

69 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 { assemblyJs, 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('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);
});
});