@pie-lib/graphing 3.2.0-next.0 → 3.2.0-next.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.
Files changed (113) hide show
  1. package/lib/__tests__/bg.test.js +282 -0
  2. package/lib/__tests__/coordinates-label.test.js +276 -0
  3. package/lib/__tests__/graph-with-controls.test.js +275 -0
  4. package/lib/__tests__/graph.test.js +927 -0
  5. package/lib/__tests__/grid-setup.test.js +729 -0
  6. package/lib/__tests__/grid.test.js +29 -0
  7. package/lib/__tests__/key-legend.test.js +321 -0
  8. package/lib/__tests__/label-svg-icon.test.js +373 -0
  9. package/lib/__tests__/labels.test.js +61 -0
  10. package/lib/__tests__/mark-label.test.js +133 -0
  11. package/lib/__tests__/toggle-bar.test.js +197 -0
  12. package/lib/__tests__/tool-menu.test.js +151 -0
  13. package/lib/__tests__/undo-redo.test.js +31 -0
  14. package/lib/__tests__/use-debounce.test.js +24 -0
  15. package/lib/__tests__/utils.js +70 -0
  16. package/lib/__tests__/utils.test.js +123 -0
  17. package/lib/axis/__tests__/arrow.test.js +60 -0
  18. package/lib/axis/__tests__/axes.test.js +195 -0
  19. package/lib/axis/arrow.js +1 -1
  20. package/lib/axis/axes.js +1 -1
  21. package/lib/axis/index.js +1 -1
  22. package/lib/bg.js +1 -1
  23. package/lib/container/__tests__/actions.test.js +108 -0
  24. package/lib/container/__tests__/index.test.js +503 -0
  25. package/lib/container/__tests__/marks.test.js +259 -0
  26. package/lib/container/__tests__/middleware.test.js +244 -0
  27. package/lib/container/__tests__/reducer.test.js +450 -0
  28. package/lib/container/actions.js +1 -1
  29. package/lib/container/index.js +1 -1
  30. package/lib/container/marks.js +1 -1
  31. package/lib/container/middleware.js +1 -1
  32. package/lib/container/reducer.js +1 -1
  33. package/lib/coordinates-label.js +1 -1
  34. package/lib/graph-with-controls.js +1 -1
  35. package/lib/graph.js +1 -1
  36. package/lib/grid-setup.js +1 -1
  37. package/lib/grid.js +1 -1
  38. package/lib/index.js +1 -1
  39. package/lib/key-legend.js +1 -1
  40. package/lib/label-svg-icon.js +1 -1
  41. package/lib/labels.js +1 -1
  42. package/lib/mark-label.js +1 -1
  43. package/lib/toggle-bar.js +1 -1
  44. package/lib/tool-menu.js +1 -1
  45. package/lib/tools/absolute/__tests__/component.test.js +65 -0
  46. package/lib/tools/absolute/component.js +1 -1
  47. package/lib/tools/absolute/index.js +1 -1
  48. package/lib/tools/circle/__tests__/bg-circle.test.js +33 -0
  49. package/lib/tools/circle/__tests__/component.test.js +615 -0
  50. package/lib/tools/circle/__tests__/index.test.js +576 -0
  51. package/lib/tools/circle/bg-circle.js +1 -1
  52. package/lib/tools/circle/component.js +1 -1
  53. package/lib/tools/circle/index.js +1 -1
  54. package/lib/tools/exponential/__tests__/component.test.js +64 -0
  55. package/lib/tools/exponential/__tests__/index.test.js +828 -0
  56. package/lib/tools/exponential/component.js +1 -1
  57. package/lib/tools/exponential/index.js +1 -1
  58. package/lib/tools/index.js +1 -1
  59. package/lib/tools/line/__tests__/component.test.js +45 -0
  60. package/lib/tools/line/component.js +1 -1
  61. package/lib/tools/line/index.js +1 -1
  62. package/lib/tools/parabola/__tests__/component.test.js +64 -0
  63. package/lib/tools/parabola/__tests__/index.test.js +564 -0
  64. package/lib/tools/parabola/component.js +1 -1
  65. package/lib/tools/parabola/index.js +1 -1
  66. package/lib/tools/point/__tests__/component.test.js +434 -0
  67. package/lib/tools/point/__tests__/index.test.js +262 -0
  68. package/lib/tools/point/component.js +1 -1
  69. package/lib/tools/point/index.js +1 -1
  70. package/lib/tools/polygon/__tests__/component.test.js +485 -0
  71. package/lib/tools/polygon/__tests__/index.test.js +303 -0
  72. package/lib/tools/polygon/__tests__/line.test.js +50 -0
  73. package/lib/tools/polygon/__tests__/polygon.test.js +85 -0
  74. package/lib/tools/polygon/component.js +1 -1
  75. package/lib/tools/polygon/index.js +1 -1
  76. package/lib/tools/polygon/line.js +1 -1
  77. package/lib/tools/polygon/polygon.js +1 -1
  78. package/lib/tools/ray/__tests__/component.test.js +35 -0
  79. package/lib/tools/ray/component.js +1 -1
  80. package/lib/tools/ray/index.js +1 -1
  81. package/lib/tools/segment/__tests__/component.test.js +35 -0
  82. package/lib/tools/segment/component.js +1 -1
  83. package/lib/tools/segment/index.js +1 -1
  84. package/lib/tools/shared/__tests__/arrow-head.test.js +45 -0
  85. package/lib/tools/shared/arrow-head.js +1 -1
  86. package/lib/tools/shared/icons/CorrectSVG.js +1 -1
  87. package/lib/tools/shared/icons/IncorrectSVG.js +1 -1
  88. package/lib/tools/shared/icons/MissingSVG.js +1 -1
  89. package/lib/tools/shared/line/__tests__/index.test.js +124 -0
  90. package/lib/tools/shared/line/__tests__/line-path.test.js +62 -0
  91. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +90 -0
  92. package/lib/tools/shared/line/index.js +1 -1
  93. package/lib/tools/shared/line/line-path.js +1 -1
  94. package/lib/tools/shared/line/with-root-edge.js +1 -1
  95. package/lib/tools/shared/point/__tests__/arrow-point.test.js +127 -0
  96. package/lib/tools/shared/point/__tests__/base-point.test.js +122 -0
  97. package/lib/tools/shared/point/arrow-point.js +1 -1
  98. package/lib/tools/shared/point/arrow.js +1 -1
  99. package/lib/tools/shared/point/base-point.js +1 -1
  100. package/lib/tools/shared/point/index.js +1 -1
  101. package/lib/tools/shared/styles.js +1 -1
  102. package/lib/tools/shared/types.js +1 -1
  103. package/lib/tools/sine/__tests__/component.test.js +72 -0
  104. package/lib/tools/sine/component.js +1 -1
  105. package/lib/tools/sine/index.js +1 -1
  106. package/lib/tools/vector/__tests__/component.test.js +32 -0
  107. package/lib/tools/vector/component.js +1 -1
  108. package/lib/tools/vector/index.js +1 -1
  109. package/lib/undo-redo.js +1 -1
  110. package/lib/use-debounce.js +1 -1
  111. package/lib/utils.js +1 -1
  112. package/package.json +9 -12
  113. package/LICENSE.md +0 -5
@@ -0,0 +1,503 @@
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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