{"version":3,"file":"scion-toolkit-testing.mjs","sources":["../../../../projects/scion/toolkit/testing/src/observe-captor.ts","../../../../projects/scion/toolkit/testing/src/public_api.ts","../../../../projects/scion/toolkit/testing/src/scion-toolkit-testing.ts"],"sourcesContent":["import {AsyncSubject, bufferCount, Observer, ReplaySubject, throwError} from 'rxjs';\nimport {take, timeout} from 'rxjs/operators';\n\n/**\n * Allows capturing emissions of an Observable.\n */\nexport class ObserveCaptor<T = any, R = T> implements Observer<T> {\n\n  private readonly _projectFn: (value: T) => R;\n\n  private _values: R[] = [];\n  private _state: 'completed' | 'errored' | undefined;\n  private _error: any;\n\n  private _completeOrError$ = new AsyncSubject<void>();\n  private _emitCount$ = new ReplaySubject<void>(Infinity);\n\n  /**\n   * Constructs this captor. Optionally, you can provide a project function to map emitted values.\n   */\n  constructor(projectFn?: (value: T) => R) {\n    this._projectFn = projectFn ?? (value => value as unknown as R);\n  }\n\n  /**\n   * @docs-private\n   *\n   * Note: Write as arrow function to retain the `this` reference when being invoked from another scope, e.g., from the global scope.\n   */\n  public next = (value: T): void => {\n    this._values.push(this._projectFn(value));\n    this._emitCount$.next();\n  };\n\n  /**\n   * @docs-private\n   *\n   * Note: Write as arrow function to retain the `this` reference when being invoked from another scope, e.g., from the global scope.\n   */\n  public error = (error: unknown): void => {\n    this._state = 'errored';\n    this._error = error;\n    this._completeOrError$.complete();\n  };\n\n  /**\n   * @docs-private\n   *\n   * Note: Write as arrow function to retain the `this` reference when being invoked from another scope, e.g., from the global scope.\n   */\n  public complete = (): void => {\n    this._state = 'completed';\n    this._completeOrError$.complete();\n  };\n\n  /**\n   * Returns captured values in the order as emitted by the Observable.\n   */\n  public getValues(): R[] {\n    return this._values;\n  }\n\n  /**\n   * Returns the last captured value, if any.\n   */\n  public getLastValue(): R | undefined {\n    return this._values.at(-1);\n  }\n\n  /**\n   * Returns the error if the Observable errored.\n   */\n  public getError(): any {\n    return this._error;\n  }\n\n  /**\n   * Indicates if the Observable completed. An Observable can either complete or error.\n   */\n  public hasCompleted(): boolean {\n    return this._state === 'completed';\n  }\n\n  /**\n   * Indicates if the Observable errored. An Observable can either complete or error.\n   */\n  public hasErrored(): boolean {\n    return this._state === 'errored';\n  }\n\n  /**\n   * Resets this captor.\n   *\n   * Pass options to control which aspects of this captor not to reset. By default, all aspects are reset.\n   */\n  public reset(options?: {resetValues?: boolean; resetEmitCount?: boolean}): this {\n    const resetValues = options?.resetValues ?? true;\n    const resetEmitCount = options?.resetEmitCount ?? true;\n\n    if (resetValues) {\n      this._values = [];\n    }\n    if (resetEmitCount) {\n      this._emitCount$.error('[CaptorError] Captor has been reset.');\n      this._emitCount$ = new ReplaySubject<void>(Infinity);\n    }\n    return this;\n  }\n\n  /**\n   * Waits until the Observable emits the given number of items, or throws if the given timeout elapses.\n   */\n  public async waitUntilEmitCount(count: number, timeoutMs: number = 5000): Promise<void> {\n    return new Promise((resolve, reject) => {\n      this._emitCount$\n        .pipe(\n          bufferCount(count), // Swallow emissions in order not to deactivate the timeout timer.\n          take(1),\n          timeout({first: timeoutMs, with: () => throwError(() => new Error('[CaptorTimeoutError] Timeout elapsed.'))}),\n        )\n        .subscribe({\n          error: error => reject(error instanceof Error ? error : Error(`${error}`)),\n          complete: resolve,\n        });\n    });\n  }\n\n  /**\n   * Waits until the Observable completes or errors.\n   */\n  public async waitUntilCompletedOrErrored(): Promise<void> {\n    return new Promise(resolve => this._completeOrError$.subscribe({complete: resolve}));\n  }\n}\n","/*\n * Copyright (c) 2018-2019 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n *  SPDX-License-Identifier: EPL-2.0\n */\n\n/*\n * Secondary entrypoint: '@scion/toolkit/testing'\n *\n * @see https://github.com/ng-packagr/ng-packagr/blob/master/docs/secondary-entrypoints.md\n */\nexport * from './observe-captor';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}