Newer
Older
reroad-test / 2020-fuga / aframe-master / tests / systems / camera.test.js
@fuga sakurai fuga sakurai on 4 Nov 2020 7 KB a-フレームを追加した
/* global assert, process, setup, suite, test, sinon */
var constants = require('constants/');
var entityFactory = require('../helpers').entityFactory;

suite('camera system', function () {
  var sceneEl;

  setup(function (done) {
    var el = this.el = entityFactory();
    if (el.hasLoaded) { done(); }
    el.addEventListener('loaded', function () {
      done();
    });
  });

  test('creates default camera if not defined', function (done) {
    // Create scene.
    sceneEl = document.createElement('a-scene');

    sceneEl.addEventListener('loaded', function () {
      assert.ok(sceneEl.camera);
      assert.ok(sceneEl.camera.el.getObject3D('camera'));
      assert.ok(sceneEl.camera.el.hasAttribute(constants.AFRAME_INJECTED));
      assert.ok(sceneEl.camera.el.hasAttribute('look-controls'));
      done();
    });

    document.body.appendChild(sceneEl);
  });

  test('uses defined camera if defined', function (done) {
    var assetsEl;
    var imgEl;  // Image that will never load.
    var cameraEl;
    var sceneEl;

    // Create assets.
    assetsEl = document.createElement('a-assets');
    imgEl = document.createElement('img');
    imgEl.setAttribute('src', 'neverloadlalala5.gif');
    assetsEl.appendChild(imgEl);

    // Create scene.
    sceneEl = document.createElement('a-scene');
    sceneEl.appendChild(assetsEl);

    // Create camera.
    cameraEl = document.createElement('a-entity');
    cameraEl.setAttribute('camera', '');
    sceneEl.appendChild(cameraEl);

    sceneEl.addEventListener('loaded', function () {
      assert.equal(sceneEl.camera.el, cameraEl);
      done();
    });

    document.body.appendChild(sceneEl);

    // Trigger scene load through assets. Camera will be waiting for assets.
    // Add `setTimeout` to mimic asynchrony of asset loading.
    setTimeout(function () { assetsEl.load(); });
  });

  test('uses defined a-camera if defined', function (done) {
    var cameraEl;
    var sceneEl;

    // Create scene.
    sceneEl = document.createElement('a-scene');

    // Create camera.
    cameraEl = document.createElement('a-camera');
    sceneEl.appendChild(cameraEl);

    sceneEl.addEventListener('cameraready', function () {
      assert.ok(cameraEl.getObject3D('camera'));
      assert.equal(sceneEl.camera.el, cameraEl);
      done();
    });

    document.body.appendChild(sceneEl);
  });

  test('does not choose defined spectator camera as initial camera', function (done) {
    var cameraEl;
    var sceneEl;

    // Create scene.
    sceneEl = document.createElement('a-scene');

    // Create camera.
    cameraEl = document.createElement('a-entity');
    cameraEl.setAttribute('camera', 'spectator: true');
    sceneEl.appendChild(cameraEl);

    sceneEl.addEventListener('loaded', function () {
      assert.notEqual(sceneEl.camera.el, cameraEl);
      done();
    });

    document.body.appendChild(sceneEl);
  });

  test('does not choose non-active camera as initial camera', function (done) {
    var cameraEl;
    var sceneEl;

    // Create scene.
    sceneEl = document.createElement('a-scene');

    // Create camera.
    cameraEl = document.createElement('a-entity');
    cameraEl.setAttribute('camera', 'active: false');
    sceneEl.appendChild(cameraEl);

    sceneEl.addEventListener('loaded', function () {
      assert.notEqual(sceneEl.camera.el, cameraEl);
      done();
    });

    document.body.appendChild(sceneEl);
  });

  suite('setActiveCamera', function () {
    test('sets new active camera on scene', function () {
      var el = this.el;
      el.setAttribute('camera', '');
      assert.equal(el.sceneEl.camera, el.components.camera.camera);
    });

    test('does not get affected by mixins', function (done) {
      var sceneEl = this.el.sceneEl;
      var assetsEl = document.querySelector('a-assets');
      var cameraEl = document.createElement('a-entity');
      var mixin = document.createElement('a-mixin');
      var cameraSystem = sceneEl.systems.camera;
      sinon.spy(cameraSystem, 'setActiveCamera');

      cameraEl.setAttribute('camera', '');
      mixin.setAttribute('camera', '');

      assetsEl.appendChild(mixin);
      mixin.addEventListener('loaded', function () {
        assert.ok(cameraSystem.setActiveCamera.notCalled);
        sceneEl.appendChild(cameraEl);
        cameraEl.addEventListener('loaded', function () {
          assert.ok(cameraEl.getAttribute('camera').active);
          assert.ok(cameraSystem.setActiveCamera.calledOnce);
          assert.equal(cameraSystem.activeCameraEl, cameraEl);
          cameraSystem.setActiveCamera.reset();
          done();
        });
      });
    });

    test('does not switch active camera to a mixin', function (done) {
      var sceneEl = this.el.sceneEl;
      var assetsEl = document.querySelector('a-assets');
      var cameraEl = document.createElement('a-entity');
      var mixin = document.createElement('a-mixin');
      var cameraSystem = sceneEl.systems.camera;
      sinon.spy(cameraSystem, 'setActiveCamera');

      cameraEl.setAttribute('camera', '');
      mixin.setAttribute('camera', '');

      sceneEl.appendChild(cameraEl);
      cameraEl.addEventListener('loaded', function () {
        assert.ok(cameraEl.getAttribute('camera').active);
        assert.ok(cameraSystem.setActiveCamera.calledOnce);
        assert.equal(cameraSystem.activeCameraEl, cameraEl);

        assetsEl.appendChild(mixin);
        mixin.addEventListener('loaded', function () {
          assert.ok(cameraEl.getAttribute('camera').active);
          assert.ok(cameraSystem.setActiveCamera.calledOnce);
          assert.equal(cameraSystem.activeCameraEl, cameraEl);
          cameraSystem.setActiveCamera.reset();
          done();
        });
      });
    });

    test('switches active camera', function (done) {
      var sceneEl = this.el.sceneEl;
      var camera1El = document.createElement('a-entity');
      var camera2El = document.createElement('a-entity');
      camera1El.setAttribute('camera', 'active: false');
      sceneEl.appendChild(camera1El);
      camera2El.setAttribute('camera', 'active: true');
      sceneEl.appendChild(camera2El);
      camera2El.addEventListener('loaded', function () {
        assert.notOk(camera1El.getAttribute('camera').active);
        sceneEl.systems.camera.setActiveCamera(camera1El);
        assert.notOk(camera2El.getAttribute('camera').active);
        done();
      });
    });

    test('disable inactive cameras', function (done) {
      var sceneEl = this.el.sceneEl;
      var cameraEl = document.createElement('a-entity');
      cameraEl.setAttribute('camera', 'active: false');
      sceneEl.appendChild(cameraEl);

      var camera2El = document.createElement('a-entity');
      camera2El.setAttribute('camera', 'active: false');
      sceneEl.appendChild(camera2El);

      camera2El.addEventListener('loaded', function () {
        cameraEl.setAttribute('camera', 'active: true');
        camera2El.setAttribute('camera', 'active: true');
        assert.notOk(cameraEl.getAttribute('camera').active);
        assert.ok(camera2El.getAttribute('camera').active, true);
        assert.equal(camera2El.components.camera.camera, sceneEl.camera);
        done();
      });
    });

    test('removes the default camera', function (done) {
      var cameraEl2 = document.createElement('a-entity');
      var sceneEl = this.el.sceneEl;
      cameraEl2.setAttribute('camera', 'active: true');
      process.nextTick(function () {
        sceneEl.appendChild(cameraEl2);
        // Need to setTimeout to wait for scene to remove element.
        cameraEl2.addEventListener('loaded', function () {
          assert.equal(cameraEl2.components.camera.camera, sceneEl.camera);
          assert.notOk(sceneEl.querySelector('[data-aframe-default-camera]'));
          done();
        });
      });
    });
  });
});