Newer
Older
reroad-test / 2020-ryusei / aframe-master / tests / components / look-controls.test.js
@ryusei ryusei on 22 Oct 2020 4 KB パノラマ表示
 /* global Event, assert, process, setup, suite, test */

var CANVAS_GRAB_CLASS = 'a-grab-cursor';
var helpers = require('../helpers');

suite('look-controls', function () {
  setup(function (done) {
    var el = this.sceneEl = document.createElement('a-scene');
    document.body.appendChild(el);
    el.addEventListener('cameraready', function () {
      done();
    });
  });

  suite('exit-vr', function () {
    test('reset previous HMD position upon exit-vr event', function (done) {
      var el = this.sceneEl;
      var lookControls = el.camera.el.components['look-controls'];
      lookControls.hasPositionalTracking = false;
      lookControls.previousHMDPosition.set(1, 2, 3);
      process.nextTick(function () {
        assert.ok(lookControls.previousHMDPosition.length() === 0);
        done();
      });
      el.dispatchEvent(new Event('exit-vr'));
    });
  });

  helpers.getSkipCISuite('grabbing', function () {
    test('enables grab cursor on canvas', function () {
      this.sceneEl.canvas.classList.contains(CANVAS_GRAB_CLASS);
    });

    test('adds grabbing style to scene canvas on mousedown', function (done) {
      var canvasEl = this.sceneEl.canvas;
      process.nextTick(function () {
        assert.ok(canvasEl.style.cursor === 'grabbing');
        canvasEl.style.cursor = '';
        done();
      });
      var event = new Event('mousedown');
      event.button = 0;
      canvasEl.dispatchEvent(event);
    });

    test('removes grabbing style from scene el canvas on document body mouseup', function (done) {
      var canvasEl = this.sceneEl.canvas;
      canvasEl.style.cursor = 'grabbing';
      process.nextTick(function () {
        assert.notOk(canvasEl.style.cursor === 'grabbing');
        done();
      });
      window.dispatchEvent(new Event('mouseup'));
    });

    test('requests pointer lock on mousedown', function (done) {
      var cameraEl = this.sceneEl.camera.el;
      var canvasEl = this.sceneEl.canvas;

      var requestPointerLock = this.sinon.spy(canvasEl, 'requestPointerLock');
      cameraEl.setAttribute('look-controls', {pointerLockEnabled: true});

      process.nextTick(function () {
        assert.ok(requestPointerLock.called);
        canvasEl.style.cursor = '';
        done();
      });

      var event = new Event('mousedown');
      event.button = 0;
      canvasEl.dispatchEvent(event);
    });

    test('does not request pointer lock when option is disabled', function (done) {
      var sceneEl = this.sceneEl;
      var canvasEl = sceneEl.canvas;
      var cameraEl = sceneEl.camera.el;

      var requestPointerLock = this.sinon.spy(canvasEl, 'requestPointerLock');

      cameraEl.setAttribute('look-controls', {pointerLockEnabled: false});

      process.nextTick(function () {
        assert.notOk(requestPointerLock.called);
        canvasEl.style.cursor = '';
        done();
      });

      var event = new Event('mousedown');
      event.button = 0;
      canvasEl.dispatchEvent(event);
    });
  });

  suite('saveCameraPose', function () {
    test('saves camera pose when entering VR w/ positional tracking', function () {
      var sceneEl = this.sceneEl;
      var cameraEl = sceneEl.camera.el;
      var lookControlsComponent = cameraEl.components['look-controls'];
      lookControlsComponent.hasPositionalTracking = true;
      cameraEl.setAttribute('look-controls', {userHeight: 0});
      cameraEl.setAttribute('position', '3 3 3');
      sceneEl.emit('enter-vr');
      assert.shallowDeepEqual(lookControlsComponent.savedPose.position,
                              {x: 3.0, y: 3.0, z: 3.0});
    });
  });

  suite('restoreCameraPose (exit VR)', function () {
    test('restores camera pose with headset', function () {
      var sceneEl = this.sceneEl;
      var cameraEl = sceneEl.camera.el;
      cameraEl.components['look-controls'].hasPositionalTracking = true;
      cameraEl.setAttribute('position', {x: 6, y: 6, z: 6});
      sceneEl.emit('enter-vr');
      cameraEl.setAttribute('position', {x: 9, y: 9, z: 9});
      assert.shallowDeepEqual(cameraEl.getAttribute('position'), {x: 9, y: 9, z: 9});
      sceneEl.emit('exit-vr');
      assert.shallowDeepEqual(cameraEl.getAttribute('position'), {x: 6, y: 6, z: 6});
    });
  });
});