import { describe, expect, it } from 'vitest'; import { readFileSync } from 'node:fs'; import { BEARING_ELEVATION_REF } from '../src/core/bearing-ref'; import { parseBearingElevationTable, readDxfTexts, type DxfText } from '../src/core/dxf-table'; const texts = JSON.parse(readFileSync(new URL('./fixtures/bearing-table-texts.json', import.meta.url), 'utf-8')) as DxfText[]; describe('도면 받침 ELEVATION TABLE 읽기 (DXF 텍스트, 승인 2026-10-23)', () => { it('reads all ten bearings from the 운곡교 교각도(2) table', () => { const r = parseBearingElevationTable(texts); expect(r.errors).toEqual([]); expect(r.drawing.map((d) => d.no)).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); }); it('the values equal the reference table used for the 도면 비교 (EL.X, h1, h2 on every bearing)', () => { const r = parseBearingElevationTable(texts); for (const ref of BEARING_ELEVATION_REF) { const got = r.drawing.find((d) => d.no === ref.no)!; expect(got.elx, `No ${ref.no} EL.X`).toBeCloseTo(ref.elx, 3); expect(got.h1, `No ${ref.no} h1`).toBe(ref.h1); expect(got.h2, `No ${ref.no} h2`).toBe(ref.h2); } }); it('a leader-line "EL. X" label placed before the table does not replace the table header', () => { const distractor = { x: 11102.8, y: 11521.7, text: 'EL. "X"' }; const r = parseBearingElevationTable([distractor, ...texts]); expect(r.errors).toEqual([]); expect(r.drawing.map((d) => d.no)).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); }); it('a stray "NO" label elsewhere on the drawing does not move the No column', () => { const r = parseBearingElevationTable([{ x: 100, y: 100, text: 'NO.' }, ...texts]); expect(r.errors).toEqual([]); expect(r.drawing.map((d) => d.no)).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); }); it('reads TEXT entities from DXF text (x, y, string)', () => { const dxf = ['0', 'SECTION', '2', 'ENTITIES', '0', 'TEXT', '10', '100.5', '20', '200.25', '1', 'EL. "X"', '0', 'ENDSEC'].join('\n'); expect(readDxfTexts(dxf)).toEqual([{ x: 100.5, y: 200.25, text: 'EL. "X"' }]); }); });