Files
Pier_v1/tests/rebar-footing.test.ts
T
ypshimandClaude Haiku 5.5 73bff19aba feat(core): B9 shear bars of the footing (plan C5)
- B9 (확대기초철근 (1).md §9): H16 with the 135° stirrup hook, on the odd grid
  (i_W = 1, 5, …), 16 rows, 20 per row (even rows start at i_L 1, odd at 3),
  320 bars, length l_v 1750 + 2 × 189 ≈ 2128.
- The rebar summary now lists B9; the alert about B9 is gone. Positions and
  hooks are the document's proposed rules (Q-B18, Q-B19), noted on the row.
- Tests: the document's B9 values; P1 summary has 320 and only the splice alert.
- Not verified in a browser.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-22 11:34:56 +09:00

79 lines
2.9 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 { assemblyBars, bottomBars, crossBars, grid, layers, legB2, shearB9, sideBars } from '../src/core/rebar/footing';
// P1 footing: L 10400 × W 8150 × H 2000.
const L = 10400;
const W = 8150;
const H = 2000;
describe('확대기초 철근 (확대기초철근 (1).md, plan C5)', () => {
it('grid across W: n 61, G 7625, e 162.5, 62 positions (§3.3)', () => {
const g = grid(W);
expect(g.n).toBe(61);
expect(g.G).toBe(7625);
expect(g.e).toBeCloseTo(162.5, 6);
expect(g.positions).toBe(62);
});
it('배근도 재현 grid: W 7800 → n 58, e 175', () => {
const g = grid(7800);
expect(g.n).toBe(58);
expect(g.e).toBeCloseTo(175, 6);
});
it('layer heights: B5 1900, B1 1873, B2·B4 150, B6·B8 177, B3 250, B7 277', () => {
const z = layers(H);
expect(z.B5).toBe(1900);
expect(z.B1).toBeCloseTo(1873, 6);
expect(z.B24).toBe(150);
expect(z.B68).toBeCloseTo(177, 6);
expect(z.B3).toBe(250);
expect(z.B7).toBeCloseTo(277, 6);
});
it('B2 leg 1723, B2 length 13646 (over the 12000 bar, splice needed)', () => {
expect(legB2(H)).toBeCloseTo(1723, 6);
const b2 = bottomBars(L, W, H).find((b) => b.name === 'B2')!;
expect(b2.length).toBeCloseTo(13646, 0);
expect(b2.count).toBe(31);
});
it('B1–B4 counts 31 / 31 / 31 / 31 and B4 length 10200', () => {
const bars = bottomBars(L, W, H);
expect(bars.map((b) => b.count)).toEqual([31, 31, 31, 31]);
expect(bars.find((b) => b.name === 'B4')!.length).toBeCloseTo(10200, 6);
});
it('B5–B8 counts 40 each (grid along L: n 79), B8 length 7950, B6 length 11396', () => {
const bars = crossBars(L, W, H);
expect(bars.map((b) => b.count)).toEqual([40, 40, 40, 40]);
expect(bars.find((b) => b.name === 'B8')!.length).toBeCloseTo(7950, 6);
expect(bars.find((b) => b.name === 'B6')!.length).toBeCloseTo(11396, 0);
});
it('B10-1 18 bars ≈ 10748, B10-2 18 bars ≈ 8494', () => {
const [b101, b102] = sideBars(L, W);
expect(b101.count).toBe(18);
expect(b101.length).toBeCloseTo(10748, 0);
expect(b102.count).toBe(18);
expect(b102.length).toBeCloseTo(8494, 0);
});
it('B11 60 bars (20 / 20 / 20) ≈ 8359, B12 47 bars (16 / 15 / 16) ≈ 10613', () => {
const [b11, b12] = assemblyBars(L, W);
expect(b11.count).toBe(60);
// The document rounds the 90° hook to 246 mm; the formula gives 246.45, so B11 is 1.2 mm longer.
expect(Math.abs(b11.length - 8359)).toBeLessThan(1.5);
expect(b12.count).toBe(47);
expect(b12.length).toBeCloseTo(10613, 0);
});
it('B9 shear: 16 rows, 20 per row, 320 in all, length ≈ 2128 (l_v 1750 + 2 × 189)', () => {
const b9 = shearB9(L, W, H);
expect(b9.rows).toBe(16);
expect(b9.perRow.every((c) => c === 20)).toBe(true);
expect(b9.count).toBe(320);
expect(b9.length).toBeCloseTo(2128, 0);
});
});