Newer
Older
reroad-test / 2020-ryusei / aframe-master / tests / utils / throttle.test.js
@ryusei ryusei on 22 Oct 2020 3 KB パノラマ表示
/* global assert, suite, test */
var throttle = require('utils').throttle;

suite('utils.throttle', function () {
  var ts;
  var dts;
  var interval = 1000;
  var functionToThrottle = function (t, dt) { ts.push(t); dts.push(dt); };
  var throttleFn;
  var arbitraryLargeTime = 987634578;
  var arbitraryLargeDelta = 12345;

  test('fires callback on first tick whatever', function () {
    ts = [];
    dts = [];
    assert.equal(ts.length, 0);
    assert.equal(dts.length, 0);
    throttleFn = throttle(functionToThrottle, interval);
    throttleFn(arbitraryLargeTime, arbitraryLargeDelta);
    assert.equal(ts.length, 1);
    assert.equal(ts[0], arbitraryLargeTime);
    assert.equal(dts.length, 1);
    assert.equal(dts[0], arbitraryLargeDelta);
  });

  test('fires callback on first tick zero', function () {
    ts = [];
    dts = [];
    assert.equal(ts.length, 0);
    assert.equal(dts.length, 0);
    throttleFn = throttle(function (t, dt) { ts.push(t); dts.push(dt); }, interval);
    throttleFn(0, arbitraryLargeDelta);
    assert.equal(ts.length, 1);
    assert.equal(ts[0], 0);
    assert.equal(dts.length, 1);
    assert.equal(dts[0], arbitraryLargeDelta);
  });

  // need to wait for wall clock time, so skip this
  test.skip('does not fire callback on ticks too soon', function () {
    var tlen = ts.length;
    var dtlen = dts.length;
    assert.equal(ts.length, dts.length);
    throttleFn(1);
    assert.equal(ts.length, tlen);
    assert.equal(dts.length, dtlen);
    throttleFn(interval / 2);
    assert.equal(ts.length, tlen);
    assert.equal(dts.length, dtlen);
    throttleFn(interval - 1);
    assert.equal(ts.length, tlen);
    assert.equal(dts.length, dtlen);
  });

  // need to wait for wall clock time
  test('does fire callback on ticks after enough', function () {
    var tlen = ts.length;
    var dtlen = dts.length;
    assert.equal(ts.length, dts.length);
    setTimeout(function () {
      throttleFn(interval);
      assert.equal(ts.length, tlen + 1);
      assert.ok(ts[tlen] - ts[tlen - 1] >= interval);
      assert.equal(dts.length, dtlen + 1);
      assert.ok(ts[tlen] - ts[tlen - 1] === dts[tlen]);
    }, interval);
  });

  // need to wait for wall clock time, so skip this
  test.skip('fires only one callback on multiply late ticks', function () {
    var tlen = ts.length;
    var dtlen = dts.length;
    assert.equal(ts.length, dts.length);
    throttleFn(interval * 5);
    assert.equal(ts.length, tlen + 1);
    assert.ok(ts[tlen] - ts[tlen - 1] >= interval);
    assert.equal(dts.length, dtlen + 1);
    assert.ok(ts[tlen] - ts[tlen - 1] === dts[tlen]);
    throttleFn(interval * 9);
    assert.equal(ts.length, tlen + 2);
    assert.ok(ts[tlen + 1] - ts[tlen] >= interval);
    assert.equal(dts.length, dtlen + 2);
    assert.ok(ts[tlen + 1] - ts[tlen] === dts[tlen + 1]);
  });

  test('binds function if context given', function () {
    var obj = {};
    obj.functionToThrottle = function (t, dt) { this.t = t; this.dt = dt; };
    var spy = this.sinon.spy(obj, 'functionToThrottle');
    obj.functionToThrottle = throttle(obj.functionToThrottle, interval, obj);
    obj.functionToThrottle(arbitraryLargeTime, arbitraryLargeDelta);
    assert.ok(spy.calledOnce);
    assert.ok(spy.calledWith(arbitraryLargeTime, arbitraryLargeDelta));
    assert.equal(obj.t, arbitraryLargeTime);
    assert.equal(obj.dt, arbitraryLargeDelta);
  });
});