Files
jellytau/src/lib/utils/haptics.test.ts
T

107 lines
2.9 KiB
TypeScript

/**
* Haptics utility tests
*/
import { describe, it, expect, beforeEach, vi } from "vitest";
import { haptic, haptics } from "./haptics";
describe("haptics utility", () => {
beforeEach(() => {
vi.clearAllMocks();
// Mock navigator.vibrate
Object.defineProperty(global.navigator, "vibrate", {
value: vi.fn(),
configurable: true,
});
});
describe("haptic function", () => {
it("should trigger vibration with light style", () => {
haptic("light");
expect(navigator.vibrate).toHaveBeenCalledWith(10);
});
it("should trigger vibration with medium style", () => {
haptic("medium");
expect(navigator.vibrate).toHaveBeenCalledWith(20);
});
it("should trigger vibration with heavy style", () => {
haptic("heavy");
expect(navigator.vibrate).toHaveBeenCalledWith(40);
});
it("should trigger vibration with success style", () => {
haptic("success");
expect(navigator.vibrate).toHaveBeenCalledWith([10, 50, 10]);
});
it("should trigger vibration with warning style", () => {
haptic("warning");
expect(navigator.vibrate).toHaveBeenCalledWith([20, 100, 20, 100, 20]);
});
it("should trigger vibration with error style", () => {
haptic("error");
expect(navigator.vibrate).toHaveBeenCalledWith(50);
});
it("should use medium style by default", () => {
haptic();
expect(navigator.vibrate).toHaveBeenCalledWith(20);
});
it("should handle missing vibration API gracefully", () => {
Object.defineProperty(global.navigator, "vibrate", {
value: undefined,
configurable: true,
});
expect(() => haptic()).not.toThrow();
});
it("should handle vibration errors gracefully", () => {
Object.defineProperty(global.navigator, "vibrate", {
value: vi.fn(() => {
throw new Error("Vibration blocked");
}),
configurable: true,
});
expect(() => haptic()).not.toThrow();
});
});
describe("haptics object", () => {
it("should provide tap method", () => {
haptics.tap();
expect(navigator.vibrate).toHaveBeenCalledWith(10);
});
it("should provide select method", () => {
haptics.select();
expect(navigator.vibrate).toHaveBeenCalledWith(20);
});
it("should provide success method", () => {
haptics.success();
expect(navigator.vibrate).toHaveBeenCalledWith([10, 50, 10]);
});
it("should provide warning method", () => {
haptics.warning();
expect(navigator.vibrate).toHaveBeenCalledWith([20, 100, 20, 100, 20]);
});
it("should provide error method", () => {
haptics.error();
expect(navigator.vibrate).toHaveBeenCalledWith(50);
});
it("should provide impact method", () => {
haptics.impact();
expect(navigator.vibrate).toHaveBeenCalledWith(40);
});
});
});