mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-16 14:16:16 -08:00
A level persisted before the shortcuts existed (the macOS menu roles never clamped, and the store restores any finite level) was clamped BEFORE the step, so the first zoom-in from level 7 rendered smaller. Step from the raw level instead: a press further out leaves an out-of-range level where it is, a press back in lands on the limit. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
61 lines
2.5 KiB
TypeScript
61 lines
2.5 KiB
TypeScript
import {
|
|
clampZoomLevel,
|
|
stepZoomLevel,
|
|
ZOOM_LEVEL_MAX,
|
|
ZOOM_LEVEL_MIN,
|
|
ZOOM_LEVEL_STEP,
|
|
} from './zoom-level.util';
|
|
|
|
describe('zoom level shortcuts contract', () => {
|
|
it('steps by the Electron menu-role step in both directions', () => {
|
|
expect(stepZoomLevel(0, 'in')).toBe(ZOOM_LEVEL_STEP);
|
|
expect(stepZoomLevel(0, 'out')).toBe(-ZOOM_LEVEL_STEP);
|
|
expect(stepZoomLevel(1, 'in')).toBe(1.5);
|
|
expect(stepZoomLevel(-1.5, 'out')).toBe(-2);
|
|
});
|
|
|
|
it('resets to the default level from anywhere', () => {
|
|
expect(stepZoomLevel(3, 'reset')).toBe(0);
|
|
expect(stepZoomLevel(-2.5, 'reset')).toBe(0);
|
|
expect(stepZoomLevel(Number.NaN, 'reset')).toBe(0);
|
|
});
|
|
|
|
it('clamps at the app limits, not at Chromium limits', () => {
|
|
expect(stepZoomLevel(ZOOM_LEVEL_MAX, 'in')).toBe(ZOOM_LEVEL_MAX);
|
|
expect(stepZoomLevel(ZOOM_LEVEL_MIN, 'out')).toBe(ZOOM_LEVEL_MIN);
|
|
expect(stepZoomLevel(ZOOM_LEVEL_MAX - 0.5, 'in')).toBe(ZOOM_LEVEL_MAX);
|
|
expect(clampZoomLevel(ZOOM_LEVEL_MIN - 1)).toBe(ZOOM_LEVEL_MIN);
|
|
});
|
|
|
|
it('never moves a stored out-of-range level against the request', () => {
|
|
// The macOS menu roles never clamped and the store restores any
|
|
// finite level, so an upgrade can start beyond the limits.
|
|
expect(stepZoomLevel(ZOOM_LEVEL_MAX + 1, 'in')).toBe(
|
|
ZOOM_LEVEL_MAX + 1
|
|
);
|
|
expect(stepZoomLevel(ZOOM_LEVEL_MAX + 1, 'out')).toBe(ZOOM_LEVEL_MAX);
|
|
expect(stepZoomLevel(ZOOM_LEVEL_MAX + 0.3, 'out')).toBe(ZOOM_LEVEL_MAX);
|
|
expect(stepZoomLevel(ZOOM_LEVEL_MIN - 1, 'out')).toBe(
|
|
ZOOM_LEVEL_MIN - 1
|
|
);
|
|
expect(stepZoomLevel(ZOOM_LEVEL_MIN - 1, 'in')).toBe(ZOOM_LEVEL_MIN);
|
|
expect(stepZoomLevel(ZOOM_LEVEL_MIN - 1, 'reset')).toBe(0);
|
|
});
|
|
|
|
it('snaps an off-grid level to the next grid point in the requested direction', () => {
|
|
// A level the macOS menu roles or an older store left between steps.
|
|
expect(stepZoomLevel(0.3, 'in')).toBe(0.5);
|
|
expect(stepZoomLevel(0.3, 'out')).toBe(0);
|
|
expect(stepZoomLevel(-0.7, 'out')).toBe(-1);
|
|
expect(stepZoomLevel(-0.7, 'in')).toBe(-0.5);
|
|
});
|
|
|
|
it('treats a non-finite level as the default', () => {
|
|
expect(stepZoomLevel(Number.NaN, 'in')).toBe(ZOOM_LEVEL_STEP);
|
|
expect(stepZoomLevel(Number.POSITIVE_INFINITY, 'out')).toBe(
|
|
-ZOOM_LEVEL_STEP
|
|
);
|
|
expect(clampZoomLevel(Number.NaN)).toBe(0);
|
|
});
|
|
});
|