summaryrefslogtreecommitdiffstats
path: root/polygerrit-ui/app/services/scheduler/fake-scheduler.ts
blob: d4df3cea62c770586773b7d1d864f7737325e988 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
 * @license
 * Copyright 2022 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import {Scheduler, Task} from './scheduler';

type FakeTask = (error?: unknown) => Promise<void>;
export class FakeScheduler<T> implements Scheduler<T> {
  readonly scheduled: Array<FakeTask> = [];

  schedule(task: Task<T>) {
    return new Promise<T>((resolve, reject) => {
      this.scheduled.push(async (error?: unknown) => {
        if (error) {
          reject(error);
        } else {
          try {
            resolve(await task());
          } catch (e: unknown) {
            reject(e);
          }
        }
      });
    });
  }

  async resolve(): Promise<void> {
    if (this.scheduled.length === 0) return;
    const fakeTask = this.scheduled.shift() as FakeTask;
    await fakeTask();
  }

  async reject(error: unknown): Promise<void> {
    if (this.scheduled.length === 0) return;
    const fakeTask = this.scheduled.shift() as FakeTask;
    await fakeTask(error);
  }
}