@pie-lib/graphing 3.2.0-next.2 → 3.2.0-next.4

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.
Files changed (114) hide show
  1. package/CHANGELOG.md +18 -30
  2. package/LICENSE.md +5 -0
  3. package/lib/axis/arrow.js +1 -1
  4. package/lib/axis/axes.js +1 -1
  5. package/lib/axis/index.js +1 -1
  6. package/lib/bg.js +1 -1
  7. package/lib/container/actions.js +1 -1
  8. package/lib/container/index.js +1 -1
  9. package/lib/container/marks.js +1 -1
  10. package/lib/container/middleware.js +1 -1
  11. package/lib/container/reducer.js +1 -1
  12. package/lib/coordinates-label.js +1 -1
  13. package/lib/graph-with-controls.js +1 -1
  14. package/lib/graph.js +1 -1
  15. package/lib/grid-setup.js +1 -1
  16. package/lib/grid.js +1 -1
  17. package/lib/index.js +1 -1
  18. package/lib/key-legend.js +1 -1
  19. package/lib/label-svg-icon.js +1 -1
  20. package/lib/labels.js +1 -1
  21. package/lib/mark-label.js +1 -1
  22. package/lib/toggle-bar.js +1 -1
  23. package/lib/tool-menu.js +1 -1
  24. package/lib/tools/absolute/component.js +1 -1
  25. package/lib/tools/absolute/index.js +1 -1
  26. package/lib/tools/circle/bg-circle.js +1 -1
  27. package/lib/tools/circle/component.js +1 -1
  28. package/lib/tools/circle/index.js +1 -1
  29. package/lib/tools/exponential/component.js +1 -1
  30. package/lib/tools/exponential/index.js +1 -1
  31. package/lib/tools/index.js +1 -1
  32. package/lib/tools/line/component.js +1 -1
  33. package/lib/tools/line/index.js +1 -1
  34. package/lib/tools/parabola/component.js +1 -1
  35. package/lib/tools/parabola/index.js +1 -1
  36. package/lib/tools/point/component.js +1 -1
  37. package/lib/tools/point/index.js +1 -1
  38. package/lib/tools/polygon/component.js +1 -1
  39. package/lib/tools/polygon/index.js +1 -1
  40. package/lib/tools/polygon/line.js +1 -1
  41. package/lib/tools/polygon/polygon.js +1 -1
  42. package/lib/tools/ray/component.js +1 -1
  43. package/lib/tools/ray/index.js +1 -1
  44. package/lib/tools/segment/component.js +1 -1
  45. package/lib/tools/segment/index.js +1 -1
  46. package/lib/tools/shared/arrow-head.js +1 -1
  47. package/lib/tools/shared/icons/CorrectSVG.js +1 -1
  48. package/lib/tools/shared/icons/IncorrectSVG.js +1 -1
  49. package/lib/tools/shared/icons/MissingSVG.js +1 -1
  50. package/lib/tools/shared/line/index.js +1 -1
  51. package/lib/tools/shared/line/line-path.js +1 -1
  52. package/lib/tools/shared/line/with-root-edge.js +1 -1
  53. package/lib/tools/shared/point/arrow-point.js +1 -1
  54. package/lib/tools/shared/point/arrow.js +1 -1
  55. package/lib/tools/shared/point/base-point.js +1 -1
  56. package/lib/tools/shared/point/index.js +1 -1
  57. package/lib/tools/shared/styles.js +1 -1
  58. package/lib/tools/shared/types.js +1 -1
  59. package/lib/tools/sine/component.js +1 -1
  60. package/lib/tools/sine/index.js +1 -1
  61. package/lib/tools/vector/component.js +1 -1
  62. package/lib/tools/vector/index.js +1 -1
  63. package/lib/undo-redo.js +1 -1
  64. package/lib/use-debounce.js +1 -1
  65. package/lib/utils.js +1 -1
  66. package/package.json +4 -4
  67. package/lib/__tests__/bg.test.js +0 -282
  68. package/lib/__tests__/coordinates-label.test.js +0 -276
  69. package/lib/__tests__/graph-with-controls.test.js +0 -275
  70. package/lib/__tests__/graph.test.js +0 -927
  71. package/lib/__tests__/grid-setup.test.js +0 -729
  72. package/lib/__tests__/grid.test.js +0 -29
  73. package/lib/__tests__/key-legend.test.js +0 -321
  74. package/lib/__tests__/label-svg-icon.test.js +0 -373
  75. package/lib/__tests__/labels.test.js +0 -61
  76. package/lib/__tests__/mark-label.test.js +0 -133
  77. package/lib/__tests__/toggle-bar.test.js +0 -197
  78. package/lib/__tests__/tool-menu.test.js +0 -151
  79. package/lib/__tests__/undo-redo.test.js +0 -31
  80. package/lib/__tests__/use-debounce.test.js +0 -24
  81. package/lib/__tests__/utils.js +0 -70
  82. package/lib/__tests__/utils.test.js +0 -123
  83. package/lib/axis/__tests__/arrow.test.js +0 -60
  84. package/lib/axis/__tests__/axes.test.js +0 -195
  85. package/lib/container/__tests__/actions.test.js +0 -108
  86. package/lib/container/__tests__/index.test.js +0 -503
  87. package/lib/container/__tests__/marks.test.js +0 -259
  88. package/lib/container/__tests__/middleware.test.js +0 -244
  89. package/lib/container/__tests__/reducer.test.js +0 -450
  90. package/lib/tools/absolute/__tests__/component.test.js +0 -65
  91. package/lib/tools/circle/__tests__/bg-circle.test.js +0 -33
  92. package/lib/tools/circle/__tests__/component.test.js +0 -615
  93. package/lib/tools/circle/__tests__/index.test.js +0 -576
  94. package/lib/tools/exponential/__tests__/component.test.js +0 -64
  95. package/lib/tools/exponential/__tests__/index.test.js +0 -828
  96. package/lib/tools/line/__tests__/component.test.js +0 -45
  97. package/lib/tools/parabola/__tests__/component.test.js +0 -64
  98. package/lib/tools/parabola/__tests__/index.test.js +0 -564
  99. package/lib/tools/point/__tests__/component.test.js +0 -434
  100. package/lib/tools/point/__tests__/index.test.js +0 -262
  101. package/lib/tools/polygon/__tests__/component.test.js +0 -485
  102. package/lib/tools/polygon/__tests__/index.test.js +0 -303
  103. package/lib/tools/polygon/__tests__/line.test.js +0 -50
  104. package/lib/tools/polygon/__tests__/polygon.test.js +0 -85
  105. package/lib/tools/ray/__tests__/component.test.js +0 -35
  106. package/lib/tools/segment/__tests__/component.test.js +0 -35
  107. package/lib/tools/shared/__tests__/arrow-head.test.js +0 -45
  108. package/lib/tools/shared/line/__tests__/index.test.js +0 -124
  109. package/lib/tools/shared/line/__tests__/line-path.test.js +0 -62
  110. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +0 -90
  111. package/lib/tools/shared/point/__tests__/arrow-point.test.js +0 -127
  112. package/lib/tools/shared/point/__tests__/base-point.test.js +0 -122
  113. package/lib/tools/sine/__tests__/component.test.js +0 -72
  114. package/lib/tools/vector/__tests__/component.test.js +0 -32
