77 lines
2.2 KiB
TypeScript
77 lines
2.2 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
|
|
import { calculateRotatedTitleLayout, TITLE_AREA_MAX_HEIGHT, TITLE_AREA_MIN_HEIGHT } from './title'
|
|
|
|
describe('calculateRotatedTitleLayout', () => {
|
|
it('reserves the available width for an unrotated title that fits', () => {
|
|
expect(
|
|
calculateRotatedTitleLayout({
|
|
naturalWidth: 200,
|
|
naturalHeight: 20,
|
|
availableWidth: 300,
|
|
rotation: 0,
|
|
}),
|
|
).toEqual({
|
|
textWidth: 300,
|
|
textHeight: 20,
|
|
visualWidth: 300,
|
|
visualHeight: 20,
|
|
areaHeight: TITLE_AREA_MIN_HEIGHT,
|
|
scale: 1,
|
|
wrapped: false,
|
|
})
|
|
})
|
|
|
|
it.each([45, 90, -90, 180])('keeps a %s degree title inside the maximum area', (rotation) => {
|
|
const layout = calculateRotatedTitleLayout({
|
|
naturalWidth: 400,
|
|
naturalHeight: 20,
|
|
availableWidth: 600,
|
|
rotation,
|
|
})
|
|
|
|
expect(layout.areaHeight).toBeGreaterThanOrEqual(TITLE_AREA_MIN_HEIGHT)
|
|
expect(layout.areaHeight).toBeLessThanOrEqual(TITLE_AREA_MAX_HEIGHT)
|
|
expect(layout.visualHeight).toBeLessThanOrEqual(TITLE_AREA_MAX_HEIGHT)
|
|
expect(layout.textWidth).toBe(400)
|
|
expect(layout.scale).toBeLessThanOrEqual(1)
|
|
expect(layout.wrapped).toBe(false)
|
|
})
|
|
|
|
it('wraps an unrotated title to the available width without scaling', () => {
|
|
const layout = calculateRotatedTitleLayout({
|
|
naturalWidth: 1_000,
|
|
naturalHeight: 20,
|
|
availableWidth: 120,
|
|
rotation: 0,
|
|
})
|
|
|
|
expect(layout.textWidth).toBe(120)
|
|
expect(layout.textHeight).toBe(180)
|
|
expect(layout.visualWidth).toBe(120)
|
|
expect(layout.visualHeight).toBe(180)
|
|
expect(layout.areaHeight).toBe(198)
|
|
expect(layout.scale).toBe(1)
|
|
expect(layout.wrapped).toBe(true)
|
|
})
|
|
|
|
it('falls back safely for non-finite dimensions and rotation', () => {
|
|
const layout = calculateRotatedTitleLayout({
|
|
naturalWidth: Number.NaN,
|
|
naturalHeight: Number.POSITIVE_INFINITY,
|
|
availableWidth: Number.NaN,
|
|
rotation: Number.NaN,
|
|
})
|
|
|
|
expect(layout).toEqual({
|
|
textWidth: 1,
|
|
textHeight: 1,
|
|
visualWidth: 1,
|
|
visualHeight: 1,
|
|
areaHeight: TITLE_AREA_MIN_HEIGHT,
|
|
scale: 1,
|
|
wrapped: false,
|
|
})
|
|
})
|
|
})
|