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

suite('pool', function () {
  setup(function (done) {
    var el = helpers.entityFactory();
    var sceneEl = this.sceneEl = el.parentNode;
    sceneEl.setAttribute('pool', 'mixin: test; size: 1');
    helpers.mixinFactory('test', {material: 'color: red'}, sceneEl);
    if (sceneEl.hasLoaded) { done(); return; }
    sceneEl.addEventListener('loaded', function () { done(); });
  });

  test('pool is initialized', function (done) {
    var sceneEl = this.sceneEl;
    var poolComponent = sceneEl.components.pool;
    assert.equal(poolComponent.availableEls.length, 1);
    assert.equal(poolComponent.usedEls.length, 0);
    setTimeout(() => {
      assert.equal(sceneEl.querySelectorAll('a-entity[material]').length, 1);
      done();
    });
  });

  test('can specify container', function (done) {
    var container;
    var sceneEl = this.sceneEl;
    var poolComponent = sceneEl.components.pool;

    container = document.createElement('a-entity');
    container.setAttribute('id', 'foo');
    sceneEl.appendChild(container);

    setTimeout(() => {
      sceneEl.setAttribute('pool__foo', 'mixin: test; size: 1; container: #foo');
      setTimeout(() => {
        assert.equal(poolComponent.availableEls.length, 1);
        assert.equal(poolComponent.usedEls.length, 0);
        assert.equal(container.querySelectorAll('[material]').length, 1);
        done();
      });
    });
  });

  suite('requestEntity', function () {
    test('can request an available entity', function () {
      var sceneEl = this.sceneEl;
      var poolComponent = sceneEl.components.pool;
      var el = poolComponent.requestEntity();
      el.addEventListener('loaded', function () {
        assert.ok(el);
        assert.equal(el.getAttribute('material').color, 'red');
      });
    });

    test('get undefined if pool is empty', function () {
      var sceneEl = this.sceneEl;
      var poolComponent = sceneEl.components.pool;
      var el;
      el = poolComponent.requestEntity();
      assert.ok(el);
      el = poolComponent.requestEntity();
      assert.notOk(el);
    });
  });

  suite('returnEntity', function () {
    test('can return an entity to the pool', function () {
      var sceneEl = this.sceneEl;
      var poolComponent = sceneEl.components.pool;
      var el = poolComponent.requestEntity();
      assert.equal(poolComponent.availableEls.length, 0);
      poolComponent.returnEntity(el);
      assert.equal(poolComponent.availableEls.length, 1);
    });

    test('cannot return an entity that did not belong to the pool', function () {
      var sceneEl = this.sceneEl;
      var poolComponent = sceneEl.components.pool;
      var el = poolComponent.requestEntity();
      var badEl = document.createElement('a-entity');
      assert.equal(poolComponent.availableEls.length, 0);
      poolComponent.returnEntity(badEl);
      assert.equal(poolComponent.availableEls.length, 0);
      poolComponent.returnEntity(el);
      assert.equal(poolComponent.availableEls.length, 1);
    });

    test('return an entity and makes the pool grow if dynamic', function () {
      var sceneEl = this.sceneEl;
      var poolComponent = sceneEl.components.pool;
      poolComponent.requestEntity();
      sceneEl.setAttribute('pool', 'dynamic', true);
      assert.equal(poolComponent.availableEls.length, 0);
      assert.equal(poolComponent.usedEls.length, 1);
      poolComponent.requestEntity();
      assert.equal(poolComponent.availableEls.length, 0);
      assert.equal(poolComponent.usedEls.length, 2);
    });
  });

  suite('wrapPlay', function () {
    test('cannot play an entity that is not in use', function () {
      var sceneEl = this.sceneEl;
      var poolComponent = sceneEl.components.pool;
      var el = poolComponent.requestEntity();
      poolComponent.returnEntity(el);
      el.play();
      assert.equal(el.isPlaying, false);
    });
  });
});