@skyux-sdk/testing
Version:
This library was generated with [Nx](https://nx.dev).
1 lines • 48.5 kB
Source Map (JSON)
{"version":3,"file":"skyux-sdk-testing.mjs","sources":["../../../../../libs/sdk/testing/src/lib/a11y/a11y-analyzer.ts","../../../../../libs/sdk/testing/src/lib/matchers/matchers.ts","../../../../../libs/sdk/testing/src/lib/query-predicates/sky-by.ts","../../../../../libs/sdk/testing/src/lib/test-utility/test-utility.ts","../../../../../libs/sdk/testing/src/skyux-sdk-testing.ts"],"sourcesContent":["import axe from 'axe-core';\n\nimport { SkyA11yAnalyzerConfig } from './a11y-analyzer-config';\n\nfunction parseMessage(violations: axe.Result[]): string {\n let message = 'Expected element to pass accessibility checks.\\n\\n';\n\n violations.forEach((violation) => {\n const wcagTags = violation.tags\n .filter((tag) => tag.match(/wcag\\d{3}|^best*/gi))\n .join(', ');\n\n const nodeResults = violation.nodes.filter(\n filterViolationNodeResults(violation),\n );\n const html = nodeResults.reduce(\n (accumulator: string, node: axe.NodeResult) => {\n const related = [...node.all, ...node.none, ...node.any]\n .map((checkResult) => {\n const relatedNodes = checkResult.relatedNodes || [];\n let relatedHtml = relatedNodes\n .map((relatedNode) =>\n relatedNode.html.split(`\\n`).join(`\\n `),\n )\n .join(`\\n\\n `);\n if (relatedHtml) {\n relatedHtml = `\\n Related Nodes:\\n ${relatedHtml}`;\n }\n return ` - [${checkResult.id}] ${checkResult.message}${relatedHtml}`;\n })\n .join(`\\n`);\n const newInformation: string[] = [\n node.failureSummary\n ? `[${node.impact?.toUpperCase()}] ${node.failureSummary\n .split(/\\n */g)\n .join(`\\n - `)}`\n : '',\n node.ancestry ? `Ancestry: ${node.ancestry.join(', ')}` : '',\n `Target: ${node.target.join(', ')}`,\n node.html ? `HTML: ${node.html}` : '',\n related,\n ].filter((info) => !!info);\n\n return `${accumulator}\\n\\n${newInformation.join(`\\n`)}`;\n },\n '',\n );\n\n const error = [\n `aXe - [Rule: '${violation.id}'] ${violation.help} - WCAG: ${wcagTags}`,\n ` Get help at: ${violation.helpUrl}\\n`,\n `${html}\\n\\n`,\n ].join('\\n');\n\n message += `${error}\\n`;\n });\n\n return message;\n}\n\nfunction filterViolationNodeResults(\n result: axe.Result,\n): (node: axe.NodeResult) => boolean {\n if (\n [\n 'aria-hidden-focus', // AG Grid uses aria-hidden on elements before they are ready\n 'aria-required-children', // AG Grid uses some aria-hidden elements that axe doesn't like\n 'aria-valid-attr', // AG Grid uses aria-description, which is still in draft\n 'scrollable-region-focusable', // AG Grid handles scrolling\n ].includes(result.id)\n ) {\n return (node: axe.NodeResult) => !node.html.includes('class=\"ag-');\n } else if (result.id === 'aria-allowed-role') {\n const fieldsetRadiogroupRegex = new RegExp(\n /<fieldset[^>]+role=\"radiogroup\"/,\n );\n return (node: axe.NodeResult) => !fieldsetRadiogroupRegex.test(node.html);\n } else {\n return () => true;\n }\n}\n\nexport abstract class SkyA11yAnalyzer {\n private static analyzer = axe;\n\n public static run(\n element?: axe.ElementContext,\n config?: SkyA11yAnalyzerConfig,\n ): Promise<void> {\n if (element === undefined) {\n throw new Error('No element was specified for accessibility checking.');\n }\n\n SkyA11yAnalyzer.analyzer.reset();\n\n const defaults: SkyA11yAnalyzerConfig = {\n rules: {},\n };\n\n // Disable autocomplete-valid\n // Chrome browsers ignore autocomplete=\"off\", which forces us to use non-standard values\n // to disable the browser's native autofill.\n // https://bugs.chromium.org/p/chromium/issues/detail?id=468153#c164\n defaults.rules['autocomplete-valid'] = { enabled: false };\n\n return new Promise((resolve, reject) => {\n const callback: axe.RunCallback = (error, results) => {\n if (error?.message) {\n reject(error);\n return;\n }\n\n const violations = results.violations.filter((violation) =>\n violation.nodes.some(filterViolationNodeResults(violation)),\n );\n if (violations.length > 0) {\n const message = parseMessage(violations);\n reject(new Error(message));\n }\n\n resolve();\n };\n\n SkyA11yAnalyzer.analyzer.run(\n element,\n { ...defaults, ...config },\n callback,\n );\n });\n }\n}\n","import { TestBed } from '@angular/core/testing';\nimport { SkyAppResourcesService, SkyLibResourcesService } from '@skyux/i18n';\n\nimport axe from 'axe-core';\nimport { firstValueFrom } from 'rxjs';\n\nimport { SkyA11yAnalyzer } from '../a11y/a11y-analyzer';\nimport { SkyA11yAnalyzerConfig } from '../a11y/a11y-analyzer-config';\n\nimport { SkyToBeVisibleOptions } from './to-be-visible-options';\n\nconst windowRef: any = window;\n\nfunction getResources(name: string, args: any[] = []): Promise<string> {\n const resourcesService = TestBed.inject(SkyAppResourcesService);\n return firstValueFrom(resourcesService.getString(name, ...args));\n}\n\nfunction getLibResources(name: string, args: any[] = []): Promise<string> {\n const resourcesService = TestBed.inject(SkyLibResourcesService);\n return firstValueFrom(resourcesService.getString(name, ...args));\n}\n\nfunction isTemplateMatch(sample: string, template: string): boolean {\n let matches = true;\n const templateTokens = template.split(new RegExp('{\\\\d+}')).reverse();\n let currentToken = templateTokens.pop();\n let lastPosition = 0;\n while (currentToken !== undefined && matches) {\n const tokenPosition: number = sample.indexOf(currentToken, lastPosition);\n matches = tokenPosition >= lastPosition;\n lastPosition = tokenPosition + currentToken.length;\n currentToken = templateTokens.pop();\n }\n return matches;\n}\n\nconst matchers: jasmine.CustomMatcherFactories = {\n toBeAccessible(): jasmine.CustomMatcher {\n return {\n compare(\n element: any,\n callback?: () => void,\n config?: SkyA11yAnalyzerConfig,\n ): jasmine.CustomMatcherResult {\n SkyA11yAnalyzer.run(element, config)\n .then(() => {\n /*istanbul ignore else*/\n if (callback) {\n callback();\n }\n })\n .catch((err) => {\n windowRef.fail(err.message);\n /*istanbul ignore else*/\n if (callback) {\n callback();\n }\n });\n\n // Asynchronous matchers are currently unsupported, but\n // the method above works to fail the specific test in the\n // callback manually, if checks do not pass.\n // ---\n // A side effect of this technique is the matcher cannot be\n // paired with a `.not.toBeAccessible` operator (since the returned\n // result is always `true`). For this particular matcher,\n // checking if an element is not accessible may be irrelevant.\n return {\n message: '',\n pass: true,\n };\n },\n };\n },\n\n toBeVisible(): jasmine.CustomMatcher {\n return {\n compare(\n el: Element,\n options?: SkyToBeVisibleOptions,\n ): jasmine.CustomMatcherResult {\n const defaults: SkyToBeVisibleOptions = {\n checkCssDisplay: true,\n checkCssVisibility: false,\n checkDimensions: false,\n checkExists: false,\n };\n\n const settings = { ...defaults, ...options };\n\n const result = {\n pass: true,\n message: '',\n };\n\n if (settings.checkExists) {\n result.pass = !!el;\n }\n\n if (result.pass) {\n const computedStyle = window.getComputedStyle(el);\n\n if (settings.checkCssDisplay) {\n result.pass = computedStyle.display !== 'none';\n }\n\n if (settings.checkCssVisibility) {\n result.pass = computedStyle.visibility !== 'hidden';\n }\n\n if (settings.checkDimensions) {\n const box = el.getBoundingClientRect();\n result.pass = box.width > 0 && box.height > 0;\n }\n }\n\n result.message = result.pass\n ? 'Expected element to not be visible'\n : 'Expected element to be visible';\n\n return result;\n },\n };\n },\n\n toExist(): jasmine.CustomMatcher {\n return {\n compare(el: any): jasmine.CustomMatcherResult {\n const result = {\n pass: false,\n message: '',\n };\n\n result.pass = !!el;\n\n result.message = result.pass\n ? 'Expected element not to exist'\n : 'Expected element to exist';\n\n return result;\n },\n };\n },\n\n toHaveCssClass(): jasmine.CustomMatcher {\n return {\n compare(el: any, expectedClassName: string): jasmine.CustomMatcherResult {\n const result = {\n pass: false,\n message: '',\n };\n\n if (expectedClassName.indexOf('.') === 0) {\n throw new Error(\n 'Please remove the leading dot from your class name.',\n );\n }\n\n result.pass = el.classList.contains(expectedClassName);\n\n result.message = result.pass\n ? `Expected element not to have CSS class \"${expectedClassName}\"`\n : `Expected element to have CSS class \"${expectedClassName}\"`;\n\n return result;\n },\n };\n },\n\n toHaveStyle(): jasmine.CustomMatcher {\n return {\n compare(\n el: any,\n expectedStyles: Record<string, string>,\n ): jasmine.CustomMatcherResult {\n const message: string[] = [];\n\n let hasFailure = false;\n\n Object.keys(expectedStyles).forEach((styleName: string) => {\n const styles = windowRef.getComputedStyle(el);\n const actualStyle = styles[styleName];\n const expectedStyle = expectedStyles[styleName];\n\n if (actualStyle !== expectedStyle) {\n if (!hasFailure) {\n hasFailure = true;\n }\n\n message.push(\n `Expected element not to have CSS style \"${styleName}: ${expectedStyle}\"`,\n );\n } else {\n message.push(\n `Expected element to have CSS style \"${styleName}: ${expectedStyle}\"`,\n );\n }\n\n message.push(`Actual styles are: \"${styleName}: ${actualStyle}\"`);\n });\n\n const result = {\n pass: !hasFailure,\n message: message.join('\\n'),\n };\n\n return result;\n },\n };\n },\n\n toHaveText(): jasmine.CustomMatcher {\n return {\n compare(\n el: any,\n expectedText: string,\n trimWhitespace = true,\n ): jasmine.CustomMatcherResult {\n const result = {\n pass: false,\n message: '',\n };\n\n let actualText = el.textContent;\n\n if (trimWhitespace) {\n actualText = actualText.trim();\n }\n\n result.pass = actualText === expectedText;\n\n result.message = result.pass\n ? `Expected element's inner text \"${actualText}\" not to be: \"${expectedText}\"`\n : `Expected element's inner text to be: \"${expectedText}\"\\n` +\n `Actual element's inner text was: \"${actualText}\"`;\n\n return result;\n },\n };\n },\n\n toEqualResourceText(): jasmine.CustomMatcher {\n return {\n compare(\n actual: string,\n name: string,\n args?: any[],\n callback?: () => void,\n ): jasmine.CustomMatcherResult {\n void getResources(name, args).then((message) => {\n /*istanbul ignore else*/\n if (actual !== message) {\n windowRef.fail(`Expected \"${actual}\" to equal \"${message}\"`);\n }\n /*istanbul ignore else*/\n if (callback) {\n callback();\n }\n });\n\n // Asynchronous matchers are currently unsupported, but\n // the method above works to fail the specific test in the\n // callback manually, if checks do not pass.\n // ---\n // A side effect of this technique is the matcher cannot be\n // paired with a `.not.toHaveResourceText` operator (since the returned\n // result is always `true`).\n return {\n message: '',\n pass: true,\n };\n },\n };\n },\n\n toHaveResourceText(): jasmine.CustomMatcher {\n return {\n compare(\n el: any,\n name: string,\n args?: any[],\n trimWhitespace = true,\n callback?: () => void,\n ): jasmine.CustomMatcherResult {\n let actual = el.textContent;\n\n if (trimWhitespace) {\n actual = actual.trim();\n }\n\n void getResources(name, args).then((message) => {\n if (actual !== message) {\n windowRef.fail(\n `Expected element's inner text \"${el.textContent}\" to be \"${message}\"`,\n );\n }\n /*istanbul ignore else*/\n if (callback) {\n callback();\n }\n });\n\n // Asynchronous matchers are currently unsupported, but\n // the method above works to fail the specific test in the\n // callback manually, if checks do not pass.\n // ---\n // A side effect of this technique is the matcher cannot be\n // paired with a `.not.toHaveResourceText` operator (since the returned\n // result is always `true`).\n return {\n message: '',\n pass: true,\n };\n },\n };\n },\n\n toMatchResourceTemplate(): jasmine.CustomMatcher {\n return {\n compare(\n el: any,\n name: string,\n callback?: () => void,\n ): jasmine.CustomMatcherResult {\n const actual = el.textContent;\n\n void getResources(name).then((message) => {\n if (!isTemplateMatch(actual, message)) {\n windowRef.fail(\n `Expected element's text \"${actual}\" to match \"${message}\"`,\n );\n }\n /*istanbul ignore else*/\n if (callback) {\n callback();\n }\n });\n\n // Asynchronous matchers are currently unsupported, but\n // the method above works to fail the specific test in the\n // callback manually, if checks do not pass.\n // ---\n // A side effect of this technique is the matcher cannot be\n // paired with a `.not.toHaveResourceText` operator (since the returned\n // result is always `true`).\n return {\n message: '',\n pass: true,\n };\n },\n };\n },\n};\n\nconst asyncMatchers: jasmine.CustomAsyncMatcherFactories = {\n toBeAccessible(): jasmine.CustomAsyncMatcher {\n return {\n compare<T extends axe.ElementContext>(\n element: T,\n config?: SkyA11yAnalyzerConfig,\n ): Promise<jasmine.CustomMatcherResult> {\n return new Promise((resolve) => {\n SkyA11yAnalyzer.run(element, config)\n .then(() => {\n resolve({\n pass: true,\n });\n })\n .catch((err) => {\n resolve({\n pass: false,\n message: err.message,\n });\n });\n });\n },\n };\n },\n\n toEqualResourceText(): jasmine.CustomAsyncMatcher {\n return {\n compare(\n actual: string,\n name: string,\n args?: any[],\n ): Promise<jasmine.CustomMatcherResult> {\n return getResources(name, args).then((message) => {\n if (actual === message) {\n return {\n pass: true,\n };\n } else {\n return {\n pass: false,\n message: `Expected \"${actual}\" to equal \"${message}\"`,\n };\n }\n });\n },\n };\n },\n\n toEqualLibResourceText(): jasmine.CustomAsyncMatcher {\n return {\n compare(\n actual: string,\n name: string,\n args?: any[],\n ): Promise<jasmine.CustomMatcherResult> {\n return getLibResources(name, args).then((message) => {\n if (actual === message) {\n return {\n pass: true,\n };\n } else {\n return {\n pass: false,\n message: `Expected \"${actual}\" to equal \"${message}\"`,\n };\n }\n });\n },\n };\n },\n\n toHaveResourceText(): jasmine.CustomAsyncMatcher {\n return {\n compare(\n element: any,\n name: string,\n args?: any[],\n trimWhitespace = true,\n ): Promise<jasmine.CustomMatcherResult> {\n return getResources(name, args).then((message) => {\n let actual = element.textContent;\n if (trimWhitespace) {\n actual = actual.trim();\n }\n\n if (actual === message) {\n return {\n pass: true,\n };\n } else {\n return {\n pass: false,\n message: `Expected element's inner text \"${actual}\" to be \"${message}\"`,\n };\n }\n });\n },\n };\n },\n\n toHaveLibResourceText(): jasmine.CustomAsyncMatcher {\n return {\n compare(\n element: any,\n name: string,\n args?: any[],\n trimWhitespace = true,\n ): Promise<jasmine.CustomMatcherResult> {\n return getLibResources(name, args).then((message) => {\n let actual = element.textContent;\n if (trimWhitespace) {\n actual = actual.trim();\n }\n if (actual === message) {\n return {\n pass: true,\n };\n } else {\n return {\n pass: false,\n message: `Expected element's inner text \"${actual}\" to be \"${message}\"`,\n };\n }\n });\n },\n };\n },\n\n toMatchResourceTemplate(): jasmine.CustomAsyncMatcher {\n return {\n compare(\n element: any,\n name: string,\n ): Promise<jasmine.CustomMatcherResult> {\n return getResources(name).then((message) => {\n const actual = element.textContent;\n if (isTemplateMatch(actual, message)) {\n return {\n pass: true,\n };\n } else {\n return {\n pass: false,\n message: `Expected element's text \"${actual}\" to match \"${message}\"`,\n };\n }\n });\n },\n };\n },\n\n toMatchLibResourceTemplate(): jasmine.CustomAsyncMatcher {\n return {\n compare(\n element: any,\n name: string,\n ): Promise<jasmine.CustomMatcherResult> {\n return getLibResources(name).then((message) => {\n const actual = element.textContent;\n if (isTemplateMatch(actual, message)) {\n return {\n pass: true,\n };\n } else {\n return {\n pass: false,\n message: `Expected element's text \"${actual}\" to match \"${message}\"`,\n };\n }\n });\n },\n };\n },\n};\n\nwindowRef.beforeEach(() => {\n jasmine.addMatchers(matchers);\n jasmine.addAsyncMatchers(asyncMatchers);\n});\n\n/**\n * Interface for \"asynchronous\" custom Sky matchers which cannot be paired with a `.not` operator.\n */\nexport interface SkyAsyncMatchers<T, U> extends jasmine.AsyncMatchers<T, U> {\n /**\n * Invert the matcher following this `expect`\n */\n not: SkyAsyncMatchers<T, U>;\n\n /**\n * `expect` an element to be accessible based on Web Content Accessibility\n * Guidelines 2.0 (WCAG20) Level A and AA success criteria.\n * @param config The configuration settings for overwriting or turning off specific accessibility checks.\n * @see https://developer.blackbaud.com/skyux/learn/get-started/advanced/accessibility-unit-tests\n */\n toBeAccessible(\n config?: SkyA11yAnalyzerConfig,\n ): Promise<jasmine.CustomMatcherResult>;\n\n /**\n * `expect` the actual text to equal the text for the expected resource string.\n * Uses `SkyAppResourcesService.getString(name, args)` to fetch the expected resource string\n * and compares using ===.\n * @param name The resource string to fetch from the resource file and compare against.\n * @param args The string replacement arguments for the expected resource string.\n */\n toEqualResourceText(\n name: string,\n args?: any[],\n ): Promise<jasmine.CustomMatcherResult>;\n\n /**\n * `expect` the actual text to equal the text for the expected resource string.\n * Uses `SkyLibResourcesService.getString(name, args)` to fetch the expected resource string\n * and compares using ===.\n * @param name The resource string to fetch from the resource file and compare against.\n * @param args The string replacement arguments for the expected resource string.\n */\n toEqualLibResourceText(\n name: string,\n args?: any[],\n ): Promise<jasmine.CustomMatcherResult>;\n\n /**\n * `expect` the actual element to have the text for the expected resource string.\n * Uses `SkyAppResourcesService.getString(name, args)` to fetch the expected resource string\n * and compares using ===.\n * @param name The resource string to fetch from the resource file and compare against.\n * @param args The string replacement arguments for the expected resource string.\n * @param trimWhitespace [true] Whether or not to trim whitespace from the actual element text before comparison.\n */\n toHaveResourceText(\n name: string,\n args?: any[],\n trimWhitespace?: boolean,\n ): Promise<jasmine.CustomMatcherResult>;\n\n /**\n * `expect` the actual element to have the text for the expected resource string.\n * Uses `SkyLibResourcesService.getString(name, args)` to fetch the expected resource string\n * and compares using ===.\n * @param name The resource string to fetch from the resource file and compare against.\n * @param args The string replacement arguments for the expected resource string.\n * @param trimWhitespace [true] Whether or not to trim whitespace from the actual element text before comparison.\n */\n toHaveLibResourceText(\n name: string,\n args?: any[],\n trimWhitespace?: boolean,\n ): Promise<jasmine.CustomMatcherResult>;\n\n /**\n * `expect` the actual element to have the text for the expected resource string.\n * Uses `SkyAppResourcesService.getString(name, args)` to fetch the expected resource string\n * and compares the tokenized element text against the template.\n * Essentially this matches any text that has the non-parameterized text of the template in the order of the template,\n * regardless of the value of each of the parameters.\n * @param name The resource string to fetch from the resource file and compare against.\n */\n toMatchResourceTemplate(name: string): Promise<jasmine.CustomMatcherResult>;\n\n /**\n * `expect` the actual element to have the text for the expected resource string.\n * Uses `SkyLibResourcesService.getString(name, args)` to fetch the expected resource string\n * and compares the tokenized element text against the template.\n * Essentially this matches any text that has the non-parameterized text of the template in the order of the template,\n * regardless of the value of each of the parameters.\n * @param name The resource string to fetch from the resource file and compare against.\n */\n toMatchLibResourceTemplate(\n name: string,\n ): Promise<jasmine.CustomMatcherResult>;\n}\n\n/**\n * Interface for \"normal\" custom Sky matchers (includes original jasmine matchers).\n */\nexport interface SkyMatchers<T> extends jasmine.Matchers<T> {\n /**\n * Invert the matcher following this `expect`\n */\n not: SkyMatchers<T>;\n\n /**\n * `expect` the actual element to be visible.\n * Checks elements style display and visibility and bounding box width/height.\n */\n toBeVisible(options?: SkyToBeVisibleOptions): void;\n\n /**\n * `expect` the actual element to exist.\n */\n toExist(): void;\n\n /**\n * `expect` the actual element to have the expected css class.\n * @param expectedClassName The css class name to check for.\n */\n toHaveCssClass(expectedClassName: string): void;\n\n /**\n * `expect` the actual element to have the expected style(s).\n * @param expectedStyles An object representing the style(s) to check for.\n */\n toHaveStyle(expectedStyles: Record<string, string>): void;\n\n /**\n * `expect` the actual element to have the expected text.\n * @param expectedText The text to check for in the actual element.\n * @param trimWhitespace [true] Whether or not to trim whitespace from the actual element text before comparison.\n */\n toHaveText(expectedText: string, trimWhitespace?: boolean): void;\n\n /**\n * `expect` the actual component to be accessible based on Web Content Accessibility\n * Guidelines 2.0 (WCAG20) Level A and AA success criteria.\n * @deprecated Use `await expectAsync(element).toBeAccessible()` instead.\n * @param callback The callback to execute after accessibility checks run.\n * @param config The configuration settings for overwriting or turning off specific accessibility checks.\n * @see https://developer.blackbaud.com/skyux/learn/get-started/advanced/accessibility-unit-tests\n */\n toBeAccessible(callback?: () => void, config?: SkyA11yAnalyzerConfig): void;\n\n /**\n * `expect` the actual text to equal the text for the expected resource string.\n * Uses `SkyAppResourcesService.getString(name, args)` to fetch the expected resource string\n * and compares using ===.\n * @deprecated Use `await expectAsync('Some message.').toEqualResourceText('foo_bar_key')` instead.\n * @param name The resource string to fetch from the resource file and compare against.\n * @param args The string replacement arguments for the expected resource string.\n * @param callback The callback to execute when the comparison fails.\n */\n toEqualResourceText(name: string, args?: any[], callback?: () => void): void;\n\n /**\n * `expect` the actual element to have the text for the expected resource string.\n * Uses `SkyAppResourcesService.getString(name, args)` to fetch the expected resource string\n * and compares using ===.\n * @deprecated Use `await expectAsync(element).toHaveResourceText('foo_bar_key')` instead.\n * @param name The resource string to fetch from the resource file and compare against.\n * @param args The string replacement arguments for the expected resource string.\n * @param trimWhitespace [true] Whether or not to trim whitespace from the actual element text before comparison.\n * @param callback The callback to execute when the comparison fails.\n */\n toHaveResourceText(\n name: string,\n args?: any[],\n trimWhitespace?: boolean,\n callback?: () => void,\n ): void;\n\n /**\n * `expect` the actual element to have the text for the expected resource string.\n * Uses `SkyAppResourcesService.getString(name, args)` to fetch the expected resource string\n * and compares the tokenized element text against the template.\n * Essentially this matches any text that has the non-parameterized text of the template in the order of the template,\n * regardless of the value of each of the parameters.\n * @deprecated Use `await expectAsync(element).toMatchResourceTemplate('foo_bar_key')` instead.\n * @param name The resource string to fetch from the resource file and compare against.\n * @param callback The callback to execute when the comparison fails.\n */\n toMatchResourceTemplate(name: string, callback?: () => void): void;\n}\n\n/**\n * Create an expectation for a spec.\n * @param actual Actual computed value to test expectations against.\n */\nexport function expect<T>(actual: T): SkyMatchers<T> {\n return windowRef.expect(actual);\n}\n\n/**\n * Create an async expectation for a spec.\n * @param actual Actual computed value to test expectations against.\n */\nexport function expectAsync<T, U>(\n actual: T | PromiseLike<T>,\n): SkyAsyncMatchers<T, U> {\n return windowRef.expectAsync(actual);\n}\n","import { DebugElement, Predicate } from '@angular/core';\nimport { By } from '@angular/platform-browser';\n\nexport class SkyBy {\n public static dataSkyId(skyId: string): Predicate<DebugElement> {\n return By.css(`[data-sky-id=\"${skyId}\"]`);\n }\n}\n","import { DebugElement } from '@angular/core';\nimport { ComponentFixture } from '@angular/core/testing';\nimport { By } from '@angular/platform-browser';\n\nimport { SkyAppTestUtilityDomEventOptions } from './test-utility-dom-event-options';\n\nfunction getNativeEl(el: any): any {\n if (!el) {\n return undefined;\n }\n\n if (el.nativeElement) {\n return el.nativeElement;\n }\n\n return el;\n}\n\nexport class SkyAppTestUtility {\n public static fireDomEvent(\n element: EventTarget | null | undefined,\n eventName: string,\n options?: SkyAppTestUtilityDomEventOptions,\n ): void {\n if (!element) {\n throw new Error(\n `Event \\`${eventName}\\` could not be fired because the element is not defined.`,\n );\n }\n\n const defaults = {\n bubbles: true,\n cancelable: true,\n keyboardEventInit: {},\n };\n\n const settings = Object.assign({}, defaults, options);\n\n // Apply keyboard event options.\n const event = Object.assign(\n document.createEvent('CustomEvent'),\n settings.keyboardEventInit,\n settings.customEventInit,\n );\n\n event.initEvent(eventName, settings.bubbles, settings.cancelable);\n element.dispatchEvent(event);\n }\n\n /**\n * Returns the inner text content of an element.\n */\n public static getText(element: any): string | undefined {\n const nativeEl = getNativeEl(element);\n\n if (nativeEl) {\n return nativeEl.innerText.trim();\n }\n\n return undefined;\n }\n\n /**\n * Returns true if the element exists on the page.\n */\n public static isVisible(element: any): boolean | undefined {\n const nativeEl = getNativeEl(element);\n\n if (nativeEl) {\n return getComputedStyle(nativeEl).display !== 'none';\n }\n\n return undefined;\n }\n\n /**\n * Sets the value of an input element and triggers its 'input' and 'change' events.\n */\n public static setInputValue(element: any, value: string): void {\n const inputEvent = document.createEvent('Event');\n inputEvent.initEvent('input', false, false);\n\n const changeEvent = document.createEvent('Event');\n changeEvent.initEvent('change', false, false);\n\n element.value = value;\n\n element.dispatchEvent(inputEvent);\n }\n\n /**\n * Returns the URL of an element's background image, if it exists.\n */\n public static getBackgroundImageUrl(el: any): string | undefined {\n const nativeEl = getNativeEl(el);\n\n if (nativeEl) {\n const backgroundImageUrl = getComputedStyle(nativeEl).backgroundImage;\n\n /* istanbul ignore else */\n // Browser will likely not return an empty value for the computed style,\n // but leave the if statement here anyway as a sanity check.\n if (backgroundImageUrl) {\n const matches = /url\\(('|\")([^'\"]+)('|\")\\)/gi.exec(backgroundImageUrl);\n\n if (matches && matches.length > 0) {\n return matches[2];\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Returns a DebugElement representing a SKY UX component.\n * @internal\n * @param fixture The ComponentFixture where the SKY UX component resides.\n * @param skyTestId The value of the `data-sky-id` property specified on the SKY UX component.\n * @param componentSelector The selector name for the SKY UX component (e.g. 'sky-alert').\n */\n public static getDebugElementByTestId(\n fixture: ComponentFixture<any>,\n skyTestId: string,\n componentSelector: string,\n ): DebugElement {\n const skyEl = fixture.debugElement.query(\n By.css(`[data-sky-id=\"${skyTestId}\"]`),\n );\n\n if (!skyEl) {\n throw new Error(\n `No element was found with a \\`data-sky-id\\` value of \"${skyTestId}\".`,\n );\n }\n\n if (skyEl.name !== componentSelector) {\n throw new Error(\n `The element with the test ID \"${skyTestId}\" is not a component of type ${componentSelector}.\"`,\n );\n }\n\n return skyEl;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}