Files
Pier_v1/tests/bearing-ref.test.ts
T
ypshimandClaude Haiku 5.5 802a1eab97 fix(view): EL.X = block top including the 50 mm mortar; coping top = EL.X − h1 − h2 (matches the model)
With this definition the drawing's coping top matches the model's coping top to within 1 mm on all ten bearings. The earlier
0.211 m offset came from reading EL.X as the solplate top, which was wrong. The reference table now uses EL.X − h1 − h2,
and the check tests the match.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-23 14:17:12 +09:00

67 lines
2.8 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 { BEARING_ELEVATION_REF, SOLPLATE_REF, SOLPLATE_T_RULE, solplateTs } from '../src/core/bearing-ref';
import { loadP1 } from './helpers';
describe('교량받침 reference (도면값, 읽기 전용, 1단계)', () => {
it('E = h1 + h2 + h3 + h4 on every row', () => {
for (const r of BEARING_ELEVATION_REF) expect(r.h1 + r.h2 + r.h3 + r.h4, `No ${r.no}`).toBe(r.E);
});
it('solplate L = A + 100 and W = B + 100 against the elevation row', () => {
BEARING_ELEVATION_REF.forEach((e, i) => {
expect(SOLPLATE_REF[i].L, `No ${e.no}`).toBe(e.A + 100);
expect(SOLPLATE_REF[i].W, `No ${e.no}`).toBe(e.B + 100);
});
});
it('T1 and T2 follow T ± L·|S|/2 on every row (the 검산 column)', () => {
for (const r of SOLPLATE_REF) {
const c = solplateTs(SOLPLATE_T_RULE, r.L, r.s);
expect(c.T1, `No ${r.no}`).toBe(r.T1);
expect(c.T2, `No ${r.no}`).toBe(r.T2);
}
});
it('the solplate tapers along the axis: T1 (−측) + T2 (+측) = 2·T, with T = 30 at the centre', () => {
for (const r of SOLPLATE_REF) {
expect(r.T, `No ${r.no}`).toBe(SOLPLATE_T_RULE);
expect(r.T1 + r.T2, `No ${r.no}`).toBe(2 * r.T);
expect(r.T1, `No ${r.no}`).toBeGreaterThan(r.T2);
}
});
it('EL.X = block top incl. the 50 mm mortar: coping top = EL.X − h1 − h2 matches the model on all ten bearings (within 2 mm)', () => {
const m = buildPier(loadP1());
const back = m.blocks.filter((b) => b.row === '후열');
const diffs = BEARING_ELEVATION_REF.map((r) => {
const modelTop = r.row === '전열' ? m.segments[r.no - 1].top : back[r.no - 6].bottom;
return modelTop - (r.elx - (r.h1 + r.h2) / 1000);
});
for (const d of diffs) expect(Math.abs(d)).toBeLessThan(0.002);
});
});
import { applyBearingRules, BEARING_RULES_DEFAULT } from '../src/core/bearing-ref';
describe('교량받침 공통 규칙 (2단계)', () => {
it('with the drawing values, the rules give back the drawing E, L, W, T1, T2 on every bearing', () => {
BEARING_ELEVATION_REF.forEach((r, i) => {
const v = applyBearingRules(r, BEARING_RULES_DEFAULT);
expect(v.E, `No ${r.no}`).toBe(r.E);
expect(v.L, `No ${r.no}`).toBe(SOLPLATE_REF[i].L);
expect(v.W, `No ${r.no}`).toBe(SOLPLATE_REF[i].W);
expect(v.T1, `No ${r.no}`).toBe(SOLPLATE_REF[i].T1);
expect(v.T2, `No ${r.no}`).toBe(SOLPLATE_REF[i].T2);
});
});
it('a 10 mm larger mortar h2 raises E by 10 and leaves L, W and T1, T2 unchanged', () => {
const r = BEARING_ELEVATION_REF[0];
const v = applyBearingRules(r, { ...BEARING_RULES_DEFAULT, h2: BEARING_RULES_DEFAULT.h2 + 10 });
expect(v.E).toBe(r.E + 10);
expect(v.L).toBe(r.A + 100);
expect(v.T1).toBe(SOLPLATE_REF[0].T1);
});
});