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

var MTL = '/base/tests/assets/crate/crate.mtl';
var OBJ = '/base/tests/assets/crate/crate.obj';

suite('obj-model', function () {
  setup(function (done) {
    var el;
    var objAsset = document.createElement('a-asset-item');
    var mtlAsset = document.createElement('a-asset-item');
    mtlAsset.setAttribute('id', 'mtl');
    mtlAsset.setAttribute('src', MTL);
    objAsset.setAttribute('id', 'obj');
    objAsset.setAttribute('src', OBJ);
    el = this.el = entityFactory({assets: [mtlAsset, objAsset]});
    if (el.hasLoaded) { done(); }
    el.addEventListener('loaded', function () { done(); });
  });

  test('can load .OBJ only', function (done) {
    var el = this.el;
    el.addEventListener('model-loaded', function () {
      assert.ok(el.components['obj-model'].model);
      done();
    });
    el.setAttribute('obj-model', 'obj', '#obj');
  });

  test('can load .OBJ + .MTL', function (done) {
    var el = this.el;
    var handled = false;  // Event listener is not getting torn down for some reason.
    el.addEventListener('model-loaded', function () {
      if (handled) { return; }
      handled = true;
      assert.ok(el.components['obj-model'].model);
      done();
    });
    el.setAttribute('obj-model', {mtl: '#mtl', obj: '#obj'});
  });

  test('can load .OBJ + .MTL with url()', function (done) {
    var el = this.el;
    var handled = false;  // Event listener is not getting torn down for some reason.
    el.addEventListener('model-loaded', function () {
      if (handled) { return; }
      handled = true;
      assert.ok(el.components['obj-model'].model);
      done();
    });
    el.setAttribute('obj-model', {mtl: `url(${MTL})`, obj: `url(${OBJ})`});
  });

  test('can load multiple .OBJ', function (done) {
    var el = this.el;
    var el2 = document.createElement('a-entity');

    var elPromise = new Promise(function (resolve) {
      el.addEventListener('model-loaded', resolve);
    });
    var el2Promise = new Promise(function (resolve) {
      el2.addEventListener('model-loaded', resolve);
    });

    Promise.all([elPromise, el2Promise]).then(function () {
      assert.ok(el.getObject3D('mesh'));
      assert.ok(el2.getObject3D('mesh'));
      assert.notEqual(el.components['obj-model'].model, el2.components['obj-model'].model);
      done();
    });

    el2.addEventListener('loaded', function () {
      el.setAttribute('obj-model', {obj: '#obj'});
      el2.setAttribute('obj-model', {obj: '#obj'});
    });
    el.sceneEl.appendChild(el2);
  });

  test('can load .OBJ with material', function (done) {
    var el = this.el;
    el.setAttribute('material', 'color', 'red');
    el.addEventListener('object3dset', () => {
      var material = el.getObject3D('mesh').children[0].material;
      assert.equal(material.color.r, 1);
      done();
    });
    el.setAttribute('obj-model', 'obj', '#obj');
  });

  test('can load .OBJ with reset material', function (done) {
    var el = this.el;
    el.setAttribute('material', 'color', 'red');
    el.addEventListener('object3dset', () => {
      el.removeAttribute('material');
      el.setAttribute('material', 'color', 'blue');
      setTimeout(() => {
        assert.equal(el.getObject3D('mesh').children[0].material.color.b, 1);
        done();
      });
    });
    el.setAttribute('obj-model', 'obj', '#obj');
  });
});