@deck.gl/test-utils 8.6.2 → 8.7.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,29 +10,13 @@ exports.testInitializeLayerAsync = testInitializeLayerAsync;
10
10
  exports.testLayer = testLayer;
11
11
  exports.testLayerAsync = testLayerAsync;
12
12
 
13
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
14
-
15
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
-
17
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
18
-
19
13
  var _core = require("@deck.gl/core");
20
14
 
21
15
  var _testUtils = require("@probe.gl/test-utils");
22
16
 
23
17
  var _setupGl = _interopRequireDefault(require("./utils/setup-gl"));
24
18
 
25
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
26
-
27
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
28
-
29
- function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
30
-
31
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
32
-
33
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
34
-
35
- var testViewport = new _core.MapView().makeViewport({
19
+ const testViewport = new _core.MapView().makeViewport({
36
20
  width: 100,
37
21
  height: 100,
38
22
  viewState: {
@@ -48,268 +32,143 @@ function defaultOnError(error, title) {
48
32
  }
49
33
  }
50
34
 
51
- function initializeLayerManager(_ref) {
52
- var layer = _ref.layer,
53
- _ref$viewport = _ref.viewport,
54
- viewport = _ref$viewport === void 0 ? testViewport : _ref$viewport,
55
- _ref$onError = _ref.onError,
56
- _onError = _ref$onError === void 0 ? defaultOnError : _ref$onError;
57
-
58
- var layerManager = new _core.LayerManager(_setupGl.default, {
59
- viewport: viewport
35
+ function initializeLayerManager({
36
+ layer,
37
+ viewport = testViewport,
38
+ onError = defaultOnError
39
+ }) {
40
+ const layerManager = new _core.LayerManager(_setupGl.default, {
41
+ viewport
60
42
  });
61
43
  layerManager.setProps({
62
- onError: function onError(error) {
63
- return _onError(error, "initializing ".concat(layer.id));
64
- }
44
+ onError: error => onError(error, "initializing ".concat(layer.id))
65
45
  });
66
46
  layerManager.setLayers([layer]);
67
47
  return layerManager;
68
48
  }
69
49
 
70
50
  function testInitializeLayer(opts) {
71
- var layerManager = initializeLayerManager(opts);
51
+ const layerManager = initializeLayerManager(opts);
72
52
  layerManager.finalize();
73
53
  return null;
74
54
  }
75
55
 
76
- function testInitializeLayerAsync(_x) {
77
- return _testInitializeLayerAsync.apply(this, arguments);
78
- }
56
+ async function testInitializeLayerAsync(opts) {
57
+ const layerManager = initializeLayerManager(opts);
58
+ const deckRenderer = new _core.DeckRenderer(_setupGl.default);
79
59
 
80
- function _testInitializeLayerAsync() {
81
- _testInitializeLayerAsync = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(opts) {
82
- var layerManager, deckRenderer;
83
- return _regenerator.default.wrap(function _callee$(_context) {
84
- while (1) {
85
- switch (_context.prev = _context.next) {
86
- case 0:
87
- layerManager = initializeLayerManager(opts);
88
- deckRenderer = new _core.DeckRenderer(_setupGl.default);
89
-
90
- case 2:
91
- if (opts.layer.isLoaded) {
92
- _context.next = 7;
93
- break;
94
- }
95
-
96
- _context.next = 5;
97
- return update({
98
- layerManager: layerManager,
99
- deckRenderer: deckRenderer
100
- });
101
-
102
- case 5:
103
- _context.next = 2;
104
- break;
105
-
106
- case 7:
107
- layerManager.finalize();
108
- return _context.abrupt("return", null);
109
-
110
- case 9:
111
- case "end":
112
- return _context.stop();
113
- }
114
- }
115
- }, _callee);
116
- }));
117
- return _testInitializeLayerAsync.apply(this, arguments);
60
+ while (!opts.layer.isLoaded) {
61
+ await update({
62
+ layerManager,
63
+ deckRenderer
64
+ });
65
+ }
66
+
67
+ layerManager.finalize();
68
+ return null;
118
69
  }
119
70
 
120
71
  function testLayer(opts) {
121
- var Layer = opts.Layer,
122
- _opts$testCases = opts.testCases,
123
- testCases = _opts$testCases === void 0 ? [] : _opts$testCases,
124
- _opts$spies = opts.spies,
125
- spies = _opts$spies === void 0 ? [] : _opts$spies,
126
- _opts$onError = opts.onError,
127
- onError = _opts$onError === void 0 ? defaultOnError : _opts$onError;
128
- var resources = setupLayerTests("testing ".concat(Layer.layerName), opts);
129
- var layer = new Layer();
130
-
131
- var _iterator = _createForOfIteratorHelper(testCases),
132
- _step;
133
-
134
- try {
135
- var _loop = function _loop() {
136
- var testCase = _step.value;
72
+ const {
73
+ Layer,
74
+ testCases = [],
75
+ spies = [],
76
+ onError = defaultOnError
77
+ } = opts;
78
+ const resources = setupLayerTests("testing ".concat(Layer.layerName), opts);
79
+ let layer = new Layer();
80
+
81
+ for (const testCase of testCases) {
82
+ const oldState = { ...layer.state
83
+ };
84
+ const {
85
+ layer: newLayer,
86
+ spyMap
87
+ } = runLayerTestUpdate(testCase, resources, layer, spies);
88
+ runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap);
89
+ Object.keys(spyMap).forEach(k => spyMap[k].reset());
90
+ layer = newLayer;
91
+ }
137
92
 
138
- var oldState = _objectSpread({}, layer.state);
93
+ const error = cleanupAfterLayerTests(resources);
139
94
 
140
- var _runLayerTestUpdate = runLayerTestUpdate(testCase, resources, layer, spies),
141
- newLayer = _runLayerTestUpdate.layer,
142
- spyMap = _runLayerTestUpdate.spyMap;
95
+ if (error) {
96
+ onError(error, "".concat(Layer.layerName, " should delete all resources"));
97
+ }
98
+ }
143
99
 
144
- runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap);
145
- Object.keys(spyMap).forEach(function (k) {
146
- return spyMap[k].reset();
147
- });
148
- layer = newLayer;
100
+ async function testLayerAsync(opts) {
101
+ const {
102
+ Layer,
103
+ testCases = [],
104
+ spies = [],
105
+ onError = defaultOnError
106
+ } = opts;
107
+ const resources = setupLayerTests("testing ".concat(Layer.layerName), opts);
108
+ let layer = new Layer();
109
+
110
+ for (const testCase of testCases) {
111
+ const oldState = { ...layer.state
149
112
  };
113
+ const {
114
+ layer: newLayer,
115
+ spyMap
116
+ } = runLayerTestUpdate(testCase, resources, layer, spies);
117
+ runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap);
150
118
 
151
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
152
- _loop();
119
+ while (!newLayer.isLoaded) {
120
+ await update(resources);
121
+ runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap);
153
122
  }
154
- } catch (err) {
155
- _iterator.e(err);
156
- } finally {
157
- _iterator.f();
123
+
124
+ Object.keys(spyMap).forEach(k => spyMap[k].reset());
125
+ layer = newLayer;
158
126
  }
159
127
 
160
- var error = cleanupAfterLayerTests(resources);
128
+ const error = cleanupAfterLayerTests(resources);
161
129
 
162
130
  if (error) {
163
131
  onError(error, "".concat(Layer.layerName, " should delete all resources"));
164
132
  }
165
133
  }
166
134
 
167
- function testLayerAsync(_x2) {
168
- return _testLayerAsync.apply(this, arguments);
169
- }
170
-
171
- function _testLayerAsync() {
172
- _testLayerAsync = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee2(opts) {
173
- var Layer, _opts$testCases2, testCases, _opts$spies2, spies, _opts$onError2, onError, resources, layer, _iterator3, _step3, _loop2, error;
174
-
175
- return _regenerator.default.wrap(function _callee2$(_context3) {
176
- while (1) {
177
- switch (_context3.prev = _context3.next) {
178
- case 0:
179
- Layer = opts.Layer, _opts$testCases2 = opts.testCases, testCases = _opts$testCases2 === void 0 ? [] : _opts$testCases2, _opts$spies2 = opts.spies, spies = _opts$spies2 === void 0 ? [] : _opts$spies2, _opts$onError2 = opts.onError, onError = _opts$onError2 === void 0 ? defaultOnError : _opts$onError2;
180
- resources = setupLayerTests("testing ".concat(Layer.layerName), opts);
181
- layer = new Layer();
182
- _iterator3 = _createForOfIteratorHelper(testCases);
183
- _context3.prev = 4;
184
- _loop2 = _regenerator.default.mark(function _loop2() {
185
- var testCase, oldState, _runLayerTestUpdate2, newLayer, spyMap;
186
-
187
- return _regenerator.default.wrap(function _loop2$(_context2) {
188
- while (1) {
189
- switch (_context2.prev = _context2.next) {
190
- case 0:
191
- testCase = _step3.value;
192
- oldState = _objectSpread({}, layer.state);
193
- _runLayerTestUpdate2 = runLayerTestUpdate(testCase, resources, layer, spies), newLayer = _runLayerTestUpdate2.layer, spyMap = _runLayerTestUpdate2.spyMap;
194
- runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap);
195
-
196
- case 4:
197
- if (newLayer.isLoaded) {
198
- _context2.next = 10;
199
- break;
200
- }
201
-
202
- _context2.next = 7;
203
- return update(resources);
204
-
205
- case 7:
206
- runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap);
207
- _context2.next = 4;
208
- break;
209
-
210
- case 10:
211
- Object.keys(spyMap).forEach(function (k) {
212
- return spyMap[k].reset();
213
- });
214
- layer = newLayer;
215
-
216
- case 12:
217
- case "end":
218
- return _context2.stop();
219
- }
220
- }
221
- }, _loop2);
222
- });
223
-
224
- _iterator3.s();
225
-
226
- case 7:
227
- if ((_step3 = _iterator3.n()).done) {
228
- _context3.next = 11;
229
- break;
230
- }
231
-
232
- return _context3.delegateYield(_loop2(), "t0", 9);
233
-
234
- case 9:
235
- _context3.next = 7;
236
- break;
237
-
238
- case 11:
239
- _context3.next = 16;
240
- break;
241
-
242
- case 13:
243
- _context3.prev = 13;
244
- _context3.t1 = _context3["catch"](4);
245
-
246
- _iterator3.e(_context3.t1);
247
-
248
- case 16:
249
- _context3.prev = 16;
250
-
251
- _iterator3.f();
252
-
253
- return _context3.finish(16);
254
-
255
- case 19:
256
- error = cleanupAfterLayerTests(resources);
257
-
258
- if (error) {
259
- onError(error, "".concat(Layer.layerName, " should delete all resources"));
260
- }
261
-
262
- case 21:
263
- case "end":
264
- return _context3.stop();
265
- }
266
- }
267
- }, _callee2, null, [[4, 13, 16, 19]]);
268
- }));
269
- return _testLayerAsync.apply(this, arguments);
270
- }
271
-
272
- function setupLayerTests(testTitle, _ref2) {
273
- var _ref2$viewport = _ref2.viewport,
274
- viewport = _ref2$viewport === void 0 ? testViewport : _ref2$viewport,
275
- _ref2$timeline = _ref2.timeline,
276
- timeline = _ref2$timeline === void 0 ? null : _ref2$timeline,
277
- _ref2$onError = _ref2.onError,
278
- _onError2 = _ref2$onError === void 0 ? defaultOnError : _ref2$onError;
279
-
280
- var oldResourceCounts = getResourceCounts();
281
- var layerManager = new _core.LayerManager(_setupGl.default, {
282
- viewport: viewport,
283
- timeline: timeline
135
+ function setupLayerTests(testTitle, {
136
+ viewport = testViewport,
137
+ timeline = null,
138
+ onError = defaultOnError
139
+ }) {
140
+ const oldResourceCounts = getResourceCounts();
141
+ const layerManager = new _core.LayerManager(_setupGl.default, {
142
+ viewport,
143
+ timeline
284
144
  });
285
- var deckRenderer = new _core.DeckRenderer(_setupGl.default);
145
+ const deckRenderer = new _core.DeckRenderer(_setupGl.default);
286
146
  layerManager.context.animationProps = {
287
147
  time: 0
288
148
  };
289
- var props = {
290
- onError: function onError(error) {
291
- return _onError2(error, testTitle);
292
- }
149
+ const props = {
150
+ onError: error => onError(error, testTitle)
293
151
  };
294
152
  layerManager.setProps(props);
295
153
  deckRenderer.setProps(props);
296
154
  return {
297
- layerManager: layerManager,
298
- deckRenderer: deckRenderer,
299
- oldResourceCounts: oldResourceCounts
155
+ layerManager,
156
+ deckRenderer,
157
+ oldResourceCounts
300
158
  };
301
159
  }
302
160
 
303
- function cleanupAfterLayerTests(_ref3) {
304
- var layerManager = _ref3.layerManager,
305
- deckRenderer = _ref3.deckRenderer,
306
- oldResourceCounts = _ref3.oldResourceCounts;
161
+ function cleanupAfterLayerTests({
162
+ layerManager,
163
+ deckRenderer,
164
+ oldResourceCounts
165
+ }) {
307
166
  layerManager.setLayers([]);
308
167
  layerManager.finalize();
309
168
  deckRenderer.finalize();
310
- var resourceCounts = getResourceCounts();
169
+ const resourceCounts = getResourceCounts();
311
170
 
312
- for (var resourceName in resourceCounts) {
171
+ for (const resourceName in resourceCounts) {
313
172
  if (resourceCounts[resourceName] !== oldResourceCounts[resourceName]) {
314
173
  return new Error("".concat(resourceCounts[resourceName] - oldResourceCounts[resourceName], " ").concat(resourceName, "s"));
315
174
  }
@@ -319,7 +178,7 @@ function cleanupAfterLayerTests(_ref3) {
319
178
  }
320
179
 
321
180
  function getResourceCounts() {
322
- var resourceStats = luma.stats.get('Resource Counts');
181
+ const resourceStats = luma.stats.get('Resource Counts');
323
182
  return {
324
183
  Texture2D: resourceStats.get('Texture2Ds Active').count,
325
184
  Buffer: resourceStats.get('Buffers Active').count
@@ -327,21 +186,11 @@ function getResourceCounts() {
327
186
  }
328
187
 
329
188
  function injectSpies(layer, spies) {
330
- var spyMap = {};
189
+ const spyMap = {};
331
190
 
332
191
  if (spies) {
333
- var _iterator2 = _createForOfIteratorHelper(spies),
334
- _step2;
335
-
336
- try {
337
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
338
- var functionName = _step2.value;
339
- spyMap[functionName] = (0, _testUtils.makeSpy)(Object.getPrototypeOf(layer), functionName);
340
- }
341
- } catch (err) {
342
- _iterator2.e(err);
343
- } finally {
344
- _iterator2.f();
192
+ for (const functionName of spies) {
193
+ spyMap[functionName] = (0, _testUtils.makeSpy)(Object.getPrototypeOf(layer), functionName);
345
194
  }
346
195
  }
347
196
 
@@ -350,32 +199,34 @@ function injectSpies(layer, spies) {
350
199
 
351
200
  function runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap) {
352
201
  if (testCase.onAfterUpdate) {
353
- var subLayers = newLayer.isComposite ? newLayer.getSubLayers() : [];
354
- var subLayer = subLayers.length && subLayers[0];
202
+ const subLayers = newLayer.isComposite ? newLayer.getSubLayers() : [];
203
+ const subLayer = subLayers.length && subLayers[0];
355
204
  testCase.onAfterUpdate({
356
- testCase: testCase,
205
+ testCase,
357
206
  layer: newLayer,
358
- oldState: oldState,
359
- subLayers: subLayers,
360
- subLayer: subLayer,
207
+ oldState,
208
+ subLayers,
209
+ subLayer,
361
210
  spies: spyMap
362
211
  });
363
212
  }
364
213
  }
365
214
 
366
- function runLayerTestUpdate(testCase, _ref4, layer, spies) {
367
- var layerManager = _ref4.layerManager,
368
- deckRenderer = _ref4.deckRenderer;
369
- var props = testCase.props,
370
- updateProps = testCase.updateProps,
371
- onBeforeUpdate = testCase.onBeforeUpdate,
372
- _testCase$viewport = testCase.viewport,
373
- viewport = _testCase$viewport === void 0 ? layerManager.context.viewport : _testCase$viewport;
215
+ function runLayerTestUpdate(testCase, {
216
+ layerManager,
217
+ deckRenderer
218
+ }, layer, spies) {
219
+ const {
220
+ props,
221
+ updateProps,
222
+ onBeforeUpdate,
223
+ viewport = layerManager.context.viewport
224
+ } = testCase;
374
225
 
375
226
  if (onBeforeUpdate) {
376
227
  onBeforeUpdate({
377
- layer: layer,
378
- testCase: testCase
228
+ layer,
229
+ testCase
379
230
  });
380
231
  }
381
232
 
@@ -386,9 +237,9 @@ function runLayerTestUpdate(testCase, _ref4, layer, spies) {
386
237
  }
387
238
 
388
239
  spies = testCase.spies || spies;
389
- var spyMap = injectSpies(layer, spies);
240
+ const spyMap = injectSpies(layer, spies);
390
241
 
391
- var drawLayers = function drawLayers() {
242
+ const drawLayers = () => {
392
243
  deckRenderer.renderLayers({
393
244
  viewports: [viewport],
394
245
  layers: layerManager.getLayers(),
@@ -405,16 +256,17 @@ function runLayerTestUpdate(testCase, _ref4, layer, spies) {
405
256
  }
406
257
 
407
258
  return {
408
- layer: layer,
409
- spyMap: spyMap
259
+ layer,
260
+ spyMap
410
261
  };
411
262
  }
412
263
 
413
- function update(_ref5) {
414
- var layerManager = _ref5.layerManager,
415
- deckRenderer = _ref5.deckRenderer;
416
- return new Promise(function (resolve) {
417
- var onAnimationFrame = function onAnimationFrame() {
264
+ function update({
265
+ layerManager,
266
+ deckRenderer
267
+ }) {
268
+ return new Promise(resolve => {
269
+ const onAnimationFrame = () => {
418
270
  if (layerManager.needsUpdate()) {
419
271
  layerManager.updateLayers();
420
272
  deckRenderer.renderLayers({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lifecycle-test.js"],"names":["testViewport","MapView","makeViewport","width","height","viewState","longitude","latitude","zoom","defaultOnError","error","title","initializeLayerManager","layer","viewport","onError","layerManager","LayerManager","gl","setProps","id","setLayers","testInitializeLayer","opts","finalize","testInitializeLayerAsync","deckRenderer","DeckRenderer","isLoaded","update","testLayer","Layer","testCases","spies","resources","setupLayerTests","layerName","testCase","oldState","state","runLayerTestUpdate","newLayer","spyMap","runLayerTestPostUpdateCheck","Object","keys","forEach","k","reset","cleanupAfterLayerTests","testLayerAsync","testTitle","timeline","oldResourceCounts","getResourceCounts","context","animationProps","time","props","resourceCounts","resourceName","Error","resourceStats","luma","stats","get","Texture2D","count","Buffer","injectSpies","functionName","getPrototypeOf","onAfterUpdate","subLayers","isComposite","getSubLayers","subLayer","length","updateProps","onBeforeUpdate","constructor","clone","drawLayers","renderLayers","viewports","layers","getLayers","onViewportActive","activateViewport","needsUpdate","updateLayers","Promise","resolve","onAnimationFrame","setTimeout"],"mappings":"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","sourcesContent":["// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport {LayerManager, MapView, DeckRenderer} from '@deck.gl/core';\n\nimport {makeSpy} from '@probe.gl/test-utils';\nimport gl from './utils/setup-gl';\n\nconst testViewport = new MapView().makeViewport({\n width: 100,\n height: 100,\n viewState: {longitude: 0, latitude: 0, zoom: 1}\n});\n\nfunction defaultOnError(error, title) {\n if (error) {\n throw error;\n }\n}\n\nfunction initializeLayerManager({layer, viewport = testViewport, onError = defaultOnError}) {\n const layerManager = new LayerManager(gl, {viewport});\n layerManager.setProps({\n onError: error => onError(error, `initializing ${layer.id}`)\n });\n\n layerManager.setLayers([layer]);\n return layerManager;\n}\n\nexport function testInitializeLayer(opts) {\n const layerManager = initializeLayerManager(opts);\n layerManager.finalize();\n return null;\n}\n\nexport async function testInitializeLayerAsync(opts) {\n const layerManager = initializeLayerManager(opts);\n const deckRenderer = new DeckRenderer(gl);\n while (!opts.layer.isLoaded) {\n await update({layerManager, deckRenderer});\n }\n layerManager.finalize();\n return null;\n}\n\nexport function testLayer(opts) {\n const {Layer, testCases = [], spies = [], onError = defaultOnError} = opts;\n\n const resources = setupLayerTests(`testing ${Layer.layerName}`, opts);\n\n let layer = new Layer();\n // Run successive update tests\n for (const testCase of testCases) {\n // Save old state before update\n const oldState = {...layer.state};\n\n const {layer: newLayer, spyMap} = runLayerTestUpdate(testCase, resources, layer, spies);\n\n runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap);\n\n // Remove spies\n Object.keys(spyMap).forEach(k => spyMap[k].reset());\n layer = newLayer;\n }\n\n const error = cleanupAfterLayerTests(resources);\n if (error) {\n onError(error, `${Layer.layerName} should delete all resources`);\n }\n}\n\nexport async function testLayerAsync(opts) {\n const {Layer, testCases = [], spies = [], onError = defaultOnError} = opts;\n\n const resources = setupLayerTests(`testing ${Layer.layerName}`, opts);\n\n let layer = new Layer();\n // Run successive update tests\n for (const testCase of testCases) {\n // Save old state before update\n const oldState = {...layer.state};\n\n const {layer: newLayer, spyMap} = runLayerTestUpdate(testCase, resources, layer, spies);\n\n runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap);\n\n while (!newLayer.isLoaded) {\n await update(resources);\n runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap);\n }\n\n // Remove spies\n Object.keys(spyMap).forEach(k => spyMap[k].reset());\n layer = newLayer;\n }\n\n const error = cleanupAfterLayerTests(resources);\n if (error) {\n onError(error, `${Layer.layerName} should delete all resources`);\n }\n}\n\nfunction setupLayerTests(\n testTitle,\n {viewport = testViewport, timeline = null, onError = defaultOnError}\n) {\n const oldResourceCounts = getResourceCounts();\n\n const layerManager = new LayerManager(gl, {viewport, timeline});\n const deckRenderer = new DeckRenderer(gl);\n\n layerManager.context.animationProps = {\n time: 0\n };\n\n const props = {\n onError: error => onError(error, testTitle)\n };\n layerManager.setProps(props);\n deckRenderer.setProps(props);\n\n return {layerManager, deckRenderer, oldResourceCounts};\n}\n\nfunction cleanupAfterLayerTests({layerManager, deckRenderer, oldResourceCounts}) {\n layerManager.setLayers([]);\n layerManager.finalize();\n deckRenderer.finalize();\n\n const resourceCounts = getResourceCounts();\n\n for (const resourceName in resourceCounts) {\n if (resourceCounts[resourceName] !== oldResourceCounts[resourceName]) {\n return new Error(\n `${resourceCounts[resourceName] - oldResourceCounts[resourceName]} ${resourceName}s`\n );\n }\n }\n return null;\n}\n\nfunction getResourceCounts() {\n /* global luma */\n const resourceStats = luma.stats.get('Resource Counts');\n return {\n Texture2D: resourceStats.get('Texture2Ds Active').count,\n Buffer: resourceStats.get('Buffers Active').count\n };\n}\n\nfunction injectSpies(layer, spies) {\n const spyMap = {};\n if (spies) {\n for (const functionName of spies) {\n spyMap[functionName] = makeSpy(Object.getPrototypeOf(layer), functionName);\n }\n }\n return spyMap;\n}\n\nfunction runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap) {\n // assert on updated layer\n if (testCase.onAfterUpdate) {\n // layer manager should handle match subLayer and tranfer state and props\n // here we assume subLayer matches copy over the new props from a new subLayer\n const subLayers = newLayer.isComposite ? newLayer.getSubLayers() : [];\n const subLayer = subLayers.length && subLayers[0];\n\n testCase.onAfterUpdate({\n testCase,\n layer: newLayer,\n oldState,\n subLayers,\n subLayer,\n spies: spyMap\n });\n }\n}\n\nfunction runLayerTestUpdate(testCase, {layerManager, deckRenderer}, layer, spies) {\n const {props, updateProps, onBeforeUpdate, viewport = layerManager.context.viewport} = testCase;\n\n if (onBeforeUpdate) {\n onBeforeUpdate({layer, testCase});\n }\n\n if (props) {\n // Test case can reset the props on every iteration\n layer = new layer.constructor(props);\n } else if (updateProps) {\n // Test case can override with new props on every iteration\n layer = layer.clone(updateProps);\n }\n\n // Create a map of spies that the test case can inspect\n spies = testCase.spies || spies;\n const spyMap = injectSpies(layer, spies);\n const drawLayers = () => {\n deckRenderer.renderLayers({\n viewports: [viewport],\n layers: layerManager.getLayers(),\n onViewportActive: layerManager.activateViewport\n });\n };\n\n layerManager.setLayers([layer]);\n drawLayers();\n\n // clear update flags set by viewport change, if any\n if (layerManager.needsUpdate()) {\n layerManager.updateLayers();\n drawLayers();\n }\n\n return {layer, spyMap};\n}\n\n/* global setTimeout */\nfunction update({layerManager, deckRenderer}) {\n return new Promise(resolve => {\n const onAnimationFrame = () => {\n if (layerManager.needsUpdate()) {\n layerManager.updateLayers();\n\n deckRenderer.renderLayers({\n viewports: [layerManager.context.viewport],\n layers: layerManager.getLayers(),\n onViewportActive: layerManager.activateViewport\n });\n resolve();\n return;\n }\n\n setTimeout(onAnimationFrame, 50);\n };\n\n onAnimationFrame();\n });\n}\n"],"file":"lifecycle-test.js"}
1
+ {"version":3,"sources":["../../src/lifecycle-test.js"],"names":["testViewport","MapView","makeViewport","width","height","viewState","longitude","latitude","zoom","defaultOnError","error","title","initializeLayerManager","layer","viewport","onError","layerManager","LayerManager","gl","setProps","id","setLayers","testInitializeLayer","opts","finalize","testInitializeLayerAsync","deckRenderer","DeckRenderer","isLoaded","update","testLayer","Layer","testCases","spies","resources","setupLayerTests","layerName","testCase","oldState","state","newLayer","spyMap","runLayerTestUpdate","runLayerTestPostUpdateCheck","Object","keys","forEach","k","reset","cleanupAfterLayerTests","testLayerAsync","testTitle","timeline","oldResourceCounts","getResourceCounts","context","animationProps","time","props","resourceCounts","resourceName","Error","resourceStats","luma","stats","get","Texture2D","count","Buffer","injectSpies","functionName","getPrototypeOf","onAfterUpdate","subLayers","isComposite","getSubLayers","subLayer","length","updateProps","onBeforeUpdate","constructor","clone","drawLayers","renderLayers","viewports","layers","getLayers","onViewportActive","activateViewport","needsUpdate","updateLayers","Promise","resolve","onAnimationFrame","setTimeout"],"mappings":"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","sourcesContent":["// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport {LayerManager, MapView, DeckRenderer} from '@deck.gl/core';\n\nimport {makeSpy} from '@probe.gl/test-utils';\nimport gl from './utils/setup-gl';\n\nconst testViewport = new MapView().makeViewport({\n width: 100,\n height: 100,\n viewState: {longitude: 0, latitude: 0, zoom: 1}\n});\n\nfunction defaultOnError(error, title) {\n if (error) {\n throw error;\n }\n}\n\nfunction initializeLayerManager({layer, viewport = testViewport, onError = defaultOnError}) {\n const layerManager = new LayerManager(gl, {viewport});\n layerManager.setProps({\n onError: error => onError(error, `initializing ${layer.id}`)\n });\n\n layerManager.setLayers([layer]);\n return layerManager;\n}\n\nexport function testInitializeLayer(opts) {\n const layerManager = initializeLayerManager(opts);\n layerManager.finalize();\n return null;\n}\n\nexport async function testInitializeLayerAsync(opts) {\n const layerManager = initializeLayerManager(opts);\n const deckRenderer = new DeckRenderer(gl);\n while (!opts.layer.isLoaded) {\n await update({layerManager, deckRenderer});\n }\n layerManager.finalize();\n return null;\n}\n\nexport function testLayer(opts) {\n const {Layer, testCases = [], spies = [], onError = defaultOnError} = opts;\n\n const resources = setupLayerTests(`testing ${Layer.layerName}`, opts);\n\n let layer = new Layer();\n // Run successive update tests\n for (const testCase of testCases) {\n // Save old state before update\n const oldState = {...layer.state};\n\n const {layer: newLayer, spyMap} = runLayerTestUpdate(testCase, resources, layer, spies);\n\n runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap);\n\n // Remove spies\n Object.keys(spyMap).forEach(k => spyMap[k].reset());\n layer = newLayer;\n }\n\n const error = cleanupAfterLayerTests(resources);\n if (error) {\n onError(error, `${Layer.layerName} should delete all resources`);\n }\n}\n\nexport async function testLayerAsync(opts) {\n const {Layer, testCases = [], spies = [], onError = defaultOnError} = opts;\n\n const resources = setupLayerTests(`testing ${Layer.layerName}`, opts);\n\n let layer = new Layer();\n // Run successive update tests\n for (const testCase of testCases) {\n // Save old state before update\n const oldState = {...layer.state};\n\n const {layer: newLayer, spyMap} = runLayerTestUpdate(testCase, resources, layer, spies);\n\n runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap);\n\n while (!newLayer.isLoaded) {\n await update(resources);\n runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap);\n }\n\n // Remove spies\n Object.keys(spyMap).forEach(k => spyMap[k].reset());\n layer = newLayer;\n }\n\n const error = cleanupAfterLayerTests(resources);\n if (error) {\n onError(error, `${Layer.layerName} should delete all resources`);\n }\n}\n\nfunction setupLayerTests(\n testTitle,\n {viewport = testViewport, timeline = null, onError = defaultOnError}\n) {\n const oldResourceCounts = getResourceCounts();\n\n const layerManager = new LayerManager(gl, {viewport, timeline});\n const deckRenderer = new DeckRenderer(gl);\n\n layerManager.context.animationProps = {\n time: 0\n };\n\n const props = {\n onError: error => onError(error, testTitle)\n };\n layerManager.setProps(props);\n deckRenderer.setProps(props);\n\n return {layerManager, deckRenderer, oldResourceCounts};\n}\n\nfunction cleanupAfterLayerTests({layerManager, deckRenderer, oldResourceCounts}) {\n layerManager.setLayers([]);\n layerManager.finalize();\n deckRenderer.finalize();\n\n const resourceCounts = getResourceCounts();\n\n for (const resourceName in resourceCounts) {\n if (resourceCounts[resourceName] !== oldResourceCounts[resourceName]) {\n return new Error(\n `${resourceCounts[resourceName] - oldResourceCounts[resourceName]} ${resourceName}s`\n );\n }\n }\n return null;\n}\n\nfunction getResourceCounts() {\n /* global luma */\n const resourceStats = luma.stats.get('Resource Counts');\n return {\n Texture2D: resourceStats.get('Texture2Ds Active').count,\n Buffer: resourceStats.get('Buffers Active').count\n };\n}\n\nfunction injectSpies(layer, spies) {\n const spyMap = {};\n if (spies) {\n for (const functionName of spies) {\n spyMap[functionName] = makeSpy(Object.getPrototypeOf(layer), functionName);\n }\n }\n return spyMap;\n}\n\nfunction runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap) {\n // assert on updated layer\n if (testCase.onAfterUpdate) {\n // layer manager should handle match subLayer and tranfer state and props\n // here we assume subLayer matches copy over the new props from a new subLayer\n const subLayers = newLayer.isComposite ? newLayer.getSubLayers() : [];\n const subLayer = subLayers.length && subLayers[0];\n\n testCase.onAfterUpdate({\n testCase,\n layer: newLayer,\n oldState,\n subLayers,\n subLayer,\n spies: spyMap\n });\n }\n}\n\nfunction runLayerTestUpdate(testCase, {layerManager, deckRenderer}, layer, spies) {\n const {props, updateProps, onBeforeUpdate, viewport = layerManager.context.viewport} = testCase;\n\n if (onBeforeUpdate) {\n onBeforeUpdate({layer, testCase});\n }\n\n if (props) {\n // Test case can reset the props on every iteration\n layer = new layer.constructor(props);\n } else if (updateProps) {\n // Test case can override with new props on every iteration\n layer = layer.clone(updateProps);\n }\n\n // Create a map of spies that the test case can inspect\n spies = testCase.spies || spies;\n const spyMap = injectSpies(layer, spies);\n const drawLayers = () => {\n deckRenderer.renderLayers({\n viewports: [viewport],\n layers: layerManager.getLayers(),\n onViewportActive: layerManager.activateViewport\n });\n };\n\n layerManager.setLayers([layer]);\n drawLayers();\n\n // clear update flags set by viewport change, if any\n if (layerManager.needsUpdate()) {\n layerManager.updateLayers();\n drawLayers();\n }\n\n return {layer, spyMap};\n}\n\n/* global setTimeout */\nfunction update({layerManager, deckRenderer}) {\n return new Promise(resolve => {\n const onAnimationFrame = () => {\n if (layerManager.needsUpdate()) {\n layerManager.updateLayers();\n\n deckRenderer.renderLayers({\n viewports: [layerManager.context.viewport],\n layers: layerManager.getLayers(),\n onViewportActive: layerManager.activateViewport\n });\n resolve();\n return;\n }\n\n setTimeout(onAnimationFrame, 50);\n };\n\n onAnimationFrame();\n });\n}\n"],"file":"lifecycle-test.js"}