@hyperfixi/testing-framework 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +168 -0
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -1
- package/dist/index.mjs.map +1 -1
- package/dist/runner.js +5 -1
- package/dist/runner.js.map +1 -1
- package/dist/runner.mjs +5 -1
- package/dist/runner.mjs.map +1 -1
- package/package.json +19 -18
- package/src/multilingual/README.md +39 -0
- package/src/multilingual/en-reference-equivalences.test.ts +321 -0
- package/src/multilingual/en-reference-preservation.test.ts +124 -0
- package/src/multilingual/en-reference-preservation.ts +495 -0
- package/src/multilingual/pattern-loader.test.ts +43 -0
- package/src/multilingual/pattern-loader.ts +7 -2
- package/src/multilingual/validators/execution-validator.test.ts +32 -3
- package/src/multilingual/validators/execution-validator.ts +17 -2
- package/src/multilingual/value-matrix-gate.ts +118 -0
- package/src/multilingual/value-matrix.accepted.test.ts +62 -0
- package/src/multilingual/value-matrix.assign.test.ts +13 -0
- package/src/multilingual/value-matrix.chain-phrases.test.ts +13 -0
- package/src/multilingual/value-matrix.chain.test.ts +13 -0
- package/src/multilingual/value-matrix.count.test.ts +13 -0
- package/src/multilingual/value-matrix.get-phrases.test.ts +13 -0
- package/src/multilingual/value-matrix.get.test.ts +13 -0
- package/src/multilingual/value-matrix.if-phrases.test.ts +13 -0
- package/src/multilingual/value-matrix.if.test.ts +13 -0
- package/src/multilingual/value-matrix.increment.test.ts +13 -0
- package/src/multilingual/value-matrix.isolation.test.ts +57 -0
- package/src/multilingual/value-matrix.names.test.ts +62 -0
- package/src/multilingual/value-matrix.put-phrases.test.ts +13 -0
- package/src/multilingual/value-matrix.put.test.ts +13 -0
- package/src/multilingual/value-matrix.set-phrases.test.ts +13 -0
- package/src/multilingual/value-matrix.set.test.ts +13 -0
- package/src/multilingual/value-matrix.times.test.ts +13 -0
- package/src/multilingual/value-matrix.ts +1170 -0
- package/src/multilingual/value-matrix.while.test.ts +13 -0
- package/src/runner.ts +7 -1
package/dist/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/assertions.ts","../src/runner.ts"],"names":["diff","diffLines","JSDOM"],"mappings":"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","file":"runner.js","sourcesContent":["/**\n * Assertion Library\n * Comprehensive assertion and expectation framework for HyperFixi testing\n */\n\nimport { diffLines } from 'diff';\nimport type { ExpectAPI, ExpectMatcher, AssertAPI } from './types';\n\n/**\n * Assertion error class\n */\nexport class AssertionError extends Error {\n constructor(\n message: string,\n public expected?: any,\n public actual?: any,\n public operator?: string\n ) {\n super(message);\n this.name = 'AssertionError';\n }\n}\n\n/**\n * Deep equality comparison\n */\nfunction deepEqual(actual: any, expected: any): boolean {\n if (actual === expected) return true;\n\n if (actual == null || expected == null) return actual === expected;\n\n if (typeof actual !== typeof expected) return false;\n\n if (actual instanceof Date && expected instanceof Date) {\n return actual.getTime() === expected.getTime();\n }\n\n if (actual instanceof RegExp && expected instanceof RegExp) {\n return actual.toString() === expected.toString();\n }\n\n if (Array.isArray(actual) && Array.isArray(expected)) {\n if (actual.length !== expected.length) return false;\n for (let i = 0; i < actual.length; i++) {\n if (!deepEqual(actual[i], expected[i])) return false;\n }\n return true;\n }\n\n if (typeof actual === 'object' && typeof expected === 'object') {\n const actualKeys = Object.keys(actual);\n const expectedKeys = Object.keys(expected);\n\n if (actualKeys.length !== expectedKeys.length) return false;\n\n for (const key of actualKeys) {\n if (!expectedKeys.includes(key)) return false;\n if (!deepEqual(actual[key], expected[key])) return false;\n }\n\n return true;\n }\n\n return false;\n}\n\n/**\n * Generate diff between actual and expected values\n */\nfunction generateDiff(actual: any, expected: any): string {\n const actualStr = typeof actual === 'string' ? actual : JSON.stringify(actual, null, 2);\n const expectedStr = typeof expected === 'string' ? expected : JSON.stringify(expected, null, 2);\n\n const diff = diffLines(expectedStr, actualStr);\n\n return diff\n .map(part => {\n const prefix = part.added ? '+' : part.removed ? '-' : ' ';\n return part.value\n .split('\\n')\n .map(line => `${prefix} ${line}`)\n .join('\\n');\n })\n .join('\\n');\n}\n\n/**\n * Check if element is in the document\n */\nfunction isInDocument(element: Element): boolean {\n if (typeof document === 'undefined') return false;\n return document.contains(element);\n}\n\n/**\n * Check if element is visible\n */\nfunction isVisible(element: Element): boolean {\n if (!isInDocument(element)) return false;\n\n const style = window.getComputedStyle(element);\n return style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0';\n}\n\n/**\n * ExpectMatcher implementation\n */\nclass ExpectMatcherImpl implements ExpectMatcher {\n constructor(\n private actual: any,\n private isNot: boolean = false\n ) {}\n\n get not(): ExpectMatcher {\n return new ExpectMatcherImpl(this.actual, !this.isNot);\n }\n\n get resolves(): ExpectMatcher {\n if (!this.isPromise(this.actual)) {\n throw new AssertionError('Expected value to be a Promise');\n }\n\n // Return a new matcher that operates on the resolved value\n return new ExpectMatcherImpl(\n this.actual.then((value: any) => value),\n this.isNot\n );\n }\n\n get rejects(): ExpectMatcher {\n if (!this.isPromise(this.actual)) {\n throw new AssertionError('Expected value to be a Promise');\n }\n\n // Return a new matcher that expects the promise to reject\n return new ExpectMatcherImpl(\n this.actual.then(\n (value: any) => {\n throw new Error('Promise did not reject');\n },\n (error: any) => error\n ),\n this.isNot\n );\n }\n\n toBe(expected: any): void {\n const passed = this.actual === expected;\n this.assert(\n passed,\n 'toBe',\n expected,\n `Expected ${this.format(this.actual)} to be ${this.format(expected)}`\n );\n }\n\n toEqual(expected: any): void {\n const passed = deepEqual(this.actual, expected);\n this.assert(\n passed,\n 'toEqual',\n expected,\n `Expected ${this.format(this.actual)} to equal ${this.format(expected)}`\n );\n }\n\n toStrictEqual(expected: any): void {\n const passed = this.actual === expected && deepEqual(this.actual, expected);\n this.assert(\n passed,\n 'toStrictEqual',\n expected,\n `Expected ${this.format(this.actual)} to strictly equal ${this.format(expected)}`\n );\n }\n\n toBeTruthy(): void {\n const passed = Boolean(this.actual);\n this.assert(passed, 'toBeTruthy', true, `Expected ${this.format(this.actual)} to be truthy`);\n }\n\n toBeFalsy(): void {\n const passed = !Boolean(this.actual);\n this.assert(passed, 'toBeFalsy', false, `Expected ${this.format(this.actual)} to be falsy`);\n }\n\n toBeNull(): void {\n const passed = this.actual === null;\n this.assert(passed, 'toBeNull', null, `Expected ${this.format(this.actual)} to be null`);\n }\n\n toBeUndefined(): void {\n const passed = this.actual === undefined;\n this.assert(\n passed,\n 'toBeUndefined',\n undefined,\n `Expected ${this.format(this.actual)} to be undefined`\n );\n }\n\n toBeDefined(): void {\n const passed = this.actual !== undefined;\n this.assert(\n passed,\n 'toBeDefined',\n 'defined',\n `Expected ${this.format(this.actual)} to be defined`\n );\n }\n\n toBeNaN(): void {\n const passed = Number.isNaN(this.actual);\n this.assert(passed, 'toBeNaN', NaN, `Expected ${this.format(this.actual)} to be NaN`);\n }\n\n toBeInstanceOf(constructor: any): void {\n const passed = this.actual instanceof constructor;\n this.assert(\n passed,\n 'toBeInstanceOf',\n constructor,\n `Expected ${this.format(this.actual)} to be instance of ${constructor.name}`\n );\n }\n\n toBeCloseTo(expected: number, precision: number = 2): void {\n if (typeof this.actual !== 'number' || typeof expected !== 'number') {\n throw new AssertionError('Expected both values to be numbers');\n }\n\n const diff = Math.abs(this.actual - expected);\n const passed = diff < Math.pow(10, -precision) / 2;\n this.assert(\n passed,\n 'toBeCloseTo',\n expected,\n `Expected ${this.actual} to be close to ${expected} (precision: ${precision})`\n );\n }\n\n toMatch(expected: string | RegExp): void {\n if (typeof this.actual !== 'string') {\n throw new AssertionError('Expected value to be a string');\n }\n\n const regex = typeof expected === 'string' ? new RegExp(expected) : expected;\n const passed = regex.test(this.actual);\n this.assert(passed, 'toMatch', expected, `Expected \"${this.actual}\" to match ${expected}`);\n }\n\n toContain(expected: any): void {\n let passed = false;\n\n if (typeof this.actual === 'string' && typeof expected === 'string') {\n passed = this.actual.includes(expected);\n } else if (Array.isArray(this.actual)) {\n passed = this.actual.includes(expected);\n } else if (this.actual && typeof this.actual.has === 'function') {\n passed = this.actual.has(expected);\n }\n\n this.assert(\n passed,\n 'toContain',\n expected,\n `Expected ${this.format(this.actual)} to contain ${this.format(expected)}`\n );\n }\n\n toHaveLength(expected: number): void {\n if (this.actual == null || typeof this.actual.length !== 'number') {\n throw new AssertionError('Expected value to have a length property');\n }\n\n const passed = this.actual.length === expected;\n this.assert(\n passed,\n 'toHaveLength',\n expected,\n `Expected length ${this.actual.length} to be ${expected}`\n );\n }\n\n toContainEqual(expected: any): void {\n if (!Array.isArray(this.actual)) {\n throw new AssertionError('Expected value to be an array');\n }\n\n const passed = this.actual.some(item => deepEqual(item, expected));\n this.assert(\n passed,\n 'toContainEqual',\n expected,\n `Expected array to contain equal to ${this.format(expected)}`\n );\n }\n\n toHaveProperty(path: string, value?: any): void {\n const keys = path.split('.');\n let current = this.actual;\n\n for (const key of keys) {\n if (current == null || !Object.prototype.hasOwnProperty.call(current, key)) {\n this.assert(false, 'toHaveProperty', path, `Expected object to have property \"${path}\"`);\n return;\n }\n current = current[key];\n }\n\n if (value !== undefined) {\n const passed = deepEqual(current, value);\n this.assert(\n passed,\n 'toHaveProperty',\n value,\n `Expected property \"${path}\" to have value ${this.format(value)}, got ${this.format(current)}`\n );\n } else {\n this.assert(true, 'toHaveProperty', path, '');\n }\n }\n\n toMatchObject(expected: object): void {\n if (typeof this.actual !== 'object' || this.actual === null) {\n throw new AssertionError('Expected value to be an object');\n }\n\n const passed = Object.keys(expected).every(key =>\n deepEqual(this.actual[key], (expected as any)[key])\n );\n\n this.assert(\n passed,\n 'toMatchObject',\n expected,\n `Expected object to match ${this.format(expected)}`\n );\n }\n\n // DOM-specific matchers\n toBeInTheDocument(): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n const passed = isInDocument(this.actual);\n this.assert(\n passed,\n 'toBeInTheDocument',\n 'in document',\n 'Expected element to be in the document'\n );\n }\n\n toBeVisible(): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n const passed = isVisible(this.actual);\n this.assert(passed, 'toBeVisible', 'visible', 'Expected element to be visible');\n }\n\n toBeDisabled(): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n const passed = (this.actual as any).disabled === true || this.actual.hasAttribute('disabled');\n this.assert(passed, 'toBeDisabled', 'disabled', 'Expected element to be disabled');\n }\n\n toBeEnabled(): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n const passed = (this.actual as any).disabled !== true && !this.actual.hasAttribute('disabled');\n this.assert(passed, 'toBeEnabled', 'enabled', 'Expected element to be enabled');\n }\n\n toBeChecked(): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n const passed = (this.actual as any).checked === true;\n this.assert(passed, 'toBeChecked', 'checked', 'Expected element to be checked');\n }\n\n toHaveClass(className: string): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n const passed = this.actual.classList.contains(className);\n this.assert(passed, 'toHaveClass', className, `Expected element to have class \"${className}\"`);\n }\n\n toHaveAttribute(name: string, value?: string): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n if (value === undefined) {\n const passed = this.actual.hasAttribute(name);\n this.assert(\n passed,\n 'toHaveAttribute',\n `attribute \"${name}\"`,\n `Expected element to have attribute \"${name}\"`\n );\n } else {\n const passed = this.actual.getAttribute(name) === value;\n this.assert(\n passed,\n 'toHaveAttribute',\n `${name}=\"${value}\"`,\n `Expected element to have attribute \"${name}\" with value \"${value}\"`\n );\n }\n }\n\n toHaveTextContent(text: string | RegExp): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n const textContent = this.actual.textContent || '';\n const passed = typeof text === 'string' ? textContent === text : text.test(textContent);\n\n this.assert(\n passed,\n 'toHaveTextContent',\n text,\n `Expected element to have text content \"${text}\"`\n );\n }\n\n toHaveValue(value: any): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n const actualValue = (this.actual as any).value;\n const passed = actualValue === value;\n this.assert(\n passed,\n 'toHaveValue',\n value,\n `Expected element to have value \"${value}\", got \"${actualValue}\"`\n );\n }\n\n // HyperScript-specific matchers\n toHaveCompiledScript(): void {\n // Implementation would depend on HyperFixi API\n const passed = this.actual && typeof this.actual._hyperscript !== 'undefined';\n this.assert(\n passed,\n 'toHaveCompiledScript',\n 'compiled script',\n 'Expected element to have compiled hyperscript'\n );\n }\n\n toHaveExecutedScript(): void {\n // Implementation would depend on HyperFixi API\n const passed = this.actual && this.actual._hyperscriptExecuted === true;\n this.assert(\n passed,\n 'toHaveExecutedScript',\n 'executed script',\n 'Expected hyperscript to have executed'\n );\n }\n\n toHaveTriggeredEvent(eventType: string): void {\n // Implementation would depend on event tracking\n const passed =\n this.actual &&\n this.actual._triggeredEvents &&\n this.actual._triggeredEvents.includes(eventType);\n this.assert(\n passed,\n 'toHaveTriggeredEvent',\n eventType,\n `Expected event \"${eventType}\" to have been triggered`\n );\n }\n\n toHaveUpdatedElement(): void {\n // Implementation would depend on DOM change tracking\n const passed = this.actual && this.actual._wasUpdated === true;\n this.assert(\n passed,\n 'toHaveUpdatedElement',\n 'updated element',\n 'Expected element to have been updated'\n );\n }\n\n private assert(passed: boolean, operator: string, expected: any, message: string): void {\n if (this.isNot) {\n passed = !passed;\n message = message.replace('Expected', 'Expected NOT');\n }\n\n if (!passed) {\n const error = new AssertionError(message, expected, this.actual, operator);\n\n if (typeof this.actual === 'object' && typeof expected === 'object') {\n error.message += '\\n\\nDiff:\\n' + generateDiff(this.actual, expected);\n }\n\n throw error;\n }\n }\n\n private format(value: any): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (typeof value === 'string') return `\"${value}\"`;\n if (typeof value === 'function') return value.name || 'function';\n if (value instanceof Date) return value.toISOString();\n if (value instanceof RegExp) return value.toString();\n if (Array.isArray(value)) return `[${value.map(v => this.format(v)).join(', ')}]`;\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n }\n\n private isPromise(value: any): boolean {\n return value && typeof value.then === 'function';\n }\n}\n\n/**\n * Create expect API\n */\nexport function createExpectAPI(): ExpectAPI {\n return function expect(actual: any): ExpectMatcher {\n return new ExpectMatcherImpl(actual);\n };\n}\n\n/**\n * Assert API implementation\n */\nclass AssertAPIImpl implements AssertAPI {\n ok(value: any, message?: string): void {\n if (!value) {\n throw new AssertionError(message || `Expected ${value} to be truthy`);\n }\n }\n\n equal(actual: any, expected: any, message?: string): void {\n if (actual != expected) {\n throw new AssertionError(\n message || `Expected ${actual} to equal ${expected}`,\n expected,\n actual,\n 'equal'\n );\n }\n }\n\n strictEqual(actual: any, expected: any, message?: string): void {\n if (actual !== expected) {\n throw new AssertionError(\n message || `Expected ${actual} to strictly equal ${expected}`,\n expected,\n actual,\n 'strictEqual'\n );\n }\n }\n\n notEqual(actual: any, expected: any, message?: string): void {\n if (actual == expected) {\n throw new AssertionError(\n message || `Expected ${actual} to not equal ${expected}`,\n expected,\n actual,\n 'notEqual'\n );\n }\n }\n\n notStrictEqual(actual: any, expected: any, message?: string): void {\n if (actual === expected) {\n throw new AssertionError(\n message || `Expected ${actual} to not strictly equal ${expected}`,\n expected,\n actual,\n 'notStrictEqual'\n );\n }\n }\n\n throws(fn: () => void, error?: any, message?: string): void {\n let thrown = false;\n let actualError: any;\n\n try {\n fn();\n } catch (e) {\n thrown = true;\n actualError = e;\n }\n\n if (!thrown) {\n throw new AssertionError(message || 'Expected function to throw');\n }\n\n if (error && !this.matchesError(actualError, error)) {\n throw new AssertionError(\n message || `Expected function to throw ${error}, but got ${actualError}`,\n error,\n actualError,\n 'throws'\n );\n }\n }\n\n doesNotThrow(fn: () => void, message?: string): void {\n try {\n fn();\n } catch (e) {\n throw new AssertionError(\n message || `Expected function to not throw, but got: ${e}`,\n 'no error',\n e,\n 'doesNotThrow'\n );\n }\n }\n\n ifError(value: any): void {\n if (value) {\n throw value;\n }\n }\n\n async rejects(promise: Promise<any>, error?: any, message?: string): Promise<void> {\n let rejected = false;\n let actualError: any;\n\n try {\n await promise;\n } catch (e) {\n rejected = true;\n actualError = e;\n }\n\n if (!rejected) {\n throw new AssertionError(message || 'Expected promise to reject');\n }\n\n if (error && !this.matchesError(actualError, error)) {\n throw new AssertionError(\n message || `Expected promise to reject with ${error}, but got ${actualError}`,\n error,\n actualError,\n 'rejects'\n );\n }\n }\n\n async doesNotReject(promise: Promise<any>, message?: string): Promise<void> {\n try {\n await promise;\n } catch (e) {\n throw new AssertionError(\n message || `Expected promise to not reject, but got: ${e}`,\n 'no error',\n e,\n 'doesNotReject'\n );\n }\n }\n\n elementExists(selector: string, message?: string): void {\n if (typeof document === 'undefined') {\n throw new AssertionError('DOM not available');\n }\n\n const element = document.querySelector(selector);\n if (!element) {\n throw new AssertionError(message || `Expected element with selector \"${selector}\" to exist`);\n }\n }\n\n elementVisible(selector: string, message?: string): void {\n if (typeof document === 'undefined') {\n throw new AssertionError('DOM not available');\n }\n\n const element = document.querySelector(selector);\n if (!element) {\n throw new AssertionError(`Element with selector \"${selector}\" does not exist`);\n }\n\n if (!isVisible(element)) {\n throw new AssertionError(\n message || `Expected element with selector \"${selector}\" to be visible`\n );\n }\n }\n\n elementHasClass(selector: string, className: string, message?: string): void {\n if (typeof document === 'undefined') {\n throw new AssertionError('DOM not available');\n }\n\n const element = document.querySelector(selector);\n if (!element) {\n throw new AssertionError(`Element with selector \"${selector}\" does not exist`);\n }\n\n if (!element.classList.contains(className)) {\n throw new AssertionError(\n message || `Expected element with selector \"${selector}\" to have class \"${className}\"`\n );\n }\n }\n\n elementHasText(selector: string, text: string, message?: string): void {\n if (typeof document === 'undefined') {\n throw new AssertionError('DOM not available');\n }\n\n const element = document.querySelector(selector);\n if (!element) {\n throw new AssertionError(`Element with selector \"${selector}\" does not exist`);\n }\n\n if (element.textContent !== text) {\n throw new AssertionError(\n message || `Expected element with selector \"${selector}\" to have text \"${text}\"`\n );\n }\n }\n\n scriptCompiled(script: string, message?: string): void {\n // Implementation would depend on HyperFixi API\n throw new AssertionError(message || 'Script compilation assertion not implemented');\n }\n\n scriptExecuted(script: string, message?: string): void {\n // Implementation would depend on HyperFixi API\n throw new AssertionError(message || 'Script execution assertion not implemented');\n }\n\n eventTriggered(eventType: string, message?: string): void {\n // Implementation would depend on event tracking\n throw new AssertionError(message || 'Event trigger assertion not implemented');\n }\n\n private matchesError(actual: any, expected: any): boolean {\n if (typeof expected === 'string') {\n return actual.message === expected;\n }\n if (expected instanceof RegExp) {\n return expected.test(actual.message);\n }\n if (typeof expected === 'function') {\n return actual instanceof expected;\n }\n return actual === expected;\n }\n}\n\n/**\n * Create assert API\n */\nexport function createAssertAPI(): AssertAPI {\n return new AssertAPIImpl();\n}\n","/**\n * Test Runner\n * Core test execution engine with multi-environment support\n */\n\nimport { JSDOM } from 'jsdom';\nimport type {\n TestRunner,\n TestSuite,\n TestCase,\n TestConfig,\n TestContext,\n TestResult,\n TestStatus,\n TestError,\n TestLog,\n BrowserTestOptions,\n PerformanceMetrics,\n} from './types';\nimport { createExpectAPI } from './assertions';\nimport { createAssertAPI } from './assertions';\n\n/**\n * Test execution context\n */\ninterface ExecutionContext {\n config: TestConfig;\n browser?: any;\n page?: any;\n logs: TestLog[];\n screenshots: string[];\n}\n\n/**\n * Core test runner implementation\n */\nexport class CoreTestRunner implements TestRunner {\n private executionContext: ExecutionContext | null = null;\n\n /**\n * Run all test suites\n */\n async run(suites: TestSuite[], config: TestConfig): Promise<TestResult[]> {\n const results: TestResult[] = [];\n\n // Setup execution context\n this.executionContext = await this.setupExecutionContext(config);\n\n try {\n // Run setup files\n await this.runSetupFiles(config.setupFiles);\n\n // Run suites\n for (const suite of suites) {\n const suiteResults = await this.runSuite(suite, config);\n results.push(...suiteResults);\n }\n\n // Run teardown files\n await this.runTeardownFiles(config.teardownFiles);\n } finally {\n // Cleanup execution context\n await this.cleanupExecutionContext();\n }\n\n return results;\n }\n\n /**\n * Run a single test suite\n */\n async runSuite(suite: TestSuite, config: TestConfig): Promise<TestResult[]> {\n const results: TestResult[] = [];\n\n // Skip suite if marked\n if (suite.skip) {\n for (const test of suite.tests) {\n results.push(this.createSkippedResult(suite.name, test.name));\n }\n return results;\n }\n\n try {\n // Run suite setup\n if (suite.setup) {\n await suite.setup();\n }\n\n // Run tests\n for (const test of suite.tests) {\n const result = await this.runTest(test, this.createTestContext(suite, test, config));\n results.push(result);\n }\n\n // Run nested suites\n for (const nestedSuite of suite.suites) {\n const nestedResults = await this.runSuite(nestedSuite, config);\n results.push(...nestedResults);\n }\n } catch (error) {\n // Suite setup/teardown failed\n const testError = this.formatError(error);\n for (const test of suite.tests) {\n results.push({\n suite: suite.name,\n test: test.name,\n status: 'failed',\n duration: 0,\n error: testError,\n logs: [],\n screenshots: [],\n });\n }\n } finally {\n try {\n // Run suite teardown\n if (suite.teardown) {\n await suite.teardown();\n }\n } catch (error) {\n console.error('Suite teardown failed:', error);\n }\n }\n\n return results;\n }\n\n /**\n * Run a single test\n */\n async runTest(test: TestCase, context: TestContext): Promise<TestResult> {\n const startTime = Date.now();\n\n // Skip test if marked\n if (test.skip) {\n return this.createSkippedResult(context.suite, context.test);\n }\n\n let status: TestStatus = 'running';\n let error: TestError | undefined;\n const logs: TestLog[] = [];\n const screenshots: string[] = [];\n\n try {\n // Setup test fixtures\n await this.setupTestFixtures(test, context);\n\n // Run beforeEach hooks\n await this.runBeforeEachHooks(context);\n\n // Set test timeout\n const timeout = test.timeout || this.executionContext?.config.timeout || 5000;\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(`Test timeout after ${timeout}ms`)), timeout);\n });\n\n // Run test function\n await Promise.race([test.fn(context), timeoutPromise]);\n\n status = 'passed';\n } catch (err) {\n status = 'failed';\n error = this.formatError(err);\n\n // Take screenshot on failure for browser tests\n if (this.executionContext?.page && this.executionContext.config.environment === 'browser') {\n try {\n const screenshotPath = await this.takeScreenshot(context.suite, context.test);\n if (screenshotPath) {\n screenshots.push(screenshotPath);\n }\n } catch (screenshotError) {\n console.warn('Failed to take screenshot:', screenshotError);\n }\n }\n } finally {\n try {\n // Run afterEach hooks\n await this.runAfterEachHooks(context);\n\n // Cleanup test fixtures\n await this.cleanupTestFixtures(test, context);\n } catch (cleanupError) {\n console.error('Test cleanup failed:', cleanupError);\n }\n }\n\n const duration = Date.now() - startTime;\n\n return {\n suite: context.suite,\n test: context.test,\n status,\n duration,\n error,\n logs: [...logs, ...(this.executionContext?.logs || [])],\n screenshots,\n };\n }\n\n /**\n * Setup execution context\n */\n private async setupExecutionContext(config: TestConfig): Promise<ExecutionContext> {\n const context: ExecutionContext = {\n config,\n logs: [],\n screenshots: [],\n };\n\n switch (config.environment) {\n case 'jsdom':\n await this.setupJSDOMContext(context);\n break;\n case 'browser':\n case 'playwright':\n await this.setupBrowserContext(context);\n break;\n case 'puppeteer':\n await this.setupPuppeteerContext(context);\n break;\n case 'node':\n // No additional setup needed for Node.js\n break;\n }\n\n return context;\n }\n\n /**\n * Setup JSDOM context\n */\n private async setupJSDOMContext(context: ExecutionContext): Promise<void> {\n const { config } = context;\n\n const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>', {\n url: config.baseURL || 'http://localhost',\n contentType: 'text/html',\n pretendToBeVisual: true,\n resources: 'usable',\n });\n\n // Setup global DOM variables\n global.window = dom.window as any;\n global.document = dom.window.document;\n global.navigator = dom.window.navigator;\n global.location = dom.window.location;\n global.HTMLElement = dom.window.HTMLElement;\n global.Event = dom.window.Event;\n global.CustomEvent = dom.window.CustomEvent;\n }\n\n /**\n * Setup browser context (Playwright)\n */\n private async setupBrowserContext(context: ExecutionContext): Promise<void> {\n try {\n const { chromium, firefox, webkit } = await import('playwright');\n const { config } = context;\n\n let browserEngine;\n switch (config.browser) {\n case 'firefox':\n browserEngine = firefox;\n break;\n case 'webkit':\n browserEngine = webkit;\n break;\n default:\n browserEngine = chromium;\n }\n\n const browser = await browserEngine.launch({\n headless: config.headless,\n });\n\n context.browser = browser;\n\n const browserContext = await browser.newContext({\n ...(config.viewport && { viewport: config.viewport }),\n ...(config.baseURL && { baseURL: config.baseURL }),\n });\n\n context.page = await browserContext.newPage();\n\n // Setup console logging\n context.page.on('console', (msg: any) => {\n context.logs.push({\n level: msg.type() as any,\n message: msg.text(),\n timestamp: Date.now(),\n source: 'browser',\n });\n });\n\n // Setup error logging\n context.page.on('pageerror', (error: Error) => {\n context.logs.push({\n level: 'error',\n message: error.message,\n timestamp: Date.now(),\n source: 'browser',\n });\n });\n } catch (error) {\n throw new Error(`Failed to setup browser context: ${error}`);\n }\n }\n\n /**\n * Setup Puppeteer context\n */\n private async setupPuppeteerContext(context: ExecutionContext): Promise<void> {\n try {\n const puppeteer = await import('puppeteer');\n const { config } = context;\n\n const browser = await puppeteer.default.launch({\n headless: config.headless,\n args: ['--no-sandbox', '--disable-setuid-sandbox'],\n });\n\n context.browser = browser;\n context.page = await browser.newPage();\n\n await context.page.setViewport(config.viewport);\n\n if (config.baseURL) {\n await context.page.goto(config.baseURL);\n }\n\n // Setup console logging\n context.page.on('console', (msg: any) => {\n context.logs.push({\n level: msg.type() as any,\n message: msg.text(),\n timestamp: Date.now(),\n source: 'browser',\n });\n });\n\n // Setup error logging\n context.page.on('pageerror', (error: Error) => {\n context.logs.push({\n level: 'error',\n message: error.message,\n timestamp: Date.now(),\n source: 'browser',\n });\n });\n } catch (error) {\n throw new Error(`Failed to setup Puppeteer context: ${error}`);\n }\n }\n\n /**\n * Create test context\n */\n private createTestContext(suite: TestSuite, test: TestCase, config: TestConfig): TestContext {\n const context: TestContext = {\n suite: suite.name,\n test: test.name,\n environment: config.environment,\n fixtures: { ...config.fixtures, ...test.fixtures },\n expect: createExpectAPI(),\n assert: createAssertAPI(),\n skip: () => {\n throw new Error('SKIP_TEST');\n },\n fail: (message: string) => {\n throw new Error(message);\n },\n timeout: (ms: number) => {\n // Timeout functionality would be implemented here\n },\n };\n\n // Add environment-specific context\n if (this.executionContext?.page) {\n context.page = this.executionContext.page;\n context.browser = this.executionContext.browser;\n }\n\n if (config.environment === 'jsdom') {\n context.document = global.document;\n context.window = global.window;\n }\n\n return context;\n }\n\n /**\n * Setup test fixtures\n */\n private async setupTestFixtures(test: TestCase, context: TestContext): Promise<void> {\n // Fixture setup would be implemented here\n // This would load and initialize test fixtures\n }\n\n /**\n * Cleanup test fixtures\n */\n private async cleanupTestFixtures(test: TestCase, context: TestContext): Promise<void> {\n // Fixture cleanup would be implemented here\n }\n\n /**\n * Run beforeEach hooks\n */\n private async runBeforeEachHooks(context: TestContext): Promise<void> {\n // Hook execution would be implemented here\n }\n\n /**\n * Run afterEach hooks\n */\n private async runAfterEachHooks(context: TestContext): Promise<void> {\n // Hook execution would be implemented here\n }\n\n /**\n * Run setup files\n */\n private async runSetupFiles(setupFiles: string[]): Promise<void> {\n for (const file of setupFiles) {\n try {\n await import(file);\n } catch (error) {\n console.error(`Failed to run setup file ${file}:`, error);\n throw error;\n }\n }\n }\n\n /**\n * Run teardown files\n */\n private async runTeardownFiles(teardownFiles: string[]): Promise<void> {\n for (const file of teardownFiles) {\n try {\n await import(file);\n } catch (error) {\n console.error(`Failed to run teardown file ${file}:`, error);\n }\n }\n }\n\n /**\n * Take screenshot\n */\n private async takeScreenshot(suite: string, test: string): Promise<string | null> {\n if (!this.executionContext?.page) return null;\n\n try {\n const filename = `${suite}-${test}-${Date.now()}.png`;\n const path = `./screenshots/${filename}`;\n\n await this.executionContext.page.screenshot({\n path,\n fullPage: true,\n });\n\n return path;\n } catch (error) {\n console.error('Screenshot failed:', error);\n return null;\n }\n }\n\n /**\n * Format error for test result\n */\n private formatError(error: any): TestError {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n }\n\n return {\n name: 'Error',\n message: String(error),\n };\n }\n\n /**\n * Create skipped test result\n */\n private createSkippedResult(suite: string, test: string): TestResult {\n return {\n suite,\n test,\n status: 'skipped',\n duration: 0,\n logs: [],\n screenshots: [],\n };\n }\n\n /**\n * Cleanup execution context\n */\n private async cleanupExecutionContext(): Promise<void> {\n if (!this.executionContext) return;\n\n try {\n // Close browser if opened\n if (this.executionContext.browser) {\n await this.executionContext.browser.close();\n }\n\n // Clean up JSDOM globals\n if (this.executionContext.config.environment === 'jsdom') {\n delete (global as any).window;\n delete (global as any).document;\n delete (global as any).navigator;\n delete (global as any).location;\n delete (global as any).HTMLElement;\n delete (global as any).Event;\n delete (global as any).CustomEvent;\n }\n } catch (error) {\n console.error('Cleanup failed:', error);\n } finally {\n this.executionContext = null;\n }\n }\n}\n\n/**\n * Parallel test runner\n */\nexport class ParallelTestRunner extends CoreTestRunner {\n /**\n * Run test suites in parallel\n */\n async run(suites: TestSuite[], config: TestConfig): Promise<TestResult[]> {\n if (!config.parallel || config.maxWorkers <= 1) {\n return super.run(suites, config);\n }\n\n const workers = Math.min(config.maxWorkers, suites.length);\n const chunks = this.chunkSuites(suites, workers);\n\n const workerPromises = chunks.map(chunk => this.runWorker(chunk, config));\n\n const workerResults = await Promise.all(workerPromises);\n return workerResults.flat();\n }\n\n /**\n * Split suites into chunks for parallel execution\n */\n private chunkSuites(suites: TestSuite[], chunkCount: number): TestSuite[][] {\n const chunks: TestSuite[][] = [];\n const chunkSize = Math.ceil(suites.length / chunkCount);\n\n for (let i = 0; i < suites.length; i += chunkSize) {\n chunks.push(suites.slice(i, i + chunkSize));\n }\n\n return chunks;\n }\n\n /**\n * Run a worker with assigned test suites\n */\n private async runWorker(suites: TestSuite[], config: TestConfig): Promise<TestResult[]> {\n const worker = new CoreTestRunner();\n return worker.run(suites, config);\n }\n}\n\n/**\n * Create test runner based on configuration\n */\nexport function createTestRunner(config: TestConfig): TestRunner {\n if (config.parallel && config.maxWorkers > 1) {\n return new ParallelTestRunner();\n }\n return new CoreTestRunner();\n}\n\n/**\n * Run performance measurements\n */\nexport async function measurePerformance(\n page: any,\n testFn: () => Promise<void>\n): Promise<PerformanceMetrics> {\n // Clear existing performance entries\n await page.evaluate(() => {\n performance.clearMarks();\n performance.clearMeasures();\n });\n\n const startTime = Date.now();\n\n // Run the test function\n await testFn();\n\n // Collect performance metrics\n const metrics = await page.evaluate(() => {\n const navigation = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming;\n const paint = performance.getEntriesByType('paint');\n\n const firstPaint = paint.find(entry => entry.name === 'first-paint')?.startTime || 0;\n const firstContentfulPaint =\n paint.find(entry => entry.name === 'first-contentful-paint')?.startTime || 0;\n\n return {\n loadTime: navigation ? navigation.loadEventEnd - navigation.startTime : 0,\n domContentLoaded: navigation ? navigation.domContentLoadedEventEnd - navigation.startTime : 0,\n firstPaint,\n firstContentfulPaint,\n largestContentfulPaint: 0, // Would need additional measurement\n cumulativeLayoutShift: 0, // Would need additional measurement\n firstInputDelay: 0, // Would need additional measurement\n memoryUsage: (performance as any).memory\n ? {\n usedJSHeapSize: (performance as any).memory.usedJSHeapSize,\n totalJSHeapSize: (performance as any).memory.totalJSHeapSize,\n jsHeapSizeLimit: (performance as any).memory.jsHeapSizeLimit,\n }\n : {\n usedJSHeapSize: 0,\n totalJSHeapSize: 0,\n jsHeapSizeLimit: 0,\n },\n };\n });\n\n return {\n ...metrics,\n loadTime: metrics.loadTime || Date.now() - startTime,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/assertions.ts","../src/runner.ts"],"names":["diff","diffLines","JSDOM"],"mappings":"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","file":"runner.js","sourcesContent":["/**\n * Assertion Library\n * Comprehensive assertion and expectation framework for HyperFixi testing\n */\n\nimport { diffLines } from 'diff';\nimport type { ExpectAPI, ExpectMatcher, AssertAPI } from './types';\n\n/**\n * Assertion error class\n */\nexport class AssertionError extends Error {\n constructor(\n message: string,\n public expected?: any,\n public actual?: any,\n public operator?: string\n ) {\n super(message);\n this.name = 'AssertionError';\n }\n}\n\n/**\n * Deep equality comparison\n */\nfunction deepEqual(actual: any, expected: any): boolean {\n if (actual === expected) return true;\n\n if (actual == null || expected == null) return actual === expected;\n\n if (typeof actual !== typeof expected) return false;\n\n if (actual instanceof Date && expected instanceof Date) {\n return actual.getTime() === expected.getTime();\n }\n\n if (actual instanceof RegExp && expected instanceof RegExp) {\n return actual.toString() === expected.toString();\n }\n\n if (Array.isArray(actual) && Array.isArray(expected)) {\n if (actual.length !== expected.length) return false;\n for (let i = 0; i < actual.length; i++) {\n if (!deepEqual(actual[i], expected[i])) return false;\n }\n return true;\n }\n\n if (typeof actual === 'object' && typeof expected === 'object') {\n const actualKeys = Object.keys(actual);\n const expectedKeys = Object.keys(expected);\n\n if (actualKeys.length !== expectedKeys.length) return false;\n\n for (const key of actualKeys) {\n if (!expectedKeys.includes(key)) return false;\n if (!deepEqual(actual[key], expected[key])) return false;\n }\n\n return true;\n }\n\n return false;\n}\n\n/**\n * Generate diff between actual and expected values\n */\nfunction generateDiff(actual: any, expected: any): string {\n const actualStr = typeof actual === 'string' ? actual : JSON.stringify(actual, null, 2);\n const expectedStr = typeof expected === 'string' ? expected : JSON.stringify(expected, null, 2);\n\n const diff = diffLines(expectedStr, actualStr);\n\n return diff\n .map(part => {\n const prefix = part.added ? '+' : part.removed ? '-' : ' ';\n return part.value\n .split('\\n')\n .map(line => `${prefix} ${line}`)\n .join('\\n');\n })\n .join('\\n');\n}\n\n/**\n * Check if element is in the document\n */\nfunction isInDocument(element: Element): boolean {\n if (typeof document === 'undefined') return false;\n return document.contains(element);\n}\n\n/**\n * Check if element is visible\n */\nfunction isVisible(element: Element): boolean {\n if (!isInDocument(element)) return false;\n\n const style = window.getComputedStyle(element);\n return style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0';\n}\n\n/**\n * ExpectMatcher implementation\n */\nclass ExpectMatcherImpl implements ExpectMatcher {\n constructor(\n private actual: any,\n private isNot: boolean = false\n ) {}\n\n get not(): ExpectMatcher {\n return new ExpectMatcherImpl(this.actual, !this.isNot);\n }\n\n get resolves(): ExpectMatcher {\n if (!this.isPromise(this.actual)) {\n throw new AssertionError('Expected value to be a Promise');\n }\n\n // Return a new matcher that operates on the resolved value\n return new ExpectMatcherImpl(\n this.actual.then((value: any) => value),\n this.isNot\n );\n }\n\n get rejects(): ExpectMatcher {\n if (!this.isPromise(this.actual)) {\n throw new AssertionError('Expected value to be a Promise');\n }\n\n // Return a new matcher that expects the promise to reject\n return new ExpectMatcherImpl(\n this.actual.then(\n (value: any) => {\n throw new Error('Promise did not reject');\n },\n (error: any) => error\n ),\n this.isNot\n );\n }\n\n toBe(expected: any): void {\n const passed = this.actual === expected;\n this.assert(\n passed,\n 'toBe',\n expected,\n `Expected ${this.format(this.actual)} to be ${this.format(expected)}`\n );\n }\n\n toEqual(expected: any): void {\n const passed = deepEqual(this.actual, expected);\n this.assert(\n passed,\n 'toEqual',\n expected,\n `Expected ${this.format(this.actual)} to equal ${this.format(expected)}`\n );\n }\n\n toStrictEqual(expected: any): void {\n const passed = this.actual === expected && deepEqual(this.actual, expected);\n this.assert(\n passed,\n 'toStrictEqual',\n expected,\n `Expected ${this.format(this.actual)} to strictly equal ${this.format(expected)}`\n );\n }\n\n toBeTruthy(): void {\n const passed = Boolean(this.actual);\n this.assert(passed, 'toBeTruthy', true, `Expected ${this.format(this.actual)} to be truthy`);\n }\n\n toBeFalsy(): void {\n const passed = !Boolean(this.actual);\n this.assert(passed, 'toBeFalsy', false, `Expected ${this.format(this.actual)} to be falsy`);\n }\n\n toBeNull(): void {\n const passed = this.actual === null;\n this.assert(passed, 'toBeNull', null, `Expected ${this.format(this.actual)} to be null`);\n }\n\n toBeUndefined(): void {\n const passed = this.actual === undefined;\n this.assert(\n passed,\n 'toBeUndefined',\n undefined,\n `Expected ${this.format(this.actual)} to be undefined`\n );\n }\n\n toBeDefined(): void {\n const passed = this.actual !== undefined;\n this.assert(\n passed,\n 'toBeDefined',\n 'defined',\n `Expected ${this.format(this.actual)} to be defined`\n );\n }\n\n toBeNaN(): void {\n const passed = Number.isNaN(this.actual);\n this.assert(passed, 'toBeNaN', NaN, `Expected ${this.format(this.actual)} to be NaN`);\n }\n\n toBeInstanceOf(constructor: any): void {\n const passed = this.actual instanceof constructor;\n this.assert(\n passed,\n 'toBeInstanceOf',\n constructor,\n `Expected ${this.format(this.actual)} to be instance of ${constructor.name}`\n );\n }\n\n toBeCloseTo(expected: number, precision: number = 2): void {\n if (typeof this.actual !== 'number' || typeof expected !== 'number') {\n throw new AssertionError('Expected both values to be numbers');\n }\n\n const diff = Math.abs(this.actual - expected);\n const passed = diff < Math.pow(10, -precision) / 2;\n this.assert(\n passed,\n 'toBeCloseTo',\n expected,\n `Expected ${this.actual} to be close to ${expected} (precision: ${precision})`\n );\n }\n\n toMatch(expected: string | RegExp): void {\n if (typeof this.actual !== 'string') {\n throw new AssertionError('Expected value to be a string');\n }\n\n const regex = typeof expected === 'string' ? new RegExp(expected) : expected;\n const passed = regex.test(this.actual);\n this.assert(passed, 'toMatch', expected, `Expected \"${this.actual}\" to match ${expected}`);\n }\n\n toContain(expected: any): void {\n let passed = false;\n\n if (typeof this.actual === 'string' && typeof expected === 'string') {\n passed = this.actual.includes(expected);\n } else if (Array.isArray(this.actual)) {\n passed = this.actual.includes(expected);\n } else if (this.actual && typeof this.actual.has === 'function') {\n passed = this.actual.has(expected);\n }\n\n this.assert(\n passed,\n 'toContain',\n expected,\n `Expected ${this.format(this.actual)} to contain ${this.format(expected)}`\n );\n }\n\n toHaveLength(expected: number): void {\n if (this.actual == null || typeof this.actual.length !== 'number') {\n throw new AssertionError('Expected value to have a length property');\n }\n\n const passed = this.actual.length === expected;\n this.assert(\n passed,\n 'toHaveLength',\n expected,\n `Expected length ${this.actual.length} to be ${expected}`\n );\n }\n\n toContainEqual(expected: any): void {\n if (!Array.isArray(this.actual)) {\n throw new AssertionError('Expected value to be an array');\n }\n\n const passed = this.actual.some(item => deepEqual(item, expected));\n this.assert(\n passed,\n 'toContainEqual',\n expected,\n `Expected array to contain equal to ${this.format(expected)}`\n );\n }\n\n toHaveProperty(path: string, value?: any): void {\n const keys = path.split('.');\n let current = this.actual;\n\n for (const key of keys) {\n if (current == null || !Object.prototype.hasOwnProperty.call(current, key)) {\n this.assert(false, 'toHaveProperty', path, `Expected object to have property \"${path}\"`);\n return;\n }\n current = current[key];\n }\n\n if (value !== undefined) {\n const passed = deepEqual(current, value);\n this.assert(\n passed,\n 'toHaveProperty',\n value,\n `Expected property \"${path}\" to have value ${this.format(value)}, got ${this.format(current)}`\n );\n } else {\n this.assert(true, 'toHaveProperty', path, '');\n }\n }\n\n toMatchObject(expected: object): void {\n if (typeof this.actual !== 'object' || this.actual === null) {\n throw new AssertionError('Expected value to be an object');\n }\n\n const passed = Object.keys(expected).every(key =>\n deepEqual(this.actual[key], (expected as any)[key])\n );\n\n this.assert(\n passed,\n 'toMatchObject',\n expected,\n `Expected object to match ${this.format(expected)}`\n );\n }\n\n // DOM-specific matchers\n toBeInTheDocument(): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n const passed = isInDocument(this.actual);\n this.assert(\n passed,\n 'toBeInTheDocument',\n 'in document',\n 'Expected element to be in the document'\n );\n }\n\n toBeVisible(): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n const passed = isVisible(this.actual);\n this.assert(passed, 'toBeVisible', 'visible', 'Expected element to be visible');\n }\n\n toBeDisabled(): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n const passed = (this.actual as any).disabled === true || this.actual.hasAttribute('disabled');\n this.assert(passed, 'toBeDisabled', 'disabled', 'Expected element to be disabled');\n }\n\n toBeEnabled(): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n const passed = (this.actual as any).disabled !== true && !this.actual.hasAttribute('disabled');\n this.assert(passed, 'toBeEnabled', 'enabled', 'Expected element to be enabled');\n }\n\n toBeChecked(): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n const passed = (this.actual as any).checked === true;\n this.assert(passed, 'toBeChecked', 'checked', 'Expected element to be checked');\n }\n\n toHaveClass(className: string): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n const passed = this.actual.classList.contains(className);\n this.assert(passed, 'toHaveClass', className, `Expected element to have class \"${className}\"`);\n }\n\n toHaveAttribute(name: string, value?: string): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n if (value === undefined) {\n const passed = this.actual.hasAttribute(name);\n this.assert(\n passed,\n 'toHaveAttribute',\n `attribute \"${name}\"`,\n `Expected element to have attribute \"${name}\"`\n );\n } else {\n const passed = this.actual.getAttribute(name) === value;\n this.assert(\n passed,\n 'toHaveAttribute',\n `${name}=\"${value}\"`,\n `Expected element to have attribute \"${name}\" with value \"${value}\"`\n );\n }\n }\n\n toHaveTextContent(text: string | RegExp): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n const textContent = this.actual.textContent || '';\n const passed = typeof text === 'string' ? textContent === text : text.test(textContent);\n\n this.assert(\n passed,\n 'toHaveTextContent',\n text,\n `Expected element to have text content \"${text}\"`\n );\n }\n\n toHaveValue(value: any): void {\n if (!(this.actual instanceof Element)) {\n throw new AssertionError('Expected value to be a DOM element');\n }\n\n const actualValue = (this.actual as any).value;\n const passed = actualValue === value;\n this.assert(\n passed,\n 'toHaveValue',\n value,\n `Expected element to have value \"${value}\", got \"${actualValue}\"`\n );\n }\n\n // HyperScript-specific matchers\n toHaveCompiledScript(): void {\n // Implementation would depend on HyperFixi API\n const passed = this.actual && typeof this.actual._hyperscript !== 'undefined';\n this.assert(\n passed,\n 'toHaveCompiledScript',\n 'compiled script',\n 'Expected element to have compiled hyperscript'\n );\n }\n\n toHaveExecutedScript(): void {\n // Implementation would depend on HyperFixi API\n const passed = this.actual && this.actual._hyperscriptExecuted === true;\n this.assert(\n passed,\n 'toHaveExecutedScript',\n 'executed script',\n 'Expected hyperscript to have executed'\n );\n }\n\n toHaveTriggeredEvent(eventType: string): void {\n // Implementation would depend on event tracking\n const passed =\n this.actual &&\n this.actual._triggeredEvents &&\n this.actual._triggeredEvents.includes(eventType);\n this.assert(\n passed,\n 'toHaveTriggeredEvent',\n eventType,\n `Expected event \"${eventType}\" to have been triggered`\n );\n }\n\n toHaveUpdatedElement(): void {\n // Implementation would depend on DOM change tracking\n const passed = this.actual && this.actual._wasUpdated === true;\n this.assert(\n passed,\n 'toHaveUpdatedElement',\n 'updated element',\n 'Expected element to have been updated'\n );\n }\n\n private assert(passed: boolean, operator: string, expected: any, message: string): void {\n if (this.isNot) {\n passed = !passed;\n message = message.replace('Expected', 'Expected NOT');\n }\n\n if (!passed) {\n const error = new AssertionError(message, expected, this.actual, operator);\n\n if (typeof this.actual === 'object' && typeof expected === 'object') {\n error.message += '\\n\\nDiff:\\n' + generateDiff(this.actual, expected);\n }\n\n throw error;\n }\n }\n\n private format(value: any): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (typeof value === 'string') return `\"${value}\"`;\n if (typeof value === 'function') return value.name || 'function';\n if (value instanceof Date) return value.toISOString();\n if (value instanceof RegExp) return value.toString();\n if (Array.isArray(value)) return `[${value.map(v => this.format(v)).join(', ')}]`;\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n }\n\n private isPromise(value: any): boolean {\n return value && typeof value.then === 'function';\n }\n}\n\n/**\n * Create expect API\n */\nexport function createExpectAPI(): ExpectAPI {\n return function expect(actual: any): ExpectMatcher {\n return new ExpectMatcherImpl(actual);\n };\n}\n\n/**\n * Assert API implementation\n */\nclass AssertAPIImpl implements AssertAPI {\n ok(value: any, message?: string): void {\n if (!value) {\n throw new AssertionError(message || `Expected ${value} to be truthy`);\n }\n }\n\n equal(actual: any, expected: any, message?: string): void {\n if (actual != expected) {\n throw new AssertionError(\n message || `Expected ${actual} to equal ${expected}`,\n expected,\n actual,\n 'equal'\n );\n }\n }\n\n strictEqual(actual: any, expected: any, message?: string): void {\n if (actual !== expected) {\n throw new AssertionError(\n message || `Expected ${actual} to strictly equal ${expected}`,\n expected,\n actual,\n 'strictEqual'\n );\n }\n }\n\n notEqual(actual: any, expected: any, message?: string): void {\n if (actual == expected) {\n throw new AssertionError(\n message || `Expected ${actual} to not equal ${expected}`,\n expected,\n actual,\n 'notEqual'\n );\n }\n }\n\n notStrictEqual(actual: any, expected: any, message?: string): void {\n if (actual === expected) {\n throw new AssertionError(\n message || `Expected ${actual} to not strictly equal ${expected}`,\n expected,\n actual,\n 'notStrictEqual'\n );\n }\n }\n\n throws(fn: () => void, error?: any, message?: string): void {\n let thrown = false;\n let actualError: any;\n\n try {\n fn();\n } catch (e) {\n thrown = true;\n actualError = e;\n }\n\n if (!thrown) {\n throw new AssertionError(message || 'Expected function to throw');\n }\n\n if (error && !this.matchesError(actualError, error)) {\n throw new AssertionError(\n message || `Expected function to throw ${error}, but got ${actualError}`,\n error,\n actualError,\n 'throws'\n );\n }\n }\n\n doesNotThrow(fn: () => void, message?: string): void {\n try {\n fn();\n } catch (e) {\n throw new AssertionError(\n message || `Expected function to not throw, but got: ${e}`,\n 'no error',\n e,\n 'doesNotThrow'\n );\n }\n }\n\n ifError(value: any): void {\n if (value) {\n throw value;\n }\n }\n\n async rejects(promise: Promise<any>, error?: any, message?: string): Promise<void> {\n let rejected = false;\n let actualError: any;\n\n try {\n await promise;\n } catch (e) {\n rejected = true;\n actualError = e;\n }\n\n if (!rejected) {\n throw new AssertionError(message || 'Expected promise to reject');\n }\n\n if (error && !this.matchesError(actualError, error)) {\n throw new AssertionError(\n message || `Expected promise to reject with ${error}, but got ${actualError}`,\n error,\n actualError,\n 'rejects'\n );\n }\n }\n\n async doesNotReject(promise: Promise<any>, message?: string): Promise<void> {\n try {\n await promise;\n } catch (e) {\n throw new AssertionError(\n message || `Expected promise to not reject, but got: ${e}`,\n 'no error',\n e,\n 'doesNotReject'\n );\n }\n }\n\n elementExists(selector: string, message?: string): void {\n if (typeof document === 'undefined') {\n throw new AssertionError('DOM not available');\n }\n\n const element = document.querySelector(selector);\n if (!element) {\n throw new AssertionError(message || `Expected element with selector \"${selector}\" to exist`);\n }\n }\n\n elementVisible(selector: string, message?: string): void {\n if (typeof document === 'undefined') {\n throw new AssertionError('DOM not available');\n }\n\n const element = document.querySelector(selector);\n if (!element) {\n throw new AssertionError(`Element with selector \"${selector}\" does not exist`);\n }\n\n if (!isVisible(element)) {\n throw new AssertionError(\n message || `Expected element with selector \"${selector}\" to be visible`\n );\n }\n }\n\n elementHasClass(selector: string, className: string, message?: string): void {\n if (typeof document === 'undefined') {\n throw new AssertionError('DOM not available');\n }\n\n const element = document.querySelector(selector);\n if (!element) {\n throw new AssertionError(`Element with selector \"${selector}\" does not exist`);\n }\n\n if (!element.classList.contains(className)) {\n throw new AssertionError(\n message || `Expected element with selector \"${selector}\" to have class \"${className}\"`\n );\n }\n }\n\n elementHasText(selector: string, text: string, message?: string): void {\n if (typeof document === 'undefined') {\n throw new AssertionError('DOM not available');\n }\n\n const element = document.querySelector(selector);\n if (!element) {\n throw new AssertionError(`Element with selector \"${selector}\" does not exist`);\n }\n\n if (element.textContent !== text) {\n throw new AssertionError(\n message || `Expected element with selector \"${selector}\" to have text \"${text}\"`\n );\n }\n }\n\n scriptCompiled(script: string, message?: string): void {\n // Implementation would depend on HyperFixi API\n throw new AssertionError(message || 'Script compilation assertion not implemented');\n }\n\n scriptExecuted(script: string, message?: string): void {\n // Implementation would depend on HyperFixi API\n throw new AssertionError(message || 'Script execution assertion not implemented');\n }\n\n eventTriggered(eventType: string, message?: string): void {\n // Implementation would depend on event tracking\n throw new AssertionError(message || 'Event trigger assertion not implemented');\n }\n\n private matchesError(actual: any, expected: any): boolean {\n if (typeof expected === 'string') {\n return actual.message === expected;\n }\n if (expected instanceof RegExp) {\n return expected.test(actual.message);\n }\n if (typeof expected === 'function') {\n return actual instanceof expected;\n }\n return actual === expected;\n }\n}\n\n/**\n * Create assert API\n */\nexport function createAssertAPI(): AssertAPI {\n return new AssertAPIImpl();\n}\n","/**\n * Test Runner\n * Core test execution engine with multi-environment support\n */\n\nimport { JSDOM } from 'jsdom';\nimport type {\n TestRunner,\n TestSuite,\n TestCase,\n TestConfig,\n TestContext,\n TestResult,\n TestStatus,\n TestError,\n TestLog,\n BrowserTestOptions,\n PerformanceMetrics,\n} from './types';\nimport { createExpectAPI } from './assertions';\nimport { createAssertAPI } from './assertions';\n\n/**\n * Test execution context\n */\ninterface ExecutionContext {\n config: TestConfig;\n browser?: any;\n page?: any;\n logs: TestLog[];\n screenshots: string[];\n}\n\n/**\n * Core test runner implementation\n */\nexport class CoreTestRunner implements TestRunner {\n private executionContext: ExecutionContext | null = null;\n\n /**\n * Run all test suites\n */\n async run(suites: TestSuite[], config: TestConfig): Promise<TestResult[]> {\n const results: TestResult[] = [];\n\n // Setup execution context\n this.executionContext = await this.setupExecutionContext(config);\n\n try {\n // Run setup files\n await this.runSetupFiles(config.setupFiles);\n\n // Run suites\n for (const suite of suites) {\n const suiteResults = await this.runSuite(suite, config);\n results.push(...suiteResults);\n }\n\n // Run teardown files\n await this.runTeardownFiles(config.teardownFiles);\n } finally {\n // Cleanup execution context\n await this.cleanupExecutionContext();\n }\n\n return results;\n }\n\n /**\n * Run a single test suite\n */\n async runSuite(suite: TestSuite, config: TestConfig): Promise<TestResult[]> {\n const results: TestResult[] = [];\n\n // Skip suite if marked\n if (suite.skip) {\n for (const test of suite.tests) {\n results.push(this.createSkippedResult(suite.name, test.name));\n }\n return results;\n }\n\n try {\n // Run suite setup\n if (suite.setup) {\n await suite.setup();\n }\n\n // Run tests\n for (const test of suite.tests) {\n const result = await this.runTest(test, this.createTestContext(suite, test, config));\n results.push(result);\n }\n\n // Run nested suites\n for (const nestedSuite of suite.suites) {\n const nestedResults = await this.runSuite(nestedSuite, config);\n results.push(...nestedResults);\n }\n } catch (error) {\n // Suite setup/teardown failed\n const testError = this.formatError(error);\n for (const test of suite.tests) {\n results.push({\n suite: suite.name,\n test: test.name,\n status: 'failed',\n duration: 0,\n error: testError,\n logs: [],\n screenshots: [],\n });\n }\n } finally {\n try {\n // Run suite teardown\n if (suite.teardown) {\n await suite.teardown();\n }\n } catch (error) {\n console.error('Suite teardown failed:', error);\n }\n }\n\n return results;\n }\n\n /**\n * Run a single test\n */\n async runTest(test: TestCase, context: TestContext): Promise<TestResult> {\n const startTime = Date.now();\n\n // Skip test if marked\n if (test.skip) {\n return this.createSkippedResult(context.suite, context.test);\n }\n\n let status: TestStatus = 'running';\n let error: TestError | undefined;\n const logs: TestLog[] = [];\n const screenshots: string[] = [];\n\n try {\n // Setup test fixtures\n await this.setupTestFixtures(test, context);\n\n // Run beforeEach hooks\n await this.runBeforeEachHooks(context);\n\n // Set test timeout\n const timeout = test.timeout || this.executionContext?.config.timeout || 5000;\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(`Test timeout after ${timeout}ms`)), timeout);\n });\n\n // Run test function\n await Promise.race([test.fn(context), timeoutPromise]);\n\n status = 'passed';\n } catch (err) {\n status = 'failed';\n error = this.formatError(err);\n\n // Take screenshot on failure for browser tests\n if (this.executionContext?.page && this.executionContext.config.environment === 'browser') {\n try {\n const screenshotPath = await this.takeScreenshot(context.suite, context.test);\n if (screenshotPath) {\n screenshots.push(screenshotPath);\n }\n } catch (screenshotError) {\n console.warn('Failed to take screenshot:', screenshotError);\n }\n }\n } finally {\n try {\n // Run afterEach hooks\n await this.runAfterEachHooks(context);\n\n // Cleanup test fixtures\n await this.cleanupTestFixtures(test, context);\n } catch (cleanupError) {\n console.error('Test cleanup failed:', cleanupError);\n }\n }\n\n const duration = Date.now() - startTime;\n\n return {\n suite: context.suite,\n test: context.test,\n status,\n duration,\n error,\n logs: [...logs, ...(this.executionContext?.logs || [])],\n screenshots,\n };\n }\n\n /**\n * Setup execution context\n */\n private async setupExecutionContext(config: TestConfig): Promise<ExecutionContext> {\n const context: ExecutionContext = {\n config,\n logs: [],\n screenshots: [],\n };\n\n switch (config.environment) {\n case 'jsdom':\n await this.setupJSDOMContext(context);\n break;\n case 'browser':\n case 'playwright':\n await this.setupBrowserContext(context);\n break;\n case 'puppeteer':\n await this.setupPuppeteerContext(context);\n break;\n case 'node':\n // No additional setup needed for Node.js\n break;\n }\n\n return context;\n }\n\n /**\n * Setup JSDOM context\n */\n private async setupJSDOMContext(context: ExecutionContext): Promise<void> {\n const { config } = context;\n\n const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>', {\n url: config.baseURL || 'http://localhost',\n contentType: 'text/html',\n pretendToBeVisual: true,\n resources: 'usable',\n });\n\n // Setup global DOM variables\n global.window = dom.window as any;\n global.document = dom.window.document;\n // Node 21+ defines `navigator` as a getter-only (but configurable) global,\n // so plain assignment throws in strict mode — redefine it instead.\n Object.defineProperty(globalThis, 'navigator', {\n value: dom.window.navigator,\n configurable: true,\n writable: true,\n });\n global.location = dom.window.location;\n global.HTMLElement = dom.window.HTMLElement;\n global.Event = dom.window.Event;\n global.CustomEvent = dom.window.CustomEvent;\n }\n\n /**\n * Setup browser context (Playwright)\n */\n private async setupBrowserContext(context: ExecutionContext): Promise<void> {\n try {\n const { chromium, firefox, webkit } = await import('playwright');\n const { config } = context;\n\n let browserEngine;\n switch (config.browser) {\n case 'firefox':\n browserEngine = firefox;\n break;\n case 'webkit':\n browserEngine = webkit;\n break;\n default:\n browserEngine = chromium;\n }\n\n const browser = await browserEngine.launch({\n headless: config.headless,\n });\n\n context.browser = browser;\n\n const browserContext = await browser.newContext({\n ...(config.viewport && { viewport: config.viewport }),\n ...(config.baseURL && { baseURL: config.baseURL }),\n });\n\n context.page = await browserContext.newPage();\n\n // Setup console logging\n context.page.on('console', (msg: any) => {\n context.logs.push({\n level: msg.type() as any,\n message: msg.text(),\n timestamp: Date.now(),\n source: 'browser',\n });\n });\n\n // Setup error logging\n context.page.on('pageerror', (error: Error) => {\n context.logs.push({\n level: 'error',\n message: error.message,\n timestamp: Date.now(),\n source: 'browser',\n });\n });\n } catch (error) {\n throw new Error(`Failed to setup browser context: ${error}`);\n }\n }\n\n /**\n * Setup Puppeteer context\n */\n private async setupPuppeteerContext(context: ExecutionContext): Promise<void> {\n try {\n const puppeteer = await import('puppeteer');\n const { config } = context;\n\n const browser = await puppeteer.default.launch({\n headless: config.headless,\n args: ['--no-sandbox', '--disable-setuid-sandbox'],\n });\n\n context.browser = browser;\n context.page = await browser.newPage();\n\n await context.page.setViewport(config.viewport);\n\n if (config.baseURL) {\n await context.page.goto(config.baseURL);\n }\n\n // Setup console logging\n context.page.on('console', (msg: any) => {\n context.logs.push({\n level: msg.type() as any,\n message: msg.text(),\n timestamp: Date.now(),\n source: 'browser',\n });\n });\n\n // Setup error logging\n context.page.on('pageerror', (error: Error) => {\n context.logs.push({\n level: 'error',\n message: error.message,\n timestamp: Date.now(),\n source: 'browser',\n });\n });\n } catch (error) {\n throw new Error(`Failed to setup Puppeteer context: ${error}`);\n }\n }\n\n /**\n * Create test context\n */\n private createTestContext(suite: TestSuite, test: TestCase, config: TestConfig): TestContext {\n const context: TestContext = {\n suite: suite.name,\n test: test.name,\n environment: config.environment,\n fixtures: { ...config.fixtures, ...test.fixtures },\n expect: createExpectAPI(),\n assert: createAssertAPI(),\n skip: () => {\n throw new Error('SKIP_TEST');\n },\n fail: (message: string) => {\n throw new Error(message);\n },\n timeout: (ms: number) => {\n // Timeout functionality would be implemented here\n },\n };\n\n // Add environment-specific context\n if (this.executionContext?.page) {\n context.page = this.executionContext.page;\n context.browser = this.executionContext.browser;\n }\n\n if (config.environment === 'jsdom') {\n context.document = global.document;\n context.window = global.window;\n }\n\n return context;\n }\n\n /**\n * Setup test fixtures\n */\n private async setupTestFixtures(test: TestCase, context: TestContext): Promise<void> {\n // Fixture setup would be implemented here\n // This would load and initialize test fixtures\n }\n\n /**\n * Cleanup test fixtures\n */\n private async cleanupTestFixtures(test: TestCase, context: TestContext): Promise<void> {\n // Fixture cleanup would be implemented here\n }\n\n /**\n * Run beforeEach hooks\n */\n private async runBeforeEachHooks(context: TestContext): Promise<void> {\n // Hook execution would be implemented here\n }\n\n /**\n * Run afterEach hooks\n */\n private async runAfterEachHooks(context: TestContext): Promise<void> {\n // Hook execution would be implemented here\n }\n\n /**\n * Run setup files\n */\n private async runSetupFiles(setupFiles: string[]): Promise<void> {\n for (const file of setupFiles) {\n try {\n await import(file);\n } catch (error) {\n console.error(`Failed to run setup file ${file}:`, error);\n throw error;\n }\n }\n }\n\n /**\n * Run teardown files\n */\n private async runTeardownFiles(teardownFiles: string[]): Promise<void> {\n for (const file of teardownFiles) {\n try {\n await import(file);\n } catch (error) {\n console.error(`Failed to run teardown file ${file}:`, error);\n }\n }\n }\n\n /**\n * Take screenshot\n */\n private async takeScreenshot(suite: string, test: string): Promise<string | null> {\n if (!this.executionContext?.page) return null;\n\n try {\n const filename = `${suite}-${test}-${Date.now()}.png`;\n const path = `./screenshots/${filename}`;\n\n await this.executionContext.page.screenshot({\n path,\n fullPage: true,\n });\n\n return path;\n } catch (error) {\n console.error('Screenshot failed:', error);\n return null;\n }\n }\n\n /**\n * Format error for test result\n */\n private formatError(error: any): TestError {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n }\n\n return {\n name: 'Error',\n message: String(error),\n };\n }\n\n /**\n * Create skipped test result\n */\n private createSkippedResult(suite: string, test: string): TestResult {\n return {\n suite,\n test,\n status: 'skipped',\n duration: 0,\n logs: [],\n screenshots: [],\n };\n }\n\n /**\n * Cleanup execution context\n */\n private async cleanupExecutionContext(): Promise<void> {\n if (!this.executionContext) return;\n\n try {\n // Close browser if opened\n if (this.executionContext.browser) {\n await this.executionContext.browser.close();\n }\n\n // Clean up JSDOM globals\n if (this.executionContext.config.environment === 'jsdom') {\n delete (global as any).window;\n delete (global as any).document;\n delete (global as any).navigator;\n delete (global as any).location;\n delete (global as any).HTMLElement;\n delete (global as any).Event;\n delete (global as any).CustomEvent;\n }\n } catch (error) {\n console.error('Cleanup failed:', error);\n } finally {\n this.executionContext = null;\n }\n }\n}\n\n/**\n * Parallel test runner\n */\nexport class ParallelTestRunner extends CoreTestRunner {\n /**\n * Run test suites in parallel\n */\n async run(suites: TestSuite[], config: TestConfig): Promise<TestResult[]> {\n if (!config.parallel || config.maxWorkers <= 1) {\n return super.run(suites, config);\n }\n\n const workers = Math.min(config.maxWorkers, suites.length);\n const chunks = this.chunkSuites(suites, workers);\n\n const workerPromises = chunks.map(chunk => this.runWorker(chunk, config));\n\n const workerResults = await Promise.all(workerPromises);\n return workerResults.flat();\n }\n\n /**\n * Split suites into chunks for parallel execution\n */\n private chunkSuites(suites: TestSuite[], chunkCount: number): TestSuite[][] {\n const chunks: TestSuite[][] = [];\n const chunkSize = Math.ceil(suites.length / chunkCount);\n\n for (let i = 0; i < suites.length; i += chunkSize) {\n chunks.push(suites.slice(i, i + chunkSize));\n }\n\n return chunks;\n }\n\n /**\n * Run a worker with assigned test suites\n */\n private async runWorker(suites: TestSuite[], config: TestConfig): Promise<TestResult[]> {\n const worker = new CoreTestRunner();\n return worker.run(suites, config);\n }\n}\n\n/**\n * Create test runner based on configuration\n */\nexport function createTestRunner(config: TestConfig): TestRunner {\n if (config.parallel && config.maxWorkers > 1) {\n return new ParallelTestRunner();\n }\n return new CoreTestRunner();\n}\n\n/**\n * Run performance measurements\n */\nexport async function measurePerformance(\n page: any,\n testFn: () => Promise<void>\n): Promise<PerformanceMetrics> {\n // Clear existing performance entries\n await page.evaluate(() => {\n performance.clearMarks();\n performance.clearMeasures();\n });\n\n const startTime = Date.now();\n\n // Run the test function\n await testFn();\n\n // Collect performance metrics\n const metrics = await page.evaluate(() => {\n const navigation = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming;\n const paint = performance.getEntriesByType('paint');\n\n const firstPaint = paint.find(entry => entry.name === 'first-paint')?.startTime || 0;\n const firstContentfulPaint =\n paint.find(entry => entry.name === 'first-contentful-paint')?.startTime || 0;\n\n return {\n loadTime: navigation ? navigation.loadEventEnd - navigation.startTime : 0,\n domContentLoaded: navigation ? navigation.domContentLoadedEventEnd - navigation.startTime : 0,\n firstPaint,\n firstContentfulPaint,\n largestContentfulPaint: 0, // Would need additional measurement\n cumulativeLayoutShift: 0, // Would need additional measurement\n firstInputDelay: 0, // Would need additional measurement\n memoryUsage: (performance as any).memory\n ? {\n usedJSHeapSize: (performance as any).memory.usedJSHeapSize,\n totalJSHeapSize: (performance as any).memory.totalJSHeapSize,\n jsHeapSizeLimit: (performance as any).memory.jsHeapSizeLimit,\n }\n : {\n usedJSHeapSize: 0,\n totalJSHeapSize: 0,\n jsHeapSizeLimit: 0,\n },\n };\n });\n\n return {\n ...metrics,\n loadTime: metrics.loadTime || Date.now() - startTime,\n };\n}\n"]}
|
package/dist/runner.mjs
CHANGED
|
@@ -776,7 +776,11 @@ var CoreTestRunner = class {
|
|
|
776
776
|
});
|
|
777
777
|
global.window = dom.window;
|
|
778
778
|
global.document = dom.window.document;
|
|
779
|
-
|
|
779
|
+
Object.defineProperty(globalThis, "navigator", {
|
|
780
|
+
value: dom.window.navigator,
|
|
781
|
+
configurable: true,
|
|
782
|
+
writable: true
|
|
783
|
+
});
|
|
780
784
|
global.location = dom.window.location;
|
|
781
785
|
global.HTMLElement = dom.window.HTMLElement;
|
|
782
786
|
global.Event = dom.window.Event;
|