Files
Pier_v1/tests/rebar-summary.test.ts
T
ypshimandClaude Haiku 5.5 4d5e3cc04e feat(rebar): P3 and P6 end at the coping middle level; e_top computed from it
The coping middle level is (Level underside + step top)/2. P3's top and P6's upper limit are this level, and e_top is the
step top minus it (P1: 1322, replacing the 1623 reverse-engineered value). On P1 P3 goes from 38 to 39 ties and P6 stays at
8 levels. With taper h2 = 3000 the middle level is 13275: P3 37 ties, P6 8 levels (32 bars), e_top 2072.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-23 13:30:28 +09:00

65 lines
3.0 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 { 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, C12 20 (5 rows × 일자 2 + ㄷ 2), C13 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('C12')).toBe(20);
expect(count('C13')).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 31 each, B5–B8 40 each, B10-1 18, B10-2 18, B11 60, B12 47', () => {
for (const n of ['B1', 'B2', 'B3', 'B4']) expect(count(n)).toBe(31);
for (const n of ['B5', 'B6', 'B7', 'B8']) expect(count(n)).toBe(40);
expect(count('B10-1')).toBe(18);
expect(count('B10-2')).toBe(18);
expect(count('B11')).toBe(60);
expect(count('B12')).toBe(47);
});
it('B9: 306 bars (320 on the grid less 14 in the column zone); warnings: B2 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('B2');
// B2 is split into two pieces (추천안): each piece is about half the 13646 bar plus half the lap.
expect(rows.find((r) => r.name === 'B2')!.length!).toBeCloseTo(7776, 0);
});
it('lengths from the documents: C13 11746, C14 3447.5, C15 3852, C16 4070, P3 ≈ C_t + 1.3·l_d, P5 ≈ C_t', () => {
// C13 has several lengths now: its straight bars are pieces (수정 2026-10-23); 11746 is the first 일자.
expect(rows.find((r) => r.name === 'C13')!.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);
});
});