@@ -1,503 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof3 = require("@babel/runtime/helpers/typeof");
5
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
6
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
7
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
8
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
- var _react = _interopRequireDefault(require("react"));
10
- var _testUtils = require("@pie-lib/test-utils");
11
- var _index = _interopRequireWildcard(require("../index"));
12
- var _actions = require("../actions");
13
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
14
- jest.mock('../../graph-with-controls', function () {
15
- return function GraphWithControls(_ref) {
16
- var marks = _ref.marks,
17
- onChangeMarks = _ref.onChangeMarks,
18
- onUndo = _ref.onUndo,
19
- onRedo = _ref.onRedo,
20
- onReset = _ref.onReset,
21
- disabled = _ref.disabled;
22
- return /*#__PURE__*/_react["default"].createElement("div", {
23
- "data-testid": "graph-with-controls"
24
- }, /*#__PURE__*/_react["default"].createElement("div", {
25
- "data-testid": "marks-count"
26
- }, (marks === null || marks === void 0 ? void 0 : marks.length) || 0), disabled && /*#__PURE__*/_react["default"].createElement("div", {
27
- "data-testid": "disabled-indicator"
28
- }, "Disabled"), /*#__PURE__*/_react["default"].createElement("button", {
29
- "data-testid": "change-marks",
30
- onClick: function onClick() {
31
- return onChangeMarks && onChangeMarks([{
32
- id: 1
33
- }]);
34
- }
35
- }, "Change"), /*#__PURE__*/_react["default"].createElement("button", {
36
- "data-testid": "undo",
37
- onClick: onUndo
38
- }, "Undo"), /*#__PURE__*/_react["default"].createElement("button", {
39
- "data-testid": "redo",
40
- onClick: onRedo
41
- }, "Redo"), /*#__PURE__*/_react["default"].createElement("button", {
42
- "data-testid": "reset",
43
- onClick: onReset
44
- }, "Reset"));
45
- };
46
- });
47
- jest.mock('@pie-lib/drag', function () {
48
- return {
49
- DragProvider: function DragProvider(_ref2) {
50
- var children = _ref2.children;
51
- return /*#__PURE__*/_react["default"].createElement("div", {
52
- "data-testid": "drag-provider"
53
- }, children);
54
- }
55
- };
56
- });
57
- describe('Container Root Component', function () {
58
- var defaultProps = {
59
- marks: [],
60
- onChangeMarks: jest.fn()
61
- };
62
- var renderComponent = function renderComponent() {
63
- var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
64
- return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_index["default"], (0, _extends2["default"])({}, defaultProps, props)));
65
- };
66
- describe('rendering', function () {
67
- it('renders without crashing', function () {
68
- var _renderComponent = renderComponent(),
69
- container = _renderComponent.container;
70
- expect(container).toBeInTheDocument();
71
- });
72
- it('renders GraphWithControls', function () {
73
- var _renderComponent2 = renderComponent(),
74
- getByTestId = _renderComponent2.getByTestId;
75
- expect(getByTestId('graph-with-controls')).toBeInTheDocument();
76
- });
77
- it('renders with Provider when no correctness set', function () {
78
- var _renderComponent3 = renderComponent({
79
- marks: [{
80
- id: 1,
81
- type: 'point'
82
- }]
83
- }),
84
- container = _renderComponent3.container;
85
- expect(container.querySelector('[data-testid="graph-with-controls"]')).toBeInTheDocument();
86
- });
87
- it('renders directly when correctness is set', function () {
88
- var marks = [{
89
- id: 1,
90
- type: 'point',
91
- correctness: {
92
- value: 'correct'
93
- }
94
- }];
95
- var _renderComponent4 = renderComponent({
96
- marks: marks
97
- }),
98
- getByTestId = _renderComponent4.getByTestId;
99
- expect(getByTestId('graph-with-controls')).toBeInTheDocument();
100
- expect(getByTestId('disabled-indicator')).toBeInTheDocument();
101
- });
102
- it('passes marks to GraphWithControls', function () {
103
- var marks = [{
104
- id: 1
105
- }, {
106
- id: 2
107
- }];
108
- var _renderComponent5 = renderComponent({
109
- marks: marks
110
- }),
111
- getByTestId = _renderComponent5.getByTestId;
112
- expect(getByTestId('marks-count')).toHaveTextContent('2');
113
- });
114
- });
115
- describe('Redux store', function () {
116
- it('creates Redux store on mount', function () {
117
- var component = new _index["default"]({
118
- marks: [],
119
- onChangeMarks: jest.fn()
120
- });
121
- expect(component.store).toBeDefined();
122
- expect((0, _typeof2["default"])(component.store.getState)).toBe('function');
123
- expect((0, _typeof2["default"])(component.store.dispatch)).toBe('function');
124
- });
125
- it('initializes store with marks from props', function () {
126
- var marks = [{
127
- id: 1,
128
- type: 'point'
129
- }];
130
- var component = new _index["default"]({
131
- marks: marks,
132
- onChangeMarks: jest.fn()
133
- });
134
- var state = component.store.getState();
135
- expect(state.marks.present).toEqual(marks);
136
- });
137
- it('initializes store with empty marks', function () {
138
- var component = new _index["default"]({
139
- marks: [],
140
- onChangeMarks: jest.fn()
141
- });
142
- var state = component.store.getState();
143
- expect(state.marks.present).toEqual([]);
144
- });
145
- it('subscribes to store changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
146
- var onChangeMarks, component, newMarks;
147
- return _regenerator["default"].wrap(function (_context) {
148
- while (1) switch (_context.prev = _context.next) {
149
- case 0:
150
- onChangeMarks = jest.fn();
151
- component = new _index["default"]({
152
- marks: [],
153
- onChangeMarks: onChangeMarks
154
- });
155
- newMarks = [{
156
- id: 1
157
- }];
158
- component.store.dispatch((0, _actions.changeMarks)(newMarks));
159
- _context.next = 1;
160
- return (0, _testUtils.waitFor)(function () {
161
- expect(onChangeMarks).toHaveBeenCalledWith(newMarks);
162
- });
163
- case 1:
164
- case "end":
165
- return _context.stop();
166
- }
167
- }, _callee);
168
- })));
169
- });
170
- describe('componentDidUpdate', function () {
171
- it('updates store when marks prop changes', function () {
172
- var onChangeMarks = jest.fn();
173
- var _render = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_index["default"], {
174
- marks: [],
175
- onChangeMarks: onChangeMarks
176
- })),
177
- rerender = _render.rerender;
178
- var newMarks = [{
179
- id: 1,
180
- type: 'point'
181
- }];
182
- rerender(/*#__PURE__*/_react["default"].createElement(_index["default"], {
183
- marks: newMarks,
184
- onChangeMarks: onChangeMarks
185
- }));
186
- expect(onChangeMarks).not.toHaveBeenCalled();
187
- });
188
- it('does not update when marks are equal', function () {
189
- var marks = [{
190
- id: 1,
191
- type: 'point'
192
- }];
193
- var onChangeMarks = jest.fn();
194
- var _render2 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_index["default"], {
195
- marks: marks,
196
- onChangeMarks: onChangeMarks
197
- })),
198
- rerender = _render2.rerender;
199
- onChangeMarks.mockClear();
200
- rerender(/*#__PURE__*/_react["default"].createElement(_index["default"], {
201
- marks: marks,
202
- onChangeMarks: onChangeMarks
203
- }));
204
- expect(onChangeMarks).not.toHaveBeenCalled();
205
- });
206
- it('handles marks changing from empty to non-empty', function () {
207
- var onChangeMarks = jest.fn();
208
- var _render3 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_index["default"], {
209
- marks: [],
210
- onChangeMarks: onChangeMarks
211
- })),
212
- rerender = _render3.rerender;
213
- var newMarks = [{
214
- id: 1
215
- }];
216
- expect(function () {
217
- rerender(/*#__PURE__*/_react["default"].createElement(_index["default"], {
218
- marks: newMarks,
219
- onChangeMarks: onChangeMarks
220
- }));
221
- }).not.toThrow();
222
- });
223
- it('handles marks changing from non-empty to empty', function () {
224
- var onChangeMarks = jest.fn();
225
- var _render4 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_index["default"], {
226
- marks: [{
227
- id: 1
228
- }],
229
- onChangeMarks: onChangeMarks
230
- })),
231
- rerender = _render4.rerender;
232
- expect(function () {
233
- rerender(/*#__PURE__*/_react["default"].createElement(_index["default"], {
234
- marks: [],
235
- onChangeMarks: onChangeMarks
236
- }));
237
- }).not.toThrow();
238
- });
239
- });
240
- describe('onStoreChange', function () {
241
- it('calls onChangeMarks when store state changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
242
- var onChangeMarks, component, newMarks;
243
- return _regenerator["default"].wrap(function (_context2) {
244
- while (1) switch (_context2.prev = _context2.next) {
245
- case 0:
246
- onChangeMarks = jest.fn();
247
- component = new _index["default"]({
248
- marks: [],
249
- onChangeMarks: onChangeMarks
250
- });
251
- newMarks = [{
252
- id: 1,
253
- type: 'point'
254
- }];
255
- component.store.dispatch((0, _actions.changeMarks)(newMarks));
256
- _context2.next = 1;
257
- return (0, _testUtils.waitFor)(function () {
258
- expect(onChangeMarks).toHaveBeenCalledWith(newMarks);
259
- });
260
- case 1:
261
- case "end":
262
- return _context2.stop();
263
- }
264
- }, _callee2);
265
- })));
266
- it('does not call onChangeMarks when marks are equal', function () {
267
- var marks = [{
268
- id: 1,
269
- type: 'point'
270
- }];
271
- var onChangeMarks = jest.fn();
272
- var component = new _index["default"]({
273
- marks: marks,
274
- onChangeMarks: onChangeMarks
275
- });
276
- onChangeMarks.mockClear();
277
- component.store.dispatch((0, _actions.changeMarks)(marks));
278
- expect(onChangeMarks).not.toHaveBeenCalled();
279
- });
280
- it('handles multiple store changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
281
- var onChangeMarks, component;
282
- return _regenerator["default"].wrap(function (_context3) {
283
- while (1) switch (_context3.prev = _context3.next) {
284
- case 0:
285
- onChangeMarks = jest.fn();
286
- component = new _index["default"]({
287
- marks: [],
288
- onChangeMarks: onChangeMarks
289
- });
290
- component.store.dispatch((0, _actions.changeMarks)([{
291
- id: 1
292
- }]));
293
- component.store.dispatch((0, _actions.changeMarks)([{
294
- id: 2
295
- }]));
296
- component.store.dispatch((0, _actions.changeMarks)([{
297
- id: 3
298
- }]));
299
- _context3.next = 1;
300
- return (0, _testUtils.waitFor)(function () {
301
- expect(onChangeMarks).toHaveBeenCalledTimes(3);
302
- });
303
- case 1:
304
- case "end":
305
- return _context3.stop();
306
- }
307
- }, _callee3);
308
- })));
309
- });
310
- describe('correctness handling', function () {
311
- it('disables when any mark has correctness', function () {
312
- var marks = [{
313
- id: 1,
314
- type: 'point'
315
- }, {
316
- id: 2,
317
- type: 'point',
318
- correctness: {
319
- value: 'correct'
320
- }
321
- }];
322
- var _renderComponent6 = renderComponent({
323
- marks: marks
324
- }),
325
- getByTestId = _renderComponent6.getByTestId;
326
- expect(getByTestId('disabled-indicator')).toBeInTheDocument();
327
- });
328
- it('renders without Provider when correctness is set', function () {
329
- var marks = [{
330
- id: 1,
331
- correctness: {
332
- value: 'correct'
333
- }
334
- }];
335
- var _renderComponent7 = renderComponent({
336
- marks: marks
337
- }),
338
- container = _renderComponent7.container;
339
- expect(container.querySelector('[data-testid="graph-with-controls"]')).toBeInTheDocument();
340
- });
341
- it('does not disable when no correctness is set', function () {
342
- var marks = [{
343
- id: 1,
344
- type: 'point'
345
- }, {
346
- id: 2,
347
- type: 'line'
348
- }];
349
- var _renderComponent8 = renderComponent({
350
- marks: marks
351
- }),
352
- queryByTestId = _renderComponent8.queryByTestId;
353
- expect(queryByTestId('disabled-indicator')).not.toBeInTheDocument();
354
- });
355
- it('handles correctness with different values', function () {
356
- var marks = [{
357
- id: 1,
358
- correctness: {
359
- value: 'incorrect'
360
- }
361
- }];
362
- var _renderComponent9 = renderComponent({
363
- marks: marks
364
- }),
365
- getByTestId = _renderComponent9.getByTestId;
366
- expect(getByTestId('disabled-indicator')).toBeInTheDocument();
367
- });
368
- it('handles empty correctness object', function () {
369
- var marks = [{
370
- id: 1,
371
- correctness: {}
372
- }];
373
- var _renderComponent0 = renderComponent({
374
- marks: marks
375
- }),
376
- getByTestId = _renderComponent0.getByTestId;
377
- expect(getByTestId('disabled-indicator')).toBeInTheDocument();
378
- });
379
- });
380
- describe('props forwarding', function () {
381
- it('forwards additional props to GraphWithControls', function () {
382
- var _renderComponent1 = renderComponent({
383
- className: 'custom-class',
384
- size: {
385
- width: 500,
386
- height: 500
387
- }
388
- }),
389
- container = _renderComponent1.container;
390
- expect(container.querySelector('[data-testid="graph-with-controls"]')).toBeInTheDocument();
391
- });
392
- it('does not forward onChangeMarks and marks to GraphWithControls', function () {
393
- var _renderComponent10 = renderComponent({
394
- marks: [{
395
- id: 1
396
- }],
397
- onChangeMarks: jest.fn(),
398
- otherProp: 'test'
399
- }),
400
- getByTestId = _renderComponent10.getByTestId;
401
- expect(getByTestId('graph-with-controls')).toBeInTheDocument();
402
- });
403
- });
404
- describe('edge cases', function () {
405
- it('handles empty marks array', function () {
406
- var _renderComponent11 = renderComponent({
407
- marks: []
408
- }),
409
- container = _renderComponent11.container;
410
- expect(container).toBeInTheDocument();
411
- });
412
- it('handles marks with complex structure', function () {
413
- var marks = [{
414
- id: 1,
415
- type: 'line',
416
- from: {
417
- x: 0,
418
- y: 0
419
- },
420
- to: {
421
- x: 10,
422
- y: 10
423
- },
424
- label: 'Line A',
425
- correctness: {
426
- value: 'correct',
427
- label: 'Correct!'
428
- }
429
- }];
430
- var _renderComponent12 = renderComponent({
431
- marks: marks
432
- }),
433
- getByTestId = _renderComponent12.getByTestId;
434
- expect(getByTestId('graph-with-controls')).toBeInTheDocument();
435
- });
436
- it('handles switching between correctness states', function () {
437
- var _render5 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_index["default"], {
438
- marks: [{
439
- id: 1
440
- }],
441
- onChangeMarks: jest.fn()
442
- })),
443
- rerender = _render5.rerender;
444
- rerender(/*#__PURE__*/_react["default"].createElement(_index["default"], {
445
- marks: [{
446
- id: 1,
447
- correctness: {
448
- value: 'correct'
449
- }
450
- }],
451
- onChangeMarks: jest.fn()
452
- }));
453
- rerender(/*#__PURE__*/_react["default"].createElement(_index["default"], {
454
- marks: [{
455
- id: 1
456
- }],
457
- onChangeMarks: jest.fn()
458
- }));
459
- expect(document.querySelector('[data-testid="graph-with-controls"]')).toBeInTheDocument();
460
- });
461
- });
462
- describe('store synchronization', function () {
463
- it('keeps store and props in sync', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
464
- var onChangeMarks, component, newMarks;
465
- return _regenerator["default"].wrap(function (_context4) {
466
- while (1) switch (_context4.prev = _context4.next) {
467
- case 0:
468
- onChangeMarks = jest.fn();
469
- component = new _index["default"]({
470
- marks: [],
471
- onChangeMarks: onChangeMarks
472
- });
473
- newMarks = [{
474
- id: 1
475
- }];
476
- component.store.dispatch((0, _actions.changeMarks)(newMarks));
477
- _context4.next = 1;
478
- return (0, _testUtils.waitFor)(function () {
479
- var state = component.store.getState();
480
- expect(state.marks.present).toEqual(newMarks);
481
- expect(onChangeMarks).toHaveBeenCalledWith(newMarks);
482
- });
483
- case 1:
484
- case "end":
485
- return _context4.stop();
486
- }
487
- }, _callee4);
488
- })));
489
- });
490
- });
491
- describe('GraphContainer (connected component)', function () {
492
- it('is a connected component', function () {
493
- expect(_index.GraphContainer).toBeDefined();
494
- expect(_index.GraphContainer.displayName).toContain('Connect');
495
- });
496
- it('maps state to props', function () {
497
- expect(_index.GraphContainer).toBeDefined();
498
- });
499
- it('maps dispatch to props', function () {
500
- expect(_index.GraphContainer).toBeDefined();
501
- });
502
- });
503
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl90ZXN0VXRpbHMiLCJfaW5kZXgiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9hY3Rpb25zIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiX3R5cGVvZjMiLCJoYXMiLCJnZXQiLCJzZXQiLCJfdCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiamVzdCIsIm1vY2siLCJHcmFwaFdpdGhDb250cm9scyIsIl9yZWYiLCJtYXJrcyIsIm9uQ2hhbmdlTWFya3MiLCJvblVuZG8iLCJvblJlZG8iLCJvblJlc2V0IiwiZGlzYWJsZWQiLCJjcmVhdGVFbGVtZW50IiwibGVuZ3RoIiwib25DbGljayIsImlkIiwiRHJhZ1Byb3ZpZGVyIiwiX3JlZjIiLCJjaGlsZHJlbiIsImRlc2NyaWJlIiwiZGVmYXVsdFByb3BzIiwiZm4iLCJyZW5kZXJDb21wb25lbnQiLCJwcm9wcyIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsInJlbmRlciIsIl9leHRlbmRzMiIsIml0IiwiX3JlbmRlckNvbXBvbmVudCIsImNvbnRhaW5lciIsImV4cGVjdCIsInRvQmVJblRoZURvY3VtZW50IiwiX3JlbmRlckNvbXBvbmVudDIiLCJnZXRCeVRlc3RJZCIsIl9yZW5kZXJDb21wb25lbnQzIiwidHlwZSIsInF1ZXJ5U2VsZWN0b3IiLCJjb3JyZWN0bmVzcyIsInZhbHVlIiwiX3JlbmRlckNvbXBvbmVudDQiLCJfcmVuZGVyQ29tcG9uZW50NSIsInRvSGF2ZVRleHRDb250ZW50IiwiY29tcG9uZW50IiwiUm9vdCIsInN0b3JlIiwidG9CZURlZmluZWQiLCJfdHlwZW9mMiIsImdldFN0YXRlIiwidG9CZSIsImRpc3BhdGNoIiwic3RhdGUiLCJwcmVzZW50IiwidG9FcXVhbCIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwibmV3TWFya3MiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImNoYW5nZU1hcmtzIiwid2FpdEZvciIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwic3RvcCIsIl9yZW5kZXIiLCJyZXJlbmRlciIsIm5vdCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJfcmVuZGVyMiIsIm1vY2tDbGVhciIsIl9yZW5kZXIzIiwidG9UaHJvdyIsIl9yZW5kZXI0IiwiX2NhbGxlZTIiLCJfY29udGV4dDIiLCJfY2FsbGVlMyIsIl9jb250ZXh0MyIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsIl9yZW5kZXJDb21wb25lbnQ2IiwiX3JlbmRlckNvbXBvbmVudDciLCJfcmVuZGVyQ29tcG9uZW50OCIsInF1ZXJ5QnlUZXN0SWQiLCJfcmVuZGVyQ29tcG9uZW50OSIsIl9yZW5kZXJDb21wb25lbnQwIiwiX3JlbmRlckNvbXBvbmVudDEiLCJjbGFzc05hbWUiLCJzaXplIiwid2lkdGgiLCJoZWlnaHQiLCJfcmVuZGVyQ29tcG9uZW50MTAiLCJvdGhlclByb3AiLCJfcmVuZGVyQ29tcG9uZW50MTEiLCJmcm9tIiwieCIsInkiLCJ0byIsImxhYmVsIiwiX3JlbmRlckNvbXBvbmVudDEyIiwiX3JlbmRlcjUiLCJkb2N1bWVudCIsIl9jYWxsZWU0IiwiX2NvbnRleHQ0IiwiR3JhcGhDb250YWluZXIiLCJkaXNwbGF5TmFtZSIsInRvQ29udGFpbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb250YWluZXIvX190ZXN0c19fL2luZGV4LnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIsIHdhaXRGb3IgfSBmcm9tICdAcGllLWxpYi90ZXN0LXV0aWxzJztcbmltcG9ydCBSb290LCB7IEdyYXBoQ29udGFpbmVyIH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgY2hhbmdlTWFya3MgfSBmcm9tICcuLi9hY3Rpb25zJztcblxuamVzdC5tb2NrKCcuLi8uLi9ncmFwaC13aXRoLWNvbnRyb2xzJywgKCkgPT4ge1xuICByZXR1cm4gZnVuY3Rpb24gR3JhcGhXaXRoQ29udHJvbHMoeyBtYXJrcywgb25DaGFuZ2VNYXJrcywgb25VbmRvLCBvblJlZG8sIG9uUmVzZXQsIGRpc2FibGVkIH0pIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBkYXRhLXRlc3RpZD1cImdyYXBoLXdpdGgtY29udHJvbHNcIj5cbiAgICAgICAgPGRpdiBkYXRhLXRlc3RpZD1cIm1hcmtzLWNvdW50XCI+e21hcmtzPy5sZW5ndGggfHwgMH08L2Rpdj5cbiAgICAgICAge2Rpc2FibGVkICYmIDxkaXYgZGF0YS10ZXN0aWQ9XCJkaXNhYmxlZC1pbmRpY2F0b3JcIj5EaXNhYmxlZDwvZGl2Pn1cbiAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cImNoYW5nZS1tYXJrc1wiIG9uQ2xpY2s9eygpID0+IG9uQ2hhbmdlTWFya3MgJiYgb25DaGFuZ2VNYXJrcyhbeyBpZDogMSB9XSl9PlxuICAgICAgICAgIENoYW5nZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cInVuZG9cIiBvbkNsaWNrPXtvblVuZG99PlxuICAgICAgICAgIFVuZG9cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gZGF0YS10ZXN0aWQ9XCJyZWRvXCIgb25DbGljaz17b25SZWRvfT5cbiAgICAgICAgICBSZWRvXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGRhdGEtdGVzdGlkPVwicmVzZXRcIiBvbkNsaWNrPXtvblJlc2V0fT5cbiAgICAgICAgICBSZXNldFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH07XG59KTtcblxuamVzdC5tb2NrKCdAcGllLWxpYi9kcmFnJywgKCkgPT4gKHtcbiAgRHJhZ1Byb3ZpZGVyOiAoeyBjaGlsZHJlbiB9KSA9PiA8ZGl2IGRhdGEtdGVzdGlkPVwiZHJhZy1wcm92aWRlclwiPntjaGlsZHJlbn08L2Rpdj4sXG59KSk7XG5cbmRlc2NyaWJlKCdDb250YWluZXIgUm9vdCBDb21wb25lbnQnLCAoKSA9PiB7XG4gIGNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgICBtYXJrczogW10sXG4gICAgb25DaGFuZ2VNYXJrczogamVzdC5mbigpLFxuICB9O1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChwcm9wcyA9IHt9KSA9PiB7XG4gICAgcmV0dXJuIHJlbmRlcig8Um9vdCB7Li4uZGVmYXVsdFByb3BzfSB7Li4ucHJvcHN9IC8+KTtcbiAgfTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgR3JhcGhXaXRoQ29udHJvbHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnZ3JhcGgtd2l0aC1jb250cm9scycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBQcm92aWRlciB3aGVuIG5vIGNvcnJlY3RuZXNzIHNldCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrczogW3sgaWQ6IDEsIHR5cGU6ICdwb2ludCcgfV0gfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRlc3RpZD1cImdyYXBoLXdpdGgtY29udHJvbHNcIl0nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGRpcmVjdGx5IHdoZW4gY29ycmVjdG5lc3MgaXMgc2V0JywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFya3MgPSBbeyBpZDogMSwgdHlwZTogJ3BvaW50JywgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JyB9IH1dO1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFya3MgfSk7XG5cbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnZ3JhcGgtd2l0aC1jb250cm9scycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdkaXNhYmxlZC1pbmRpY2F0b3InKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdwYXNzZXMgbWFya3MgdG8gR3JhcGhXaXRoQ29udHJvbHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXJrcyA9IFt7IGlkOiAxIH0sIHsgaWQ6IDIgfV07XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrcyB9KTtcbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnbWFya3MtY291bnQnKSkudG9IYXZlVGV4dENvbnRlbnQoJzInKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1JlZHV4IHN0b3JlJywgKCkgPT4ge1xuICAgIGl0KCdjcmVhdGVzIFJlZHV4IHN0b3JlIG9uIG1vdW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFJvb3QoeyBtYXJrczogW10sIG9uQ2hhbmdlTWFya3M6IGplc3QuZm4oKSB9KTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQuc3RvcmUpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QodHlwZW9mIGNvbXBvbmVudC5zdG9yZS5nZXRTdGF0ZSkudG9CZSgnZnVuY3Rpb24nKTtcbiAgICAgIGV4cGVjdCh0eXBlb2YgY29tcG9uZW50LnN0b3JlLmRpc3BhdGNoKS50b0JlKCdmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2luaXRpYWxpemVzIHN0b3JlIHdpdGggbWFya3MgZnJvbSBwcm9wcycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hcmtzID0gW3sgaWQ6IDEsIHR5cGU6ICdwb2ludCcgfV07XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgUm9vdCh7IG1hcmtzLCBvbkNoYW5nZU1hcmtzOiBqZXN0LmZuKCkgfSk7XG5cbiAgICAgIGNvbnN0IHN0YXRlID0gY29tcG9uZW50LnN0b3JlLmdldFN0YXRlKCk7XG4gICAgICBleHBlY3Qoc3RhdGUubWFya3MucHJlc2VudCkudG9FcXVhbChtYXJrcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5pdGlhbGl6ZXMgc3RvcmUgd2l0aCBlbXB0eSBtYXJrcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBSb290KHsgbWFya3M6IFtdLCBvbkNoYW5nZU1hcmtzOiBqZXN0LmZuKCkgfSk7XG5cbiAgICAgIGNvbnN0IHN0YXRlID0gY29tcG9uZW50LnN0b3JlLmdldFN0YXRlKCk7XG4gICAgICBleHBlY3Qoc3RhdGUubWFya3MucHJlc2VudCkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3Vic2NyaWJlcyB0byBzdG9yZSBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgb25DaGFuZ2VNYXJrcyA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBSb290KHsgbWFya3M6IFtdLCBvbkNoYW5nZU1hcmtzIH0pO1xuXG4gICAgICBjb25zdCBuZXdNYXJrcyA9IFt7IGlkOiAxIH1dO1xuICAgICAgY29tcG9uZW50LnN0b3JlLmRpc3BhdGNoKGNoYW5nZU1hcmtzKG5ld01hcmtzKSk7XG5cbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBleHBlY3Qob25DaGFuZ2VNYXJrcykudG9IYXZlQmVlbkNhbGxlZFdpdGgobmV3TWFya3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb21wb25lbnREaWRVcGRhdGUnLCAoKSA9PiB7XG4gICAgaXQoJ3VwZGF0ZXMgc3RvcmUgd2hlbiBtYXJrcyBwcm9wIGNoYW5nZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZU1hcmtzID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgeyByZXJlbmRlciB9ID0gcmVuZGVyKDxSb290IG1hcmtzPXtbXX0gb25DaGFuZ2VNYXJrcz17b25DaGFuZ2VNYXJrc30gLz4pO1xuXG4gICAgICBjb25zdCBuZXdNYXJrcyA9IFt7IGlkOiAxLCB0eXBlOiAncG9pbnQnIH1dO1xuICAgICAgcmVyZW5kZXIoPFJvb3QgbWFya3M9e25ld01hcmtzfSBvbkNoYW5nZU1hcmtzPXtvbkNoYW5nZU1hcmtzfSAvPik7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZU1hcmtzKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHVwZGF0ZSB3aGVuIG1hcmtzIGFyZSBlcXVhbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hcmtzID0gW3sgaWQ6IDEsIHR5cGU6ICdwb2ludCcgfV07XG4gICAgICBjb25zdCBvbkNoYW5nZU1hcmtzID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgeyByZXJlbmRlciB9ID0gcmVuZGVyKDxSb290IG1hcmtzPXttYXJrc30gb25DaGFuZ2VNYXJrcz17b25DaGFuZ2VNYXJrc30gLz4pO1xuXG4gICAgICBvbkNoYW5nZU1hcmtzLm1vY2tDbGVhcigpO1xuXG4gICAgICByZXJlbmRlcig8Um9vdCBtYXJrcz17bWFya3N9IG9uQ2hhbmdlTWFya3M9e29uQ2hhbmdlTWFya3N9IC8+KTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlTWFya3MpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBtYXJrcyBjaGFuZ2luZyBmcm9tIGVtcHR5IHRvIG5vbi1lbXB0eScsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlTWFya3MgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXIoPFJvb3QgbWFya3M9e1tdfSBvbkNoYW5nZU1hcmtzPXtvbkNoYW5nZU1hcmtzfSAvPik7XG5cbiAgICAgIGNvbnN0IG5ld01hcmtzID0gW3sgaWQ6IDEgfV07XG5cbiAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgIHJlcmVuZGVyKDxSb290IG1hcmtzPXtuZXdNYXJrc30gb25DaGFuZ2VNYXJrcz17b25DaGFuZ2VNYXJrc30gLz4pO1xuICAgICAgfSkubm90LnRvVGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG1hcmtzIGNoYW5naW5nIGZyb20gbm9uLWVtcHR5IHRvIGVtcHR5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25DaGFuZ2VNYXJrcyA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcig8Um9vdCBtYXJrcz17W3sgaWQ6IDEgfV19IG9uQ2hhbmdlTWFya3M9e29uQ2hhbmdlTWFya3N9IC8+KTtcblxuICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgcmVyZW5kZXIoPFJvb3QgbWFya3M9e1tdfSBvbkNoYW5nZU1hcmtzPXtvbkNoYW5nZU1hcmtzfSAvPik7XG4gICAgICB9KS5ub3QudG9UaHJvdygpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnb25TdG9yZUNoYW5nZScsICgpID0+IHtcbiAgICBpdCgnY2FsbHMgb25DaGFuZ2VNYXJrcyB3aGVuIHN0b3JlIHN0YXRlIGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZU1hcmtzID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFJvb3QoeyBtYXJrczogW10sIG9uQ2hhbmdlTWFya3MgfSk7XG5cbiAgICAgIGNvbnN0IG5ld01hcmtzID0gW3sgaWQ6IDEsIHR5cGU6ICdwb2ludCcgfV07XG4gICAgICBjb21wb25lbnQuc3RvcmUuZGlzcGF0Y2goY2hhbmdlTWFya3MobmV3TWFya3MpKTtcblxuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChvbkNoYW5nZU1hcmtzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChuZXdNYXJrcyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBjYWxsIG9uQ2hhbmdlTWFya3Mgd2hlbiBtYXJrcyBhcmUgZXF1YWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXJrcyA9IFt7IGlkOiAxLCB0eXBlOiAncG9pbnQnIH1dO1xuICAgICAgY29uc3Qgb25DaGFuZ2VNYXJrcyA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBSb290KHsgbWFya3MsIG9uQ2hhbmdlTWFya3MgfSk7XG5cbiAgICAgIG9uQ2hhbmdlTWFya3MubW9ja0NsZWFyKCk7XG5cbiAgICAgIGNvbXBvbmVudC5zdG9yZS5kaXNwYXRjaChjaGFuZ2VNYXJrcyhtYXJrcykpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2VNYXJrcykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG11bHRpcGxlIHN0b3JlIGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZU1hcmtzID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFJvb3QoeyBtYXJrczogW10sIG9uQ2hhbmdlTWFya3MgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5zdG9yZS5kaXNwYXRjaChjaGFuZ2VNYXJrcyhbeyBpZDogMSB9XSkpO1xuICAgICAgY29tcG9uZW50LnN0b3JlLmRpc3BhdGNoKGNoYW5nZU1hcmtzKFt7IGlkOiAyIH1dKSk7XG4gICAgICBjb21wb25lbnQuc3RvcmUuZGlzcGF0Y2goY2hhbmdlTWFya3MoW3sgaWQ6IDMgfV0pKTtcblxuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChvbkNoYW5nZU1hcmtzKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NvcnJlY3RuZXNzIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgIGl0KCdkaXNhYmxlcyB3aGVuIGFueSBtYXJrIGhhcyBjb3JyZWN0bmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hcmtzID0gW1xuICAgICAgICB7IGlkOiAxLCB0eXBlOiAncG9pbnQnIH0sXG4gICAgICAgIHsgaWQ6IDIsIHR5cGU6ICdwb2ludCcsIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcgfSB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7IG1hcmtzIH0pO1xuXG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ2Rpc2FibGVkLWluZGljYXRvcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aG91dCBQcm92aWRlciB3aGVuIGNvcnJlY3RuZXNzIGlzIHNldCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hcmtzID0gW3sgaWQ6IDEsIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcgfSB9XTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrcyB9KTtcblxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbZGF0YS10ZXN0aWQ9XCJncmFwaC13aXRoLWNvbnRyb2xzXCJdJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgZGlzYWJsZSB3aGVuIG5vIGNvcnJlY3RuZXNzIGlzIHNldCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hcmtzID0gW1xuICAgICAgICB7IGlkOiAxLCB0eXBlOiAncG9pbnQnIH0sXG4gICAgICAgIHsgaWQ6IDIsIHR5cGU6ICdsaW5lJyB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFya3MgfSk7XG5cbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdkaXNhYmxlZC1pbmRpY2F0b3InKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBjb3JyZWN0bmVzcyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXJrcyA9IFt7IGlkOiAxLCBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2luY29ycmVjdCcgfSB9XTtcbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7IG1hcmtzIH0pO1xuXG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ2Rpc2FibGVkLWluZGljYXRvcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgZW1wdHkgY29ycmVjdG5lc3Mgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFya3MgPSBbeyBpZDogMSwgY29ycmVjdG5lc3M6IHt9IH1dO1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFya3MgfSk7XG5cbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnZGlzYWJsZWQtaW5kaWNhdG9yJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwcm9wcyBmb3J3YXJkaW5nJywgKCkgPT4ge1xuICAgIGl0KCdmb3J3YXJkcyBhZGRpdGlvbmFsIHByb3BzIHRvIEdyYXBoV2l0aENvbnRyb2xzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNsYXNzTmFtZTogJ2N1c3RvbS1jbGFzcycsXG4gICAgICAgIHNpemU6IHsgd2lkdGg6IDUwMCwgaGVpZ2h0OiA1MDAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRlc3RpZD1cImdyYXBoLXdpdGgtY29udHJvbHNcIl0nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBmb3J3YXJkIG9uQ2hhbmdlTWFya3MgYW5kIG1hcmtzIHRvIEdyYXBoV2l0aENvbnRyb2xzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbWFya3M6IFt7IGlkOiAxIH1dLFxuICAgICAgICBvbkNoYW5nZU1hcmtzOiBqZXN0LmZuKCksXG4gICAgICAgIG90aGVyUHJvcDogJ3Rlc3QnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnZ3JhcGgtd2l0aC1jb250cm9scycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZWRnZSBjYXNlcycsICgpID0+IHtcbiAgICBpdCgnaGFuZGxlcyBlbXB0eSBtYXJrcyBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrczogW10gfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbWFya3Mgd2l0aCBjb21wbGV4IHN0cnVjdHVyZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hcmtzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgICAgIGZyb206IHsgeDogMCwgeTogMCB9LFxuICAgICAgICAgIHRvOiB7IHg6IDEwLCB5OiAxMCB9LFxuICAgICAgICAgIGxhYmVsOiAnTGluZSBBJyxcbiAgICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnLCBsYWJlbDogJ0NvcnJlY3QhJyB9LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7IG1hcmtzIH0pO1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdncmFwaC13aXRoLWNvbnRyb2xzJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBzd2l0Y2hpbmcgYmV0d2VlbiBjb3JyZWN0bmVzcyBzdGF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXIoPFJvb3QgbWFya3M9e1t7IGlkOiAxIH1dfSBvbkNoYW5nZU1hcmtzPXtqZXN0LmZuKCl9IC8+KTtcblxuICAgICAgcmVyZW5kZXIoPFJvb3QgbWFya3M9e1t7IGlkOiAxLCBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnIH0gfV19IG9uQ2hhbmdlTWFya3M9e2plc3QuZm4oKX0gLz4pO1xuXG4gICAgICByZXJlbmRlcig8Um9vdCBtYXJrcz17W3sgaWQ6IDEgfV19IG9uQ2hhbmdlTWFya3M9e2plc3QuZm4oKX0gLz4pO1xuXG4gICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtdGVzdGlkPVwiZ3JhcGgtd2l0aC1jb250cm9sc1wiXScpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3RvcmUgc3luY2hyb25pemF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdrZWVwcyBzdG9yZSBhbmQgcHJvcHMgaW4gc3luYycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlTWFya3MgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgUm9vdCh7IG1hcmtzOiBbXSwgb25DaGFuZ2VNYXJrcyB9KTtcblxuICAgICAgY29uc3QgbmV3TWFya3MgPSBbeyBpZDogMSB9XTtcbiAgICAgIGNvbXBvbmVudC5zdG9yZS5kaXNwYXRjaChjaGFuZ2VNYXJrcyhuZXdNYXJrcykpO1xuXG4gICAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjb21wb25lbnQuc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgZXhwZWN0KHN0YXRlLm1hcmtzLnByZXNlbnQpLnRvRXF1YWwobmV3TWFya3MpO1xuICAgICAgICBleHBlY3Qob25DaGFuZ2VNYXJrcykudG9IYXZlQmVlbkNhbGxlZFdpdGgobmV3TWFya3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdHcmFwaENvbnRhaW5lciAoY29ubmVjdGVkIGNvbXBvbmVudCknLCAoKSA9PiB7XG4gIGl0KCdpcyBhIGNvbm5lY3RlZCBjb21wb25lbnQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KEdyYXBoQ29udGFpbmVyKS50b0JlRGVmaW5lZCgpO1xuICAgIGV4cGVjdChHcmFwaENvbnRhaW5lci5kaXNwbGF5TmFtZSkudG9Db250YWluKCdDb25uZWN0Jyk7XG4gIH0pO1xuXG4gIGl0KCdtYXBzIHN0YXRlIHRvIHByb3BzJywgKCkgPT4ge1xuICAgIGV4cGVjdChHcmFwaENvbnRhaW5lcikudG9CZURlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ21hcHMgZGlzcGF0Y2ggdG8gcHJvcHMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KEdyYXBoQ29udGFpbmVyKS50b0JlRGVmaW5lZCgpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7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