Newer
Older
reroad-test / 2020-ryusei / aframe-master / tests / components / hand-controls.test.js
@ryusei ryusei on 22 Oct 2020 5 KB パノラマ表示
/* global assert, process, setup, suite, test */
var entityFactory = require('../helpers').entityFactory;
var CONTROLLER_TYPE_VIVE = 'OpenVR Gamepad';
var CONTROLLER_TYPE_GENERIC = 'Generic Gamepad';

suite('hand-controls', function () {
  var component;
  var el;

  function setupTrackedControls (controllerType) {
    var trackedControls;
    el.setAttribute('tracked-controls', '');
    trackedControls = el.components['tracked-controls'];
    trackedControls.controller = {id: controllerType, connected: true};
  }

  setup(function (done) {
    el = entityFactory();
    el.addEventListener('componentinitialized', function (evt) {
      if (evt.detail.name !== 'hand-controls') { return; }
      component = el.components['hand-controls'];
      done();
    });
    el.setAttribute('hand-controls', '');
  });

  suite('determineGesture', function () {
    test('makes no gesture if nothing touched or pressed', function () {
      component.pressedButtons['grip'] = false;
      component.pressedButtons['trigger'] = false;
      component.pressedButtons['touchpad'] = false;
      component.pressedButtons['thumbstick'] = false;
      component.pressedButtons['menu'] = false;
      component.pressedButtons['AorX'] = false;
      component.pressedButtons['BorY'] = false;
      component.pressedButtons['surface'] = false;
      assert.notOk(component.determineGesture());
    });

    test('makes point gesture', function () {
      setupTrackedControls(CONTROLLER_TYPE_GENERIC);

      component.pressedButtons['grip'] = true;
      component.pressedButtons['trigger'] = false;
      component.pressedButtons['trackpad'] = true;
      component.pressedButtons['thumbstick'] = false;
      component.pressedButtons['menu'] = false;
      component.pressedButtons['AorX'] = false;
      component.pressedButtons['BorY'] = false;
      component.pressedButtons['surface'] = false;
      assert.equal(component.determineGesture(), 'Point');
    });

    test('makes point gesture on vive', function () {
      setupTrackedControls(CONTROLLER_TYPE_VIVE);

      component.pressedButtons['grip'] = false;
      component.pressedButtons['trigger'] = false;
      component.pressedButtons['trackpad'] = true;
      component.pressedButtons['thumbstick'] = false;
      component.pressedButtons['menu'] = false;
      component.pressedButtons['AorX'] = false;
      component.pressedButtons['BorY'] = false;
      component.pressedButtons['surface'] = false;
      assert.equal(component.determineGesture(), 'Point');
    });

    test('makes fist gesture', function () {
      setupTrackedControls(CONTROLLER_TYPE_GENERIC);

      component.pressedButtons['grip'] = true;
      component.pressedButtons['trigger'] = true;
      component.pressedButtons['trackpad'] = true;
      component.pressedButtons['thumbstick'] = false;
      component.pressedButtons['menu'] = false;
      component.pressedButtons['AorX'] = false;
      component.pressedButtons['BorY'] = false;
      component.pressedButtons['surface'] = false;
      assert.equal(component.determineGesture(), 'Fist');
    });

    test('makes fist gesture on vive', function () {
      setupTrackedControls(CONTROLLER_TYPE_VIVE);

      component.pressedButtons['grip'] = true;
      component.pressedButtons['trigger'] = false;
      component.pressedButtons['trackpad'] = false;
      component.pressedButtons['thumbstick'] = false;
      component.pressedButtons['menu'] = false;
      component.pressedButtons['AorX'] = false;
      component.pressedButtons['BorY'] = false;
      component.pressedButtons['surface'] = false;
      assert.equal(component.determineGesture(), 'Fist');

      component.pressedButtons['grip'] = false;
      component.pressedButtons['trigger'] = true;
      assert.equal(component.determineGesture(), 'Fist');

      component.pressedButtons['grip'] = true;
      component.pressedButtons['trigger'] = true;
      assert.equal(component.determineGesture(), 'Fist');

      component.pressedButtons['trackpad'] = true;
      assert.equal(component.determineGesture(), 'Fist');

      component.pressedButtons['menu'] = true;
      assert.equal(component.determineGesture(), 'Fist');
    });

    test('makes a hold gesture', function () {
      setupTrackedControls(CONTROLLER_TYPE_GENERIC);

      component.pressedButtons['grip'] = false;
      component.pressedButtons['trigger'] = true;
      assert.equal(component.determineGesture(), 'Hold');
    });

    test('makes a thumbs up gesture', function () {
      setupTrackedControls(CONTROLLER_TYPE_GENERIC);

      component.pressedButtons['grip'] = true;
      component.pressedButtons['trigger'] = true;
      assert.equal(component.determineGesture(), 'Thumb Up');

      // Verify that the gesture still works with touch in addition to press.
      component.pressedButtons['grip'] = true;
      component.pressedButtons['trigger'] = false;
      component.touchedButtons['trigger'] = true;
      assert.equal(component.determineGesture(), 'Thumb Up');
    });

    test('makes a point and thumb gesture', function () {
      setupTrackedControls(CONTROLLER_TYPE_GENERIC);

      component.pressedButtons['grip'] = true;
      component.pressedButtons['trigger'] = false;
      assert.equal(component.determineGesture(), 'Point + Thumb');
    });
  });
});