{"version":3,"file":"testing.mjs","sources":["../../../../../../packages/compiler/testing/src/resource_loader_mock.ts","../../../../../../packages/compiler/testing/src/schema_registry_mock.ts","../../../../../../packages/compiler/testing/src/directive_resolver_mock.ts","../../../../../../packages/compiler/testing/src/ng_module_resolver_mock.ts","../../../../../../packages/compiler/testing/src/pipe_resolver_mock.ts","../../../../../../packages/compiler/testing/src/testing.ts","../../../../../../packages/compiler/testing/public_api.ts","../../../../../../packages/compiler/testing/index.ts","../../../../../../packages/compiler/testing/testing.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.io/license\n */\n\nimport {ResourceLoader} from '@angular/compiler';\n\n/**\n * A mock implementation of {@link ResourceLoader} that allows outgoing requests to be mocked\n * and responded to within a single test, without going to the network.\n */\nexport class MockResourceLoader extends ResourceLoader {\n  private _expectations: _Expectation[] = [];\n  private _definitions = new Map<string, string>();\n  private _requests: _PendingRequest[] = [];\n\n  override get(url: string): Promise<string> {\n    const request = new _PendingRequest(url);\n    this._requests.push(request);\n    return request.getPromise();\n  }\n\n  hasPendingRequests() {\n    return !!this._requests.length;\n  }\n\n  /**\n   * Add an expectation for the given URL. Incoming requests will be checked against\n   * the next expectation (in FIFO order). The `verifyNoOutstandingExpectations` method\n   * can be used to check if any expectations have not yet been met.\n   *\n   * The response given will be returned if the expectation matches.\n   */\n  expect(url: string, response: string) {\n    const expectation = new _Expectation(url, response);\n    this._expectations.push(expectation);\n  }\n\n  /**\n   * Add a definition for the given URL to return the given response. Unlike expectations,\n   * definitions have no order and will satisfy any matching request at any time. Also\n   * unlike expectations, unused definitions do not cause `verifyNoOutstandingExpectations`\n   * to return an error.\n   */\n  when(url: string, response: string) {\n    this._definitions.set(url, response);\n  }\n\n  /**\n   * Process pending requests and verify there are no outstanding expectations. Also fails\n   * if no requests are pending.\n   */\n  flush() {\n    if (this._requests.length === 0) {\n      throw new Error('No pending requests to flush');\n    }\n\n    do {\n      this._processRequest(this._requests.shift()!);\n    } while (this._requests.length > 0);\n\n    this.verifyNoOutstandingExpectations();\n  }\n\n  /**\n   * Throw an exception if any expectations have not been satisfied.\n   */\n  verifyNoOutstandingExpectations() {\n    if (this._expectations.length === 0) return;\n\n    const urls: string[] = [];\n    for (let i = 0; i < this._expectations.length; i++) {\n      const expectation = this._expectations[i];\n      urls.push(expectation.url);\n    }\n\n    throw new Error(`Unsatisfied requests: ${urls.join(', ')}`);\n  }\n\n  private _processRequest(request: _PendingRequest) {\n    const url = request.url;\n\n    if (this._expectations.length > 0) {\n      const expectation = this._expectations[0];\n      if (expectation.url == url) {\n        remove(this._expectations, expectation);\n        request.complete(expectation.response);\n        return;\n      }\n    }\n\n    if (this._definitions.has(url)) {\n      const response = this._definitions.get(url);\n      request.complete(response == null ? null : response);\n      return;\n    }\n\n    throw new Error(`Unexpected request ${url}`);\n  }\n}\n\nclass _PendingRequest {\n  // TODO(issue/24571): remove '!'.\n  resolve!: (result: string) => void;\n  // TODO(issue/24571): remove '!'.\n  reject!: (error: any) => void;\n  promise: Promise<string>;\n\n  constructor(public url: string) {\n    this.promise = new Promise((res, rej) => {\n      this.resolve = res;\n      this.reject = rej;\n    });\n  }\n\n  complete(response: string|null) {\n    if (response == null) {\n      this.reject(`Failed to load ${this.url}`);\n    } else {\n      this.resolve(response);\n    }\n  }\n\n  getPromise(): Promise<string> {\n    return this.promise;\n  }\n}\n\nclass _Expectation {\n  url: string;\n  response: string;\n  constructor(url: string, response: string) {\n    this.url = url;\n    this.response = response;\n  }\n}\n\nfunction remove<T>(list: T[], el: T): void {\n  const index = list.indexOf(el);\n  if (index > -1) {\n    list.splice(index, 1);\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.io/license\n */\n\nimport {core, ElementSchemaRegistry} from '@angular/compiler';\n\nexport class MockSchemaRegistry implements ElementSchemaRegistry {\n  constructor(\n      public existingProperties: {[key: string]: boolean},\n      public attrPropMapping: {[key: string]: string},\n      public existingElements: {[key: string]: boolean}, public invalidProperties: Array<string>,\n      public invalidAttributes: Array<string>) {}\n\n  hasProperty(tagName: string, property: string, schemas: core.SchemaMetadata[]): boolean {\n    const value = this.existingProperties[property];\n    return value === void 0 ? true : value;\n  }\n\n  hasElement(tagName: string, schemaMetas: core.SchemaMetadata[]): boolean {\n    const value = this.existingElements[tagName.toLowerCase()];\n    return value === void 0 ? true : value;\n  }\n\n  allKnownElementNames(): string[] {\n    return Object.keys(this.existingElements);\n  }\n\n  securityContext(selector: string, property: string, isAttribute: boolean): core.SecurityContext {\n    return core.SecurityContext.NONE;\n  }\n\n  getMappedPropName(attrName: string): string {\n    return this.attrPropMapping[attrName] || attrName;\n  }\n\n  getDefaultComponentElementName(): string {\n    return 'ng-component';\n  }\n\n  validateProperty(name: string): {error: boolean, msg?: string} {\n    if (this.invalidProperties.indexOf(name) > -1) {\n      return {error: true, msg: `Binding to property '${name}' is disallowed for security reasons`};\n    } else {\n      return {error: false};\n    }\n  }\n\n  validateAttribute(name: string): {error: boolean, msg?: string} {\n    if (this.invalidAttributes.indexOf(name) > -1) {\n      return {\n        error: true,\n        msg: `Binding to attribute '${name}' is disallowed for security reasons`\n      };\n    } else {\n      return {error: false};\n    }\n  }\n\n  normalizeAnimationStyleProperty(propName: string): string {\n    return propName;\n  }\n  normalizeAnimationStyleValue(camelCaseProp: string, userProvidedProp: string, val: string|number):\n      {error: string, value: string} {\n    return {error: null!, value: val.toString()};\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.io/license\n */\nimport {CompileReflector, core, DirectiveResolver} from '@angular/compiler';\n\n/**\n * An implementation of {@link DirectiveResolver} that allows overriding\n * various properties of directives.\n */\nexport class MockDirectiveResolver extends DirectiveResolver {\n  private _directives = new Map<core.Type, core.Directive>();\n\n  constructor(reflector: CompileReflector) {\n    super(reflector);\n  }\n\n  override resolve(type: core.Type): core.Directive;\n  override resolve(type: core.Type, throwIfNotFound: true): core.Directive;\n  override resolve(type: core.Type, throwIfNotFound: boolean): core.Directive|null;\n  override resolve(type: core.Type, throwIfNotFound = true): core.Directive|null {\n    return this._directives.get(type) || super.resolve(type, throwIfNotFound);\n  }\n\n  /**\n   * Overrides the {@link core.Directive} for a directive.\n   */\n  setDirective(type: core.Type, metadata: core.Directive): void {\n    this._directives.set(type, metadata);\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.io/license\n */\n\nimport {CompileReflector, core, NgModuleResolver} from '@angular/compiler';\n\nexport class MockNgModuleResolver extends NgModuleResolver {\n  private _ngModules = new Map<core.Type, core.NgModule>();\n\n  constructor(reflector: CompileReflector) {\n    super(reflector);\n  }\n\n  /**\n   * Overrides the {@link NgModule} for a module.\n   */\n  setNgModule(type: core.Type, metadata: core.NgModule): void {\n    this._ngModules.set(type, metadata);\n  }\n\n  /**\n   * Returns the {@link NgModule} for a module:\n   * - Set the {@link NgModule} to the overridden view when it exists or fallback to the\n   * default\n   * `NgModuleResolver`, see `setNgModule`.\n   */\n  override resolve(type: core.Type, throwIfNotFound = true): core.NgModule {\n    return this._ngModules.get(type) || super.resolve(type, throwIfNotFound)!;\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.io/license\n */\n\nimport {CompileReflector, core, PipeResolver} from '@angular/compiler';\n\nexport class MockPipeResolver extends PipeResolver {\n  private _pipes = new Map<core.Type, core.Pipe>();\n\n  constructor(refector: CompileReflector) {\n    super(refector);\n  }\n\n  /**\n   * Overrides the {@link Pipe} for a pipe.\n   */\n  setPipe(type: core.Type, metadata: core.Pipe): void {\n    this._pipes.set(type, metadata);\n  }\n\n  /**\n   * Returns the {@link Pipe} for a pipe:\n   * - Set the {@link Pipe} to the overridden view when it exists or fallback to the\n   * default\n   * `PipeResolver`, see `setPipe`.\n   */\n  override resolve(type: core.Type, throwIfNotFound = true): core.Pipe {\n    let metadata = this._pipes.get(type);\n    if (!metadata) {\n      metadata = super.resolve(type, throwIfNotFound)!;\n    }\n    return metadata;\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.io/license\n */\n\n/**\n * @module\n * @description\n * Entry point for all APIs of the compiler package.\n *\n * <div class=\"callout is-critical\">\n *   <header>Unstable APIs</header>\n *   <p>\n *     All compiler apis are currently considered experimental and private!\n *   </p>\n *   <p>\n *     We expect the APIs in this package to keep on changing. Do not rely on them.\n *   </p>\n * </div>\n */\nexport * from './resource_loader_mock';\nexport * from './schema_registry_mock';\nexport * from './directive_resolver_mock';\nexport * from './ng_module_resolver_mock';\nexport * from './pipe_resolver_mock';\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.io/license\n */\n\n/// <reference types=\"node\" />\n\n/**\n * @module\n * @description\n * Entry point for all public APIs of this package.\n */\nexport * from './src/testing';\n\n// This file only reexports content of the `src` folder. Keep it that way.\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.io/license\n */\n\n// This file is not used to build this module. It is only used during editing\n// by the TypeScript language service and during build for verification. `ngc`\n// replaces this file with production index.ts when it rewrites private symbol\n// names.\n\nexport * from './public_api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}