{"version":3,"file":"testing-testbed.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/testing/testbed/task-state-zone-interceptor.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/testing/testbed/fake-events/event-objects.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/testing/testbed/fake-events/dispatch-events.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/testing/testbed/fake-events/element-focus.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/testing/testbed/fake-events/type-in-element.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/testing/testbed/unit-test-element.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/testing/testbed/testbed-harness-environment.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {BehaviorSubject, Observable} from 'rxjs';\nimport {ProxyZone, ProxyZoneStatic} from './proxy-zone-types';\n\n/** Current state of the intercepted zone. */\nexport interface TaskState {\n  /** Whether the zone is stable (i.e. no microtasks and macrotasks). */\n  stable: boolean;\n}\n\n/** Unique symbol that is used to patch a property to a proxy zone. */\nconst stateObservableSymbol = Symbol('ProxyZone_PATCHED#stateObservable');\n\n/** Type that describes a potentially patched proxy zone instance. */\ntype PatchedProxyZone = ProxyZone & {\n  [stateObservableSymbol]: undefined | Observable<TaskState>;\n};\n\n/**\n * Interceptor that can be set up in a `ProxyZone` instance. The interceptor\n * will keep track of the task state and emit whenever the state changes.\n *\n * This serves as a workaround for https://github.com/angular/angular/issues/32896.\n */\nexport class TaskStateZoneInterceptor {\n  private _lastState: HasTaskState | null = null;\n\n  /** Subject that can be used to emit a new state change. */\n  private readonly _stateSubject = new BehaviorSubject<TaskState>(\n    this._lastState ? this._getTaskStateFromInternalZoneState(this._lastState) : {stable: true},\n  );\n\n  /** Public observable that emits whenever the task state changes. */\n  readonly state: Observable<TaskState> = this._stateSubject;\n\n  constructor(lastState: HasTaskState | null) {\n    this._lastState = lastState;\n  }\n\n  /** This will be called whenever the task state changes in the intercepted zone. */\n  onHasTask(delegate: ZoneDelegate, current: Zone, target: Zone, hasTaskState: HasTaskState) {\n    if (current === target) {\n      this._stateSubject.next(this._getTaskStateFromInternalZoneState(hasTaskState));\n    }\n  }\n\n  /** Gets the task state from the internal ZoneJS task state. */\n  private _getTaskStateFromInternalZoneState(state: HasTaskState): TaskState {\n    return {stable: !state.macroTask && !state.microTask};\n  }\n\n  static isInProxyZone(): boolean {\n    if (typeof Zone === 'undefined') {\n      return false;\n    }\n    return ((Zone as any)['ProxyZoneSpec'] as ProxyZoneStatic | undefined)?.get() !== undefined;\n  }\n\n  /**\n   * Sets up the custom task state Zone interceptor in the  `ProxyZone`. Throws if\n   * no `ProxyZone` could be found.\n   * @returns an observable that emits whenever the task state changes.\n   */\n  static setup(): Observable<TaskState> {\n    if (Zone === undefined) {\n      throw Error(\n        'Could not find ZoneJS. For test harnesses running in TestBed, ' +\n          'ZoneJS needs to be installed.',\n      );\n    }\n\n    // tslint:disable-next-line:variable-name\n    const ProxyZoneSpec = (Zone as any)['ProxyZoneSpec'] as ProxyZoneStatic | undefined;\n\n    // If there is no \"ProxyZoneSpec\" installed, we throw an error and recommend\n    // setting up the proxy zone by pulling in the testing bundle.\n    if (!ProxyZoneSpec) {\n      throw Error(\n        'ProxyZoneSpec is needed for the test harnesses but could not be found. ' +\n          'Please make sure that your environment includes zone.js/dist/zone-testing.js',\n      );\n    }\n\n    // Ensure that there is a proxy zone instance set up, and get\n    // a reference to the instance if present.\n    const zoneSpec = ProxyZoneSpec.assertPresent() as PatchedProxyZone;\n\n    // If there already is a delegate registered in the proxy zone, and it\n    // is type of the custom task state interceptor, we just use that state\n    // observable. This allows us to only intercept Zone once per test\n    // (similar to how `fakeAsync` or `async` work).\n    if (zoneSpec[stateObservableSymbol]) {\n      return zoneSpec[stateObservableSymbol]!;\n    }\n\n    // Since we intercept on environment creation and the fixture has been\n    // created before, we might have missed tasks scheduled before. Fortunately\n    // the proxy zone keeps track of the previous task state, so we can just pass\n    // this as initial state to the task zone interceptor.\n    const interceptor = new TaskStateZoneInterceptor(zoneSpec.lastTaskState);\n    const zoneSpecOnHasTask = zoneSpec.onHasTask.bind(zoneSpec);\n\n    // We setup the task state interceptor in the `ProxyZone`. Note that we cannot register\n    // the interceptor as a new proxy zone delegate because it would mean that other zone\n    // delegates (e.g. `FakeAsyncTestZone` or `AsyncTestZone`) can accidentally overwrite/disable\n    // our interceptor. Since we just intend to monitor the task state of the proxy zone, it is\n    // sufficient to just patch the proxy zone. This also avoids that we interfere with the task\n    // queue scheduling logic.\n    zoneSpec.onHasTask = function (...args: [ZoneDelegate, Zone, Zone, HasTaskState]) {\n      zoneSpecOnHasTask(...args);\n      interceptor.onHasTask(...args);\n    };\n\n    return (zoneSpec[stateObservableSymbol] = interceptor.state);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ModifierKeys} from '../../test-element';\n\n/** Used to generate unique IDs for events. */\nlet uniqueIds = 0;\n\n/**\n * Creates a browser MouseEvent with the specified options.\n * @docs-private\n */\nexport function createMouseEvent(\n  type: string,\n  clientX = 0,\n  clientY = 0,\n  offsetX = 0,\n  offsetY = 0,\n  button = 0,\n  modifiers: ModifierKeys = {},\n) {\n  // Note: We cannot determine the position of the mouse event based on the screen\n  // because the dimensions and position of the browser window are not available\n  // To provide reasonable `screenX` and `screenY` coordinates, we simply use the\n  // client coordinates as if the browser is opened in fullscreen.\n  const screenX = clientX;\n  const screenY = clientY;\n\n  const event = new MouseEvent(type, {\n    bubbles: true,\n    cancelable: true,\n    composed: true, // Required for shadow DOM events.\n    view: getEventView(),\n    detail: 1,\n    relatedTarget: null,\n    screenX,\n    screenY,\n    clientX,\n    clientY,\n    ctrlKey: modifiers.control,\n    altKey: modifiers.alt,\n    shiftKey: modifiers.shift,\n    metaKey: modifiers.meta,\n    button: button,\n    buttons: 1,\n  });\n\n  // The `MouseEvent` constructor doesn't allow us to pass these properties into the constructor.\n  // Override them to `1`, because they're used for fake screen reader event detection.\n  if (offsetX != null) {\n    defineReadonlyEventProperty(event, 'offsetX', offsetX);\n  }\n\n  if (offsetY != null) {\n    defineReadonlyEventProperty(event, 'offsetY', offsetY);\n  }\n\n  return event;\n}\n\n/**\n * Creates a browser `PointerEvent` with the specified options. Pointer events\n * by default will appear as if they are the primary pointer of their type.\n * https://www.w3.org/TR/pointerevents2/#dom-pointerevent-isprimary.\n *\n * For example, if pointer events for a multi-touch interaction are created, the non-primary\n * pointer touches would need to be represented by non-primary pointer events.\n *\n * @docs-private\n */\nexport function createPointerEvent(\n  type: string,\n  clientX = 0,\n  clientY = 0,\n  offsetX?: number,\n  offsetY?: number,\n  options: PointerEventInit = {isPrimary: true},\n) {\n  const event = new PointerEvent(type, {\n    bubbles: true,\n    cancelable: true,\n    composed: true, // Required for shadow DOM events.\n    view: getEventView(),\n    clientX,\n    clientY,\n    ...options,\n  });\n\n  if (offsetX != null) {\n    defineReadonlyEventProperty(event, 'offsetX', offsetX);\n  }\n\n  if (offsetY != null) {\n    defineReadonlyEventProperty(event, 'offsetY', offsetY);\n  }\n\n  return event;\n}\n\n/**\n * Creates a browser TouchEvent with the specified pointer coordinates.\n * @docs-private\n */\nexport function createTouchEvent(type: string, pageX = 0, pageY = 0, clientX = 0, clientY = 0) {\n  // We cannot use the `TouchEvent` or `Touch` because Firefox and Safari lack support.\n  // TODO: Switch to the constructor API when it is available for Firefox and Safari.\n  const event = document.createEvent('UIEvent');\n  const touchDetails = {pageX, pageY, clientX, clientY, identifier: uniqueIds++};\n\n  // TS3.6 removes the initUIEvent method and suggests porting to \"new UIEvent()\".\n  (event as any).initUIEvent(type, true, true, window, 0);\n\n  // Most of the browsers don't have a \"initTouchEvent\" method that can be used to define\n  // the touch details.\n  defineReadonlyEventProperty(event, 'touches', [touchDetails]);\n  defineReadonlyEventProperty(event, 'targetTouches', [touchDetails]);\n  defineReadonlyEventProperty(event, 'changedTouches', [touchDetails]);\n\n  return event;\n}\n\n/**\n * Creates a keyboard event with the specified key and modifiers.\n * @docs-private\n */\nexport function createKeyboardEvent(\n  type: string,\n  keyCode: number = 0,\n  key: string = '',\n  modifiers: ModifierKeys = {},\n  code: string = '',\n) {\n  return new KeyboardEvent(type, {\n    bubbles: true,\n    cancelable: true,\n    composed: true, // Required for shadow DOM events.\n    view: getEventView(),\n    keyCode,\n    key,\n    shiftKey: modifiers.shift,\n    metaKey: modifiers.meta,\n    altKey: modifiers.alt,\n    ctrlKey: modifiers.control,\n    code,\n  });\n}\n\n/**\n * Creates a fake event object with any desired event type.\n * @docs-private\n */\nexport function createFakeEvent(type: string, bubbles = false, cancelable = true, composed = true) {\n  return new Event(type, {bubbles, cancelable, composed});\n}\n\n/**\n * Defines a readonly property on the given event object. Readonly properties on an event object\n * are always set as configurable as that matches default readonly properties for DOM event objects.\n */\nfunction defineReadonlyEventProperty(event: Event, propertyName: string, value: any) {\n  Object.defineProperty(event, propertyName, {get: () => value, configurable: true});\n}\n\n/** Gets the `view` that should be passed to synthetically-created DOM events */\nfunction getEventView(): Window | undefined {\n  // Passing `window` as the `view` on for events when the environment is using jsdom\n  // ends up throwing `member view is not of type Window` (see #32389). Leave it as\n  // `undefined` for such cases.\n  return typeof window !== 'undefined' && window && !(window as Window & {jsdom?: unknown}).jsdom\n    ? window\n    : undefined;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ModifierKeys} from '../../test-element';\nimport {\n  createFakeEvent,\n  createKeyboardEvent,\n  createMouseEvent,\n  createPointerEvent,\n  createTouchEvent,\n} from './event-objects';\n\n/**\n * Utility to dispatch any event on a Node.\n * @docs-private\n */\nexport function dispatchEvent<T extends Event>(node: Node | Window, event: T): T {\n  node.dispatchEvent(event);\n  return event;\n}\n\n/**\n * Shorthand to dispatch a fake event on a specified node.\n * @docs-private\n */\nexport function dispatchFakeEvent(node: Node | Window, type: string, bubbles?: boolean): Event {\n  return dispatchEvent(node, createFakeEvent(type, bubbles));\n}\n\n/**\n * Shorthand to dispatch a keyboard event with a specified key code and\n * optional modifiers.\n * @docs-private\n */\nexport function dispatchKeyboardEvent(\n  node: Node,\n  type: string,\n  keyCode?: number,\n  key?: string,\n  modifiers?: ModifierKeys,\n  code?: string,\n): KeyboardEvent {\n  return dispatchEvent(node, createKeyboardEvent(type, keyCode, key, modifiers, code));\n}\n\n/**\n * Shorthand to dispatch a mouse event on the specified coordinates.\n * @docs-private\n */\nexport function dispatchMouseEvent(\n  node: Node,\n  type: string,\n  clientX = 0,\n  clientY = 0,\n  offsetX?: number,\n  offsetY?: number,\n  button?: number,\n  modifiers?: ModifierKeys,\n): MouseEvent {\n  return dispatchEvent(\n    node,\n    createMouseEvent(type, clientX, clientY, offsetX, offsetY, button, modifiers),\n  );\n}\n\n/**\n * Shorthand to dispatch a pointer event on the specified coordinates.\n * @docs-private\n */\nexport function dispatchPointerEvent(\n  node: Node,\n  type: string,\n  clientX = 0,\n  clientY = 0,\n  offsetX?: number,\n  offsetY?: number,\n  options?: PointerEventInit,\n): PointerEvent {\n  return dispatchEvent(\n    node,\n    createPointerEvent(type, clientX, clientY, offsetX, offsetY, options),\n  ) as PointerEvent;\n}\n\n/**\n * Shorthand to dispatch a touch event on the specified coordinates.\n * @docs-private\n */\nexport function dispatchTouchEvent(\n  node: Node,\n  type: string,\n  pageX = 0,\n  pageY = 0,\n  clientX = 0,\n  clientY = 0,\n) {\n  return dispatchEvent(node, createTouchEvent(type, pageX, pageY, clientX, clientY));\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {dispatchFakeEvent} from './dispatch-events';\n\nfunction triggerFocusChange(element: HTMLElement, event: 'focus' | 'blur') {\n  let eventFired = false;\n  const handler = () => (eventFired = true);\n  element.addEventListener(event, handler);\n  element[event]();\n  element.removeEventListener(event, handler);\n  if (!eventFired) {\n    dispatchFakeEvent(element, event);\n  }\n}\n\n/**\n * Patches an elements focus and blur methods to emit events consistently and predictably.\n * This is necessary, because some browsers can call the focus handlers asynchronously,\n * while others won't fire them at all if the browser window is not focused.\n * @docs-private\n */\n// TODO: Check if this element focus patching is still needed for local testing,\n// where browser is not necessarily focused.\nexport function patchElementFocus(element: HTMLElement) {\n  element.focus = () => dispatchFakeEvent(element, 'focus');\n  element.blur = () => dispatchFakeEvent(element, 'blur');\n}\n\n/** @docs-private */\nexport function triggerFocus(element: HTMLElement) {\n  triggerFocusChange(element, 'focus');\n}\n\n/** @docs-private */\nexport function triggerBlur(element: HTMLElement) {\n  triggerFocusChange(element, 'blur');\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {PERIOD} from '../../../keycodes';\nimport {ModifierKeys} from '../../test-element';\nimport {getNoKeysSpecifiedError} from '../../test-element-errors';\nimport {dispatchFakeEvent, dispatchKeyboardEvent} from './dispatch-events';\nimport {triggerFocus} from './element-focus';\n\n/** Input types for which the value can be entered incrementally. */\nconst incrementalInputTypes = new Set([\n  'text',\n  'email',\n  'hidden',\n  'password',\n  'search',\n  'tel',\n  'url',\n]);\n\n/**\n * Manual mapping of some common characters to their `code` in a keyboard event. Non-exhaustive, see\n * the tables on MDN for more info: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\n */\nconst charsToCodes: Record<string, string> = {\n  ' ': 'Space',\n  '.': 'Period',\n  ',': 'Comma',\n  '`': 'Backquote',\n  '-': 'Minus',\n  '=': 'Equal',\n  '[': 'BracketLeft',\n  ']': 'BracketRight',\n  '\\\\': 'Backslash',\n  '/': 'Slash',\n  \"'\": 'Quote',\n  '\"': 'Quote',\n  ';': 'Semicolon',\n};\n\n/**\n * Determines the `KeyboardEvent.key` from a character. See #27034 and\n * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code\n */\nfunction getKeyboardEventCode(char: string): string {\n  if (char.length !== 1) {\n    return '';\n  }\n\n  const charCode = char.charCodeAt(0);\n\n  // Key is a letter between a and z, uppercase or lowercase.\n  if ((charCode >= 97 && charCode <= 122) || (charCode >= 65 && charCode <= 90)) {\n    return `Key${char.toUpperCase()}`;\n  }\n\n  // Digits from 0 to 9.\n  if (48 <= charCode && charCode <= 57) {\n    return `Digit${char}`;\n  }\n\n  return charsToCodes[char] ?? '';\n}\n\n/**\n * Checks whether the given Element is a text input element.\n * @docs-private\n */\nexport function isTextInput(element: Element): element is HTMLInputElement | HTMLTextAreaElement {\n  const nodeName = element.nodeName.toLowerCase();\n  return nodeName === 'input' || nodeName === 'textarea';\n}\n\n/**\n * If keys have been specified, focuses an input, sets its value and dispatches\n * the `input` event, simulating the user typing.\n * @param element Element onto which to set the value.\n * @param keys The keys to send to the element.\n * @docs-private\n */\nexport function typeInElement(\n  element: HTMLElement,\n  ...keys: (string | {keyCode?: number; key?: string})[]\n): void;\n\n/**\n * If keys have been specified, focuses an input, sets its value and dispatches\n * the `input` event, simulating the user typing.\n * @param element Element onto which to set the value.\n * @param modifiers Modifier keys that are held while typing.\n * @param keys The keys to send to the element.\n * @docs-private\n */\nexport function typeInElement(\n  element: HTMLElement,\n  modifiers: ModifierKeys,\n  ...keys: (string | {keyCode?: number; key?: string})[]\n): void;\n\nexport function typeInElement(element: HTMLElement, ...modifiersAndKeys: any[]) {\n  const first = modifiersAndKeys[0];\n  let modifiers: ModifierKeys;\n  let rest: (string | {keyCode?: number; key?: string; code?: string})[];\n  if (\n    first !== undefined &&\n    typeof first !== 'string' &&\n    first.keyCode === undefined &&\n    first.key === undefined\n  ) {\n    modifiers = first;\n    rest = modifiersAndKeys.slice(1);\n  } else {\n    modifiers = {};\n    rest = modifiersAndKeys;\n  }\n  const isInput = isTextInput(element);\n  const inputType = element.getAttribute('type') || 'text';\n  const keys: {keyCode?: number; key?: string; code?: string}[] = rest\n    .map(k =>\n      typeof k === 'string'\n        ? k.split('').map(c => ({\n            keyCode: c.toUpperCase().charCodeAt(0),\n            key: c,\n            code: getKeyboardEventCode(c),\n          }))\n        : [k],\n    )\n    .reduce((arr, k) => arr.concat(k), []);\n\n  // Throw an error if no keys have been specified. Calling this function with no\n  // keys should not result in a focus event being dispatched unexpectedly.\n  if (keys.length === 0) {\n    throw getNoKeysSpecifiedError();\n  }\n\n  // We simulate the user typing in a value by incrementally assigning the value below. The problem\n  // is that for some input types, the browser won't allow for an invalid value to be set via the\n  // `value` property which will always be the case when going character-by-character. If we detect\n  // such an input, we have to set the value all at once or listeners to the `input` event (e.g.\n  // the `ReactiveFormsModule` uses such an approach) won't receive the correct value.\n  const enterValueIncrementally =\n    inputType === 'number'\n      ? // The value can be set character by character in number inputs if it doesn't have any decimals.\n        keys.every(key => key.key !== '.' && key.key !== '-' && key.keyCode !== PERIOD)\n      : incrementalInputTypes.has(inputType);\n\n  triggerFocus(element);\n\n  // When we aren't entering the value incrementally, assign it all at once ahead\n  // of time so that any listeners to the key events below will have access to it.\n  if (!enterValueIncrementally) {\n    (element as HTMLInputElement).value = keys.reduce((value, key) => value + (key.key || ''), '');\n  }\n\n  for (const key of keys) {\n    dispatchKeyboardEvent(element, 'keydown', key.keyCode, key.key, modifiers, key.code);\n    dispatchKeyboardEvent(element, 'keypress', key.keyCode, key.key, modifiers, key.code);\n    if (isInput && key.key && key.key.length === 1) {\n      if (enterValueIncrementally) {\n        (element as HTMLInputElement | HTMLTextAreaElement).value += key.key;\n        dispatchFakeEvent(element, 'input');\n      }\n    }\n    dispatchKeyboardEvent(element, 'keyup', key.keyCode, key.key, modifiers, key.code);\n  }\n\n  // Since we weren't dispatching `input` events while sending the keys, we have to do it now.\n  if (!enterValueIncrementally) {\n    dispatchFakeEvent(element, 'input');\n  }\n}\n\n/**\n * Clears the text in an input or textarea element.\n * @docs-private\n */\nexport function clearElement(element: HTMLInputElement | HTMLTextAreaElement) {\n  triggerFocus(element as HTMLElement);\n  element.value = '';\n  dispatchFakeEvent(element, 'input');\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport * as keyCodes from '../../keycodes';\nimport {\n  _getTextWithExcludedElements,\n  ElementDimensions,\n  ModifierKeys,\n  TestElement,\n  TestKey,\n  TextOptions,\n  EventData,\n} from '../../testing';\nimport {\n  clearElement,\n  createFakeEvent,\n  dispatchFakeEvent,\n  dispatchMouseEvent,\n  dispatchPointerEvent,\n  isTextInput,\n  triggerBlur,\n  triggerFocus,\n  typeInElement,\n  dispatchEvent,\n} from './fake-events';\n\n/** Maps `TestKey` constants to the `keyCode` and `key` values used by native browser events. */\nconst keyMap = {\n  [TestKey.BACKSPACE]: {keyCode: keyCodes.BACKSPACE, key: 'Backspace', code: 'Backspace'},\n  [TestKey.TAB]: {keyCode: keyCodes.TAB, key: 'Tab', code: 'Tab'},\n  [TestKey.ENTER]: {keyCode: keyCodes.ENTER, key: 'Enter', code: 'Enter'},\n  [TestKey.SHIFT]: {keyCode: keyCodes.SHIFT, key: 'Shift', code: 'ShiftLeft'},\n  [TestKey.CONTROL]: {keyCode: keyCodes.CONTROL, key: 'Control', code: 'ControlLeft'},\n  [TestKey.ALT]: {keyCode: keyCodes.ALT, key: 'Alt', code: 'AltLeft'},\n  [TestKey.ESCAPE]: {keyCode: keyCodes.ESCAPE, key: 'Escape', code: 'Escape'},\n  [TestKey.PAGE_UP]: {keyCode: keyCodes.PAGE_UP, key: 'PageUp', code: 'PageUp'},\n  [TestKey.PAGE_DOWN]: {keyCode: keyCodes.PAGE_DOWN, key: 'PageDown', code: 'PageDown'},\n  [TestKey.END]: {keyCode: keyCodes.END, key: 'End', code: 'End'},\n  [TestKey.HOME]: {keyCode: keyCodes.HOME, key: 'Home', code: 'Home'},\n  [TestKey.LEFT_ARROW]: {keyCode: keyCodes.LEFT_ARROW, key: 'ArrowLeft', code: 'ArrowLeft'},\n  [TestKey.UP_ARROW]: {keyCode: keyCodes.UP_ARROW, key: 'ArrowUp', code: 'ArrowUp'},\n  [TestKey.RIGHT_ARROW]: {keyCode: keyCodes.RIGHT_ARROW, key: 'ArrowRight', code: 'ArrowRight'},\n  [TestKey.DOWN_ARROW]: {keyCode: keyCodes.DOWN_ARROW, key: 'ArrowDown', code: 'ArrowDown'},\n  [TestKey.INSERT]: {keyCode: keyCodes.INSERT, key: 'Insert', code: 'Insert'},\n  [TestKey.DELETE]: {keyCode: keyCodes.DELETE, key: 'Delete', code: 'Delete'},\n  [TestKey.F1]: {keyCode: keyCodes.F1, key: 'F1', code: 'F1'},\n  [TestKey.F2]: {keyCode: keyCodes.F2, key: 'F2', code: 'F2'},\n  [TestKey.F3]: {keyCode: keyCodes.F3, key: 'F3', code: 'F3'},\n  [TestKey.F4]: {keyCode: keyCodes.F4, key: 'F4', code: 'F4'},\n  [TestKey.F5]: {keyCode: keyCodes.F5, key: 'F5', code: 'F5'},\n  [TestKey.F6]: {keyCode: keyCodes.F6, key: 'F6', code: 'F6'},\n  [TestKey.F7]: {keyCode: keyCodes.F7, key: 'F7', code: 'F7'},\n  [TestKey.F8]: {keyCode: keyCodes.F8, key: 'F8', code: 'F8'},\n  [TestKey.F9]: {keyCode: keyCodes.F9, key: 'F9', code: 'F9'},\n  [TestKey.F10]: {keyCode: keyCodes.F10, key: 'F10', code: 'F10'},\n  [TestKey.F11]: {keyCode: keyCodes.F11, key: 'F11', code: 'F11'},\n  [TestKey.F12]: {keyCode: keyCodes.F12, key: 'F12', code: 'F12'},\n  [TestKey.META]: {keyCode: keyCodes.META, key: 'Meta', code: 'MetaLeft'},\n  [TestKey.COMMA]: {keyCode: keyCodes.COMMA, key: ',', code: 'Comma'},\n};\n\n/** A `TestElement` implementation for unit tests. */\nexport class UnitTestElement implements TestElement {\n  constructor(\n    readonly element: Element,\n    private _stabilize: () => Promise<void>,\n  ) {}\n\n  /** Blur the element. */\n  async blur(): Promise<void> {\n    triggerBlur(this.element as HTMLElement);\n    await this._stabilize();\n  }\n\n  /** Clear the element's input (for input and textarea elements only). */\n  async clear(): Promise<void> {\n    if (!isTextInput(this.element)) {\n      throw Error('Attempting to clear an invalid element');\n    }\n    clearElement(this.element);\n    await this._stabilize();\n  }\n\n  /**\n   * Click the element at the default location for the current environment. If you need to guarantee\n   * the element is clicked at a specific location, consider using `click('center')` or\n   * `click(x, y)` instead.\n   */\n  click(modifiers?: ModifierKeys): Promise<void>;\n  /** Click the element at the element's center. */\n  click(location: 'center', modifiers?: ModifierKeys): Promise<void>;\n  /**\n   * Click the element at the specified coordinates relative to the top-left of the element.\n   * @param relativeX Coordinate within the element, along the X-axis at which to click.\n   * @param relativeY Coordinate within the element, along the Y-axis at which to click.\n   * @param modifiers Modifier keys held while clicking\n   */\n  click(relativeX: number, relativeY: number, modifiers?: ModifierKeys): Promise<void>;\n  async click(\n    ...args: [ModifierKeys?] | ['center', ModifierKeys?] | [number, number, ModifierKeys?]\n  ): Promise<void> {\n    const isDisabled = (this.element as Partial<{disabled?: boolean}>).disabled === true;\n\n    // If the element is `disabled` and has a `disabled` property, we emit the mouse event\n    // sequence but not dispatch the `click` event. This is necessary to keep the behavior\n    // consistent with an actual user interaction. The click event is not necessarily\n    // automatically prevented by the browser. There is mismatch between Firefox and Chromium:\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=329509.\n    // https://bugs.chromium.org/p/chromium/issues/detail?id=1115661.\n    await this._dispatchMouseEventSequence(isDisabled ? null : 'click', args, 0);\n    await this._stabilize();\n  }\n\n  /**\n   * Right clicks on the element at the specified coordinates relative to the top-left of it.\n   * @param relativeX Coordinate within the element, along the X-axis at which to click.\n   * @param relativeY Coordinate within the element, along the Y-axis at which to click.\n   * @param modifiers Modifier keys held while clicking\n   */\n  rightClick(relativeX: number, relativeY: number, modifiers?: ModifierKeys): Promise<void>;\n  async rightClick(\n    ...args: [ModifierKeys?] | ['center', ModifierKeys?] | [number, number, ModifierKeys?]\n  ): Promise<void> {\n    await this._dispatchMouseEventSequence('contextmenu', args, 2);\n    await this._stabilize();\n  }\n\n  /** Focus the element. */\n  async focus(): Promise<void> {\n    triggerFocus(this.element as HTMLElement);\n    await this._stabilize();\n  }\n\n  /** Get the computed value of the given CSS property for the element. */\n  async getCssValue(property: string): Promise<string> {\n    await this._stabilize();\n    // TODO(mmalerba): Consider adding value normalization if we run into common cases where its\n    //  needed.\n    return getComputedStyle(this.element).getPropertyValue(property);\n  }\n\n  /** Hovers the mouse over the element. */\n  async hover(): Promise<void> {\n    this._dispatchPointerEventIfSupported('pointerenter');\n    dispatchMouseEvent(this.element, 'mouseover');\n    dispatchMouseEvent(this.element, 'mouseenter');\n    await this._stabilize();\n  }\n\n  /** Moves the mouse away from the element. */\n  async mouseAway(): Promise<void> {\n    this._dispatchPointerEventIfSupported('pointerleave');\n    dispatchMouseEvent(this.element, 'mouseout');\n    dispatchMouseEvent(this.element, 'mouseleave');\n    await this._stabilize();\n  }\n\n  /**\n   * Sends the given string to the input as a series of key presses. Also fires input events\n   * and attempts to add the string to the Element's value. Note that this cannot\n   * reproduce native browser behavior for keyboard shortcuts such as Tab, Ctrl + A, etc.\n   */\n  async sendKeys(...keys: (string | TestKey)[]): Promise<void>;\n  /**\n   * Sends the given string to the input as a series of key presses. Also fires input events\n   * and attempts to add the string to the Element's value.\n   */\n  async sendKeys(modifiers: ModifierKeys, ...keys: (string | TestKey)[]): Promise<void>;\n  async sendKeys(...modifiersAndKeys: any[]): Promise<void> {\n    const args = modifiersAndKeys.map(k => (typeof k === 'number' ? keyMap[k as TestKey] : k));\n    typeInElement(this.element as HTMLElement, ...args);\n    await this._stabilize();\n  }\n\n  /**\n   * Gets the text from the element.\n   * @param options Options that affect what text is included.\n   */\n  async text(options?: TextOptions): Promise<string> {\n    await this._stabilize();\n    if (options?.exclude) {\n      return _getTextWithExcludedElements(this.element, options.exclude);\n    }\n    return (this.element.textContent || '').trim();\n  }\n\n  /**\n   * Sets the value of a `contenteditable` element.\n   * @param value Value to be set on the element.\n   */\n  async setContenteditableValue(value: string): Promise<void> {\n    const contenteditableAttr = await this.getAttribute('contenteditable');\n\n    if (\n      contenteditableAttr !== '' &&\n      contenteditableAttr !== 'true' &&\n      contenteditableAttr !== 'plaintext-only'\n    ) {\n      throw new Error('setContenteditableValue can only be called on a `contenteditable` element.');\n    }\n\n    await this._stabilize();\n    this.element.textContent = value;\n  }\n\n  /** Gets the value for the given attribute from the element. */\n  async getAttribute(name: string): Promise<string | null> {\n    await this._stabilize();\n    return this.element.getAttribute(name);\n  }\n\n  /** Checks whether the element has the given class. */\n  async hasClass(name: string): Promise<boolean> {\n    await this._stabilize();\n    return this.element.classList.contains(name);\n  }\n\n  /** Gets the dimensions of the element. */\n  async getDimensions(): Promise<ElementDimensions> {\n    await this._stabilize();\n    return this.element.getBoundingClientRect();\n  }\n\n  /** Gets the value of a property of an element. */\n  async getProperty<T = any>(name: string): Promise<T> {\n    await this._stabilize();\n    return (this.element as any)[name];\n  }\n\n  /** Sets the value of a property of an input. */\n  async setInputValue(value: string): Promise<void> {\n    (this.element as any).value = value;\n    await this._stabilize();\n  }\n\n  /** Selects the options at the specified indexes inside of a native `select` element. */\n  async selectOptions(...optionIndexes: number[]): Promise<void> {\n    let hasChanged = false;\n    const options = this.element.querySelectorAll('option');\n    const indexes = new Set(optionIndexes); // Convert to a set to remove duplicates.\n\n    for (let i = 0; i < options.length; i++) {\n      const option = options[i];\n      const wasSelected = option.selected;\n\n      // We have to go through `option.selected`, because `HTMLSelectElement.value` doesn't\n      // allow for multiple options to be selected, even in `multiple` mode.\n      option.selected = indexes.has(i);\n\n      if (option.selected !== wasSelected) {\n        hasChanged = true;\n        dispatchFakeEvent(this.element, 'change');\n      }\n    }\n\n    if (hasChanged) {\n      await this._stabilize();\n    }\n  }\n\n  /** Checks whether this element matches the given selector. */\n  async matchesSelector(selector: string): Promise<boolean> {\n    await this._stabilize();\n    const elementPrototype = Element.prototype as any;\n    return (elementPrototype['matches'] || elementPrototype['msMatchesSelector']).call(\n      this.element,\n      selector,\n    );\n  }\n\n  /** Checks whether the element is focused. */\n  async isFocused(): Promise<boolean> {\n    await this._stabilize();\n    return document.activeElement === this.element;\n  }\n\n  /**\n   * Dispatches an event with a particular name.\n   * @param name Name of the event to be dispatched.\n   */\n  async dispatchEvent(name: string, data?: Record<string, EventData>): Promise<void> {\n    const event = createFakeEvent(name);\n\n    if (data) {\n      // tslint:disable-next-line:ban Have to use `Object.assign` to preserve the original object.\n      Object.assign(event, data);\n    }\n\n    dispatchEvent(this.element, event);\n    await this._stabilize();\n  }\n\n  /**\n   * Dispatches a pointer event on the current element if the browser supports it.\n   * @param name Name of the pointer event to be dispatched.\n   * @param clientX Coordinate of the user's pointer along the X axis.\n   * @param clientY Coordinate of the user's pointer along the Y axis.\n   * @param button Mouse button that should be pressed when dispatching the event.\n   */\n  private _dispatchPointerEventIfSupported(\n    name: string,\n    clientX?: number,\n    clientY?: number,\n    offsetX?: number,\n    offsetY?: number,\n    button?: number,\n  ) {\n    // The latest versions of all browsers we support have the new `PointerEvent` API.\n    // Though since we capture the two most recent versions of these browsers, we also\n    // need to support Safari 12 at time of writing. Safari 12 does not have support for this,\n    // so we need to conditionally create and dispatch these events based on feature detection.\n    if (typeof PointerEvent !== 'undefined' && PointerEvent) {\n      dispatchPointerEvent(this.element, name, clientX, clientY, offsetX, offsetY, {\n        isPrimary: true,\n        button,\n      });\n    }\n  }\n\n  /**\n   * Dispatches all the events that are part of a mouse event sequence\n   * and then emits a given primary event at the end, if speciifed.\n   */\n  private async _dispatchMouseEventSequence(\n    primaryEventName: string | null,\n    args: [ModifierKeys?] | ['center', ModifierKeys?] | [number, number, ModifierKeys?],\n    button?: number,\n  ) {\n    let clientX: number | undefined = undefined;\n    let clientY: number | undefined = undefined;\n    let offsetX: number | undefined = undefined;\n    let offsetY: number | undefined = undefined;\n    let modifiers: ModifierKeys = {};\n\n    if (args.length && typeof args[args.length - 1] === 'object') {\n      modifiers = args.pop() as ModifierKeys;\n    }\n\n    if (args.length) {\n      const {left, top, width, height} = await this.getDimensions();\n      offsetX = args[0] === 'center' ? width / 2 : (args[0] as number);\n      offsetY = args[0] === 'center' ? height / 2 : (args[1] as number);\n\n      // Round the computed click position as decimal pixels are not\n      // supported by mouse events and could lead to unexpected results.\n      clientX = Math.round(left + offsetX);\n      clientY = Math.round(top + offsetY);\n    }\n\n    this._dispatchPointerEventIfSupported(\n      'pointerdown',\n      clientX,\n      clientY,\n      offsetX,\n      offsetY,\n      button,\n    );\n    dispatchMouseEvent(\n      this.element,\n      'mousedown',\n      clientX,\n      clientY,\n      offsetX,\n      offsetY,\n      button,\n      modifiers,\n    );\n    this._dispatchPointerEventIfSupported('pointerup', clientX, clientY, offsetX, offsetY, button);\n    dispatchMouseEvent(\n      this.element,\n      'mouseup',\n      clientX,\n      clientY,\n      offsetX,\n      offsetY,\n      button,\n      modifiers,\n    );\n\n    // If a primary event name is specified, emit it after the mouse event sequence.\n    if (primaryEventName !== null) {\n      dispatchMouseEvent(\n        this.element,\n        primaryEventName,\n        clientX,\n        clientY,\n        offsetX,\n        offsetY,\n        button,\n        modifiers,\n      );\n    }\n\n    // This call to _stabilize should not be needed since the callers will already do that them-\n    // selves. Nevertheless it breaks some tests in g3 without it. It needs to be investigated\n    // why removing breaks those tests.\n    // See: https://github.com/angular/components/pull/20758/files#r520886256.\n    await this._stabilize();\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  ComponentHarness,\n  ComponentHarnessConstructor,\n  handleAutoChangeDetectionStatus,\n  HarnessEnvironment,\n  HarnessLoader,\n  stopHandlingAutoChangeDetectionStatus,\n  TestElement,\n} from '../../testing';\nimport {ComponentFixture, flush} from '@angular/core/testing';\nimport {Observable} from 'rxjs';\nimport {takeWhile} from 'rxjs/operators';\nimport {TaskState, TaskStateZoneInterceptor} from './task-state-zone-interceptor';\nimport {UnitTestElement} from './unit-test-element';\n\n/** Options to configure the environment. */\nexport interface TestbedHarnessEnvironmentOptions {\n  /** The query function used to find DOM elements. */\n  queryFn: (selector: string, root: Element) => Iterable<Element> | ArrayLike<Element>;\n}\n\n/** The default environment options. */\nconst defaultEnvironmentOptions: TestbedHarnessEnvironmentOptions = {\n  queryFn: (selector: string, root: Element) => root.querySelectorAll(selector),\n};\n\n/** Whether auto change detection is currently disabled. */\nlet disableAutoChangeDetection = false;\n\n/**\n * The set of non-destroyed fixtures currently being used by `TestbedHarnessEnvironment` instances.\n */\nconst activeFixtures = new Set<ComponentFixture<unknown>>();\n\n/**\n * Installs a handler for change detection batching status changes for a specific fixture.\n * @param fixture The fixture to handle change detection batching for.\n */\nfunction installAutoChangeDetectionStatusHandler(fixture: ComponentFixture<unknown>) {\n  if (!activeFixtures.size) {\n    handleAutoChangeDetectionStatus(({isDisabled, onDetectChangesNow}) => {\n      disableAutoChangeDetection = isDisabled;\n      if (onDetectChangesNow) {\n        Promise.all(Array.from(activeFixtures).map(detectChanges)).then(onDetectChangesNow);\n      }\n    });\n  }\n  activeFixtures.add(fixture);\n}\n\n/**\n * Uninstalls a handler for change detection batching status changes for a specific fixture.\n * @param fixture The fixture to stop handling change detection batching for.\n */\nfunction uninstallAutoChangeDetectionStatusHandler(fixture: ComponentFixture<unknown>) {\n  activeFixtures.delete(fixture);\n  if (!activeFixtures.size) {\n    stopHandlingAutoChangeDetectionStatus();\n  }\n}\n\n/** Whether we are currently in the fake async zone. */\nfunction isInFakeAsyncZone() {\n  return typeof Zone !== 'undefined' && Zone!.current.get('FakeAsyncTestZoneSpec') != null;\n}\n\n/**\n * Triggers change detection for a specific fixture.\n * @param fixture The fixture to trigger change detection for.\n */\nasync function detectChanges(fixture: ComponentFixture<unknown>) {\n  fixture.detectChanges();\n  if (isInFakeAsyncZone()) {\n    flush();\n  } else {\n    await fixture.whenStable();\n  }\n}\n\n/** A `HarnessEnvironment` implementation for Angular's Testbed. */\nexport class TestbedHarnessEnvironment extends HarnessEnvironment<Element> {\n  /** Whether the environment has been destroyed. */\n  private _destroyed = false;\n\n  /** Observable that emits whenever the test task state changes. */\n  private _taskState?: Observable<TaskState>;\n\n  /** The options for this environment. */\n  private _options: TestbedHarnessEnvironmentOptions;\n\n  /** Environment stabilization callback passed to the created test elements. */\n  private _stabilizeCallback: () => Promise<void>;\n\n  protected constructor(\n    rawRootElement: Element,\n    private _fixture: ComponentFixture<unknown>,\n    options?: TestbedHarnessEnvironmentOptions,\n  ) {\n    super(rawRootElement);\n    this._options = {...defaultEnvironmentOptions, ...options};\n    if (TaskStateZoneInterceptor.isInProxyZone()) {\n      this._taskState = TaskStateZoneInterceptor.setup();\n    }\n    this._stabilizeCallback = () => this.forceStabilize();\n    installAutoChangeDetectionStatusHandler(_fixture);\n    _fixture.componentRef.onDestroy(() => {\n      uninstallAutoChangeDetectionStatusHandler(_fixture);\n      this._destroyed = true;\n    });\n  }\n\n  /** Creates a `HarnessLoader` rooted at the given fixture's root element. */\n  static loader(\n    fixture: ComponentFixture<unknown>,\n    options?: TestbedHarnessEnvironmentOptions,\n  ): HarnessLoader {\n    return new TestbedHarnessEnvironment(fixture.nativeElement, fixture, options);\n  }\n\n  /**\n   * Creates a `HarnessLoader` at the document root. This can be used if harnesses are\n   * located outside of a fixture (e.g. overlays appended to the document body).\n   */\n  static documentRootLoader(\n    fixture: ComponentFixture<unknown>,\n    options?: TestbedHarnessEnvironmentOptions,\n  ): HarnessLoader {\n    return new TestbedHarnessEnvironment(document.body, fixture, options);\n  }\n\n  /** Gets the native DOM element corresponding to the given TestElement. */\n  static getNativeElement(el: TestElement): Element {\n    if (el instanceof UnitTestElement) {\n      return el.element;\n    }\n    throw Error('This TestElement was not created by the TestbedHarnessEnvironment');\n  }\n\n  /**\n   * Creates an instance of the given harness type, using the fixture's root element as the\n   * harness's host element. This method should be used when creating a harness for the root element\n   * of a fixture, as components do not have the correct selector when they are created as the root\n   * of the fixture.\n   */\n  static async harnessForFixture<T extends ComponentHarness>(\n    fixture: ComponentFixture<unknown>,\n    harnessType: ComponentHarnessConstructor<T>,\n    options?: TestbedHarnessEnvironmentOptions,\n  ): Promise<T> {\n    const environment = new TestbedHarnessEnvironment(fixture.nativeElement, fixture, options);\n    await environment.forceStabilize();\n    return environment.createComponentHarness(harnessType, fixture.nativeElement);\n  }\n\n  /**\n   * Flushes change detection and async tasks captured in the Angular zone.\n   * In most cases it should not be necessary to call this manually. However, there may be some edge\n   * cases where it is needed to fully flush animation events.\n   */\n  async forceStabilize(): Promise<void> {\n    if (!disableAutoChangeDetection) {\n      if (this._destroyed) {\n        throw Error('Harness is attempting to use a fixture that has already been destroyed.');\n      }\n\n      await detectChanges(this._fixture);\n    }\n  }\n\n  /**\n   * Waits for all scheduled or running async tasks to complete. This allows harness\n   * authors to wait for async tasks outside of the Angular zone.\n   *\n   * This only works when Zone.js is present _and_ patches are applied to the test framework\n   * by `zone.js/testing` (Jasmine and Jest only) or another script.\n   */\n  async waitForTasksOutsideAngular(): Promise<void> {\n    // If we run in the fake async zone, we run \"flush\" to run any scheduled tasks. This\n    // ensures that the harnesses behave inside of the FakeAsyncTestZone similar to the\n    // \"AsyncTestZone\" and the root zone (i.e. neither fakeAsync or async). Note that we\n    // cannot just rely on the task state observable to become stable because the state will\n    // never change. This is because the task queue will be only drained if the fake async\n    // zone is being flushed.\n    if (isInFakeAsyncZone()) {\n      flush();\n    }\n\n    // Wait until the task queue has been drained and the zone is stable. Note that\n    // we cannot rely on \"fixture.whenStable\" since it does not catch tasks scheduled\n    // outside of the Angular zone. For test harnesses, we want to ensure that the\n    // app is fully stabilized and therefore need to use our own zone interceptor.\n    await this._taskState?.pipe(takeWhile(state => !state.stable)).toPromise();\n  }\n\n  /** Gets the root element for the document. */\n  protected getDocumentRoot(): Element {\n    return document.body;\n  }\n\n  /** Creates a `TestElement` from a raw element. */\n  protected createTestElement(element: Element): TestElement {\n    return new UnitTestElement(element, this._stabilizeCallback);\n  }\n\n  /** Creates a `HarnessLoader` rooted at the given raw element. */\n  protected createEnvironment(element: Element): HarnessEnvironment<Element> {\n    return new TestbedHarnessEnvironment(element, this._fixture, this._options);\n  }\n\n  /**\n   * Gets a list of all elements matching the given selector under this environment's root element.\n   */\n  protected async getAllRawElements(selector: string): Promise<Element[]> {\n    await this.forceStabilize();\n    return Array.from(this._options.queryFn(selector, this.rawRootElement));\n  }\n}\n"],"names":["stateObservableSymbol","Symbol","TaskStateZoneInterceptor","_lastState","_stateSubject","BehaviorSubject","_getTaskStateFromInternalZoneState","stable","state","constructor","lastState","onHasTask","delegate","current","target","hasTaskState","next","macroTask","microTask","isInProxyZone","Zone","get","undefined","setup","Error","ProxyZoneSpec","zoneSpec","assertPresent","interceptor","lastTaskState","zoneSpecOnHasTask","bind","args","createMouseEvent","type","clientX","clientY","offsetX","offsetY","button","modifiers","screenX","screenY","event","MouseEvent","bubbles","cancelable","composed","view","getEventView","detail","relatedTarget","ctrlKey","control","altKey","alt","shiftKey","shift","metaKey","meta","buttons","defineReadonlyEventProperty","createPointerEvent","options","isPrimary","PointerEvent","createKeyboardEvent","keyCode","key","code","KeyboardEvent","createFakeEvent","Event","propertyName","value","Object","defineProperty","configurable","window","jsdom","dispatchEvent","node","dispatchFakeEvent","dispatchKeyboardEvent","dispatchMouseEvent","dispatchPointerEvent","triggerFocusChange","element","eventFired","handler","addEventListener","removeEventListener","triggerFocus","triggerBlur","incrementalInputTypes","Set","charsToCodes","getKeyboardEventCode","char","length","charCode","charCodeAt","toUpperCase","isTextInput","nodeName","toLowerCase","typeInElement","modifiersAndKeys","first","rest","slice","isInput","inputType","getAttribute","keys","map","k","split","c","reduce","arr","concat","getNoKeysSpecifiedError","enterValueIncrementally","every","PERIOD","has","clearElement","keyMap","TestKey","BACKSPACE","keyCodes","TAB","ENTER","SHIFT","CONTROL","ALT","ESCAPE","PAGE_UP","PAGE_DOWN","END","HOME","LEFT_ARROW","UP_ARROW","RIGHT_ARROW","DOWN_ARROW","INSERT","DELETE","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","META","COMMA","UnitTestElement","_stabilize","blur","clear","click","isDisabled","disabled","_dispatchMouseEventSequence","rightClick","focus","getCssValue","property","getComputedStyle","getPropertyValue","hover","_dispatchPointerEventIfSupported","mouseAway","sendKeys","text","exclude","_getTextWithExcludedElements","textContent","trim","setContenteditableValue","contenteditableAttr","name","hasClass","classList","contains","getDimensions","getBoundingClientRect","getProperty","setInputValue","selectOptions","optionIndexes","hasChanged","querySelectorAll","indexes","i","option","wasSelected","selected","matchesSelector","selector","elementPrototype","Element","prototype","call","isFocused","document","activeElement","data","assign","primaryEventName","pop","left","top","width","height","Math","round","defaultEnvironmentOptions","queryFn","root","disableAutoChangeDetection","activeFixtures","installAutoChangeDetectionStatusHandler","fixture","size","handleAutoChangeDetectionStatus","onDetectChangesNow","Promise","all","Array","from","detectChanges","then","add","uninstallAutoChangeDetectionStatusHandler","delete","stopHandlingAutoChangeDetectionStatus","isInFakeAsyncZone","flush","whenStable","TestbedHarnessEnvironment","HarnessEnvironment","_fixture","_destroyed","_taskState","_options","_stabilizeCallback","rawRootElement","forceStabilize","componentRef","onDestroy","loader","nativeElement","documentRootLoader","body","getNativeElement","el","harnessForFixture","harnessType","environment","createComponentHarness","waitForTasksOutsideAngular","pipe","takeWhile","toPromise","getDocumentRoot","createTestElement","createEnvironment","getAllRawElements"],"mappings":"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"}