- B07_wf4_DesignDetail(8파일+openwebcad) -> B08_DesignDetail로 git mv (이력 보존) - B08_wf5_Quantity -> B07_Quantity (구 수량 백업 zip 보관 폴더) - 파생 문자열 일괄 전환: /b07-cad -> /b08-cad 정적 서빙, CAD 레이어 b07-* -> b08-*, postMessage aislo:b07:* -> aislo:b08:*, 패키지명 aislo-b08-cad, CSS .b08-*, 라우트 키/슬러그(B08_DESIGN_DETAIL/b08-design-detail, B07_QUANTITY/b07-quantity) - 상세설계 워크플로우 stage 4 -> 5 (확정/무효화 전이 3곳), 확정 완료 시 B09로 이동 - WORKFLOW_STEP_ROUTES 순서 재배열: index4=수량(B07), index5=상세설계(B08) - [임시] B08 이동 테스트 버튼 제거, openwebcad dist 재빌드 - 주석 의미 정렬: 수량 인계 주석 B08->B07, 도면 참조 B07->B08 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
50 lines
1.9 KiB
TypeScript
50 lines
1.9 KiB
TypeScript
import {describe, expect, it} from 'vitest';
|
|
import {Point} from "@flatten-js/core";
|
|
import {LineEntity} from "./LineEntity.ts";
|
|
import {TO_DEGREES} from "../App.consts.ts";
|
|
import {getActiveLayerId} from "../state.ts";
|
|
|
|
describe('getAngle', () => {
|
|
it('should return 0 for a horizontal line', () => {
|
|
const point1 = new Point(0, 0);
|
|
const point2 = new Point(1, 0);
|
|
const lineEntity = new LineEntity(getActiveLayerId(), point1, point2);
|
|
expect(lineEntity.getAngle() * TO_DEGREES).toBeCloseTo(0);
|
|
});
|
|
|
|
it('should return 90 degrees for a vertical line', () => {
|
|
const point1 = new Point(0, 0);
|
|
const point2 = new Point(0, 1);
|
|
const lineEntity = new LineEntity(getActiveLayerId(), point1, point2);
|
|
expect(lineEntity.getAngle() * TO_DEGREES).toBeCloseTo(90);
|
|
});
|
|
|
|
it('should return 45 degrees for a slope of 1', () => {
|
|
const point1 = new Point(0, 0);
|
|
const point2 = new Point(1, 1);
|
|
const lineEntity = new LineEntity(getActiveLayerId(), point1, point2);
|
|
expect(lineEntity.getAngle() * TO_DEGREES).toBeCloseTo(45);
|
|
});
|
|
|
|
it('should return 135 degrees for a slope of -1', () => {
|
|
const point1 = new Point(0, 0);
|
|
const point2 = new Point(-1, 1);
|
|
const lineEntity = new LineEntity(getActiveLayerId(), point1, point2);
|
|
expect(lineEntity.getAngle() * TO_DEGREES).toBeCloseTo(135);
|
|
});
|
|
|
|
it('should return 30 degrees for a slope of √3/3', () => {
|
|
const point1 = new Point(0, 0);
|
|
const point2 = new Point(1, Math.tan(Math.PI / 6)); // tan(30°) = 1/√3 ≈ 0.577
|
|
const lineEntity = new LineEntity(getActiveLayerId(), point1, point2);
|
|
expect(lineEntity.getAngle() * TO_DEGREES).toBeCloseTo(30);
|
|
});
|
|
|
|
it('should handle NaN slope gracefully', () => {
|
|
const point1 = new Point(0, 0);
|
|
const point2 = new Point(0, 0);
|
|
const lineEntity = new LineEntity(getActiveLayerId(), point1, point2); // zero-length segment
|
|
expect(lineEntity.getAngle() * TO_DEGREES).toBeCloseTo(0);
|
|
});
|
|
});
|