- 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>
69 lines
3.7 KiB
TypeScript
69 lines
3.7 KiB
TypeScript
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);
|
||
});
|
||
});
|