@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.
- package/CHANGELOG.md +18 -30
- package/LICENSE.md +5 -0
- package/lib/axis/arrow.js +1 -1
- package/lib/axis/axes.js +1 -1
- package/lib/axis/index.js +1 -1
- package/lib/bg.js +1 -1
- package/lib/container/actions.js +1 -1
- package/lib/container/index.js +1 -1
- package/lib/container/marks.js +1 -1
- package/lib/container/middleware.js +1 -1
- package/lib/container/reducer.js +1 -1
- package/lib/coordinates-label.js +1 -1
- package/lib/graph-with-controls.js +1 -1
- package/lib/graph.js +1 -1
- package/lib/grid-setup.js +1 -1
- package/lib/grid.js +1 -1
- package/lib/index.js +1 -1
- package/lib/key-legend.js +1 -1
- package/lib/label-svg-icon.js +1 -1
- package/lib/labels.js +1 -1
- package/lib/mark-label.js +1 -1
- package/lib/toggle-bar.js +1 -1
- package/lib/tool-menu.js +1 -1
- package/lib/tools/absolute/component.js +1 -1
- package/lib/tools/absolute/index.js +1 -1
- package/lib/tools/circle/bg-circle.js +1 -1
- package/lib/tools/circle/component.js +1 -1
- package/lib/tools/circle/index.js +1 -1
- package/lib/tools/exponential/component.js +1 -1
- package/lib/tools/exponential/index.js +1 -1
- package/lib/tools/index.js +1 -1
- package/lib/tools/line/component.js +1 -1
- package/lib/tools/line/index.js +1 -1
- package/lib/tools/parabola/component.js +1 -1
- package/lib/tools/parabola/index.js +1 -1
- package/lib/tools/point/component.js +1 -1
- package/lib/tools/point/index.js +1 -1
- package/lib/tools/polygon/component.js +1 -1
- package/lib/tools/polygon/index.js +1 -1
- package/lib/tools/polygon/line.js +1 -1
- package/lib/tools/polygon/polygon.js +1 -1
- package/lib/tools/ray/component.js +1 -1
- package/lib/tools/ray/index.js +1 -1
- package/lib/tools/segment/component.js +1 -1
- package/lib/tools/segment/index.js +1 -1
- package/lib/tools/shared/arrow-head.js +1 -1
- package/lib/tools/shared/icons/CorrectSVG.js +1 -1
- package/lib/tools/shared/icons/IncorrectSVG.js +1 -1
- package/lib/tools/shared/icons/MissingSVG.js +1 -1
- package/lib/tools/shared/line/index.js +1 -1
- package/lib/tools/shared/line/line-path.js +1 -1
- package/lib/tools/shared/line/with-root-edge.js +1 -1
- package/lib/tools/shared/point/arrow-point.js +1 -1
- package/lib/tools/shared/point/arrow.js +1 -1
- package/lib/tools/shared/point/base-point.js +1 -1
- package/lib/tools/shared/point/index.js +1 -1
- package/lib/tools/shared/styles.js +1 -1
- package/lib/tools/shared/types.js +1 -1
- package/lib/tools/sine/component.js +1 -1
- package/lib/tools/sine/index.js +1 -1
- package/lib/tools/vector/component.js +1 -1
- package/lib/tools/vector/index.js +1 -1
- package/lib/undo-redo.js +1 -1
- package/lib/use-debounce.js +1 -1
- package/lib/utils.js +1 -1
- package/package.json +4 -4
- package/lib/__tests__/bg.test.js +0 -282
- package/lib/__tests__/coordinates-label.test.js +0 -276
- package/lib/__tests__/graph-with-controls.test.js +0 -275
- package/lib/__tests__/graph.test.js +0 -927
- package/lib/__tests__/grid-setup.test.js +0 -729
- package/lib/__tests__/grid.test.js +0 -29
- package/lib/__tests__/key-legend.test.js +0 -321
- package/lib/__tests__/label-svg-icon.test.js +0 -373
- package/lib/__tests__/labels.test.js +0 -61
- package/lib/__tests__/mark-label.test.js +0 -133
- package/lib/__tests__/toggle-bar.test.js +0 -197
- package/lib/__tests__/tool-menu.test.js +0 -151
- package/lib/__tests__/undo-redo.test.js +0 -31
- package/lib/__tests__/use-debounce.test.js +0 -24
- package/lib/__tests__/utils.js +0 -70
- package/lib/__tests__/utils.test.js +0 -123
- package/lib/axis/__tests__/arrow.test.js +0 -60
- package/lib/axis/__tests__/axes.test.js +0 -195
- package/lib/container/__tests__/actions.test.js +0 -108
- package/lib/container/__tests__/index.test.js +0 -503
- package/lib/container/__tests__/marks.test.js +0 -259
- package/lib/container/__tests__/middleware.test.js +0 -244
- package/lib/container/__tests__/reducer.test.js +0 -450
- package/lib/tools/absolute/__tests__/component.test.js +0 -65
- package/lib/tools/circle/__tests__/bg-circle.test.js +0 -33
- package/lib/tools/circle/__tests__/component.test.js +0 -615
- package/lib/tools/circle/__tests__/index.test.js +0 -576
- package/lib/tools/exponential/__tests__/component.test.js +0 -64
- package/lib/tools/exponential/__tests__/index.test.js +0 -828
- package/lib/tools/line/__tests__/component.test.js +0 -45
- package/lib/tools/parabola/__tests__/component.test.js +0 -64
- package/lib/tools/parabola/__tests__/index.test.js +0 -564
- package/lib/tools/point/__tests__/component.test.js +0 -434
- package/lib/tools/point/__tests__/index.test.js +0 -262
- package/lib/tools/polygon/__tests__/component.test.js +0 -485
- package/lib/tools/polygon/__tests__/index.test.js +0 -303
- package/lib/tools/polygon/__tests__/line.test.js +0 -50
- package/lib/tools/polygon/__tests__/polygon.test.js +0 -85
- package/lib/tools/ray/__tests__/component.test.js +0 -35
- package/lib/tools/segment/__tests__/component.test.js +0 -35
- package/lib/tools/shared/__tests__/arrow-head.test.js +0 -45
- package/lib/tools/shared/line/__tests__/index.test.js +0 -124
- package/lib/tools/shared/line/__tests__/line-path.test.js +0 -62
- package/lib/tools/shared/line/__tests__/with-root-edge.test.js +0 -90
- package/lib/tools/shared/point/__tests__/arrow-point.test.js +0 -127
- package/lib/tools/shared/point/__tests__/base-point.test.js +0 -122
- package/lib/tools/sine/__tests__/component.test.js +0 -72
- 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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
|