- The coping section listed every piece of a bar as its own crossing, so the same spot and name were drawn many times. Each spot is drawn once and each bar name is written once. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
44 lines
1.9 KiB
TypeScript
44 lines
1.9 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
||
import { buildPier } from '../src/core/geometry';
|
||
import { buildRebar3D } from '../src/view/rebar3d';
|
||
import { copingBarGroup, copingFrontSvg, copingSectionSvg } from '../src/view/coping-rebar-svg';
|
||
import { loadP1 } from './helpers';
|
||
|
||
const model = buildPier(loadP1());
|
||
const scene = buildRebar3D(model);
|
||
|
||
describe('코핑 배근 정면 · 단면 (승인 2026-10-26)', () => {
|
||
it('the 3D bar records include the coping bars, the same data as the meshes', () => {
|
||
const coping = scene.records.filter((r) => /^C\d/.test(r.name));
|
||
expect(coping.length).toBeGreaterThan(0);
|
||
expect(scene.records.length).toBeGreaterThan(coping.length - 1);
|
||
});
|
||
|
||
it('the front view draws one polyline per coping bar', () => {
|
||
const coping = scene.records.filter((r) => /^C\d/.test(r.name));
|
||
const svg = copingFrontSvg(scene.records, model.copingL * 1000);
|
||
expect((svg.match(/<polyline/g) ?? []).length).toBe(coping.length);
|
||
});
|
||
|
||
it('groups the bars: C1–C8 main, C9–C11 loops, C12–C13 sides, C14–C16 steps', () => {
|
||
expect(copingBarGroup('C1')).toBe('main');
|
||
expect(copingBarGroup('C9')).toBe('loop');
|
||
expect(copingBarGroup('C12')).toBe('side');
|
||
expect(copingBarGroup('C15')).toBe('step');
|
||
});
|
||
|
||
it('the section at mid-length shows the bars that cross it', () => {
|
||
const svg = copingSectionSvg(scene.records, model.copingL / 2);
|
||
expect((svg.match(/<circle/g) ?? []).length).toBeGreaterThan(0);
|
||
});
|
||
});
|
||
|
||
describe('단면 · 폐합 글자 겹침 (승인 2026-10-26)', () => {
|
||
it('writes each bar name once, and each spot once', () => {
|
||
const svg = copingSectionSvg(scene.records, 6);
|
||
const labels = (svg.match(/<text /g) ?? []).length;
|
||
const names = new Set((svg.match(/font-size="120"[^>]*>(C\d+)</g) ?? []).map((s) => s.replace(/.*>/, '')));
|
||
expect(labels).toBe(names.size);
|
||
});
|
||
});
|