@pie-lib/plot 2.27.3-next.2 → 2.27.4-next.0

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.
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
+ var _react = require("@testing-library/react");
6
+ var _react2 = _interopRequireDefault(require("react"));
7
+ var _root = require("../root");
8
+ var _d3Selection = require("d3-selection");
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
+ jest.mock('d3-selection', function () {
12
+ return {
13
+ select: jest.fn(),
14
+ mouse: jest.fn()
15
+ };
16
+ });
17
+ var scaleMock = function scaleMock() {
18
+ var fn = jest.fn(function (n) {
19
+ return n;
20
+ });
21
+ fn.invert = jest.fn(function (n) {
22
+ return n;
23
+ });
24
+ return fn;
25
+ };
26
+ var graphProps = function graphProps() {
27
+ return {
28
+ scale: {
29
+ x: scaleMock(),
30
+ y: scaleMock()
31
+ },
32
+ snap: {
33
+ x: jest.fn(function (n) {
34
+ return n;
35
+ }),
36
+ y: jest.fn(function (n) {
37
+ return n;
38
+ })
39
+ },
40
+ domain: {
41
+ min: 0,
42
+ max: 1,
43
+ step: 1
44
+ },
45
+ range: {
46
+ min: 0,
47
+ max: 1,
48
+ step: 1
49
+ },
50
+ size: {
51
+ width: 400,
52
+ height: 400
53
+ }
54
+ };
55
+ };
56
+ describe('root', function () {
57
+ var mockOn;
58
+ var defaultProps;
59
+ beforeEach(function () {
60
+ mockOn = jest.fn();
61
+ _d3Selection.select.mockReturnValue({
62
+ on: mockOn
63
+ });
64
+ _d3Selection.mouse.mockReturnValue([0, 0]);
65
+ defaultProps = {
66
+ classes: {},
67
+ graphProps: graphProps()
68
+ };
69
+ });
70
+ afterEach(function () {
71
+ (0, _react.cleanup)();
72
+ jest.clearAllMocks();
73
+ });
74
+ it('renders with children', function () {
75
+ var _render = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_root.Root, defaultProps, "hi")),
76
+ container = _render.container,
77
+ getByText = _render.getByText;
78
+ expect(container.firstChild).toBeInTheDocument();
79
+ expect(getByText('hi')).toBeInTheDocument();
80
+ });
81
+ describe('logic', function () {
82
+ describe('mousemove', function () {
83
+ describe('mount/unmount', function () {
84
+ it('adds mousemove listener on componentDidMount', function () {
85
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_root.Root, defaultProps, "hi"));
86
+
87
+ // Verify that select was called with the g element
88
+ expect(_d3Selection.select).toHaveBeenCalled();
89
+
90
+ // Verify that on() was called with 'mousemove' and a function
91
+ expect(mockOn).toHaveBeenCalledWith('mousemove', expect.any(Function));
92
+ });
93
+ it('removes mousemove listener on componentWillUnmount', function () {
94
+ var _render2 = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_root.Root, defaultProps, "hi")),
95
+ unmount = _render2.unmount;
96
+
97
+ // Clear previous calls to isolate unmount behavior
98
+ mockOn.mockClear();
99
+ _d3Selection.select.mockClear();
100
+ unmount();
101
+
102
+ // Verify that select was called during unmount
103
+ expect(_d3Selection.select).toHaveBeenCalled();
104
+
105
+ // Verify that on() was called with 'mousemove' and null to remove the listener
106
+ expect(mockOn).toHaveBeenCalledWith('mousemove', null);
107
+ });
108
+ });
109
+ describe('mouseMove function', function () {
110
+ it('calls mouse with correct arguments', function () {
111
+ var onMouseMove = jest.fn();
112
+ var gp = graphProps();
113
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
114
+ onMouseMove: onMouseMove,
115
+ graphProps: gp
116
+ });
117
+ var mockNode = document.createElement('div');
118
+ var mockSelection = {
119
+ _groups: [[mockNode]],
120
+ node: function node() {
121
+ return mockNode;
122
+ }
123
+ };
124
+
125
+ // Mock select to return our mockSelection
126
+ _d3Selection.select.mockReturnValue(_objectSpread(_objectSpread({}, mockSelection), {}, {
127
+ on: function on(event, handler) {
128
+ mockOn(event, handler);
129
+ // When 'mousemove' is registered, immediately test it
130
+ if (event === 'mousemove' && handler) {
131
+ _d3Selection.mouse.mockReturnValue([10, 20]);
132
+ // Handler is bound with mockSelection as first arg, so call with no args
133
+ handler();
134
+ }
135
+ }
136
+ }));
137
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_root.Root, props, "hi"));
138
+
139
+ // Verify mouse was called with the correct node
140
+ expect(_d3Selection.mouse).toHaveBeenCalledWith(mockNode);
141
+ });
142
+ it('calls scale.x.invert and scale.y.invert', function () {
143
+ var onMouseMove = jest.fn();
144
+ var gp = graphProps();
145
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
146
+ onMouseMove: onMouseMove,
147
+ graphProps: gp
148
+ });
149
+ var mockNode = document.createElement('div');
150
+ var mockSelection = {
151
+ _groups: [[mockNode]],
152
+ node: function node() {
153
+ return mockNode;
154
+ }
155
+ };
156
+ _d3Selection.select.mockReturnValue(_objectSpread(_objectSpread({}, mockSelection), {}, {
157
+ on: function on(event, handler) {
158
+ mockOn(event, handler);
159
+ if (event === 'mousemove' && handler) {
160
+ _d3Selection.mouse.mockReturnValue([15, 25]);
161
+ handler();
162
+ }
163
+ }
164
+ }));
165
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_root.Root, props, "hi"));
166
+ expect(gp.scale.x.invert).toHaveBeenCalledWith(15);
167
+ expect(gp.scale.y.invert).toHaveBeenCalledWith(25);
168
+ });
169
+ it('calls snap.x and snap.y with inverted coordinates', function () {
170
+ var onMouseMove = jest.fn();
171
+ var gp = graphProps();
172
+ gp.scale.x.invert = jest.fn().mockReturnValue(5);
173
+ gp.scale.y.invert = jest.fn().mockReturnValue(10);
174
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
175
+ onMouseMove: onMouseMove,
176
+ graphProps: gp
177
+ });
178
+ var mockNode = document.createElement('div');
179
+ var mockSelection = {
180
+ _groups: [[mockNode]],
181
+ node: function node() {
182
+ return mockNode;
183
+ }
184
+ };
185
+ _d3Selection.select.mockReturnValue(_objectSpread(_objectSpread({}, mockSelection), {}, {
186
+ on: function on(event, handler) {
187
+ mockOn(event, handler);
188
+ if (event === 'mousemove' && handler) {
189
+ _d3Selection.mouse.mockReturnValue([15, 25]);
190
+ handler();
191
+ }
192
+ }
193
+ }));
194
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_root.Root, props, "hi"));
195
+ expect(gp.snap.x).toHaveBeenCalledWith(5);
196
+ expect(gp.snap.y).toHaveBeenCalledWith(10);
197
+ });
198
+ it('calls onMouseMove handler with snapped coordinates', function () {
199
+ var onMouseMove = jest.fn();
200
+ var gp = graphProps();
201
+ gp.scale.x.invert = jest.fn().mockReturnValue(7);
202
+ gp.scale.y.invert = jest.fn().mockReturnValue(14);
203
+ gp.snap.x = jest.fn().mockReturnValue(10);
204
+ gp.snap.y = jest.fn().mockReturnValue(15);
205
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
206
+ onMouseMove: onMouseMove,
207
+ graphProps: gp
208
+ });
209
+ var mockNode = document.createElement('div');
210
+ var mockSelection = {
211
+ _groups: [[mockNode]],
212
+ node: function node() {
213
+ return mockNode;
214
+ }
215
+ };
216
+ _d3Selection.select.mockReturnValue(_objectSpread(_objectSpread({}, mockSelection), {}, {
217
+ on: function on(event, handler) {
218
+ mockOn(event, handler);
219
+ if (event === 'mousemove' && handler) {
220
+ _d3Selection.mouse.mockReturnValue([100, 200]);
221
+ handler();
222
+ }
223
+ }
224
+ }));
225
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_root.Root, props, "hi"));
226
+ expect(onMouseMove).toHaveBeenCalledWith({
227
+ x: 10,
228
+ y: 15
229
+ });
230
+ });
231
+ it('does not call onMouseMove when handler is not provided', function () {
232
+ var gp = graphProps();
233
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
234
+ graphProps: gp
235
+ });
236
+ var mockNode = document.createElement('div');
237
+ var mockSelection = {
238
+ _groups: [[mockNode]],
239
+ node: function node() {
240
+ return mockNode;
241
+ }
242
+ };
243
+ _d3Selection.select.mockReturnValue(_objectSpread(_objectSpread({}, mockSelection), {}, {
244
+ on: function on(event, handler) {
245
+ mockOn(event, handler);
246
+ if (event === 'mousemove' && handler) {
247
+ _d3Selection.mouse.mockReturnValue([100, 200]);
248
+ // Should not throw error when onMouseMove is not provided
249
+ expect(function () {
250
+ return handler();
251
+ }).not.toThrow();
252
+ }
253
+ }
254
+ }));
255
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_root.Root, props, "hi"));
256
+
257
+ // Verify scale methods were not called (early return in mouseMove)
258
+ expect(gp.scale.x.invert).not.toHaveBeenCalled();
259
+ expect(gp.scale.y.invert).not.toHaveBeenCalled();
260
+ });
261
+ });
262
+ });
263
+ });
264
+ });
265
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX3JlYWN0MiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcm9vdCIsIl9kM1NlbGVjdGlvbiIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiamVzdCIsIm1vY2siLCJzZWxlY3QiLCJmbiIsIm1vdXNlIiwic2NhbGVNb2NrIiwibiIsImludmVydCIsImdyYXBoUHJvcHMiLCJzY2FsZSIsIngiLCJ5Iiwic25hcCIsImRvbWFpbiIsIm1pbiIsIm1heCIsInN0ZXAiLCJyYW5nZSIsInNpemUiLCJ3aWR0aCIsImhlaWdodCIsImRlc2NyaWJlIiwibW9ja09uIiwiZGVmYXVsdFByb3BzIiwiYmVmb3JlRWFjaCIsIm1vY2tSZXR1cm5WYWx1ZSIsIm9uIiwiY2xhc3NlcyIsImFmdGVyRWFjaCIsImNsZWFudXAiLCJjbGVhckFsbE1vY2tzIiwiaXQiLCJfcmVuZGVyIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsIlJvb3QiLCJjb250YWluZXIiLCJnZXRCeVRleHQiLCJleHBlY3QiLCJmaXJzdENoaWxkIiwidG9CZUluVGhlRG9jdW1lbnQiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJhbnkiLCJGdW5jdGlvbiIsIl9yZW5kZXIyIiwidW5tb3VudCIsIm1vY2tDbGVhciIsIm9uTW91c2VNb3ZlIiwiZ3AiLCJwcm9wcyIsIm1vY2tOb2RlIiwiZG9jdW1lbnQiLCJtb2NrU2VsZWN0aW9uIiwiX2dyb3VwcyIsIm5vZGUiLCJldmVudCIsImhhbmRsZXIiLCJub3QiLCJ0b1Rocm93Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9yb290LnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlciwgY2xlYW51cCB9IGZyb20gJ0B0ZXN0aW5nLWxpYnJhcnkvcmVhY3QnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJvb3QgfSBmcm9tICcuLi9yb290JztcbmltcG9ydCB7IHNlbGVjdCwgbW91c2UgfSBmcm9tICdkMy1zZWxlY3Rpb24nO1xuXG5qZXN0Lm1vY2soJ2QzLXNlbGVjdGlvbicsICgpID0+ICh7XG4gIHNlbGVjdDogamVzdC5mbigpLFxuICBtb3VzZTogamVzdC5mbigpLFxufSkpO1xuXG5jb25zdCBzY2FsZU1vY2sgPSAoKSA9PiB7XG4gIGNvbnN0IGZuID0gamVzdC5mbigobikgPT4gbik7XG4gIGZuLmludmVydCA9IGplc3QuZm4oKG4pID0+IG4pO1xuICByZXR1cm4gZm47XG59O1xuXG5jb25zdCBncmFwaFByb3BzID0gKCkgPT4gKHtcbiAgc2NhbGU6IHtcbiAgICB4OiBzY2FsZU1vY2soKSxcbiAgICB5OiBzY2FsZU1vY2soKSxcbiAgfSxcbiAgc25hcDoge1xuICAgIHg6IGplc3QuZm4oKG4pID0+IG4pLFxuICAgIHk6IGplc3QuZm4oKG4pID0+IG4pLFxuICB9LFxuICBkb21haW46IHtcbiAgICBtaW46IDAsXG4gICAgbWF4OiAxLFxuICAgIHN0ZXA6IDEsXG4gIH0sXG4gIHJhbmdlOiB7XG4gICAgbWluOiAwLFxuICAgIG1heDogMSxcbiAgICBzdGVwOiAxLFxuICB9LFxuICBzaXplOiB7XG4gICAgd2lkdGg6IDQwMCxcbiAgICBoZWlnaHQ6IDQwMCxcbiAgfSxcbn0pO1xuXG5kZXNjcmliZSgncm9vdCcsICgpID0+IHtcbiAgbGV0IG1vY2tPbjtcbiAgbGV0IGRlZmF1bHRQcm9wcztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBtb2NrT24gPSBqZXN0LmZuKCk7XG4gICAgc2VsZWN0Lm1vY2tSZXR1cm5WYWx1ZSh7XG4gICAgICBvbjogbW9ja09uLFxuICAgIH0pO1xuICAgIG1vdXNlLm1vY2tSZXR1cm5WYWx1ZShbMCwgMF0pO1xuXG4gICAgZGVmYXVsdFByb3BzID0ge1xuICAgICAgY2xhc3Nlczoge30sXG4gICAgICBncmFwaFByb3BzOiBncmFwaFByb3BzKCksXG4gICAgfTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBjbGVhbnVwKCk7XG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIHdpdGggY2hpbGRyZW4nLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIsIGdldEJ5VGV4dCB9ID0gcmVuZGVyKFxuICAgICAgPFJvb3Qgey4uLmRlZmF1bHRQcm9wc30+aGk8L1Jvb3Q+XG4gICAgKTtcbiAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgZXhwZWN0KGdldEJ5VGV4dCgnaGknKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2xvZ2ljJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdtb3VzZW1vdmUnLCAoKSA9PiB7XG4gICAgICBkZXNjcmliZSgnbW91bnQvdW5tb3VudCcsICgpID0+IHtcbiAgICAgICAgaXQoJ2FkZHMgbW91c2Vtb3ZlIGxpc3RlbmVyIG9uIGNvbXBvbmVudERpZE1vdW50JywgKCkgPT4ge1xuICAgICAgICAgIHJlbmRlcig8Um9vdCB7Li4uZGVmYXVsdFByb3BzfT5oaTwvUm9vdD4pO1xuXG4gICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgc2VsZWN0IHdhcyBjYWxsZWQgd2l0aCB0aGUgZyBlbGVtZW50XG4gICAgICAgICAgZXhwZWN0KHNlbGVjdCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgb24oKSB3YXMgY2FsbGVkIHdpdGggJ21vdXNlbW92ZScgYW5kIGEgZnVuY3Rpb25cbiAgICAgICAgICBleHBlY3QobW9ja09uKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnbW91c2Vtb3ZlJywgZXhwZWN0LmFueShGdW5jdGlvbikpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgncmVtb3ZlcyBtb3VzZW1vdmUgbGlzdGVuZXIgb24gY29tcG9uZW50V2lsbFVubW91bnQnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyB1bm1vdW50IH0gPSByZW5kZXIoPFJvb3Qgey4uLmRlZmF1bHRQcm9wc30+aGk8L1Jvb3Q+KTtcblxuICAgICAgICAgIC8vIENsZWFyIHByZXZpb3VzIGNhbGxzIHRvIGlzb2xhdGUgdW5tb3VudCBiZWhhdmlvclxuICAgICAgICAgIG1vY2tPbi5tb2NrQ2xlYXIoKTtcbiAgICAgICAgICBzZWxlY3QubW9ja0NsZWFyKCk7XG5cbiAgICAgICAgICB1bm1vdW50KCk7XG5cbiAgICAgICAgICAvLyBWZXJpZnkgdGhhdCBzZWxlY3Qgd2FzIGNhbGxlZCBkdXJpbmcgdW5tb3VudFxuICAgICAgICAgIGV4cGVjdChzZWxlY3QpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcblxuICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IG9uKCkgd2FzIGNhbGxlZCB3aXRoICdtb3VzZW1vdmUnIGFuZCBudWxsIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXJcbiAgICAgICAgICBleHBlY3QobW9ja09uKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnbW91c2Vtb3ZlJywgbnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdtb3VzZU1vdmUgZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgICAgIGl0KCdjYWxscyBtb3VzZSB3aXRoIGNvcnJlY3QgYXJndW1lbnRzJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gamVzdC5mbigpO1xuICAgICAgICAgIGNvbnN0IGdwID0gZ3JhcGhQcm9wcygpO1xuICAgICAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICAgICAgb25Nb3VzZU1vdmUsXG4gICAgICAgICAgICBncmFwaFByb3BzOiBncCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgbW9ja05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICBjb25zdCBtb2NrU2VsZWN0aW9uID0ge1xuICAgICAgICAgICAgX2dyb3VwczogW1ttb2NrTm9kZV1dLFxuICAgICAgICAgICAgbm9kZTogKCkgPT4gbW9ja05vZGUsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIE1vY2sgc2VsZWN0IHRvIHJldHVybiBvdXIgbW9ja1NlbGVjdGlvblxuICAgICAgICAgIHNlbGVjdC5tb2NrUmV0dXJuVmFsdWUoe1xuICAgICAgICAgICAgLi4ubW9ja1NlbGVjdGlvbixcbiAgICAgICAgICAgIG9uOiAoZXZlbnQsIGhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgICAgbW9ja09uKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgLy8gV2hlbiAnbW91c2Vtb3ZlJyBpcyByZWdpc3RlcmVkLCBpbW1lZGlhdGVseSB0ZXN0IGl0XG4gICAgICAgICAgICAgIGlmIChldmVudCA9PT0gJ21vdXNlbW92ZScgJiYgaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIG1vdXNlLm1vY2tSZXR1cm5WYWx1ZShbMTAsIDIwXSk7XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlciBpcyBib3VuZCB3aXRoIG1vY2tTZWxlY3Rpb24gYXMgZmlyc3QgYXJnLCBzbyBjYWxsIHdpdGggbm8gYXJnc1xuICAgICAgICAgICAgICAgIGhhbmRsZXIoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJlbmRlcig8Um9vdCB7Li4ucHJvcHN9PmhpPC9Sb290Pik7XG5cbiAgICAgICAgICAvLyBWZXJpZnkgbW91c2Ugd2FzIGNhbGxlZCB3aXRoIHRoZSBjb3JyZWN0IG5vZGVcbiAgICAgICAgICBleHBlY3QobW91c2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKG1vY2tOb2RlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2NhbGxzIHNjYWxlLnguaW52ZXJ0IGFuZCBzY2FsZS55LmludmVydCcsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBvbk1vdXNlTW92ZSA9IGplc3QuZm4oKTtcbiAgICAgICAgICBjb25zdCBncCA9IGdyYXBoUHJvcHMoKTtcbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgICAgIG9uTW91c2VNb3ZlLFxuICAgICAgICAgICAgZ3JhcGhQcm9wczogZ3AsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IG1vY2tOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgY29uc3QgbW9ja1NlbGVjdGlvbiA9IHtcbiAgICAgICAgICAgIF9ncm91cHM6IFtbbW9ja05vZGVdXSxcbiAgICAgICAgICAgIG5vZGU6ICgpID0+IG1vY2tOb2RlLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBzZWxlY3QubW9ja1JldHVyblZhbHVlKHtcbiAgICAgICAgICAgIC4uLm1vY2tTZWxlY3Rpb24sXG4gICAgICAgICAgICBvbjogKGV2ZW50LCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICAgIG1vY2tPbihldmVudCwgaGFuZGxlcik7XG4gICAgICAgICAgICAgIGlmIChldmVudCA9PT0gJ21vdXNlbW92ZScgJiYgaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIG1vdXNlLm1vY2tSZXR1cm5WYWx1ZShbMTUsIDI1XSk7XG4gICAgICAgICAgICAgICAgaGFuZGxlcigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmVuZGVyKDxSb290IHsuLi5wcm9wc30+aGk8L1Jvb3Q+KTtcblxuICAgICAgICAgIGV4cGVjdChncC5zY2FsZS54LmludmVydCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoMTUpO1xuICAgICAgICAgIGV4cGVjdChncC5zY2FsZS55LmludmVydCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoMjUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnY2FsbHMgc25hcC54IGFuZCBzbmFwLnkgd2l0aCBpbnZlcnRlZCBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBvbk1vdXNlTW92ZSA9IGplc3QuZm4oKTtcbiAgICAgICAgICBjb25zdCBncCA9IGdyYXBoUHJvcHMoKTtcbiAgICAgICAgICBncC5zY2FsZS54LmludmVydCA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoNSk7XG4gICAgICAgICAgZ3Auc2NhbGUueS5pbnZlcnQgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDEwKTtcbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgICAgIG9uTW91c2VNb3ZlLFxuICAgICAgICAgICAgZ3JhcGhQcm9wczogZ3AsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IG1vY2tOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgY29uc3QgbW9ja1NlbGVjdGlvbiA9IHtcbiAgICAgICAgICAgIF9ncm91cHM6IFtbbW9ja05vZGVdXSxcbiAgICAgICAgICAgIG5vZGU6ICgpID0+IG1vY2tOb2RlLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBzZWxlY3QubW9ja1JldHVyblZhbHVlKHtcbiAgICAgICAgICAgIC4uLm1vY2tTZWxlY3Rpb24sXG4gICAgICAgICAgICBvbjogKGV2ZW50LCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICAgIG1vY2tPbihldmVudCwgaGFuZGxlcik7XG4gICAgICAgICAgICAgIGlmIChldmVudCA9PT0gJ21vdXNlbW92ZScgJiYgaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIG1vdXNlLm1vY2tSZXR1cm5WYWx1ZShbMTUsIDI1XSk7XG4gICAgICAgICAgICAgICAgaGFuZGxlcigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmVuZGVyKDxSb290IHsuLi5wcm9wc30+aGk8L1Jvb3Q+KTtcblxuICAgICAgICAgIGV4cGVjdChncC5zbmFwLngpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDUpO1xuICAgICAgICAgIGV4cGVjdChncC5zbmFwLnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDEwKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2NhbGxzIG9uTW91c2VNb3ZlIGhhbmRsZXIgd2l0aCBzbmFwcGVkIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gamVzdC5mbigpO1xuICAgICAgICAgIGNvbnN0IGdwID0gZ3JhcGhQcm9wcygpO1xuICAgICAgICAgIGdwLnNjYWxlLnguaW52ZXJ0ID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSg3KTtcbiAgICAgICAgICBncC5zY2FsZS55LmludmVydCA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMTQpO1xuICAgICAgICAgIGdwLnNuYXAueCA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMTApO1xuICAgICAgICAgIGdwLnNuYXAueSA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMTUpO1xuXG4gICAgICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgICAgICBvbk1vdXNlTW92ZSxcbiAgICAgICAgICAgIGdyYXBoUHJvcHM6IGdwLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBtb2NrTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIGNvbnN0IG1vY2tTZWxlY3Rpb24gPSB7XG4gICAgICAgICAgICBfZ3JvdXBzOiBbW21vY2tOb2RlXV0sXG4gICAgICAgICAgICBub2RlOiAoKSA9PiBtb2NrTm9kZSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgc2VsZWN0Lm1vY2tSZXR1cm5WYWx1ZSh7XG4gICAgICAgICAgICAuLi5tb2NrU2VsZWN0aW9uLFxuICAgICAgICAgICAgb246IChldmVudCwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgICBtb2NrT24oZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICBpZiAoZXZlbnQgPT09ICdtb3VzZW1vdmUnICYmIGhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBtb3VzZS5tb2NrUmV0dXJuVmFsdWUoWzEwMCwgMjAwXSk7XG4gICAgICAgICAgICAgICAgaGFuZGxlcigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmVuZGVyKDxSb290IHsuLi5wcm9wc30+aGk8L1Jvb3Q+KTtcblxuICAgICAgICAgIGV4cGVjdChvbk1vdXNlTW92ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoeyB4OiAxMCwgeTogMTUgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdkb2VzIG5vdCBjYWxsIG9uTW91c2VNb3ZlIHdoZW4gaGFuZGxlciBpcyBub3QgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZ3AgPSBncmFwaFByb3BzKCk7XG4gICAgICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgICAgICBncmFwaFByb3BzOiBncCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgbW9ja05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICBjb25zdCBtb2NrU2VsZWN0aW9uID0ge1xuICAgICAgICAgICAgX2dyb3VwczogW1ttb2NrTm9kZV1dLFxuICAgICAgICAgICAgbm9kZTogKCkgPT4gbW9ja05vZGUsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHNlbGVjdC5tb2NrUmV0dXJuVmFsdWUoe1xuICAgICAgICAgICAgLi4ubW9ja1NlbGVjdGlvbixcbiAgICAgICAgICAgIG9uOiAoZXZlbnQsIGhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgICAgbW9ja09uKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgaWYgKGV2ZW50ID09PSAnbW91c2Vtb3ZlJyAmJiBoYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgbW91c2UubW9ja1JldHVyblZhbHVlKFsxMDAsIDIwMF0pO1xuICAgICAgICAgICAgICAgIC8vIFNob3VsZCBub3QgdGhyb3cgZXJyb3Igd2hlbiBvbk1vdXNlTW92ZSBpcyBub3QgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gaGFuZGxlcigpKS5ub3QudG9UaHJvdygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmVuZGVyKDxSb290IHsuLi5wcm9wc30+aGk8L1Jvb3Q+KTtcblxuICAgICAgICAgIC8vIFZlcmlmeSBzY2FsZSBtZXRob2RzIHdlcmUgbm90IGNhbGxlZCAoZWFybHkgcmV0dXJuIGluIG1vdXNlTW92ZSlcbiAgICAgICAgICBleHBlY3QoZ3Auc2NhbGUueC5pbnZlcnQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgICAgZXhwZWN0KGdwLnNjYWxlLnkuaW52ZXJ0KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtc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NUQsQ0FBQyxDQUFDO1FBRUZvQixFQUFFLENBQUMsd0RBQXdELEVBQUUsWUFBTTtVQUNqRSxJQUFNa0IsRUFBRSxHQUFHekMsVUFBVSxDQUFDLENBQUM7VUFDdkIsSUFBTTBDLEtBQUssR0FBQTFELGFBQUEsQ0FBQUEsYUFBQSxLQUNOK0IsWUFBWTtZQUNmZixVQUFVLEVBQUV5QztVQUFFLEVBQ2Y7VUFFRCxJQUFNRSxRQUFRLEdBQUdDLFFBQVEsQ0FBQ2xCLGFBQWEsQ0FBQyxLQUFLLENBQUM7VUFDOUMsSUFBTW1CLGFBQWEsR0FBRztZQUNwQkMsT0FBTyxFQUFFLENBQUMsQ0FBQ0gsUUFBUSxDQUFDLENBQUM7WUFDckJJLElBQUksRUFBRSxTQUFOQSxJQUFJQSxDQUFBO2NBQUEsT0FBUUosUUFBUTtZQUFBO1VBQ3RCLENBQUM7VUFFRGpELG1CQUFNLENBQUN1QixlQUFlLENBQUFqQyxhQUFBLENBQUFBLGFBQUEsS0FDakI2RCxhQUFhO1lBQ2hCM0IsRUFBRSxFQUFFLFNBQUpBLEVBQUVBLENBQUc4QixLQUFLLEVBQUVDLE9BQU8sRUFBSztjQUN0Qm5DLE1BQU0sQ0FBQ2tDLEtBQUssRUFBRUMsT0FBTyxDQUFDO2NBQ3RCLElBQUlELEtBQUssS0FBSyxXQUFXLElBQUlDLE9BQU8sRUFBRTtnQkFDcENyRCxrQkFBSyxDQUFDcUIsZUFBZSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQztnQkFDQWEsTUFBTSxDQUFDO2tCQUFBLE9BQU1tQixPQUFPLENBQUMsQ0FBQztnQkFBQSxFQUFDLENBQUNDLEdBQUcsQ0FBQ0MsT0FBTyxDQUFDLENBQUM7Y0FDdkM7WUFDRjtVQUFDLEVBQ0YsQ0FBQztVQUVGLElBQUExQixhQUFNLGVBQUMxRCxPQUFBLFlBQUEyRCxhQUFBLENBQUN6RCxLQUFBLENBQUEwRCxJQUFJLEVBQUtlLEtBQUssRUFBRSxJQUFRLENBQUMsQ0FBQzs7VUFFbEM7VUFDQVosTUFBTSxDQUFDVyxFQUFFLENBQUN4QyxLQUFLLENBQUNDLENBQUMsQ0FBQ0gsTUFBTSxDQUFDLENBQUNtRCxHQUFHLENBQUNqQixnQkFBZ0IsQ0FBQyxDQUFDO1VBQ2hESCxNQUFNLENBQUNXLEVBQUUsQ0FBQ3hDLEtBQUssQ0FBQ0UsQ0FBQyxDQUFDSixNQUFNLENBQUMsQ0FBQ21ELEdBQUcsQ0FBQ2pCLGdCQUFnQixDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDO01BQ0osQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
5
+ var _trig = require("../trig");
6
+ var _utils = require("../utils");
7
+ var _debug = _interopRequireDefault(require("debug"));
8
+ var _templateObject, _templateObject2, _templateObject3;
9
+ var log = (0, _debug["default"])('pie-lib:plot:trig:test');
10
+ var vs = function vs(v) {
11
+ if (!v) {
12
+ return '';
13
+ }
14
+ if (Number.isFinite(v.x) && Number.isFinite(v.y)) {
15
+ return "[".concat(v.x, ",").concat(v.y, "]");
16
+ }
17
+ return JSON.stringify(v);
18
+ };
19
+ var p = function p(strings) {
20
+ for (var _len = arguments.length, values = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
21
+ values[_key - 1] = arguments[_key];
22
+ }
23
+ return strings.reduce(function (acc, s, index) {
24
+ return "".concat(acc).concat(s).concat(vs(values[index]));
25
+ }, '');
26
+ };
27
+ describe('trig', function () {
28
+ describe('angle', function () {
29
+ var assertAngle = function assertAngle(a, b, expected) {
30
+ it(p(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["", ", ", " => ", ""])), a, b, (0, _trig.toDegrees)(expected)), function () {
31
+ var result = (0, _trig.angle)(a, b);
32
+ expect(result).toBeCloseTo(expected);
33
+ });
34
+ };
35
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(1, 1), (0, _trig.toRadians)(45));
36
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(0, 1), (0, _trig.toRadians)(90));
37
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(-1, 1), (0, _trig.toRadians)(135));
38
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(-1, 0), (0, _trig.toRadians)(180));
39
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(-1, -1), (0, _trig.toRadians)(225));
40
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(0, -1), (0, _trig.toRadians)(270));
41
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(1, -1), (0, _trig.toRadians)(315));
42
+ assertAngle((0, _utils.xy)(1, 1), (0, _utils.xy)(0, 0), (0, _trig.toRadians)(225));
43
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(1, 1), (0, _trig.toRadians)(45));
44
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(2, 1), (0, _trig.toRadians)(26.565));
45
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(3, 1), (0, _trig.toRadians)(18.434));
46
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(4, 1), (0, _trig.toRadians)(14.036));
47
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(5, 1), (0, _trig.toRadians)(11.309));
48
+ });
49
+ describe('acuteXAngle', function () {
50
+ var assertAcute = function assertAcute(input, expected) {
51
+ it("".concat((0, _trig.toDegrees)(input), " => ").concat((0, _trig.toDegrees)(expected)), function () {
52
+ var result = (0, _trig.acuteXAngle)(input);
53
+ log("result: ".concat((0, _trig.toDegrees)(result)));
54
+ expect(result).toBeCloseTo(expected);
55
+ });
56
+ };
57
+ assertAcute((0, _trig.toRadians)(45), (0, _trig.toRadians)(45));
58
+ assertAcute((0, _trig.toRadians)(100), (0, _trig.toRadians)(80));
59
+ assertAcute((0, _trig.toRadians)(190), (0, _trig.toRadians)(10));
60
+ assertAcute((0, _trig.toRadians)(350), (0, _trig.toRadians)(10));
61
+ });
62
+ describe('acuteYAngle', function () {
63
+ var assertAcute = function assertAcute(input, expected) {
64
+ it("".concat((0, _trig.toDegrees)(input), " => ").concat((0, _trig.toDegrees)(expected)), function () {
65
+ var result = (0, _trig.acuteYAngle)(input);
66
+ log("result: ".concat((0, _trig.toDegrees)(result)));
67
+ expect(result).toBeCloseTo(expected);
68
+ });
69
+ };
70
+ assertAcute((0, _trig.toRadians)(45), (0, _trig.toRadians)(45));
71
+ assertAcute((0, _trig.toRadians)(100), (0, _trig.toRadians)(10));
72
+ assertAcute((0, _trig.toRadians)(190), (0, _trig.toRadians)(80));
73
+ assertAcute((0, _trig.toRadians)(350), (0, _trig.toRadians)(80));
74
+ });
75
+ describe('edges', function () {
76
+ var assertEdges = function assertEdges(domain, range) {
77
+ return function (from, to, expected) {
78
+ it(p(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["", ", ", " + ", " -> ", " => ", "", ""])), domain, range, from, to, expected[0], expected[1]), function () {
79
+ var result = (0, _trig.edges)(domain, range)(from, to);
80
+ expect(result[0].x).toBeCloseTo(expected[0].x);
81
+ expect(result[0].y).toBeCloseTo(expected[0].y);
82
+ expect(result[1].x).toBeCloseTo(expected[1].x);
83
+ expect(result[1].y).toBeCloseTo(expected[1].y);
84
+ });
85
+ };
86
+ };
87
+ var one = assertEdges({
88
+ min: -4,
89
+ max: 4
90
+ }, {
91
+ min: -4,
92
+ max: 4
93
+ });
94
+ one((0, _utils.xy)(0, 0), (0, _utils.xy)(1, 1), [(0, _utils.xy)(4, 4), (0, _utils.xy)(-4, -4)]);
95
+ one((0, _utils.xy)(0, 0), (0, _utils.xy)(2, 1), [(0, _utils.xy)(4, 2), (0, _utils.xy)(-4, -2)]);
96
+ one((0, _utils.xy)(1, 1), (0, _utils.xy)(2, 2), [(0, _utils.xy)(4, 4), (0, _utils.xy)(-4, -4)]);
97
+ one((0, _utils.xy)(1, 0), (0, _utils.xy)(2, 0), [(0, _utils.xy)(4, 0), (0, _utils.xy)(-4, 0)]);
98
+ one((0, _utils.xy)(1, 0), (0, _utils.xy)(-2, 0), [(0, _utils.xy)(-4, 0), (0, _utils.xy)(4, 0)]);
99
+
100
+ /**
101
+ * domain {min: -5, max: 5, padding: 0, step: 1, labelStep: 1}labelStep: 1max: 5min: -5padding: 0step: 1__proto__: Object range: {min: -5, max: 5, padding: 0, step: 1, labelStep: 1} a: {x: -5, y: 0} b: {x: -5, y: 2} edges: Point {x: -5, y: 5} Point {x: -5, y: 2}
102
+ */
103
+ var lineIssue = assertEdges({
104
+ min: -5,
105
+ max: 5
106
+ }, {
107
+ min: -5,
108
+ max: 5
109
+ });
110
+ lineIssue((0, _utils.xy)(-5, -0), (0, _utils.xy)(-5, 2), [(0, _utils.xy)(-5, 5), (0, _utils.xy)(-5, -5)]);
111
+ });
112
+ describe('diffEdge', function () {
113
+ var assertDiffEdge = function assertDiffEdge(bounds, from, to, expected) {
114
+ it(p(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["<", "> ", " -> ", " => ", ""])), bounds, from, to, expected), function () {
115
+ var result = (0, _trig.diffEdge)(bounds, from, to);
116
+ expect(result.x).toBeCloseTo(expected.x);
117
+ expect(result.y).toBeCloseTo(expected.y);
118
+ });
119
+ };
120
+ var twoTwo = assertDiffEdge.bind(null, (0, _utils.xy)(2, 2));
121
+ twoTwo((0, _utils.xy)(0, 0), (0, _utils.xy)(1, 1), (0, _utils.xy)(2, 2));
122
+ twoTwo((0, _utils.xy)(0, 0), (0, _utils.xy)(1, 2), (0, _utils.xy)(1, 2));
123
+ twoTwo((0, _utils.xy)(0, 0), (0, _utils.xy)(2, 2), (0, _utils.xy)(2, 2));
124
+ twoTwo((0, _utils.xy)(0, 0), (0, _utils.xy)(2, 2), (0, _utils.xy)(2, 2));
125
+ twoTwo((0, _utils.xy)(0, 0), (0, _utils.xy)(-1, 1), (0, _utils.xy)(-2, 2));
126
+ twoTwo((0, _utils.xy)(0, 0), (0, _utils.xy)(-1, -1), (0, _utils.xy)(-2, -2));
127
+ var fourFour = assertDiffEdge.bind(null, (0, _utils.xy)(4, 4));
128
+ fourFour((0, _utils.xy)(0, 0), (0, _utils.xy)(1, 1), (0, _utils.xy)(4, 4));
129
+ fourFour((0, _utils.xy)(0, 0), (0, _utils.xy)(1, 2), (0, _utils.xy)(2, 4));
130
+ fourFour((0, _utils.xy)(0, 0), (0, _utils.xy)(2, 1), (0, _utils.xy)(4, 2));
131
+ fourFour((0, _utils.xy)(0, 0), (0, _utils.xy)(-1, 1), (0, _utils.xy)(-4, 4));
132
+ fourFour((0, _utils.xy)(0, 0), (0, _utils.xy)(-1, 1), (0, _utils.xy)(-4, 4));
133
+ assertDiffEdge((0, _utils.xy)(-4, -4), (0, _utils.xy)(0, 0), (0, _utils.xy)(-1, -1), (0, _utils.xy)(-4, -4));
134
+ assertDiffEdge((0, _utils.xy)(4, 4), (0, _utils.xy)(1, 1), (0, _utils.xy)(2, 2), (0, _utils.xy)(4, 4));
135
+ assertDiffEdge((0, _utils.xy)(4, 4), (0, _utils.xy)(2, 2), (0, _utils.xy)(3, 3), (0, _utils.xy)(4, 4));
136
+ assertDiffEdge((0, _utils.xy)(-4, -4), (0, _utils.xy)(-1, -1), (0, _utils.xy)(-2, -2), (0, _utils.xy)(-4, -4));
137
+ assertDiffEdge((0, _utils.xy)(-4, 4), (0, _utils.xy)(-1, -1), (0, _utils.xy)(-2, 0), (0, _utils.xy)(-4, 2));
138
+ var lineIssue = assertDiffEdge.bind(null, (0, _utils.xy)(-5, -5));
139
+ lineIssue((0, _utils.xy)(-5, 2), (0, _utils.xy)(-5, 0), (0, _utils.xy)(-5, -5));
140
+ //Top Right
141
+ assertDiffEdge((0, _utils.xy)(5, 5), (0, _utils.xy)(0, 5), (0, _utils.xy)(2, 5), (0, _utils.xy)(5, 5));
142
+ assertDiffEdge((0, _utils.xy)(5, 5), (0, _utils.xy)(5, 0), (0, _utils.xy)(5, 1), (0, _utils.xy)(5, 5));
143
+
144
+ // //Bottom Right
145
+ assertDiffEdge((0, _utils.xy)(5, -5), (0, _utils.xy)(5, 0), (0, _utils.xy)(5, -0.1), (0, _utils.xy)(5, -5));
146
+ assertDiffEdge((0, _utils.xy)(5, -5), (0, _utils.xy)(0, -5), (0, _utils.xy)(1, -5), (0, _utils.xy)(5, -5));
147
+
148
+ //Top Left
149
+ assertDiffEdge((0, _utils.xy)(-5, 5), (0, _utils.xy)(-5, 0), (0, _utils.xy)(-5, 0.1), (0, _utils.xy)(-5, 5));
150
+ assertDiffEdge((0, _utils.xy)(-5, 5), (0, _utils.xy)(0, 5), (0, _utils.xy)(-1, 5), (0, _utils.xy)(-5, 5));
151
+
152
+ //Bottom Left
153
+ assertDiffEdge((0, _utils.xy)(-5, -5), (0, _utils.xy)(-5, 0), (0, _utils.xy)(-5, -0.1), (0, _utils.xy)(-5, -5));
154
+ assertDiffEdge((0, _utils.xy)(-5, -5), (0, _utils.xy)(0, -5), (0, _utils.xy)(-1, -5), (0, _utils.xy)(-5, -5));
155
+ });
156
+ describe('getOpposingSide', function () {
157
+ var assertOpposingSide = function assertOpposingSide(hyp, angle, expected) {
158
+ it("".concat(hyp, ", ").concat(angle, " = ").concat(expected), function () {
159
+ var radians = (0, _trig.toRadians)(angle);
160
+ var result = (0, _trig.getOpposingSide)(hyp, radians);
161
+ expect(result).toBeCloseTo(expected);
162
+ });
163
+ };
164
+ assertOpposingSide(1, 45, 0.707);
165
+ assertOpposingSide(1.25, 45, 0.88);
166
+ });
167
+ });
168
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHJpZyIsInJlcXVpcmUiLCJfdXRpbHMiLCJfZGVidWciLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJsb2ciLCJkZWJ1ZyIsInZzIiwidiIsIk51bWJlciIsImlzRmluaXRlIiwieCIsInkiLCJjb25jYXQiLCJKU09OIiwic3RyaW5naWZ5IiwicCIsInN0cmluZ3MiLCJfbGVuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidmFsdWVzIiwiQXJyYXkiLCJfa2V5IiwicmVkdWNlIiwiYWNjIiwicyIsImluZGV4IiwiZGVzY3JpYmUiLCJhc3NlcnRBbmdsZSIsImEiLCJiIiwiZXhwZWN0ZWQiLCJpdCIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwidG9EZWdyZWVzIiwicmVzdWx0IiwiYW5nbGUiLCJleHBlY3QiLCJ0b0JlQ2xvc2VUbyIsInh5IiwidG9SYWRpYW5zIiwiYXNzZXJ0QWN1dGUiLCJpbnB1dCIsImFjdXRlWEFuZ2xlIiwiYWN1dGVZQW5nbGUiLCJhc3NlcnRFZGdlcyIsImRvbWFpbiIsInJhbmdlIiwiZnJvbSIsInRvIiwiZWRnZXMiLCJvbmUiLCJtaW4iLCJtYXgiLCJsaW5lSXNzdWUiLCJhc3NlcnREaWZmRWRnZSIsImJvdW5kcyIsImRpZmZFZGdlIiwidHdvVHdvIiwiYmluZCIsImZvdXJGb3VyIiwiYXNzZXJ0T3Bwb3NpbmdTaWRlIiwiaHlwIiwicmFkaWFucyIsImdldE9wcG9zaW5nU2lkZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vdHJpZy50ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFuZ2xlLFxuICBlZGdlLFxuICBlZGdlcyxcbiAgbWF4RWRnZSxcbiAgbWluRWRnZSxcbiAgdG9SYWRpYW5zLFxuICB0b0RlZ3JlZXMsXG4gIGFjdXRlWEFuZ2xlLFxuICBhY3V0ZVlBbmdsZSxcbiAgZGlmZkVkZ2UsXG59IGZyb20gJy4uL3RyaWcnO1xuaW1wb3J0IHsgeHkgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IHsgZ2V0T3Bwb3NpbmdTaWRlIH0gZnJvbSAnLi4vdHJpZyc7XG5jb25zdCBsb2cgPSBkZWJ1ZygncGllLWxpYjpwbG90OnRyaWc6dGVzdCcpO1xuXG5jb25zdCB2cyA9ICh2KSA9PiB7XG4gIGlmICghdikge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmIChOdW1iZXIuaXNGaW5pdGUodi54KSAmJiBOdW1iZXIuaXNGaW5pdGUodi55KSkge1xuICAgIHJldHVybiBgWyR7di54fSwke3YueX1dYDtcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG59O1xuY29uc3QgcCA9IChzdHJpbmdzLCAuLi52YWx1ZXMpID0+IHtcbiAgcmV0dXJuIHN0cmluZ3MucmVkdWNlKChhY2MsIHMsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIGAke2FjY30ke3N9JHt2cyh2YWx1ZXNbaW5kZXhdKX1gO1xuICB9LCAnJyk7XG59O1xuZGVzY3JpYmUoJ3RyaWcnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdhbmdsZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRBbmdsZSA9IChhLCBiLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQocGAke2F9LCAke2J9ID0+ICR7dG9EZWdyZWVzKGV4cGVjdGVkKX1gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFuZ2xlKGEsIGIpO1xuICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlQ2xvc2VUbyhleHBlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0QW5nbGUoeHkoMCwgMCksIHh5KDEsIDEpLCB0b1JhZGlhbnMoNDUpKTtcbiAgICBhc3NlcnRBbmdsZSh4eSgwLCAwKSwgeHkoMCwgMSksIHRvUmFkaWFucyg5MCkpO1xuICAgIGFzc2VydEFuZ2xlKHh5KDAsIDApLCB4eSgtMSwgMSksIHRvUmFkaWFucygxMzUpKTtcbiAgICBhc3NlcnRBbmdsZSh4eSgwLCAwKSwgeHkoLTEsIDApLCB0b1JhZGlhbnMoMTgwKSk7XG4gICAgYXNzZXJ0QW5nbGUoeHkoMCwgMCksIHh5KC0xLCAtMSksIHRvUmFkaWFucygyMjUpKTtcbiAgICBhc3NlcnRBbmdsZSh4eSgwLCAwKSwgeHkoMCwgLTEpLCB0b1JhZGlhbnMoMjcwKSk7XG4gICAgYXNzZXJ0QW5nbGUoeHkoMCwgMCksIHh5KDEsIC0xKSwgdG9SYWRpYW5zKDMxNSkpO1xuICAgIGFzc2VydEFuZ2xlKHh5KDEsIDEpLCB4eSgwLCAwKSwgdG9SYWRpYW5zKDIyNSkpO1xuICAgIGFzc2VydEFuZ2xlKHh5KDAsIDApLCB4eSgxLCAxKSwgdG9SYWRpYW5zKDQ1KSk7XG4gICAgYXNzZXJ0QW5nbGUoeHkoMCwgMCksIHh5KDIsIDEpLCB0b1JhZGlhbnMoMjYuNTY1KSk7XG4gICAgYXNzZXJ0QW5nbGUoeHkoMCwgMCksIHh5KDMsIDEpLCB0b1JhZGlhbnMoMTguNDM0KSk7XG4gICAgYXNzZXJ0QW5nbGUoeHkoMCwgMCksIHh5KDQsIDEpLCB0b1JhZGlhbnMoMTQuMDM2KSk7XG4gICAgYXNzZXJ0QW5nbGUoeHkoMCwgMCksIHh5KDUsIDEpLCB0b1JhZGlhbnMoMTEuMzA5KSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhY3V0ZVhBbmdsZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRBY3V0ZSA9IChpbnB1dCwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KGAke3RvRGVncmVlcyhpbnB1dCl9ID0+ICR7dG9EZWdyZWVzKGV4cGVjdGVkKX1gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFjdXRlWEFuZ2xlKGlucHV0KTtcbiAgICAgICAgbG9nKGByZXN1bHQ6ICR7dG9EZWdyZWVzKHJlc3VsdCl9YCk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVDbG9zZVRvKGV4cGVjdGVkKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRBY3V0ZSh0b1JhZGlhbnMoNDUpLCB0b1JhZGlhbnMoNDUpKTtcbiAgICBhc3NlcnRBY3V0ZSh0b1JhZGlhbnMoMTAwKSwgdG9SYWRpYW5zKDgwKSk7XG4gICAgYXNzZXJ0QWN1dGUodG9SYWRpYW5zKDE5MCksIHRvUmFkaWFucygxMCkpO1xuICAgIGFzc2VydEFjdXRlKHRvUmFkaWFucygzNTApLCB0b1JhZGlhbnMoMTApKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FjdXRlWUFuZ2xlJywgKCkgPT4ge1xuICAgIGNvbnN0IGFzc2VydEFjdXRlID0gKGlucHV0LCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoYCR7dG9EZWdyZWVzKGlucHV0KX0gPT4gJHt0b0RlZ3JlZXMoZXhwZWN0ZWQpfWAsICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYWN1dGVZQW5nbGUoaW5wdXQpO1xuICAgICAgICBsb2coYHJlc3VsdDogJHt0b0RlZ3JlZXMocmVzdWx0KX1gKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZUNsb3NlVG8oZXhwZWN0ZWQpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydEFjdXRlKHRvUmFkaWFucyg0NSksIHRvUmFkaWFucyg0NSkpO1xuICAgIGFzc2VydEFjdXRlKHRvUmFkaWFucygxMDApLCB0b1JhZGlhbnMoMTApKTtcbiAgICBhc3NlcnRBY3V0ZSh0b1JhZGlhbnMoMTkwKSwgdG9SYWRpYW5zKDgwKSk7XG4gICAgYXNzZXJ0QWN1dGUodG9SYWRpYW5zKDM1MCksIHRvUmFkaWFucyg4MCkpO1xuICB9KTtcblxuICBkZXNjcmliZSgnZWRnZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0RWRnZXMgPSAoZG9tYWluLCByYW5nZSkgPT4gKGZyb20sIHRvLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQocGAke2RvbWFpbn0sICR7cmFuZ2V9ICsgJHtmcm9tfSAtPiAke3RvfSA9PiAke2V4cGVjdGVkWzBdfSR7ZXhwZWN0ZWRbMV19YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBlZGdlcyhkb21haW4sIHJhbmdlKShmcm9tLCB0byk7XG4gICAgICAgIGV4cGVjdChyZXN1bHRbMF0ueCkudG9CZUNsb3NlVG8oZXhwZWN0ZWRbMF0ueCk7XG4gICAgICAgIGV4cGVjdChyZXN1bHRbMF0ueSkudG9CZUNsb3NlVG8oZXhwZWN0ZWRbMF0ueSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHRbMV0ueCkudG9CZUNsb3NlVG8oZXhwZWN0ZWRbMV0ueCk7XG4gICAgICAgIGV4cGVjdChyZXN1bHRbMV0ueSkudG9CZUNsb3NlVG8oZXhwZWN0ZWRbMV0ueSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25lID0gYXNzZXJ0RWRnZXMoeyBtaW46IC00LCBtYXg6IDQgfSwgeyBtaW46IC00LCBtYXg6IDQgfSk7XG4gICAgb25lKHh5KDAsIDApLCB4eSgxLCAxKSwgW3h5KDQsIDQpLCB4eSgtNCwgLTQpXSk7XG4gICAgb25lKHh5KDAsIDApLCB4eSgyLCAxKSwgW3h5KDQsIDIpLCB4eSgtNCwgLTIpXSk7XG4gICAgb25lKHh5KDEsIDEpLCB4eSgyLCAyKSwgW3h5KDQsIDQpLCB4eSgtNCwgLTQpXSk7XG4gICAgb25lKHh5KDEsIDApLCB4eSgyLCAwKSwgW3h5KDQsIDApLCB4eSgtNCwgMCldKTtcbiAgICBvbmUoeHkoMSwgMCksIHh5KC0yLCAwKSwgW3h5KC00LCAwKSwgeHkoNCwgMCldKTtcblxuICAgIC8qKlxuICAgICAqIGRvbWFpbiB7bWluOiAtNSwgbWF4OiA1LCBwYWRkaW5nOiAwLCBzdGVwOiAxLCBsYWJlbFN0ZXA6IDF9bGFiZWxTdGVwOiAxbWF4OiA1bWluOiAtNXBhZGRpbmc6IDBzdGVwOiAxX19wcm90b19fOiBPYmplY3QgcmFuZ2U6ICB7bWluOiAtNSwgbWF4OiA1LCBwYWRkaW5nOiAwLCBzdGVwOiAxLCBsYWJlbFN0ZXA6IDF9IGE6IHt4OiAtNSwgeTogMH0gYjoge3g6IC01LCB5OiAyfSBlZGdlczogUG9pbnTCoHt4OiAtNSwgeTogNX0gUG9pbnTCoHt4OiAtNSwgeTogMn1cbiAgICAgKi9cbiAgICBjb25zdCBsaW5lSXNzdWUgPSBhc3NlcnRFZGdlcyh7IG1pbjogLTUsIG1heDogNSB9LCB7IG1pbjogLTUsIG1heDogNSB9KTtcbiAgICBsaW5lSXNzdWUoeHkoLTUsIC0wKSwgeHkoLTUsIDIpLCBbeHkoLTUsIDUpLCB4eSgtNSwgLTUpXSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkaWZmRWRnZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnREaWZmRWRnZSA9IChib3VuZHMsIGZyb20sIHRvLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQocGA8JHtib3VuZHN9PiAke2Zyb219IC0+ICR7dG99ID0+ICR7ZXhwZWN0ZWR9YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkaWZmRWRnZShib3VuZHMsIGZyb20sIHRvKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC54KS50b0JlQ2xvc2VUbyhleHBlY3RlZC54KTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC55KS50b0JlQ2xvc2VUbyhleHBlY3RlZC55KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCB0d29Ud28gPSBhc3NlcnREaWZmRWRnZS5iaW5kKG51bGwsIHh5KDIsIDIpKTtcbiAgICB0d29Ud28oeHkoMCwgMCksIHh5KDEsIDEpLCB4eSgyLCAyKSk7XG4gICAgdHdvVHdvKHh5KDAsIDApLCB4eSgxLCAyKSwgeHkoMSwgMikpO1xuICAgIHR3b1R3byh4eSgwLCAwKSwgeHkoMiwgMiksIHh5KDIsIDIpKTtcbiAgICB0d29Ud28oeHkoMCwgMCksIHh5KDIsIDIpLCB4eSgyLCAyKSk7XG4gICAgdHdvVHdvKHh5KDAsIDApLCB4eSgtMSwgMSksIHh5KC0yLCAyKSk7XG4gICAgdHdvVHdvKHh5KDAsIDApLCB4eSgtMSwgLTEpLCB4eSgtMiwgLTIpKTtcbiAgICBjb25zdCBmb3VyRm91ciA9IGFzc2VydERpZmZFZGdlLmJpbmQobnVsbCwgeHkoNCwgNCkpO1xuXG4gICAgZm91ckZvdXIoeHkoMCwgMCksIHh5KDEsIDEpLCB4eSg0LCA0KSk7XG4gICAgZm91ckZvdXIoeHkoMCwgMCksIHh5KDEsIDIpLCB4eSgyLCA0KSk7XG4gICAgZm91ckZvdXIoeHkoMCwgMCksIHh5KDIsIDEpLCB4eSg0LCAyKSk7XG4gICAgZm91ckZvdXIoeHkoMCwgMCksIHh5KC0xLCAxKSwgeHkoLTQsIDQpKTtcbiAgICBmb3VyRm91cih4eSgwLCAwKSwgeHkoLTEsIDEpLCB4eSgtNCwgNCkpO1xuXG4gICAgYXNzZXJ0RGlmZkVkZ2UoeHkoLTQsIC00KSwgeHkoMCwgMCksIHh5KC0xLCAtMSksIHh5KC00LCAtNCkpO1xuICAgIGFzc2VydERpZmZFZGdlKHh5KDQsIDQpLCB4eSgxLCAxKSwgeHkoMiwgMiksIHh5KDQsIDQpKTtcbiAgICBhc3NlcnREaWZmRWRnZSh4eSg0LCA0KSwgeHkoMiwgMiksIHh5KDMsIDMpLCB4eSg0LCA0KSk7XG4gICAgYXNzZXJ0RGlmZkVkZ2UoeHkoLTQsIC00KSwgeHkoLTEsIC0xKSwgeHkoLTIsIC0yKSwgeHkoLTQsIC00KSk7XG4gICAgYXNzZXJ0RGlmZkVkZ2UoeHkoLTQsIDQpLCB4eSgtMSwgLTEpLCB4eSgtMiwgMCksIHh5KC00LCAyKSk7XG5cbiAgICBjb25zdCBsaW5lSXNzdWUgPSBhc3NlcnREaWZmRWRnZS5iaW5kKG51bGwsIHh5KC01LCAtNSkpO1xuXG4gICAgbGluZUlzc3VlKHh5KC01LCAyKSwgeHkoLTUsIDApLCB4eSgtNSwgLTUpKTtcbiAgICAvL1RvcCBSaWdodFxuICAgIGFzc2VydERpZmZFZGdlKHh5KDUsIDUpLCB4eSgwLCA1KSwgeHkoMiwgNSksIHh5KDUsIDUpKTtcbiAgICBhc3NlcnREaWZmRWRnZSh4eSg1LCA1KSwgeHkoNSwgMCksIHh5KDUsIDEpLCB4eSg1LCA1KSk7XG5cbiAgICAvLyAvL0JvdHRvbSBSaWdodFxuICAgIGFzc2VydERpZmZFZGdlKHh5KDUsIC01KSwgeHkoNSwgMCksIHh5KDUsIC0wLjEpLCB4eSg1LCAtNSkpO1xuICAgIGFzc2VydERpZmZFZGdlKHh5KDUsIC01KSwgeHkoMCwgLTUpLCB4eSgxLCAtNSksIHh5KDUsIC01KSk7XG5cbiAgICAvL1RvcCBMZWZ0XG4gICAgYXNzZXJ0RGlmZkVkZ2UoeHkoLTUsIDUpLCB4eSgtNSwgMCksIHh5KC01LCAwLjEpLCB4eSgtNSwgNSkpO1xuICAgIGFzc2VydERpZmZFZGdlKHh5KC01LCA1KSwgeHkoMCwgNSksIHh5KC0xLCA1KSwgeHkoLTUsIDUpKTtcblxuICAgIC8vQm90dG9tIExlZnRcbiAgICBhc3NlcnREaWZmRWRnZSh4eSgtNSwgLTUpLCB4eSgtNSwgMCksIHh5KC01LCAtMC4xKSwgeHkoLTUsIC01KSk7XG4gICAgYXNzZXJ0RGlmZkVkZ2UoeHkoLTUsIC01KSwgeHkoMCwgLTUpLCB4eSgtMSwgLTUpLCB4eSgtNSwgLTUpKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldE9wcG9zaW5nU2lkZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRPcHBvc2luZ1NpZGUgPSAoaHlwLCBhbmdsZSwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KGAke2h5cH0sICR7YW5nbGV9ID0gJHtleHBlY3RlZH1gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJhZGlhbnMgPSB0b1JhZGlhbnMoYW5nbGUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBnZXRPcHBvc2luZ1NpZGUoaHlwLCByYWRpYW5zKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZUNsb3NlVG8oZXhwZWN0ZWQpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydE9wcG9zaW5nU2lkZSgxLCA0NSwgMC43MDcpO1xuICAgIGFzc2VydE9wcG9zaW5nU2lkZSgxLjI1LCA0NSwgMC44OCk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFBQSxLQUFBLEdBQUFDLE9BQUE7QUFZQSxJQUFBQyxNQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxNQUFBLEdB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R0FBRyxDQUFDLENBQUM7SUFDaERaLFdBQVcsQ0FBQyxJQUFBVyxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUFDLGVBQVMsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUNqRFosV0FBVyxDQUFDLElBQUFXLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUFDLGVBQVMsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUNoRFosV0FBVyxDQUFDLElBQUFXLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUFDLGVBQVMsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUNoRFosV0FBVyxDQUFDLElBQUFXLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQyxlQUFTLEVBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0NaLFdBQVcsQ0FBQyxJQUFBVyxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUMsZUFBUyxFQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlDWixXQUFXLENBQUMsSUFBQVcsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFDLGVBQVMsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUNsRFosV0FBVyxDQUFDLElBQUFXLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxD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QUUsQ0FBQyxDQUFDO01BQUVDLEdBQUcsRUFBRTtJQUFFLENBQUMsRUFBRTtNQUFFRCxHQUFHLEVBQUUsQ0FBQyxDQUFDO01BQUVDLEdBQUcsRUFBRTtJQUFFLENBQUMsQ0FBQztJQUNqRUYsR0FBRyxDQUFDLElBQUFaLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQ1ksR0FBRyxDQUFDLElBQUFaLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQ1ksR0FBRyxDQUFDLElBQUFaLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQ1ksR0FBRyxDQUFDLElBQUFaLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7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QUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdENtQixNQUFNLENBQUMsSUFBQW5CLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEMsSUFBTXFCLFFBQVEsR0FBR0wsY0FBYyxDQUFDSSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUFwQixTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXBEcUIsUUFBUSxDQUFDLElBQUFyQixTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0Q3FCLFFBQVEsQ0FBQyxJQUFBckIsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdENxQixRQUFRLENBQUMsSUFBQXJCLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RDcUIsUUFBUSxDQUFDLElBQUFyQixTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeENxQixRQUFRLENBQUMsSUFBQXJCLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV4Q2dCLGNBQWMsQ0FBQyxJQUFBaEIsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RGdCLGNBQWMsQ0FBQyxJQUFBaEIsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RGdCLGNBQWMsQ0FBQyxJQUFBaEIsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RGdCLGNBQWMsQ0FBQyxJQUFBaEIsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOURnQixjQUFjLENBQUMsSUFBQWhCLFNBQUUsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTNELElBQU1lLFNBQVMsR0FBR0MsY0FBYyxDQUFDSSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUFwQixTQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV2RGUsU0FBUyxDQUFDLElBQUFmLFNBQUUsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0M7SUFDQWdCLGNBQWMsQ0FBQyxJQUFBaEIsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RGdCLGNBQWMsQ0FBQyxJQUFBaEIsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFD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