@pie-lib/graphing 4.0.24-beta.6 → 4.0.24-beta.7

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 (97) 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/container/__tests__/actions.test.js +108 -0
  20. package/lib/container/__tests__/index.test.js +503 -0
  21. package/lib/container/__tests__/marks.test.js +259 -0
  22. package/lib/container/__tests__/middleware.test.js +244 -0
  23. package/lib/container/__tests__/reducer.test.js +450 -0
  24. package/lib/tools/absolute/__tests__/component.test.js +65 -0
  25. package/lib/tools/circle/__tests__/bg-circle.test.js +33 -0
  26. package/lib/tools/circle/__tests__/component.test.js +615 -0
  27. package/lib/tools/circle/__tests__/index.test.js +576 -0
  28. package/lib/tools/exponential/__tests__/component.test.js +64 -0
  29. package/lib/tools/exponential/__tests__/index.test.js +828 -0
  30. package/lib/tools/line/__tests__/component.test.js +45 -0
  31. package/lib/tools/parabola/__tests__/component.test.js +64 -0
  32. package/lib/tools/parabola/__tests__/index.test.js +564 -0
  33. package/lib/tools/point/__tests__/component.test.js +434 -0
  34. package/lib/tools/point/__tests__/index.test.js +262 -0
  35. package/lib/tools/polygon/__tests__/component.test.js +485 -0
  36. package/lib/tools/polygon/__tests__/index.test.js +303 -0
  37. package/lib/tools/polygon/__tests__/line.test.js +50 -0
  38. package/lib/tools/polygon/__tests__/polygon.test.js +85 -0
  39. package/lib/tools/ray/__tests__/component.test.js +35 -0
  40. package/lib/tools/segment/__tests__/component.test.js +35 -0
  41. package/lib/tools/shared/__tests__/arrow-head.test.js +45 -0
  42. package/lib/tools/shared/line/__tests__/index.test.js +124 -0
  43. package/lib/tools/shared/line/__tests__/line-path.test.js +62 -0
  44. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +90 -0
  45. package/lib/tools/shared/point/__tests__/arrow-point.test.js +127 -0
  46. package/lib/tools/shared/point/__tests__/base-point.test.js +122 -0
  47. package/lib/tools/sine/__tests__/component.test.js +72 -0
  48. package/lib/tools/vector/__tests__/component.test.js +32 -0
  49. package/package.json +3 -3
  50. package/src/__tests__/bg.test.jsx +250 -0
  51. package/src/__tests__/coordinates-label.test.jsx +243 -0
  52. package/src/__tests__/graph-with-controls.test.jsx +198 -0
  53. package/src/__tests__/graph.test.jsx +721 -0
  54. package/src/__tests__/grid-setup.test.jsx +645 -0
  55. package/src/__tests__/grid.test.jsx +22 -0
  56. package/src/__tests__/key-legend.test.jsx +260 -0
  57. package/src/__tests__/label-svg-icon.test.jsx +278 -0
  58. package/src/__tests__/labels.test.jsx +55 -0
  59. package/src/__tests__/mark-label.test.jsx +63 -0
  60. package/src/__tests__/toggle-bar.test.jsx +146 -0
  61. package/src/__tests__/tool-menu.test.jsx +115 -0
  62. package/src/__tests__/undo-redo.test.jsx +24 -0
  63. package/src/__tests__/use-debounce.test.js +21 -0
  64. package/src/__tests__/utils.js +41 -0
  65. package/src/__tests__/utils.test.js +105 -0
  66. package/src/axis/__tests__/arrow.test.jsx +38 -0
  67. package/src/axis/__tests__/axes.test.jsx +216 -0
  68. package/src/container/__tests__/actions.test.js +105 -0
  69. package/src/container/__tests__/index.test.jsx +319 -0
  70. package/src/container/__tests__/marks.test.js +172 -0
  71. package/src/container/__tests__/middleware.test.js +235 -0
  72. package/src/container/__tests__/reducer.test.js +324 -0
  73. package/src/tools/absolute/__tests__/component.test.jsx +53 -0
  74. package/src/tools/circle/__tests__/bg-circle.test.jsx +26 -0
  75. package/src/tools/circle/__tests__/component.test.jsx +494 -0
  76. package/src/tools/circle/__tests__/index.test.js +480 -0
  77. package/src/tools/exponential/__tests__/component.test.jsx +53 -0
  78. package/src/tools/exponential/__tests__/index.test.js +729 -0
  79. package/src/tools/line/__tests__/component.test.jsx +37 -0
  80. package/src/tools/parabola/__tests__/component.test.jsx +48 -0
  81. package/src/tools/parabola/__tests__/index.test.js +470 -0
  82. package/src/tools/point/__tests__/component.test.jsx +349 -0
  83. package/src/tools/point/__tests__/index.test.js +241 -0
  84. package/src/tools/polygon/__tests__/component.test.jsx +471 -0
  85. package/src/tools/polygon/__tests__/index.test.js +294 -0
  86. package/src/tools/polygon/__tests__/line.test.jsx +35 -0
  87. package/src/tools/polygon/__tests__/polygon.test.jsx +61 -0
  88. package/src/tools/ray/__tests__/component.test.jsx +29 -0
  89. package/src/tools/segment/__tests__/component.test.jsx +28 -0
  90. package/src/tools/shared/__tests__/arrow-head.test.jsx +31 -0
  91. package/src/tools/shared/line/__tests__/index.test.jsx +109 -0
  92. package/src/tools/shared/line/__tests__/line-path.test.jsx +53 -0
  93. package/src/tools/shared/line/__tests__/with-root-edge.test.jsx +73 -0
  94. package/src/tools/shared/point/__tests__/arrow-point.test.jsx +91 -0
  95. package/src/tools/shared/point/__tests__/base-point.test.jsx +87 -0
  96. package/src/tools/sine/__tests__/component.test.jsx +51 -0
  97. package/src/tools/vector/__tests__/component.test.jsx +25 -0
