///
import { readFileSync } from 'node:fs';
import { describe, expect, expectTypeOf, it } from 'vitest';
import type { SwipeDirection } from '../gesture-recognizer.js';
type ExpectedSwipeDirection = 'left' | 'right' | 'up' | 'down';
const gestureRecognizerSource = readFileSync(
new URL('../gesture-recognizer.ts', import.meta.url),
'utf8',
);
describe('swipe direction owner', () => {
it('keeps the exact public membership and producer declaration', () => {
expectTypeOf().toEqualTypeOf();
expectTypeOf().toEqualTypeOf();
const acceptsDirection = (direction: SwipeDirection): SwipeDirection => direction;
acceptsDirection('left');
acceptsDirection('right');
acceptsDirection('up');
acceptsDirection('down');
// @ts-expect-error unknown direction labels remain outside the closed union.
acceptsDirection('direction-not-real');
});
it('derives the public union and dominant-axis output from one private tuple', () => {
expect(gestureRecognizerSource).toContain(
"const SWIPE_DIRECTIONS = ['left', 'right', 'up', 'down'] as const;",
);
expect(gestureRecognizerSource).toContain(
'export type SwipeDirection = (typeof SWIPE_DIRECTIONS)[number];',
);
expect(gestureRecognizerSource).toContain(
'if (Math.abs(dx) >= Math.abs(dy)) return dx >= 0 ? SWIPE_DIRECTIONS[1] : SWIPE_DIRECTIONS[0];',
);
expect(gestureRecognizerSource).toContain(
'return dy >= 0 ? SWIPE_DIRECTIONS[3] : SWIPE_DIRECTIONS[2];',
);
expect(gestureRecognizerSource).not.toContain(
"export type SwipeDirection = 'left' | 'right' | 'up' | 'down';",
);
});
});