Files
Pier_v1/tests/all-piers.test.ts
T
ypshimandClaude Haiku 5.5 e5d8002c79 fix(view): 지형 모델이 없을 때 60 m 사각판 대신 교각별 지반고 선 표시
- 지형 격자가 없으면 교각 지반고 위치에 얇은 선(코핑 길이 + 여유 2 m)만 그림
- 전체 보기에서도 지형이 없으면 교각별 지반고 선을 표시, 지형이 있으면 공유 격자만 표시
- 부재 표시 '지반' 체크박스는 두 경우 모두 동작
- 테스트: 얇은 선 위치와 길이, 지형 있을 때 선 미표시

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-27 15:16:49 +09:00

46 lines
2.1 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 * as THREE from 'three';
import { describe, expect, it } from 'vitest';
import { buildPier, type PierModel } from '../src/core/geometry';
import { buildAllPiers, pierOffset } from '../src/view/all-piers';
import { loadP1 } from './helpers';
const model = buildPier(loadP1());
describe('pierOffset', () => {
it('is zero for the reference pier', () => {
expect(pierOffset(model.pivot, model.pivot)).toEqual({ x: 0, z: 0 });
});
it('moves east by the E difference and north by the N difference (z = −N)', () => {
const ref = { e: 259865, n: 179138 };
const other = { e: 260117, n: 179177 };
expect(pierOffset(other, ref)).toEqual({ x: 252, z: -39 });
});
});
describe('buildAllPiers', () => {
it('places a pier at the same world box whatever pivot it is built around', () => {
// The same pier with its pivot shifted: the geometry shifts by the opposite amount, so the world box must not change.
const shifted: PierModel = { ...model, pivot: { e: model.pivot.e + 50, n: model.pivot.n - 20 } };
const all = buildAllPiers([{ name: 'P1', model }, { name: 'P2', model: shifted }]);
all.piers.updateMatrixWorld(true);
const a = new THREE.Box3().setFromObject(all.scenes.get('P1')!.root);
const b = new THREE.Box3().setFromObject(all.scenes.get('P2')!.root);
// Float32 geometry: allow 0.1 mm.
expect(b.min.distanceTo(a.min)).toBeLessThan(1e-4);
expect(b.max.distanceTo(a.max)).toBeLessThan(1e-4);
});
it('keeps each pier 지반고 line without terrain, and hides it when the shared terrain is drawn', () => {
const without = buildAllPiers([{ name: 'P1', model }]);
expect([...without.scenes.keys()]).toEqual(['P1']);
expect(without.scenes.get('P1')!.parts.ground.visible).toBe(true);
expect(without.terrain).toBeNull();
expect(without.view.size).toBeGreaterThan(0);
const withTerrain = buildAllPiers([{ name: 'P1', model }], { origin: [259815.676, 179088.094], step: 5, nx: 2, ny: 2, z: [30, 31, 32, 33] });
expect(withTerrain.scenes.get('P1')!.parts.ground.visible).toBe(false);
expect(withTerrain.terrain).not.toBeNull();
});
});