@@ -0,0 +1,450 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
5
+ var _reducer = _interopRequireDefault(require("../reducer"));
6
+ var _actions = require("../actions");
7
+ describe('container reducer', function () {
8
+ describe('reducer creation', function () {
9
+ it('creates a reducer function', function () {
10
+ var rootReducer = (0, _reducer["default"])();
11
+ expect((0, _typeof2["default"])(rootReducer)).toBe('function');
12
+ });
13
+ it('returns an object with marks property', function () {
14
+ var rootReducer = (0, _reducer["default"])();
15
+ var state = rootReducer(undefined, {
16
+ type: 'INIT'
17
+ });
18
+ expect(state).toHaveProperty('marks');
19
+ });
20
+ it('wraps marks reducer with undoable', function () {
21
+ var rootReducer = (0, _reducer["default"])();
22
+ var state = rootReducer(undefined, {
23
+ type: 'INIT'
24
+ });
25
+ expect(state.marks).toHaveProperty('past');
26
+ expect(state.marks).toHaveProperty('present');
27
+ expect(state.marks).toHaveProperty('future');
28
+ });
29
+ });
30
+ describe('initial state', function () {
31
+ it('initializes with empty past', function () {
32
+ var rootReducer = (0, _reducer["default"])();
33
+ var state = rootReducer(undefined, {
34
+ type: 'INIT'
35
+ });
36
+ expect(state.marks.past).toEqual([]);
37
+ });
38
+ it('initializes with empty present', function () {
39
+ var rootReducer = (0, _reducer["default"])();
40
+ var state = rootReducer(undefined, {
41
+ type: 'INIT'
42
+ });
43
+ expect(state.marks.present).toEqual([]);
44
+ });
45
+ it('initializes with empty future', function () {
46
+ var rootReducer = (0, _reducer["default"])();
47
+ var state = rootReducer(undefined, {
48
+ type: 'INIT'
49
+ });
50
+ expect(state.marks.future).toEqual([]);
51
+ });
52
+ });
53
+ describe('CHANGE_MARKS action', function () {
54
+ it('updates present with new marks', function () {
55
+ var rootReducer = (0, _reducer["default"])();
56
+ var newMarks = [{
57
+ id: 1,
58
+ type: 'point',
59
+ x: 5,
60
+ y: 10
61
+ }];
62
+ var action = (0, _actions.changeMarks)(newMarks);
63
+ var state = rootReducer(undefined, {
64
+ type: '@@INIT'
65
+ });
66
+ state = rootReducer(state, action);
67
+ expect(state.marks.present).toEqual(newMarks);
68
+ });
69
+ it('adds previous state to past', function () {
70
+ var rootReducer = (0, _reducer["default"])();
71
+ var firstMarks = [{
72
+ id: 1,
73
+ type: 'point'
74
+ }];
75
+ var secondMarks = [{
76
+ id: 2,
77
+ type: 'line'
78
+ }];
79
+ var state = rootReducer(undefined, {
80
+ type: '@@INIT'
81
+ });
82
+ state = rootReducer(state, (0, _actions.changeMarks)(firstMarks));
83
+ state = rootReducer(state, (0, _actions.changeMarks)(secondMarks));
84
+ expect(state.marks.past.length).toBeGreaterThan(0);
85
+ expect(state.marks.present).toEqual(secondMarks);
86
+ });
87
+ it('clears future on new action', function () {
88
+ var rootReducer = (0, _reducer["default"])();
89
+ var firstMarks = [{
90
+ id: 1,
91
+ type: 'point'
92
+ }];
93
+ var secondMarks = [{
94
+ id: 2,
95
+ type: 'line'
96
+ }];
97
+ var thirdMarks = [{
98
+ id: 3,
99
+ type: 'circle'
100
+ }];
101
+ var state = rootReducer(undefined, {
102
+ type: '@@INIT'
103
+ });
104
+ state = rootReducer(state, (0, _actions.changeMarks)(firstMarks));
105
+ state = rootReducer(state, (0, _actions.changeMarks)(secondMarks));
106
+ state = rootReducer(state, {
107
+ type: '@@redux-undo/UNDO'
108
+ });
109
+ expect(state.marks.future.length).toBeGreaterThan(0);
110
+ state = rootReducer(state, (0, _actions.changeMarks)(thirdMarks));
111
+ expect(state.marks.future).toEqual([]);
112
+ });
113
+ it('handles empty marks array', function () {
114
+ var rootReducer = (0, _reducer["default"])();
115
+ var action = (0, _actions.changeMarks)([]);
116
+ var state = rootReducer(undefined, {
117
+ type: '@@INIT'
118
+ });
119
+ state = rootReducer(state, action);
120
+ expect(state.marks.present).toEqual([]);
121
+ });
122
+ it('handles multiple marks', function () {
123
+ var rootReducer = (0, _reducer["default"])();
124
+ var marks = [{
125
+ id: 1,
126
+ type: 'point',
127
+ x: 1,
128
+ y: 2
129
+ }, {
130
+ id: 2,
131
+ type: 'line',
132
+ from: {
133
+ x: 0,
134
+ y: 0
135
+ },
136
+ to: {
137
+ x: 5,
138
+ y: 5
139
+ }
140
+ }, {
141
+ id: 3,
142
+ type: 'circle',
143
+ center: {
144
+ x: 3,
145
+ y: 3
146
+ },
147
+ radius: 2
148
+ }];
149
+ var action = (0, _actions.changeMarks)(marks);
150
+ var state = rootReducer(undefined, {
151
+ type: '@@INIT'
152
+ });
153
+ state = rootReducer(state, action);
154
+ expect(state.marks.present).toEqual(marks);
155
+ expect(state.marks.present.length).toBe(3);
156
+ });
157
+ });
158
+ describe('undo functionality', function () {
159
+ it('supports undo action', function () {
160
+ var rootReducer = (0, _reducer["default"])();
161
+ var firstMarks = [{
162
+ id: 1,
163
+ type: 'point'
164
+ }];
165
+ var secondMarks = [{
166
+ id: 2,
167
+ type: 'line'
168
+ }];
169
+ var state = rootReducer(undefined, {
170
+ type: '@@INIT'
171
+ });
172
+ state = rootReducer(state, (0, _actions.changeMarks)(firstMarks));
173
+ state = rootReducer(state, (0, _actions.changeMarks)(secondMarks));
174
+ state = rootReducer(state, {
175
+ type: '@@redux-undo/UNDO'
176
+ });
177
+ expect(state.marks.present).toEqual(firstMarks);
178
+ });
179
+ it('moves present to future on undo', function () {
180
+ var rootReducer = (0, _reducer["default"])();
181
+ var firstMarks = [{
182
+ id: 1,
183
+ type: 'point'
184
+ }];
185
+ var secondMarks = [{
186
+ id: 2,
187
+ type: 'line'
188
+ }];
189
+ var state = rootReducer(undefined, {
190
+ type: '@@INIT'
191
+ });
192
+ state = rootReducer(state, (0, _actions.changeMarks)(firstMarks));
193
+ state = rootReducer(state, (0, _actions.changeMarks)(secondMarks));
194
+ state = rootReducer(state, {
195
+ type: '@@redux-undo/UNDO'
196
+ });
197
+ expect(state.marks.future.length).toBeGreaterThan(0);
198
+ });
199
+ it('handles multiple undos', function () {
200
+ var rootReducer = (0, _reducer["default"])();
201
+ var marks1 = [{
202
+ id: 1
203
+ }];
204
+ var marks2 = [{
205
+ id: 2
206
+ }];
207
+ var marks3 = [{
208
+ id: 3
209
+ }];
210
+ var state = rootReducer(undefined, {
211
+ type: '@@INIT'
212
+ });
213
+ state = rootReducer(state, (0, _actions.changeMarks)(marks1));
214
+ state = rootReducer(state, (0, _actions.changeMarks)(marks2));
215
+ state = rootReducer(state, (0, _actions.changeMarks)(marks3));
216
+ state = rootReducer(state, {
217
+ type: '@@redux-undo/UNDO'
218
+ });
219
+ state = rootReducer(state, {
220
+ type: '@@redux-undo/UNDO'
221
+ });
222
+ expect(state.marks.present).toEqual(marks1);
223
+ });
224
+ it('does not undo beyond initial state', function () {
225
+ var rootReducer = (0, _reducer["default"])();
226
+ var marks = [{
227
+ id: 1,
228
+ type: 'point'
229
+ }];
230
+ var state = rootReducer(undefined, {
231
+ type: '@@INIT'
232
+ });
233
+ state = rootReducer(state, (0, _actions.changeMarks)(marks));
234
+ state = rootReducer(state, {
235
+ type: '@@redux-undo/UNDO'
236
+ });
237
+ state = rootReducer(state, {
238
+ type: '@@redux-undo/UNDO'
239
+ });
240
+ state = rootReducer(state, {
241
+ type: '@@redux-undo/UNDO'
242
+ });
243
+ expect(state.marks.present).toEqual([]);
244
+ expect(state.marks.past).toEqual([]);
245
+ });
246
+ });
247
+ describe('redo functionality', function () {
248
+ it('supports redo action', function () {
249
+ var rootReducer = (0, _reducer["default"])();
250
+ var firstMarks = [{
251
+ id: 1,
252
+ type: 'point'
253
+ }];
254
+ var secondMarks = [{
255
+ id: 2,
256
+ type: 'line'
257
+ }];
258
+ var state = rootReducer(undefined, {
259
+ type: '@@INIT'
260
+ });
261
+ state = rootReducer(state, (0, _actions.changeMarks)(firstMarks));
262
+ state = rootReducer(state, (0, _actions.changeMarks)(secondMarks));
263
+ state = rootReducer(state, {
264
+ type: '@@redux-undo/UNDO'
265
+ });
266
+
267
+ // Redo
268
+ state = rootReducer(state, {
269
+ type: '@@redux-undo/REDO'
270
+ });
271
+ expect(state.marks.present).toEqual(secondMarks);
272
+ });
273
+ it('moves future to past on redo', function () {
274
+ var rootReducer = (0, _reducer["default"])();
275
+ var firstMarks = [{
276
+ id: 1,
277
+ type: 'point'
278
+ }];
279
+ var secondMarks = [{
280
+ id: 2,
281
+ type: 'line'
282
+ }];
283
+ var state = rootReducer(undefined, {
284
+ type: '@@INIT'
285
+ });
286
+ state = rootReducer(state, (0, _actions.changeMarks)(firstMarks));
287
+ state = rootReducer(state, (0, _actions.changeMarks)(secondMarks));
288
+ state = rootReducer(state, {
289
+ type: '@@redux-undo/UNDO'
290
+ });
291
+ var futureBeforeRedo = state.marks.future.length;
292
+ state = rootReducer(state, {
293
+ type: '@@redux-undo/REDO'
294
+ });
295
+ expect(state.marks.future.length).toBe(futureBeforeRedo - 1);
296
+ });
297
+ it('handles multiple redos', function () {
298
+ var rootReducer = (0, _reducer["default"])();
299
+ var marks1 = [{
300
+ id: 1
301
+ }];
302
+ var marks2 = [{
303
+ id: 2
304
+ }];
305
+ var marks3 = [{
306
+ id: 3
307
+ }];
308
+ var state = rootReducer(undefined, {
309
+ type: '@@INIT'
310
+ });
311
+ state = rootReducer(state, (0, _actions.changeMarks)(marks1));
312
+ state = rootReducer(state, (0, _actions.changeMarks)(marks2));
313
+ state = rootReducer(state, (0, _actions.changeMarks)(marks3));
314
+
315
+ // undo twice, then redo twice
316
+ state = rootReducer(state, {
317
+ type: '@@redux-undo/UNDO'
318
+ });
319
+ state = rootReducer(state, {
320
+ type: '@@redux-undo/UNDO'
321
+ });
322
+ state = rootReducer(state, {
323
+ type: '@@redux-undo/REDO'
324
+ });
325
+ state = rootReducer(state, {
326
+ type: '@@redux-undo/REDO'
327
+ });
328
+ expect(state.marks.present).toEqual(marks3);
329
+ });
330
+ it('does not redo beyond last state', function () {
331
+ var rootReducer = (0, _reducer["default"])();
332
+ var marks = [{
333
+ id: 1,
334
+ type: 'point'
335
+ }];
336
+ var state = rootReducer(undefined, {
337
+ type: '@@INIT'
338
+ });
339
+ state = rootReducer(state, (0, _actions.changeMarks)(marks));
340
+ state = rootReducer(state, {
341
+ type: '@@redux-undo/UNDO'
342
+ });
343
+ state = rootReducer(state, {
344
+ type: '@@redux-undo/REDO'
345
+ });
346
+
347
+ // try to redo beyond the end
348
+ state = rootReducer(state, {
349
+ type: '@@redux-undo/REDO'
350
+ });
351
+ state = rootReducer(state, {
352
+ type: '@@redux-undo/REDO'
353
+ });
354
+ expect(state.marks.present).toEqual(marks);
355
+ expect(state.marks.future).toEqual([]);
356
+ });
357
+ });
358
+ describe('state structure', function () {
359
+ it('maintains correct undoable structure', function () {
360
+ var rootReducer = (0, _reducer["default"])();
361
+ var state = rootReducer(undefined, {
362
+ type: 'INIT'
363
+ });
364
+ expect(state.marks).toHaveProperty('past');
365
+ expect(state.marks).toHaveProperty('present');
366
+ expect(state.marks).toHaveProperty('future');
367
+ expect(Array.isArray(state.marks.past)).toBe(true);
368
+ expect(Array.isArray(state.marks.future)).toBe(true);
369
+ });
370
+ it('preserves mark properties through undo/redo', function () {
371
+ var rootReducer = (0, _reducer["default"])();
372
+ var marks = [{
373
+ id: 1,
374
+ type: 'point',
375
+ x: 10,
376
+ y: 20,
377
+ label: 'A',
378
+ correctness: {
379
+ value: 'correct'
380
+ }
381
+ }];
382
+ var state = rootReducer(undefined, {
383
+ type: 'INIT'
384
+ });
385
+ state = rootReducer(state, (0, _actions.changeMarks)(marks));
386
+ state = rootReducer(state, (0, _actions.changeMarks)([]));
387
+ state = rootReducer(state, {
388
+ type: '@@redux-undo/UNDO'
389
+ });
390
+ expect(state.marks.present).toEqual(marks);
391
+ expect(state.marks.present[0]).toBeDefined();
392
+ if (state.marks.present[0]) {
393
+ expect(state.marks.present[0]).toEqual(marks[0]);
394
+ expect(state.marks.present[0].correctness).toBeDefined();
395
+ }
396
+ });
397
+ });
398
+ describe('integration', function () {
399
+ it('handles complex undo/redo sequences', function () {
400
+ var rootReducer = (0, _reducer["default"])();
401
+ var marks1 = [{
402
+ id: 1
403
+ }];
404
+ var marks2 = [{
405
+ id: 2
406
+ }];
407
+ var marks3 = [{
408
+ id: 3
409
+ }];
410
+ var marks4 = [{
411
+ id: 4
412
+ }];
413
+ var state = rootReducer(undefined, {
414
+ type: '@@INIT'
415
+ });
416
+ state = rootReducer(state, (0, _actions.changeMarks)(marks1));
417
+ state = rootReducer(state, (0, _actions.changeMarks)(marks2));
418
+ state = rootReducer(state, (0, _actions.changeMarks)(marks3));
419
+ state = rootReducer(state, {
420
+ type: '@@redux-undo/UNDO'
421
+ }); // back to marks2
422
+ state = rootReducer(state, {
423
+ type: '@@redux-undo/UNDO'
424
+ }); // back to marks1
425
+ state = rootReducer(state, {
426
+ type: '@@redux-undo/REDO'
427
+ }); // forward to marks2
428
+ state = rootReducer(state, (0, _actions.changeMarks)(marks4));
429
+ expect(state.marks.present).toEqual(marks4);
430
+ expect(state.marks.future).toEqual([]);
431
+ });
432
+ it('works with empty state transitions', function () {
433
+ var rootReducer = (0, _reducer["default"])();
434
+ var marks = [{
435
+ id: 1
436
+ }];
437
+ var state = rootReducer(undefined, {
438
+ type: '@@INIT'
439
+ });
440
+ state = rootReducer(state, (0, _actions.changeMarks)([]));
441
+ state = rootReducer(state, (0, _actions.changeMarks)(marks));
442
+ state = rootReducer(state, (0, _actions.changeMarks)([]));
443
+ state = rootReducer(state, {
444
+ type: '@@redux-undo/UNDO'
445
+ });
446
+ expect(state.marks.present).toEqual(marks);
447
+ });
448
+ });
449
+ });
450
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVkdWNlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2FjdGlvbnMiLCJkZXNjcmliZSIsIml0Iiwicm9vdFJlZHVjZXIiLCJyZWR1Y2VyIiwiZXhwZWN0IiwiX3R5cGVvZjIiLCJ0b0JlIiwic3RhdGUiLCJ1bmRlZmluZWQiLCJ0eXBlIiwidG9IYXZlUHJvcGVydHkiLCJtYXJrcyIsInBhc3QiLCJ0b0VxdWFsIiwicHJlc2VudCIsImZ1dHVyZSIsIm5ld01hcmtzIiwiaWQiLCJ4IiwieSIsImFjdGlvbiIsImNoYW5nZU1hcmtzIiwiZmlyc3RNYXJrcyIsInNlY29uZE1hcmtzIiwibGVuZ3RoIiwidG9CZUdyZWF0ZXJUaGFuIiwidGhpcmRNYXJrcyIsImZyb20iLCJ0byIsImNlbnRlciIsInJhZGl1cyIsIm1hcmtzMSIsIm1hcmtzMiIsIm1hcmtzMyIsImZ1dHVyZUJlZm9yZVJlZG8iLCJBcnJheSIsImlzQXJyYXkiLCJsYWJlbCIsImNvcnJlY3RuZXNzIiwidmFsdWUiLCJ0b0JlRGVmaW5lZCIsIm1hcmtzNCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb250YWluZXIvX190ZXN0c19fL3JlZHVjZXIudGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcmVkdWNlciBmcm9tICcuLi9yZWR1Y2VyJztcbmltcG9ydCB7IGNoYW5nZU1hcmtzIH0gZnJvbSAnLi4vYWN0aW9ucyc7XG5cbmRlc2NyaWJlKCdjb250YWluZXIgcmVkdWNlcicsICgpID0+IHtcbiAgZGVzY3JpYmUoJ3JlZHVjZXIgY3JlYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ2NyZWF0ZXMgYSByZWR1Y2VyIGZ1bmN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9vdFJlZHVjZXIgPSByZWR1Y2VyKCk7XG4gICAgICBleHBlY3QodHlwZW9mIHJvb3RSZWR1Y2VyKS50b0JlKCdmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgYW4gb2JqZWN0IHdpdGggbWFya3MgcHJvcGVydHknLCAoKSA9PiB7XG4gICAgICBjb25zdCByb290UmVkdWNlciA9IHJlZHVjZXIoKTtcbiAgICAgIGNvbnN0IHN0YXRlID0gcm9vdFJlZHVjZXIodW5kZWZpbmVkLCB7IHR5cGU6ICdJTklUJyB9KTtcbiAgICAgIGV4cGVjdChzdGF0ZSkudG9IYXZlUHJvcGVydHkoJ21hcmtzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnd3JhcHMgbWFya3MgcmVkdWNlciB3aXRoIHVuZG9hYmxlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9vdFJlZHVjZXIgPSByZWR1Y2VyKCk7XG4gICAgICBjb25zdCBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHVuZGVmaW5lZCwgeyB0eXBlOiAnSU5JVCcgfSk7XG5cbiAgICAgIGV4cGVjdChzdGF0ZS5tYXJrcykudG9IYXZlUHJvcGVydHkoJ3Bhc3QnKTtcbiAgICAgIGV4cGVjdChzdGF0ZS5tYXJrcykudG9IYXZlUHJvcGVydHkoJ3ByZXNlbnQnKTtcbiAgICAgIGV4cGVjdChzdGF0ZS5tYXJrcykudG9IYXZlUHJvcGVydHkoJ2Z1dHVyZScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaW5pdGlhbCBzdGF0ZScsICgpID0+IHtcbiAgICBpdCgnaW5pdGlhbGl6ZXMgd2l0aCBlbXB0eSBwYXN0JywgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9vdFJlZHVjZXIgPSByZWR1Y2VyKCk7XG4gICAgICBjb25zdCBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHVuZGVmaW5lZCwgeyB0eXBlOiAnSU5JVCcgfSk7XG5cbiAgICAgIGV4cGVjdChzdGF0ZS5tYXJrcy5wYXN0KS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdpbml0aWFsaXplcyB3aXRoIGVtcHR5IHByZXNlbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByb290UmVkdWNlciA9IHJlZHVjZXIoKTtcbiAgICAgIGNvbnN0IHN0YXRlID0gcm9vdFJlZHVjZXIodW5kZWZpbmVkLCB7IHR5cGU6ICdJTklUJyB9KTtcblxuICAgICAgZXhwZWN0KHN0YXRlLm1hcmtzLnByZXNlbnQpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2luaXRpYWxpemVzIHdpdGggZW1wdHkgZnV0dXJlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9vdFJlZHVjZXIgPSByZWR1Y2VyKCk7XG4gICAgICBjb25zdCBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHVuZGVmaW5lZCwgeyB0eXBlOiAnSU5JVCcgfSk7XG5cbiAgICAgIGV4cGVjdChzdGF0ZS5tYXJrcy5mdXR1cmUpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ0hBTkdFX01BUktTIGFjdGlvbicsICgpID0+IHtcbiAgICBpdCgndXBkYXRlcyBwcmVzZW50IHdpdGggbmV3IG1hcmtzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9vdFJlZHVjZXIgPSByZWR1Y2VyKCk7XG4gICAgICBjb25zdCBuZXdNYXJrcyA9IFt7IGlkOiAxLCB0eXBlOiAncG9pbnQnLCB4OiA1LCB5OiAxMCB9XTtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGNoYW5nZU1hcmtzKG5ld01hcmtzKTtcblxuICAgICAgbGV0IHN0YXRlID0gcm9vdFJlZHVjZXIodW5kZWZpbmVkLCB7IHR5cGU6ICdAQElOSVQnIH0pO1xuICAgICAgc3RhdGUgPSByb290UmVkdWNlcihzdGF0ZSwgYWN0aW9uKTtcblxuICAgICAgZXhwZWN0KHN0YXRlLm1hcmtzLnByZXNlbnQpLnRvRXF1YWwobmV3TWFya3MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FkZHMgcHJldmlvdXMgc3RhdGUgdG8gcGFzdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJvb3RSZWR1Y2VyID0gcmVkdWNlcigpO1xuICAgICAgY29uc3QgZmlyc3RNYXJrcyA9IFt7IGlkOiAxLCB0eXBlOiAncG9pbnQnIH1dO1xuICAgICAgY29uc3Qgc2Vjb25kTWFya3MgPSBbeyBpZDogMiwgdHlwZTogJ2xpbmUnIH1dO1xuXG4gICAgICBsZXQgc3RhdGUgPSByb290UmVkdWNlcih1bmRlZmluZWQsIHsgdHlwZTogJ0BASU5JVCcgfSk7XG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCBjaGFuZ2VNYXJrcyhmaXJzdE1hcmtzKSk7XG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCBjaGFuZ2VNYXJrcyhzZWNvbmRNYXJrcykpO1xuXG4gICAgICBleHBlY3Qoc3RhdGUubWFya3MucGFzdC5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICAgIGV4cGVjdChzdGF0ZS5tYXJrcy5wcmVzZW50KS50b0VxdWFsKHNlY29uZE1hcmtzKTtcbiAgICB9KTtcblxuICAgIGl0KCdjbGVhcnMgZnV0dXJlIG9uIG5ldyBhY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCByb290UmVkdWNlciA9IHJlZHVjZXIoKTtcbiAgICAgIGNvbnN0IGZpcnN0TWFya3MgPSBbeyBpZDogMSwgdHlwZTogJ3BvaW50JyB9XTtcbiAgICAgIGNvbnN0IHNlY29uZE1hcmtzID0gW3sgaWQ6IDIsIHR5cGU6ICdsaW5lJyB9XTtcbiAgICAgIGNvbnN0IHRoaXJkTWFya3MgPSBbeyBpZDogMywgdHlwZTogJ2NpcmNsZScgfV07XG5cbiAgICAgIGxldCBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHVuZGVmaW5lZCwgeyB0eXBlOiAnQEBJTklUJyB9KTtcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIGNoYW5nZU1hcmtzKGZpcnN0TWFya3MpKTtcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIGNoYW5nZU1hcmtzKHNlY29uZE1hcmtzKSk7XG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCB7IHR5cGU6ICdAQHJlZHV4LXVuZG8vVU5ETycgfSk7XG5cbiAgICAgIGV4cGVjdChzdGF0ZS5tYXJrcy5mdXR1cmUubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG5cbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIGNoYW5nZU1hcmtzKHRoaXJkTWFya3MpKTtcbiAgICAgIGV4cGVjdChzdGF0ZS5tYXJrcy5mdXR1cmUpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgZW1wdHkgbWFya3MgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCByb290UmVkdWNlciA9IHJlZHVjZXIoKTtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGNoYW5nZU1hcmtzKFtdKTtcblxuICAgICAgbGV0IHN0YXRlID0gcm9vdFJlZHVjZXIodW5kZWZpbmVkLCB7IHR5cGU6ICdAQElOSVQnIH0pO1xuICAgICAgc3RhdGUgPSByb290UmVkdWNlcihzdGF0ZSwgYWN0aW9uKTtcblxuICAgICAgZXhwZWN0KHN0YXRlLm1hcmtzLnByZXNlbnQpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbXVsdGlwbGUgbWFya3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCByb290UmVkdWNlciA9IHJlZHVjZXIoKTtcbiAgICAgIGNvbnN0IG1hcmtzID0gW1xuICAgICAgICB7IGlkOiAxLCB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAyIH0sXG4gICAgICAgIHsgaWQ6IDIsIHR5cGU6ICdsaW5lJywgZnJvbTogeyB4OiAwLCB5OiAwIH0sIHRvOiB7IHg6IDUsIHk6IDUgfSB9LFxuICAgICAgICB7IGlkOiAzLCB0eXBlOiAnY2lyY2xlJywgY2VudGVyOiB7IHg6IDMsIHk6IDMgfSwgcmFkaXVzOiAyIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgYWN0aW9uID0gY2hhbmdlTWFya3MobWFya3MpO1xuXG4gICAgICBsZXQgc3RhdGUgPSByb290UmVkdWNlcih1bmRlZmluZWQsIHsgdHlwZTogJ0BASU5JVCcgfSk7XG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCBhY3Rpb24pO1xuXG4gICAgICBleHBlY3Qoc3RhdGUubWFya3MucHJlc2VudCkudG9FcXVhbChtYXJrcyk7XG4gICAgICBleHBlY3Qoc3RhdGUubWFya3MucHJlc2VudC5sZW5ndGgpLnRvQmUoMyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd1bmRvIGZ1bmN0aW9uYWxpdHknLCAoKSA9PiB7XG4gICAgaXQoJ3N1cHBvcnRzIHVuZG8gYWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9vdFJlZHVjZXIgPSByZWR1Y2VyKCk7XG4gICAgICBjb25zdCBmaXJzdE1hcmtzID0gW3sgaWQ6IDEsIHR5cGU6ICdwb2ludCcgfV07XG4gICAgICBjb25zdCBzZWNvbmRNYXJrcyA9IFt7IGlkOiAyLCB0eXBlOiAnbGluZScgfV07XG5cbiAgICAgIGxldCBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHVuZGVmaW5lZCwgeyB0eXBlOiAnQEBJTklUJyB9KTtcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIGNoYW5nZU1hcmtzKGZpcnN0TWFya3MpKTtcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIGNoYW5nZU1hcmtzKHNlY29uZE1hcmtzKSk7XG5cbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIHsgdHlwZTogJ0BAcmVkdXgtdW5kby9VTkRPJyB9KTtcblxuICAgICAgZXhwZWN0KHN0YXRlLm1hcmtzLnByZXNlbnQpLnRvRXF1YWwoZmlyc3RNYXJrcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnbW92ZXMgcHJlc2VudCB0byBmdXR1cmUgb24gdW5kbycsICgpID0+IHtcbiAgICAgIGNvbnN0IHJvb3RSZWR1Y2VyID0gcmVkdWNlcigpO1xuICAgICAgY29uc3QgZmlyc3RNYXJrcyA9IFt7IGlkOiAxLCB0eXBlOiAncG9pbnQnIH1dO1xuICAgICAgY29uc3Qgc2Vjb25kTWFya3MgPSBbeyBpZDogMiwgdHlwZTogJ2xpbmUnIH1dO1xuXG4gICAgICBsZXQgc3RhdGUgPSByb290UmVkdWNlcih1bmRlZmluZWQsIHsgdHlwZTogJ0BASU5JVCcgfSk7XG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCBjaGFuZ2VNYXJrcyhmaXJzdE1hcmtzKSk7XG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCBjaGFuZ2VNYXJrcyhzZWNvbmRNYXJrcykpO1xuICAgICAgc3RhdGUgPSByb290UmVkdWNlcihzdGF0ZSwgeyB0eXBlOiAnQEByZWR1eC11bmRvL1VORE8nIH0pO1xuXG4gICAgICBleHBlY3Qoc3RhdGUubWFya3MuZnV0dXJlLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbXVsdGlwbGUgdW5kb3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCByb290UmVkdWNlciA9IHJlZHVjZXIoKTtcbiAgICAgIGNvbnN0IG1hcmtzMSA9IFt7IGlkOiAxIH1dO1xuICAgICAgY29uc3QgbWFya3MyID0gW3sgaWQ6IDIgfV07XG4gICAgICBjb25zdCBtYXJrczMgPSBbeyBpZDogMyB9XTtcblxuICAgICAgbGV0IHN0YXRlID0gcm9vdFJlZHVjZXIodW5kZWZpbmVkLCB7IHR5cGU6ICdAQElOSVQnIH0pO1xuICAgICAgc3RhdGUgPSByb290UmVkdWNlcihzdGF0ZSwgY2hhbmdlTWFya3MobWFya3MxKSk7XG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCBjaGFuZ2VNYXJrcyhtYXJrczIpKTtcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIGNoYW5nZU1hcmtzKG1hcmtzMykpO1xuXG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCB7IHR5cGU6ICdAQHJlZHV4LXVuZG8vVU5ETycgfSk7XG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCB7IHR5cGU6ICdAQHJlZHV4LXVuZG8vVU5ETycgfSk7XG5cbiAgICAgIGV4cGVjdChzdGF0ZS5tYXJrcy5wcmVzZW50KS50b0VxdWFsKG1hcmtzMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgdW5kbyBiZXlvbmQgaW5pdGlhbCBzdGF0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHJvb3RSZWR1Y2VyID0gcmVkdWNlcigpO1xuICAgICAgY29uc3QgbWFya3MgPSBbeyBpZDogMSwgdHlwZTogJ3BvaW50JyB9XTtcblxuICAgICAgbGV0IHN0YXRlID0gcm9vdFJlZHVjZXIodW5kZWZpbmVkLCB7IHR5cGU6ICdAQElOSVQnIH0pO1xuICAgICAgc3RhdGUgPSByb290UmVkdWNlcihzdGF0ZSwgY2hhbmdlTWFya3MobWFya3MpKTtcblxuICAgICAgc3RhdGUgPSByb290UmVkdWNlcihzdGF0ZSwgeyB0eXBlOiAnQEByZWR1eC11bmRvL1VORE8nIH0pO1xuICAgICAgc3RhdGUgPSByb290UmVkdWNlcihzdGF0ZSwgeyB0eXBlOiAnQEByZWR1eC11bmRvL1VORE8nIH0pO1xuICAgICAgc3RhdGUgPSByb290UmVkdWNlcihzdGF0ZSwgeyB0eXBlOiAnQEByZWR1eC11bmRvL1VORE8nIH0pO1xuXG4gICAgICBleHBlY3Qoc3RhdGUubWFya3MucHJlc2VudCkudG9FcXVhbChbXSk7XG4gICAgICBleHBlY3Qoc3RhdGUubWFya3MucGFzdCkudG9FcXVhbChbXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWRvIGZ1bmN0aW9uYWxpdHknLCAoKSA9PiB7XG4gICAgaXQoJ3N1cHBvcnRzIHJlZG8gYWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9vdFJlZHVjZXIgPSByZWR1Y2VyKCk7XG4gICAgICBjb25zdCBmaXJzdE1hcmtzID0gW3sgaWQ6IDEsIHR5cGU6ICdwb2ludCcgfV07XG4gICAgICBjb25zdCBzZWNvbmRNYXJrcyA9IFt7IGlkOiAyLCB0eXBlOiAnbGluZScgfV07XG5cbiAgICAgIGxldCBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHVuZGVmaW5lZCwgeyB0eXBlOiAnQEBJTklUJyB9KTtcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIGNoYW5nZU1hcmtzKGZpcnN0TWFya3MpKTtcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIGNoYW5nZU1hcmtzKHNlY29uZE1hcmtzKSk7XG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCB7IHR5cGU6ICdAQHJlZHV4LXVuZG8vVU5ETycgfSk7XG5cbiAgICAgIC8vIFJlZG9cbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIHsgdHlwZTogJ0BAcmVkdXgtdW5kby9SRURPJyB9KTtcblxuICAgICAgZXhwZWN0KHN0YXRlLm1hcmtzLnByZXNlbnQpLnRvRXF1YWwoc2Vjb25kTWFya3MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ21vdmVzIGZ1dHVyZSB0byBwYXN0IG9uIHJlZG8nLCAoKSA9PiB7XG4gICAgICBjb25zdCByb290UmVkdWNlciA9IHJlZHVjZXIoKTtcbiAgICAgIGNvbnN0IGZpcnN0TWFya3MgPSBbeyBpZDogMSwgdHlwZTogJ3BvaW50JyB9XTtcbiAgICAgIGNvbnN0IHNlY29uZE1hcmtzID0gW3sgaWQ6IDIsIHR5cGU6ICdsaW5lJyB9XTtcblxuICAgICAgbGV0IHN0YXRlID0gcm9vdFJlZHVjZXIodW5kZWZpbmVkLCB7IHR5cGU6ICdAQElOSVQnIH0pO1xuICAgICAgc3RhdGUgPSByb290UmVkdWNlcihzdGF0ZSwgY2hhbmdlTWFya3MoZmlyc3RNYXJrcykpO1xuICAgICAgc3RhdGUgPSByb290UmVkdWNlcihzdGF0ZSwgY2hhbmdlTWFya3Moc2Vjb25kTWFya3MpKTtcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIHsgdHlwZTogJ0BAcmVkdXgtdW5kby9VTkRPJyB9KTtcblxuICAgICAgY29uc3QgZnV0dXJlQmVmb3JlUmVkbyA9IHN0YXRlLm1hcmtzLmZ1dHVyZS5sZW5ndGg7XG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCB7IHR5cGU6ICdAQHJlZHV4LXVuZG8vUkVETycgfSk7XG5cbiAgICAgIGV4cGVjdChzdGF0ZS5tYXJrcy5mdXR1cmUubGVuZ3RoKS50b0JlKGZ1dHVyZUJlZm9yZVJlZG8gLSAxKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG11bHRpcGxlIHJlZG9zJywgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9vdFJlZHVjZXIgPSByZWR1Y2VyKCk7XG4gICAgICBjb25zdCBtYXJrczEgPSBbeyBpZDogMSB9XTtcbiAgICAgIGNvbnN0IG1hcmtzMiA9IFt7IGlkOiAyIH1dO1xuICAgICAgY29uc3QgbWFya3MzID0gW3sgaWQ6IDMgfV07XG5cbiAgICAgIGxldCBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHVuZGVmaW5lZCwgeyB0eXBlOiAnQEBJTklUJyB9KTtcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIGNoYW5nZU1hcmtzKG1hcmtzMSkpO1xuICAgICAgc3RhdGUgPSByb290UmVkdWNlcihzdGF0ZSwgY2hhbmdlTWFya3MobWFya3MyKSk7XG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCBjaGFuZ2VNYXJrcyhtYXJrczMpKTtcblxuICAgICAgLy8gdW5kbyB0d2ljZSwgdGhlbiByZWRvIHR3aWNlXG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCB7IHR5cGU6ICdAQHJlZHV4LXVuZG8vVU5ETycgfSk7XG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCB7IHR5cGU6ICdAQHJlZHV4LXVuZG8vVU5ETycgfSk7XG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCB7IHR5cGU6ICdAQHJlZHV4LXVuZG8vUkVETycgfSk7XG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCB7IHR5cGU6ICdAQHJlZHV4LXVuZG8vUkVETycgfSk7XG5cbiAgICAgIGV4cGVjdChzdGF0ZS5tYXJrcy5wcmVzZW50KS50b0VxdWFsKG1hcmtzMyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVkbyBiZXlvbmQgbGFzdCBzdGF0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHJvb3RSZWR1Y2VyID0gcmVkdWNlcigpO1xuICAgICAgY29uc3QgbWFya3MgPSBbeyBpZDogMSwgdHlwZTogJ3BvaW50JyB9XTtcblxuICAgICAgbGV0IHN0YXRlID0gcm9vdFJlZHVjZXIodW5kZWZpbmVkLCB7IHR5cGU6ICdAQElOSVQnIH0pO1xuICAgICAgc3RhdGUgPSByb290UmVkdWNlcihzdGF0ZSwgY2hhbmdlTWFya3MobWFya3MpKTtcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIHsgdHlwZTogJ0BAcmVkdXgtdW5kby9VTkRPJyB9KTtcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIHsgdHlwZTogJ0BAcmVkdXgtdW5kby9SRURPJyB9KTtcblxuICAgICAgLy8gdHJ5IHRvIHJlZG8gYmV5b25kIHRoZSBlbmRcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIHsgdHlwZTogJ0BAcmVkdXgtdW5kby9SRURPJyB9KTtcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIHsgdHlwZTogJ0BAcmVkdXgtdW5kby9SRURPJyB9KTtcblxuICAgICAgZXhwZWN0KHN0YXRlLm1hcmtzLnByZXNlbnQpLnRvRXF1YWwobWFya3MpO1xuICAgICAgZXhwZWN0KHN0YXRlLm1hcmtzLmZ1dHVyZSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdGF0ZSBzdHJ1Y3R1cmUnLCAoKSA9PiB7XG4gICAgaXQoJ21haW50YWlucyBjb3JyZWN0IHVuZG9hYmxlIHN0cnVjdHVyZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHJvb3RSZWR1Y2VyID0gcmVkdWNlcigpO1xuICAgICAgY29uc3Qgc3RhdGUgPSByb290UmVkdWNlcih1bmRlZmluZWQsIHsgdHlwZTogJ0lOSVQnIH0pO1xuXG4gICAgICBleHBlY3Qoc3RhdGUubWFya3MpLnRvSGF2ZVByb3BlcnR5KCdwYXN0Jyk7XG4gICAgICBleHBlY3Qoc3RhdGUubWFya3MpLnRvSGF2ZVByb3BlcnR5KCdwcmVzZW50Jyk7XG4gICAgICBleHBlY3Qoc3RhdGUubWFya3MpLnRvSGF2ZVByb3BlcnR5KCdmdXR1cmUnKTtcbiAgICAgIGV4cGVjdChBcnJheS5pc0FycmF5KHN0YXRlLm1hcmtzLnBhc3QpKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KEFycmF5LmlzQXJyYXkoc3RhdGUubWFya3MuZnV0dXJlKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdwcmVzZXJ2ZXMgbWFyayBwcm9wZXJ0aWVzIHRocm91Z2ggdW5kby9yZWRvJywgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9vdFJlZHVjZXIgPSByZWR1Y2VyKCk7XG4gICAgICBjb25zdCBtYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAxLFxuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMTAsXG4gICAgICAgICAgeTogMjAsXG4gICAgICAgICAgbGFiZWw6ICdBJyxcbiAgICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnIH0sXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBsZXQgc3RhdGUgPSByb290UmVkdWNlcih1bmRlZmluZWQsIHsgdHlwZTogJ0lOSVQnIH0pO1xuICAgICAgc3RhdGUgPSByb290UmVkdWNlcihzdGF0ZSwgY2hhbmdlTWFya3MobWFya3MpKTtcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIGNoYW5nZU1hcmtzKFtdKSk7XG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCB7IHR5cGU6ICdAQHJlZHV4LXVuZG8vVU5ETycgfSk7XG5cbiAgICAgIGV4cGVjdChzdGF0ZS5tYXJrcy5wcmVzZW50KS50b0VxdWFsKG1hcmtzKTtcbiAgICAgIGV4cGVjdChzdGF0ZS5tYXJrcy5wcmVzZW50WzBdKS50b0JlRGVmaW5lZCgpO1xuICAgICAgaWYgKHN0YXRlLm1hcmtzLnByZXNlbnRbMF0pIHtcbiAgICAgICAgZXhwZWN0KHN0YXRlLm1hcmtzLnByZXNlbnRbMF0pLnRvRXF1YWwobWFya3NbMF0pO1xuICAgICAgICBleHBlY3Qoc3RhdGUubWFya3MucHJlc2VudFswXS5jb3JyZWN0bmVzcykudG9CZURlZmluZWQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2ludGVncmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdoYW5kbGVzIGNvbXBsZXggdW5kby9yZWRvIHNlcXVlbmNlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHJvb3RSZWR1Y2VyID0gcmVkdWNlcigpO1xuICAgICAgY29uc3QgbWFya3MxID0gW3sgaWQ6IDEgfV07XG4gICAgICBjb25zdCBtYXJrczIgPSBbeyBpZDogMiB9XTtcbiAgICAgIGNvbnN0IG1hcmtzMyA9IFt7IGlkOiAzIH1dO1xuICAgICAgY29uc3QgbWFya3M0ID0gW3sgaWQ6IDQgfV07XG5cbiAgICAgIGxldCBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHVuZGVmaW5lZCwgeyB0eXBlOiAnQEBJTklUJyB9KTtcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIGNoYW5nZU1hcmtzKG1hcmtzMSkpO1xuICAgICAgc3RhdGUgPSByb290UmVkdWNlcihzdGF0ZSwgY2hhbmdlTWFya3MobWFya3MyKSk7XG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCBjaGFuZ2VNYXJrcyhtYXJrczMpKTtcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIHsgdHlwZTogJ0BAcmVkdXgtdW5kby9VTkRPJyB9KTsgLy8gYmFjayB0byBtYXJrczJcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIHsgdHlwZTogJ0BAcmVkdXgtdW5kby9VTkRPJyB9KTsgLy8gYmFjayB0byBtYXJrczFcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIHsgdHlwZTogJ0BAcmVkdXgtdW5kby9SRURPJyB9KTsgLy8gZm9yd2FyZCB0byBtYXJrczJcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIGNoYW5nZU1hcmtzKG1hcmtzNCkpO1xuXG4gICAgICBleHBlY3Qoc3RhdGUubWFya3MucHJlc2VudCkudG9FcXVhbChtYXJrczQpO1xuICAgICAgZXhwZWN0KHN0YXRlLm1hcmtzLmZ1dHVyZSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnd29ya3Mgd2l0aCBlbXB0eSBzdGF0ZSB0cmFuc2l0aW9ucycsICgpID0+IHtcbiAgICAgIGNvbnN0IHJvb3RSZWR1Y2VyID0gcmVkdWNlcigpO1xuICAgICAgY29uc3QgbWFya3MgPSBbeyBpZDogMSB9XTtcblxuICAgICAgbGV0IHN0YXRlID0gcm9vdFJlZHVjZXIodW5kZWZpbmVkLCB7IHR5cGU6ICdAQElOSVQnIH0pO1xuICAgICAgc3RhdGUgPSByb290UmVkdWNlcihzdGF0ZSwgY2hhbmdlTWFya3MoW10pKTtcbiAgICAgIHN0YXRlID0gcm9vdFJlZHVjZXIoc3RhdGUsIGNoYW5nZU1hcmtzKG1hcmtzKSk7XG4gICAgICBzdGF0ZSA9IHJvb3RSZWR1Y2VyKHN0YXRlLCBjaGFuZ2VNYXJrcyhbXSkpO1xuICAgICAgc3RhdGUgPSByb290UmVkdWNlcihzdGF0ZSwgeyB0eXBlOiAnQEByZWR1eC11bmRvL1VORE8nIH0pO1xuXG4gICAgICBleHBlY3Qoc3RhdGUubWFya3MucHJlc2VudCkudG9FcXVhbChtYXJrcyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFBQSxRQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFELE9BQUE7QUFFQUUsUUFBUSxDQUFDLG1CQUFtQixFQUFFLFlBQU07RUFDbENBLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxZQUFNO0lBQ2pDQyxFQUFFLENBQUMsNEJBQTRCLEVBQUUsWUFBTTtNQUNyQyxJQUFNQyxXQUFXLEdBQUcsSUFBQUMsbUJBQU8sRUFBQyxDQUFDO01BQzdCQyxNQUFNLEtBQUFDLFFBQUEsYUFBUUgsV0FB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
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+
3
+ var _withRootEdge = require("../../shared/line/with-root-edge");
4
+ var _graphingUtils = require("@pie-lib/graphing-utils");
5
+ var _plot = require("@pie-lib/plot");
6
+ var _utils = require("../../../__tests__/utils");
7
+ var xy = _plot.utils.xy;
8
+ jest.mock('@pie-lib/graphing-utils', function () {
9
+ return {
10
+ buildDataPoints: jest.fn().mockReturnValue([]),
11
+ absoluteFromTwoPoints: jest.fn(function () {
12
+ return jest.fn();
13
+ }),
14
+ getAmplitudeAndFreq: jest.fn().mockReturnValue({
15
+ freq: 4,
16
+ amplitude: 1
17
+ })
18
+ };
19
+ });
20
+ jest.mock('../../shared/line/with-root-edge', function () {
21
+ return {
22
+ withRootEdge: jest.fn(),
23
+ rootEdgeComponent: jest.fn()
24
+ };
25
+ });
26
+ describe('Absolute', function () {
27
+ var fnBody;
28
+ var graphProps;
29
+ var root;
30
+ var edge;
31
+ var result;
32
+ beforeEach(function () {
33
+ require('../component');
34
+ fnBody = _withRootEdge.withRootEdge.mock.calls[0][0];
35
+ graphProps = (0, _utils.graphProps)();
36
+ root = xy(0, 0);
37
+ edge = xy(1, 1);
38
+ result = fnBody({
39
+ graphProps: graphProps,
40
+ root: root,
41
+ edge: edge
42
+ });
43
+ });
44
+ it('fnBody is not null', function () {
45
+ expect(fnBody).toBeDefined();
46
+ });
47
+ it('calls buildDataPoints', function () {
48
+ var _graphProps = graphProps,
49
+ domain = _graphProps.domain,
50
+ range = _graphProps.range;
51
+ expect(_graphingUtils.buildDataPoints).toHaveBeenCalledWith(domain, range, root, edge, expect.anything(), true);
52
+ });
53
+ it('calls absoluteFromTwoPoints', function () {
54
+ expect(_graphingUtils.absoluteFromTwoPoints).toHaveBeenCalledWith(root, edge);
55
+ });
56
+ it('returns dataPoints', function () {
57
+ expect(result).toEqual({
58
+ enableCurve: false,
59
+ root: root,
60
+ edge: edge,
61
+ dataPoints: []
62
+ });
63
+ });
64
+ });
65
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2l0aFJvb3RFZGdlIiwicmVxdWlyZSIsIl9ncmFwaGluZ1V0aWxzIiwiX3Bsb3QiLCJfdXRpbHMiLCJ4eSIsInV0aWxzIiwiamVzdCIsIm1vY2siLCJidWlsZERhdGFQb2ludHMiLCJmbiIsIm1vY2tSZXR1cm5WYWx1ZSIsImFic29sdXRlRnJvbVR3b1BvaW50cyIsImdldEFtcGxpdHVkZUFuZEZyZXEiLCJmcmVxIiwiYW1wbGl0dWRlIiwid2l0aFJvb3RFZGdlIiwicm9vdEVkZ2VDb21wb25lbnQiLCJkZXNjcmliZSIsImZuQm9keSIsImdyYXBoUHJvcHMiLCJyb290IiwiZWRnZSIsInJlc3VsdCIsImJlZm9yZUVhY2giLCJjYWxscyIsImdldEdyYXBoUHJvcHMiLCJpdCIsImV4cGVjdCIsInRvQmVEZWZpbmVkIiwiX2dyYXBoUHJvcHMiLCJkb21haW4iLCJyYW5nZSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwiYW55dGhpbmciLCJ0b0VxdWFsIiwiZW5hYmxlQ3VydmUiLCJkYXRhUG9pbnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rvb2xzL2Fic29sdXRlL19fdGVzdHNfXy9jb21wb25lbnQudGVzdC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgd2l0aFJvb3RFZGdlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2xpbmUvd2l0aC1yb290LWVkZ2UnO1xuaW1wb3J0IHsgYWJzb2x1dGVGcm9tVHdvUG9pbnRzLCBidWlsZERhdGFQb2ludHMgfSBmcm9tICdAcGllLWxpYi9ncmFwaGluZy11dGlscyc7XG5pbXBvcnQgeyB1dGlscyB9IGZyb20gJ0BwaWUtbGliL3Bsb3QnO1xuXG5pbXBvcnQgeyBncmFwaFByb3BzIGFzIGdldEdyYXBoUHJvcHMgfSBmcm9tICcuLi8uLi8uLi9fX3Rlc3RzX18vdXRpbHMnO1xuXG5jb25zdCB7IHh5IH0gPSB1dGlscztcblxuamVzdC5tb2NrKCdAcGllLWxpYi9ncmFwaGluZy11dGlscycsICgpID0+ICh7XG4gIGJ1aWxkRGF0YVBvaW50czogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShbXSksXG4gIGFic29sdXRlRnJvbVR3b1BvaW50czogamVzdC5mbigoKSA9PiBqZXN0LmZuKCkpLFxuICBnZXRBbXBsaXR1ZGVBbmRGcmVxOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHsgZnJlcTogNCwgYW1wbGl0dWRlOiAxIH0pLFxufSkpO1xuXG5qZXN0Lm1vY2soJy4uLy4uL3NoYXJlZC9saW5lL3dpdGgtcm9vdC1lZGdlJywgKCkgPT4gKHtcbiAgd2l0aFJvb3RFZGdlOiBqZXN0LmZuKCksXG4gIHJvb3RFZGdlQ29tcG9uZW50OiBqZXN0LmZuKCksXG59KSk7XG5cbmRlc2NyaWJlKCdBYnNvbHV0ZScsICgpID0+IHtcbiAgbGV0IGZuQm9keTtcbiAgbGV0IGdyYXBoUHJvcHM7XG4gIGxldCByb290O1xuICBsZXQgZWRnZTtcbiAgbGV0IHJlc3VsdDtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICByZXF1aXJlKCcuLi9jb21wb25lbnQnKTtcbiAgICBmbkJvZHkgPSB3aXRoUm9vdEVkZ2UubW9jay5jYWxsc1swXVswXTtcbiAgICBncmFwaFByb3BzID0gZ2V0R3JhcGhQcm9wcygpO1xuICAgIHJvb3QgPSB4eSgwLCAwKTtcbiAgICBlZGdlID0geHkoMSwgMSk7XG5cbiAgICByZXN1bHQgPSBmbkJvZHkoeyBncmFwaFByb3BzLCByb290LCBlZGdlIH0pO1xuICB9KTtcblxuICBpdCgnZm5Cb2R5IGlzIG5vdCBudWxsJywgKCkgPT4ge1xuICAgIGV4cGVjdChmbkJvZHkpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBidWlsZERhdGFQb2ludHMnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBkb21haW4sIHJhbmdlIH0gPSBncmFwaFByb3BzO1xuICAgIGV4cGVjdChidWlsZERhdGFQb2ludHMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGRvbWFpbiwgcmFuZ2UsIHJvb3QsIGVkZ2UsIGV4cGVjdC5hbnl0aGluZygpLCB0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ2NhbGxzIGFic29sdXRlRnJvbVR3b1BvaW50cycsICgpID0+IHtcbiAgICBleHBlY3QoYWJzb2x1dGVGcm9tVHdvUG9pbnRzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChyb290LCBlZGdlKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgZGF0YVBvaW50cycsICgpID0+IHtcbiAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHsgZW5hYmxlQ3VydmU6IGZhbHNlLCByb290LCBlZGdlLCBkYXRhUG9pbnRzOiBbXSB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFBQSxhQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxjQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFGLE9BQUE7QUFFQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFFQSxJQUFRSSxFQUFFLEdBQUtDLFdBQUssQ0FBWkQsRUFBRTtBQUVWRSxJQUFJLENBQUNDLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtFQUFBLE9BQU87SUFDMUNDLGVBQWUsRUFBRUYsSUFBSSxDQUFDRyxFQUFFLENBQUMsQ0FBQyxDQUFDQyxlQUFlLENBQUMsRUFBRSxDQUFDO0lBQzlDQyxxQkFBcUIsRUFBRUwsSUFBSSxDQUFDRyxFQUFFLENBQUM7TUFBQSxPQUFNSCxJQUFJLENBQUNHLEVBQUUsQ0FBQyxDQUFDO0lBQUEsRUFBQztJQUMvQ0csbUJBQW1CLEVBQUVOLElBQUksQ0FBQ0csRUFBRSxDQUFDLENBQUMsQ0FBQ0MsZUFBZSxDQUFDO01BQUVHLElBQUksRUFBRSxDQUFDO01BQUVDLFNBQVMsRUFBRTtJQUFFLENBQUM7RUFDMUUsQ0FBQztBQUFBLENBQUMsQ0FBQztBQUVIUixJQUFJLENBQUNDLElBQUksQ0FBQyxrQ0FBa0MsRUFBRTtFQUFBLE9BQU87SUFDbkRRLFlBQVksRUFBRVQsSUFBSSxDQUFDRyxFQUFFLENBQUMsQ0FBQztJQUN2Qk8saUJBQWlCLEVBQUVWLElBQUksQ0FBQ0csRUFBRSxDQUFDO0VBQzdCLENBQUM7QUFBQSxDQUFDLENBQUM7QUFFSFEsUUFBUSxDQUFDLFVBQVUsRUFBRSxZQUFNO0VBQ3pCLElBQUlDLE1BQU07RUFDVixJQUFJQyxVQUFVO0VBQ2QsSUFBSUMsSUFBSTtFQUNSLElBQUlDLElBQUk7RUFDUixJQUFJQyxNQUFNO0VBRVZDLFVBQVUsQ0FBQyxZQUFNO0lBQ2Z2QixPQUFPLENBQUMsY0FBYyxDQUFDO0lBQ3ZCa0IsTUFBTSxHQUFHSCwwQkFBWSxDQUFDUixJQUFJLENBQUNpQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDTCxVQUFVLEdBQUcsSUFBQU0saUJBQWEsRUFBQyxDQUFDO0lBQzVCTCxJQUFJLEdBQUdoQixFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNmaUIsSUFBSSxHQUFHakIsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFZmtCLE1BQU0sR0FBR0osTUFBTSxDQUFDO01BQUVDLFVBQVUsRUFBVkEsVUFBVTtNQUFFQyxJQUFJLEVBQUpBLElBQUk7TUFBRUMsSUFBSSxFQUFKQTtJQUFLLENBQUMsQ0FBQztFQUM3QyxDQUFDLENBQUM7RUFFRkssRUFBRSxDQUFDLG9CQUFvQixFQUFFLFlBQU07SUFDN0JDLE1BQU0sQ0FBQ1QsTUFBTSxDQUFDLENBQUNVLFdBQVcsQ0FBQyxDQUFDO0VBQzlCLENBQUMsQ0FBQztFQUVGRixFQUFFLENBQUMsdUJBQXVCLEVBQUUsWUFBTTtJQUNoQyxJQUFBRyxXQUFBLEdBQTBCVixVQUFVO01BQTVCVyxNQUFNLEdBQUFELFdBQUEsQ0FBTkMsTUFBTTtNQUFFQyxLQUFLLEdBQUFGLFdBQUEsQ0FBTEUsS0FBSztJQUNyQkosTUFBTSxDQUFDbkIsOEJBQWUsQ0FBQyxDQUFDd0Isb0JBQW9CLENBQUNGLE1BQU0sRUFBRUMsS0FBSyxFQUFFWCxJQUFJLEVBQUVDLElBQUksRUFBRU0sTUFBTSxDQUFDTSxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztFQUNsRyxDQUFDLENBQUM7RUFFRlAsRUFBRSxDQUFDLDZCQUE2QixFQUFFLFlBQU07SUFDdENDLE1BQU0sQ0FBQ2hCLG9DQUFxQixDQUFDLENBQUNxQixvQkFBb0IsQ0FBQ1osSUFBSSxFQUFFQyxJQUFJLENBQUM7RUFDaEUsQ0FBQyxDQUFDO0VBRUZLLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxZQUFNO0lBQzdCQyxNQUFNLENBQUNMLE1BQU0sQ0FBQyxDQUFDWSxPQUFPLENBQUM7TUFBRUMsV0FBVyxFQUFFLEtBQUs7TUFBRWYsSUFBSSxFQUFKQSxJQUFJO01BQUVDLElBQUksRUFBSkEsSUFBSTtNQUFFZSxVQUFVLEVBQUU7SUFBRyxDQUFDLENBQUM7RUFDNUUsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
+ var _testUtils = require("@pie-lib/test-utils");
6
+ var _react = _interopRequireDefault(require("react"));
7
+ var _bgCircle = require("../bg-circle");
8
+ var _utils = require("../../../__tests__/utils");
9
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
11
+ describe('BgCircle', function () {
12
+ var onChange = jest.fn();
13
+ var renderComponent = function renderComponent(extras) {
14
+ var defaults = {
15
+ classes: {},
16
+ className: 'className',
17
+ onChange: onChange,
18
+ x: 0,
19
+ y: 0,
20
+ graphProps: (0, _utils.graphProps)()
21
+ };
22
+ var props = _objectSpread(_objectSpread({}, defaults), extras);
23
+ return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bgCircle.BgCircle, props));
24
+ };
25
+ describe('rendering', function () {
26
+ it('renders without crashing', function () {
27
+ var _renderComponent = renderComponent(),
28
+ container = _renderComponent.container;
29
+ expect(container.firstChild).toBeInTheDocument();
30
+ });
31
+ });
32
+ });
33
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGVzdFV0aWxzIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfYmdDaXJjbGUiLCJfdXRpbHMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImRlc2NyaWJlIiwib25DaGFuZ2UiLCJqZXN0IiwiZm4iLCJyZW5kZXJDb21wb25lbnQiLCJleHRyYXMiLCJkZWZhdWx0cyIsImNsYXNzZXMiLCJjbGFzc05hbWUiLCJ4IiwieSIsImdyYXBoUHJvcHMiLCJwcm9wcyIsInJlbmRlciIsImNyZWF0ZUVsZW1lbnQiLCJCZ0NpcmNsZSIsIml0IiwiX3JlbmRlckNvbXBvbmVudCIsImNvbnRhaW5lciIsImV4cGVjdCIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90b29scy9jaXJjbGUvX190ZXN0c19fL2JnLWNpcmNsZS50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZW5kZXIgfSBmcm9tICdAcGllLWxpYi90ZXN0LXV0aWxzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBCZ0NpcmNsZSB9IGZyb20gJy4uL2JnLWNpcmNsZSc7XG5pbXBvcnQgeyBncmFwaFByb3BzIH0gZnJvbSAnLi4vLi4vLi4vX190ZXN0c19fL3V0aWxzJztcblxuZGVzY3JpYmUoJ0JnQ2lyY2xlJywgKCkgPT4ge1xuICBsZXQgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgY2xhc3NOYW1lOiAnY2xhc3NOYW1lJyxcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICBncmFwaFByb3BzOiBncmFwaFByb3BzKCksXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuICAgIHJldHVybiByZW5kZXIoPEJnQ2lyY2xlIHsuLi5wcm9wc30gLz4pO1xuICB9O1xuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFBQSxVQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxTQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFKLE9BQUE7QUFBc0QsU0FBQUssUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FBQSxRQUFBQSxDQUFBLE9BQUFGLE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLE9BQUFhLE9BQUEsV0FBQWQsQ0FBQSxRQUFBZSxnQkFBQSxhQUFBaEIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsQ0FBQUQsQ0FBQSxTQUFBRSxNQUFBLENBQUFjLHlCQUFBLEdBQUFkLE1BQUEsQ0FBQWUsZ0JBQUEsQ0FBQWxCLENBQUEsRUFBQUcsTUFBQSxDQUFBYyx5QkFBQSxDQUFBZixDQUFBLEtBQUFILE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLEdBQUFhLE9BQUEsV0FBQWQsQ0FBQSxJQUFBRSxNQUFBLENBQUFnQixjQUFBLENBQUFuQixDQUFBLEVBQUFDLENBQUEsRUFBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBTixDQUFBLEVBQUFELENBQUEsaUJBQUFELENBQUE7QUFFdERvQixRQUFRLENBQUMsVUFBVSxFQUFFLFlBQU07RUFDekIsSUFBSUMsUUFBUSxHQUFHQyxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO0VBQ3hCLElBQU1DLGVBQWUsR0FBRyxTQUFsQkEsZUFBZUEsQ0FBSUMsTUFBTSxFQUFLO0lBQ2xDLElBQU1DLFFBQVEsR0FBRztNQUNmQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO01BQ1hDLFNBQVMsRUFBRSxXQUFXO01BQ3RCUCxRQUFRLEVBQVJBLFFBQVE7TUFDUlEsQ0FBQyxFQUFFLENBQUM7TUFDSkMsQ0FBQyxFQUFFLENBQUM7TUFDSkMsVUFBVSxFQUFFLElBQUFBLGlCQUFVLEVBQUM7SUFDekIsQ0FBQztJQUNELElBQU1DLEtBQUssR0FBQXBCLGFBQUEsQ0FBQUEsYUFBQSxLQUFRYyxRQUFRLEdBQUtELE1BQU0sQ0FBRTtJQUN4QyxPQUFPLElBQUFRLGlCQUFNLGVBQUN0QyxNQUFBLFlBQUF1QyxhQUFBLENBQUNyQyxTQUFBLENBQUFzQyxRQUFRLEVBQUtILEtBQVEsQ0FBQyxDQUFDO0VBQ3hDLENBQUM7RUFDRFosUUFBUSxDQUFDLFdBQVcsRUFBRSxZQUFNO0lBQzFCZ0IsRUFBRSxDQUFDLDBCQUEwQixFQUFFLFlBQU07TUFDbkMsSUFBQUMsZ0JBQUEsR0FBc0JiLGVBQWUsQ0FBQyxDQUFDO1FBQS9CYyxTQUFTLEdBQUFELGdCQUFBLENBQVRDLFNBQVM7TUFDakJDLE1BQU0sQ0FBQ0QsU0FBUyxDQUFDRSxVQUFVLENBQUMsQ0FBQ0MsaUJBQWlCLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7QUFDSixDQUFDLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=