Files
openmaic/OpenMAIC/tests/pbl/v2/fit-scale.test.ts
2026-08-16 14:58:47 +08:00

86 lines
2.2 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { computeFitScale } from '@/components/scene-renderers/pbl/v2/fit-scale';
describe('PBL v2 — computeFitScale', () => {
it('keeps natural size (1) when the content already fits', () => {
expect(
computeFitScale({
containerWidth: 1280,
containerHeight: 720,
contentWidth: 640,
contentHeight: 500,
}),
).toBe(1);
});
it('never scales up content that is smaller than the box', () => {
expect(
computeFitScale({
containerWidth: 1280,
containerHeight: 720,
contentWidth: 100,
contentHeight: 100,
}),
).toBe(1);
});
it('shrinks by the height ratio when the content is too tall (the Hero zoom bug)', () => {
// Box shorter than the content → scale down so the bottom (launch button)
// stays visible instead of being clipped by overflow-hidden.
expect(
computeFitScale({
containerWidth: 800,
containerHeight: 400,
contentWidth: 640,
contentHeight: 800,
}),
).toBe(0.5);
});
it('shrinks by the width ratio when the content is too wide', () => {
expect(
computeFitScale({
containerWidth: 320,
containerHeight: 720,
contentWidth: 640,
contentHeight: 360,
}),
).toBe(0.5);
});
it('uses the smaller ratio when both axes overflow', () => {
// width ratio 0.5, height ratio 0.25 → must pick 0.25 so both fit.
expect(
computeFitScale({
containerWidth: 320,
containerHeight: 200,
contentWidth: 640,
contentHeight: 800,
}),
).toBe(0.25);
});
it('falls back to 1 for unmeasured / degenerate dimensions', () => {
expect(
computeFitScale({ containerWidth: 0, containerHeight: 0, contentWidth: 0, contentHeight: 0 }),
).toBe(1);
expect(
computeFitScale({
containerWidth: 800,
containerHeight: 600,
contentWidth: 0,
contentHeight: 400,
}),
).toBe(1);
expect(
computeFitScale({
containerWidth: Number.NaN,
containerHeight: 600,
contentWidth: 400,
contentHeight: 400,
}),
).toBe(1);
});
});