chromium/chrome/test/data/webui/bookmarks/test_timer_proxy.ts

// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import {assert} from 'chrome://resources/js/assert.js';

// TODO(calamity): Remove TestTimerProxy in favor of MockTimer.
export class TestTimerProxy {
  immediatelyResolveTimeouts: boolean = true;
  private nextTimeoutId_: number = 0;
  private activeTimeouts_: Map<number, Function> = new Map();

  setTimeout(fn: Function, _delay: number): number {
    if (this.immediatelyResolveTimeouts) {
      fn();
    } else {
      this.activeTimeouts_.set(this.nextTimeoutId_, fn);
    }

    return this.nextTimeoutId_++;
  }

  clearTimeout(id: number) {
    this.activeTimeouts_.delete(id);
  }

  /**
   * Run the function associated with a timeout id and clear it from the
   * active timeouts.
   */
  runTimeoutFn(id: number) {
    const fn = this.activeTimeouts_.get(id);
    assert(fn);
    fn();
    this.clearTimeout(id);
  }

  /**
   * Returns true if a given timeout id has not been run or cleared.
   */
  hasTimeout(id: number): boolean {
    return this.activeTimeouts_.has(id);
  }
}