{"version":3,"file":"TestUtils.mjs","sources":["../src/TestUtils.ts"],"sourcesContent":["/**\n * @module TestUtils\n * @description A collection of utility functions for testing, mocking, and test data generation.\n * @example\n * ```typescript\n * import { TestUtils } from 'houser-js-utils';\n *\n * // Generate test data\n * const testUser = TestUtils.createTestDataGenerator({ name: 'John', age: 30 });\n *\n * // Create mock function\n * const mockFn = TestUtils.createMock();\n *\n * // Wait for async operations\n * await TestUtils.waitFor(() => element.isVisible());\n * ```\n */\n\nexport const TestUtils = {\n  /**\n   * Creates a test animation event\n   * @param type - Event type\n   * @param options - Event options\n   * @returns Test animation event\n   */\n  createTestAnimationEvent(\n    type: string,\n    options: AnimationEventInit = {}\n  ): AnimationEvent {\n    return new AnimationEvent(type, options);\n  },\n\n  /**\n   * Creates a test clipboard event\n   * @param type - Event type\n   * @param options - Event options\n   * @returns Test clipboard event\n   */\n  createTestClipboardEvent(\n    type: string,\n    options: ClipboardEventInit = {}\n  ): ClipboardEvent {\n    return new ClipboardEvent(type, options);\n  },\n\n  /**\n   * Creates a test data array generator\n   * @param template - Template object\n   * @returns Function that generates an array of test data\n   */\n  createTestDataArrayGenerator<T extends object>(template: T) {\n    return (count: number, overrides: Partial<T> = {}): T[] => {\n      return Array.from({ length: count }, () => ({\n        ...template,\n        ...overrides,\n      }));\n    };\n  },\n\n  /**\n   * Creates a test data generator\n   * @param template - Template object\n   * @returns Function that generates test data\n   */\n  createTestDataGenerator<T extends object>(template: T) {\n    return (overrides: Partial<T> = {}): T => ({\n      ...template,\n      ...overrides,\n    });\n  },\n\n  /**\n   * Creates a test drag event\n   * @param type - Event type\n   * @param options - Event options\n   * @returns Test drag event\n   */\n  createTestDragEvent(type: string, options: DragEventInit = {}): DragEvent {\n    return new DragEvent(type, options);\n  },\n\n  /**\n   * Creates a test event\n   * @param type - Event type\n   * @param options - Event options\n   * @returns Test event\n   */\n  createTestEvent(type: string, options: EventInit = {}): Event {\n    return new Event(type, options);\n  },\n\n  /**\n   * Creates a test focus event\n   * @param type - Event type\n   * @param options - Event options\n   * @returns Test focus event\n   */\n  createTestFocusEvent(type: string, options: FocusEventInit = {}): FocusEvent {\n    return new FocusEvent(type, options);\n  },\n\n  /**\n   * Creates a test input event\n   * @param type - Event type\n   * @param options - Event options\n   * @returns Test input event\n   */\n  createTestInputEvent(type: string, options: InputEventInit = {}): InputEvent {\n    return new InputEvent(type, options);\n  },\n\n  /**\n   * Creates a test keyboard event\n   * @param type - Event type\n   * @param options - Event options\n   * @returns Test keyboard event\n   */\n  createTestKeyboardEvent(\n    type: string,\n    options: KeyboardEventInit = {}\n  ): KeyboardEvent {\n    return new KeyboardEvent(type, options);\n  },\n\n  /**\n   * Creates a test mouse event\n   * @param type - Event type\n   * @param options - Event options\n   * @returns Test mouse event\n   */\n  createTestMouseEvent(type: string, options: MouseEventInit = {}): MouseEvent {\n    return new MouseEvent(type, options);\n  },\n\n  /**\n   * Creates a test touch event\n   * @param type - Event type\n   * @param options - Event options\n   * @returns Test touch event\n   */\n  createTestTouchEvent(type: string, options: TouchEventInit = {}): TouchEvent {\n    return new TouchEvent(type, options);\n  },\n\n  /**\n   * Creates a test transition event\n   * @param type - Event type\n   * @param options - Event options\n   * @returns Test transition event\n   */\n  createTestTransitionEvent(\n    type: string,\n    options: TransitionEventInit = {}\n  ): TransitionEvent {\n    return new TransitionEvent(type, options);\n  },\n\n  /**\n   * Creates a mock error promise\n   * @param error - Error to reject with\n   * @param delay - Delay in milliseconds\n   * @returns Mock error promise\n   */\n  createMockErrorPromise(error: Error, delay = 0): Promise<never> {\n    return new Promise((_, reject) => setTimeout(() => reject(error), delay));\n  },\n\n  /**\n   * Creates a mock function\n   * @param implementation - Optional implementation function\n   * @returns Mock function\n   */\n  createMock<T extends (...args: any[]) => any>(implementation?: T): T {\n    return implementation || ((() => {}) as T);\n  },\n\n  /**\n   * Creates a mock object\n   * @param template - Template object to mock\n   * @returns Mock object\n   */\n  createMockObject<T extends object>(template: T): T {\n    return template;\n  },\n\n  /**\n   * Creates a mock promise\n   * @param value - Value to resolve with\n   * @param delay - Delay in milliseconds\n   * @returns Mock promise\n   */\n  createMockPromise<T>(value: T, delay = 0): Promise<T> {\n    return new Promise((resolve) => setTimeout(() => resolve(value), delay));\n  },\n\n  /**\n   * Waits for a number of milliseconds\n   * @param ms - Milliseconds to wait\n   * @returns Promise that resolves after the delay\n   */\n  async wait(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  },\n\n  /**\n   * Waits for a condition to be true\n   * @param condition - Function that returns a boolean\n   * @param timeout - Timeout in milliseconds\n   * @param interval - Check interval in milliseconds\n   * @returns Promise that resolves when condition is true\n   */\n  async waitFor(\n    condition: () => boolean,\n    timeout = 5000,\n    interval = 100\n  ): Promise<void> {\n    const start = Date.now();\n    while (Date.now() - start < timeout) {\n      if (condition()) {\n        return;\n      }\n      await new Promise((resolve) => setTimeout(resolve, interval));\n    }\n    throw new Error(\"Timeout waiting for condition\");\n  },\n};\n"],"names":[],"mappings":"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"}