T형과 다주형 모두 엑셀 Pier 시트 철근표(C12 상단, C13 하단(변화구간))에 맞춰 측면 수평철근 번호를 서로 바꾼다 (사용자 결정 2026-11-06). - 경사 하면에서 끊기는 아래 단 → C13, 끝면까지 가는 위 단 → C12 - 철근표 위치·비고 문구, 3D, 다주형 생성기가 같은 원천(sideRows)을 따른다 - C14 높이 순서를 유지하도록 측면 단을 아래(C13) → 위(C12) 순서로 넘김 - 테스트 기대값의 번호를 교환 (P1: C12 2단 8개, C13 5단 20개) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
65 lines
3.0 KiB
TypeScript
65 lines
3.0 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
||
import { buildPier } from '../src/core/geometry';
|
||
import { rebarSummary } from '../src/core/rebar/summary';
|
||
import { loadP1 } from './helpers';
|
||
|
||
const { rows, warnings } = rebarSummary(buildPier(loadP1()));
|
||
const count = (name: string) => rows.find((r) => r.name === name)!.count;
|
||
|
||
describe('③ 철근표 요약 (P1)', () => {
|
||
it('bearing blocks: S1 and S2 80 bars each', () => {
|
||
expect(count('S1')).toBe(80);
|
||
expect(count('S2')).toBe(80);
|
||
});
|
||
|
||
it('coping: C1–C8 12 each, C9 18, C10 9, C11 18, C13 20 (5 rows × 일자 2 + ㄷ 2), C12 8 (2 rows), C14 38, C15 11, C16 22', () => {
|
||
for (const n of ['C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8']) expect(count(n)).toBe(12);
|
||
expect(count('C9')).toBe(18);
|
||
expect(count('C10')).toBe(9);
|
||
expect(count('C11')).toBe(18);
|
||
expect(count('C13')).toBe(20);
|
||
expect(count('C12')).toBe(8);
|
||
expect(count('C14')).toBe(38);
|
||
expect(count('C15')).toBe(11);
|
||
expect(count('C16')).toBe(22);
|
||
});
|
||
|
||
it('column: P1 230, P2 230, couplers 368, P3 39, P5 19, P4 8, P6 32', () => {
|
||
expect(count('P1')).toBe(230);
|
||
expect(count('P2')).toBe(230);
|
||
expect(count('주철근 커플러')).toBe(368);
|
||
expect(count('띠철근 커플러')).toBe(35);
|
||
expect(count('P3')).toBe(39);
|
||
expect(count('P5')).toBe(19);
|
||
expect(count('P4')).toBe(8);
|
||
expect(count('P6')).toBe(32);
|
||
});
|
||
|
||
it('footing (방향 교환): B1–B4 40 each, B5–B8 31 each, B10-1 16, B10-2 16, B11 30, B12 24 (k = 8)', () => {
|
||
for (const n of ['B1', 'B2', 'B3', 'B4']) expect(count(n)).toBe(40);
|
||
for (const n of ['B5', 'B6', 'B7', 'B8']) expect(count(n)).toBe(31);
|
||
expect(count('B10-1')).toBe(16);
|
||
expect(count('B10-2')).toBe(16);
|
||
expect(count('B11')).toBe(30);
|
||
expect(count('B12')).toBe(24);
|
||
});
|
||
|
||
it('B9: 306 bars (320 on the grid less 14 in the column zone); warnings: B6 needs a splice (13646 > 12000)', () => {
|
||
expect(count('B9')).toBe(306);
|
||
expect(warnings.map((w) => w.code)).toEqual(['I02', 'RB-S04', 'RB-F08']); // defaults are assumed values (I02); bearing embedment 619–669 < 882 (RB-S04)
|
||
expect(warnings.find((w) => w.code === 'RB-F08')!.bar).toBe('B6');
|
||
// B6 is split into two pieces (추천안): each piece is about half the 13646 bar plus half the lap.
|
||
expect(rows.find((r) => r.name === 'B6')!.length!).toBeCloseTo(7776, 0);
|
||
});
|
||
|
||
it('lengths from the documents: C12 11746, C14 3447.5, C15 3852, C16 4070, P3 ≈ C_t + 1.3·l_d, P5 ≈ C_t', () => {
|
||
// C12 has several lengths now: its straight bars are pieces (수정 2026-10-23); 11746 is the first 일자.
|
||
expect(rows.find((r) => r.name === 'C12')!.pieces!.some((p) => p.length === 11746)).toBe(true);
|
||
expect(rows.find((r) => r.name === 'C14')!.length).toBe(3447.5);
|
||
expect(rows.find((r) => r.name === 'C15')!.length).toBe(3852);
|
||
expect(rows.find((r) => r.name === 'C16')!.length).toBe(4070);
|
||
expect(rows.find((r) => r.name === 'P5')!.length).toBeCloseTo(5657.7, 0);
|
||
expect(rows.find((r) => r.name === 'P3')!.length!).toBeCloseTo(5657.7 + 1146.6, 0);
|
||
});
|
||
});
|