{"version":3,"file":"context.cjs","sources":["../../../../../src/mods/runner/context/context.ts"],"sourcesContent":["import { TestError } from \"mods/runner/error.js\";\n\nexport class Context {\n  private _befores = new Array<(context: Context) => Promise<void>>()\n  private _afters = new Array<(context: Context) => Promise<void>>()\n\n  private _catcher?: (error: TestError, context: Context) => Promise<void>\n\n  constructor(\n    readonly message: string\n  ) {\n    this.test = this.test.bind(this)\n    this.before = this.before.bind(this)\n    this.after = this.after.bind(this)\n    this.catcher = this.catcher.bind(this)\n    this.wait = this.wait.bind(this)\n  }\n\n  /**\n   * Run something before each test block\n   * @param closure closure\n   */\n  before(closure: (context: Context) => Promise<void>) {\n    this._befores.push(closure)\n  }\n\n  /**\n   * Run something after each test block\n   * @param closure closure\n   */\n  after(closure: (context: Context) => Promise<void>) {\n    this._afters.push(closure)\n  }\n\n  /**\n   * Run something when an error is thrown\n   * @param closure \n   */\n  catcher(closure: (error: TestError, context: Context) => Promise<void>) {\n    this._catcher = closure\n  }\n\n  private _tests = new Array<Promise<void>>()\n\n  /**\n   * Run a test block\n   * @param message message to show\n   * @param closure closure to run\n   * @returns result of closure\n   */\n  async test(message: string, closure: (context: Context) => Promise<void>) {\n    const promise = this._test(message, closure)\n    this._tests.push(promise)\n    return promise.catch(() => { })\n  }\n\n  private async _test(message: string, closure: (context: Context) => Promise<void>) {\n    const context = new Context(message)\n\n    for (const before of this._befores)\n      await before(context)\n\n    try {\n      await closure(context)\n      await context.wait()\n    } catch (cause: unknown) {\n      const error = new TestError(message, { cause })\n      if (!this._catcher) throw error\n\n      try {\n        await this._catcher?.(error, context)\n      } catch (cause: unknown) {\n        throw new TestError(message, { cause })\n      }\n    } finally {\n      for (const after of this._afters)\n        await after(context)\n    }\n  }\n\n  /**\n   * Wait for all tests to finish (called by default at the end of each test block)\n   * @why You want to forcefully wait in the midst of a test block\n   */\n  async wait() {\n    try {\n      await Promise.all(this._tests)\n    } finally {\n      this._tests = new Array()\n    }\n  }\n}"],"names":["error","TestError"],"mappings":"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"}