'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.testInitializeLayer = testInitializeLayer;
exports.testUpdateLayer = testUpdateLayer;
exports.testDrawLayer = testDrawLayer;
exports.testLayer = testLayer;

var _deck = require('deck.gl');

var _test = require('probe.gl/test');

var _setupGl = require('./utils/setup-gl');

var _setupGl2 = _interopRequireDefault(_setupGl);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var MapView = _deck.experimental.MapView; // Copyright (c) 2015 - 2017 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

function checkDoesNotThrow(func, comment, userData) {
  try {
    return func();
  } catch (error) {
    return error;
  }
}

function testInitializeLayer(_ref) {
  var layer = _ref.layer,
      viewport = _ref.viewport;

  var layerManager = new _deck.LayerManager(_setupGl2.default);

  try {
    layerManager.setLayers([layer]);
  } catch (error) {
    return error;
  }

  return null;
}

function testUpdateLayer(_ref2) {
  var layer = _ref2.layer,
      viewport = _ref2.viewport,
      newProps = _ref2.newProps;

  var layerManager = new _deck.LayerManager(_setupGl2.default);

  try {
    layerManager.setLayers([layer]);
    layerManager.setLayers([layer.clone(newProps)]);
  } catch (error) {
    return error;
  }

  return null;
}

function testDrawLayer(_ref3) {
  var layer = _ref3.layer,
      _ref3$uniforms = _ref3.uniforms,
      uniforms = _ref3$uniforms === undefined ? {} : _ref3$uniforms;

  var layerManager = new _deck.LayerManager(_setupGl2.default);

  try {
    layerManager.setLayers([layer]);
    layerManager.drawLayers();
  } catch (error) {
    return error;
  }

  return null;
}

function testLayer(_ref4) {
  var Layer = _ref4.Layer,
      _ref4$testCases = _ref4.testCases,
      testCases = _ref4$testCases === undefined ? [] : _ref4$testCases,
      _ref4$spies = _ref4.spies,
      spies = _ref4$spies === undefined ? [] : _ref4$spies,
      _ref4$userData = _ref4.userData,
      userData = _ref4$userData === undefined ? null : _ref4$userData,
      _ref4$doesNotThrow = _ref4.doesNotThrow,
      doesNotThrow = _ref4$doesNotThrow === undefined ? checkDoesNotThrow : _ref4$doesNotThrow;

  // assert(Layer);

  var layerManager = new _deck.LayerManager(_setupGl2.default);
  layerManager.setViews([new MapView()]);

  var initialProps = testCases[0].props;
  var layer = new Layer(initialProps);

  doesNotThrow(function () {
    return layerManager.setLayers([layer]);
  }, 'initialization of ' + Layer.layerName + ' should not fail', userData);

  runLayerTests(layerManager, layer, testCases, spies, userData, doesNotThrow);
}

/* eslint-disable max-params, no-loop-func */
function runLayerTests(layerManager, layer, testCases, spies, userData, doesNotThrow) {
  var combinedProps = {};

  // Run successive update tests

  var _loop = function _loop(i) {
    var _testCases$i = testCases[i],
        props = _testCases$i.props,
        updateProps = _testCases$i.updateProps,
        assert = _testCases$i.assert;


    spies = testCases[i].spies || spies;

    // Create a map of spies that the test case can inspect
    var spyMap = {};
    if (spies) {
      var _iteratorNormalCompletion = true;
      var _didIteratorError = false;
      var _iteratorError = undefined;

      try {
        for (var _iterator = spies[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
          var functionName = _step.value;

          spyMap[functionName] = (0, _test.makeSpy)(Object.getPrototypeOf(layer), functionName);
        }
      } catch (err) {
        _didIteratorError = true;
        _iteratorError = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion && _iterator.return) {
            _iterator.return();
          }
        } finally {
          if (_didIteratorError) {
            throw _iteratorError;
          }
        }
      }
    }

    // Test case can reset the props on every iteration
    if (props) {
      combinedProps = Object.assign({}, props);
    }
    // Test case can override with new props on every iteration
    if (updateProps) {
      Object.assign(combinedProps, updateProps);
    }

    // copy old state before update
    var oldState = Object.assign({}, layer.state);

    layer = layer.clone(combinedProps);
    doesNotThrow(function () {
      return layerManager.setLayers([layer]);
    }, 'update ' + layer + ' should not fail', userData);

    // call draw layer
    doesNotThrow(function () {
      return layerManager.drawLayers();
    }, 'draw ' + layer + ' should not fail', userData);

    // layer manager should handle match subLayer and tranfer state and props
    // here we assume subLayer matches copy over the new props from a new subLayer
    var subLayers = layer.isComposite ? layer.getSubLayers() : [];
    var subLayer = subLayers.length && subLayers[0];

    // assert on updated layer
    if (assert) {
      assert({ layer: layer, oldState: oldState, subLayers: subLayers, subLayer: subLayer, spies: spyMap, userData: userData });
    }

    // Remove spies
    Object.keys(spyMap).forEach(function (k) {
      return spyMap[k].reset();
    });
  };

  for (var i = 0; i < testCases.length; i++) {
    _loop(i);
  }
}
/* eslint-enable parameters, no-loop-func */
//# sourceMappingURL=lifecycle-test.js.map