67 lines
2.7 KiB
TypeScript
67 lines
2.7 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { defaultProject, fireplace } from '../src/lib/defaults';
|
|
import { buildGeometry } from '../src/lib/geometry';
|
|
import { planFlooring } from '../src/lib/flooring';
|
|
import { floorPieceLabels } from '../src/lib/piece-labels';
|
|
|
|
describe('floorplan piece labels', () => {
|
|
const room = fireplace('room-2', 'Room 2');
|
|
const settings = {
|
|
...defaultProject().flooring,
|
|
pattern: 'random' as const,
|
|
minOffset: 100,
|
|
maxOffset: 1000,
|
|
minLength: 10,
|
|
minWidth: 0.1,
|
|
};
|
|
const plan = planFlooring([room], settings, 10);
|
|
const geometry = buildGeometry(room, 10);
|
|
const cuts = plan.pieces.filter((piece) => piece.cut || piece.reused);
|
|
|
|
it('labels short positive cuts without covering neighboring labels or changing their geometry', () => {
|
|
const before = structuredClone(plan.pieces);
|
|
const labels = floorPieceLabels(plan.pieces, geometry.vertices, 0, 4800 * 0.024);
|
|
expect(labels.map((label) => label.id)).toEqual(cuts.map((piece) => piece.id));
|
|
const small = cuts.filter((piece) => piece.length < 180);
|
|
expect(small.length).toBeGreaterThan(0);
|
|
for (const piece of small) {
|
|
expect(piece.length).toBeGreaterThan(0);
|
|
expect(piece.width).toBeGreaterThan(0);
|
|
expect(labels.find((label) => label.id === piece.id)!.leader).toBe(true);
|
|
}
|
|
for (const [index, label] of labels.entries()) {
|
|
expect(label.box.minX).toBeGreaterThanOrEqual(0);
|
|
expect(label.box.maxX).toBeLessThanOrEqual(4800);
|
|
for (const other of labels.slice(index + 1)) {
|
|
expect(
|
|
label.box.minX >= other.box.maxX ||
|
|
label.box.maxX <= other.box.minX ||
|
|
label.box.minY >= other.box.maxY ||
|
|
label.box.maxY <= other.box.minY,
|
|
).toBe(true);
|
|
}
|
|
}
|
|
expect(plan.pieces).toEqual(before);
|
|
expect(floorPieceLabels(plan.pieces, geometry.vertices, 0, 4800 * 0.024)).toEqual(labels);
|
|
});
|
|
|
|
it('allows space for complete three-digit codes and completion marks in either direction', () => {
|
|
const piece = { ...cuts[0], id: 'F999' };
|
|
for (const direction of [0, 90] as const) {
|
|
const plain = floorPieceLabels([piece], geometry.vertices, direction, 100)[0];
|
|
const done = floorPieceLabels(
|
|
[piece],
|
|
geometry.vertices,
|
|
direction,
|
|
100,
|
|
[],
|
|
[`floor:${piece.stockId}`],
|
|
)[0];
|
|
expect(done.text).toBe('F999 ✓');
|
|
expect(done.width).toBeGreaterThan(plain.width);
|
|
expect(done.angle).toBe(direction);
|
|
expect(done.box.maxX - done.box.minX).toBeCloseTo(direction === 0 ? done.width : done.height);
|
|
expect(done.box.maxY - done.box.minY).toBeCloseTo(direction === 0 ? done.height : done.width);
|
|
}
|
|
});
|
|
});
|