- 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>
79 lines
2.9 KiB
TypeScript
79 lines
2.9 KiB
TypeScript
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);
|
||
});
|
||
});
|