@pie-lib/graphing-solution-set 4.0.13 → 4.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/CHANGELOG.md +0 -44
  2. package/lib/__tests__/bg.test.js +282 -0
  3. package/lib/__tests__/bg.test.js.map +1 -0
  4. package/lib/__tests__/coordinates-label.test.js +276 -0
  5. package/lib/__tests__/coordinates-label.test.js.map +1 -0
  6. package/lib/__tests__/graph-with-controls.test.js +256 -0
  7. package/lib/__tests__/graph-with-controls.test.js.map +1 -0
  8. package/lib/__tests__/graph.test.js +113 -0
  9. package/lib/__tests__/graph.test.js.map +1 -0
  10. package/lib/__tests__/grid-setup.test.js +729 -0
  11. package/lib/__tests__/grid-setup.test.js.map +1 -0
  12. package/lib/__tests__/grid.test.js +29 -0
  13. package/lib/__tests__/grid.test.js.map +1 -0
  14. package/lib/__tests__/labels.test.js +45 -0
  15. package/lib/__tests__/labels.test.js.map +1 -0
  16. package/lib/__tests__/mark-label.test.js +133 -0
  17. package/lib/__tests__/mark-label.test.js.map +1 -0
  18. package/lib/__tests__/toggle-bar.test.js +146 -0
  19. package/lib/__tests__/toggle-bar.test.js.map +1 -0
  20. package/lib/__tests__/tool-menu.test.js +540 -0
  21. package/lib/__tests__/tool-menu.test.js.map +1 -0
  22. package/lib/__tests__/undo-redo.test.js +31 -0
  23. package/lib/__tests__/undo-redo.test.js.map +1 -0
  24. package/lib/__tests__/use-debounce.test.js +24 -0
  25. package/lib/__tests__/use-debounce.test.js.map +1 -0
  26. package/lib/__tests__/utils.js +70 -0
  27. package/lib/__tests__/utils.js.map +1 -0
  28. package/lib/__tests__/utils.test.js +123 -0
  29. package/lib/__tests__/utils.test.js.map +1 -0
  30. package/lib/axis/__tests__/arrow.test.js +60 -0
  31. package/lib/axis/__tests__/arrow.test.js.map +1 -0
  32. package/lib/axis/__tests__/axes.test.js +160 -0
  33. package/lib/axis/__tests__/axes.test.js.map +1 -0
  34. package/lib/container/__tests__/actions.test.js +108 -0
  35. package/lib/container/__tests__/actions.test.js.map +1 -0
  36. package/lib/container/__tests__/index.test.js +346 -0
  37. package/lib/container/__tests__/index.test.js.map +1 -0
  38. package/lib/container/__tests__/marks.test.js +259 -0
  39. package/lib/container/__tests__/marks.test.js.map +1 -0
  40. package/lib/container/__tests__/middleware.test.js +244 -0
  41. package/lib/container/__tests__/middleware.test.js.map +1 -0
  42. package/lib/container/__tests__/reducer.test.js +450 -0
  43. package/lib/container/__tests__/reducer.test.js.map +1 -0
  44. package/lib/tools/line/__tests__/component.test.js +45 -0
  45. package/lib/tools/line/__tests__/component.test.js.map +1 -0
  46. package/lib/tools/polygon/__tests__/component.test.js +501 -0
  47. package/lib/tools/polygon/__tests__/component.test.js.map +1 -0
  48. package/lib/tools/polygon/__tests__/index.test.js +92 -0
  49. package/lib/tools/polygon/__tests__/index.test.js.map +1 -0
  50. package/lib/tools/polygon/__tests__/line.test.js +30 -0
  51. package/lib/tools/polygon/__tests__/line.test.js.map +1 -0
  52. package/lib/tools/polygon/__tests__/polygon.test.js +61 -0
  53. package/lib/tools/polygon/__tests__/polygon.test.js.map +1 -0
  54. package/lib/tools/shared/__tests__/arrow-head.test.js +45 -0
  55. package/lib/tools/shared/__tests__/arrow-head.test.js.map +1 -0
  56. package/lib/tools/shared/line/__tests__/index.test.js +725 -0
  57. package/lib/tools/shared/line/__tests__/index.test.js.map +1 -0
  58. package/lib/tools/shared/line/__tests__/line-path.test.js +64 -0
  59. package/lib/tools/shared/line/__tests__/line-path.test.js.map +1 -0
  60. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +618 -0
  61. package/lib/tools/shared/line/__tests__/with-root-edge.test.js.map +1 -0
  62. package/lib/tools/shared/point/__tests__/arrow-point.test.js +127 -0
  63. package/lib/tools/shared/point/__tests__/arrow-point.test.js.map +1 -0
  64. package/lib/tools/shared/point/__tests__/arrow.test.js +619 -0
  65. package/lib/tools/shared/point/__tests__/arrow.test.js.map +1 -0
  66. package/lib/tools/shared/point/__tests__/base-point.test.js +122 -0
  67. package/lib/tools/shared/point/__tests__/base-point.test.js.map +1 -0
  68. package/package.json +7 -7
  69. package/LICENSE.md +0 -5
package/CHANGELOG.md CHANGED
@@ -3,50 +3,6 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
- ## [4.0.13](https://github.com/pie-framework/pie-lib/compare/@pie-lib/graphing-solution-set@4.0.12...@pie-lib/graphing-solution-set@4.0.13) (2026-07-31)
7
-
8
- **Note:** Version bump only for package @pie-lib/graphing-solution-set
9
-
10
- ## [4.0.12](https://github.com/pie-framework/pie-lib/compare/@pie-lib/graphing-solution-set@4.0.11...@pie-lib/graphing-solution-set@4.0.12) (2026-07-08)
11
-
12
- **Note:** Version bump only for package @pie-lib/graphing-solution-set
13
-
14
- ## [4.0.11](https://github.com/pie-framework/pie-lib/compare/@pie-lib/graphing-solution-set@4.0.10...@pie-lib/graphing-solution-set@4.0.11) (2026-07-01)
15
-
16
- **Note:** Version bump only for package @pie-lib/graphing-solution-set
17
-
18
- ## [4.0.10](https://github.com/pie-framework/pie-lib/compare/@pie-lib/graphing-solution-set@4.0.9...@pie-lib/graphing-solution-set@4.0.10) (2026-06-25)
19
-
20
- **Note:** Version bump only for package @pie-lib/graphing-solution-set
21
-
22
- ## [4.0.9](https://github.com/pie-framework/pie-lib/compare/@pie-lib/graphing-solution-set@4.0.8...@pie-lib/graphing-solution-set@4.0.9) (2026-06-19)
23
-
24
- **Note:** Version bump only for package @pie-lib/graphing-solution-set
25
-
26
- ## [4.0.8](https://github.com/pie-framework/pie-lib/compare/@pie-lib/graphing-solution-set@4.0.7...@pie-lib/graphing-solution-set@4.0.8) (2026-06-17)
27
-
28
- **Note:** Version bump only for package @pie-lib/graphing-solution-set
29
-
30
- ## [4.0.7](https://github.com/pie-framework/pie-lib/compare/@pie-lib/graphing-solution-set@4.0.6...@pie-lib/graphing-solution-set@4.0.7) (2026-06-12)
31
-
32
- ### Bug Fixes
33
-
34
- - correct @emotion/style typo to @emotion/styled in package deps PIE-678 ([d529ac7](https://github.com/pie-framework/pie-lib/commit/d529ac7bc3dfa94d8037688452d4c70c66f2590b))
35
-
36
- ## [4.0.6](https://github.com/pie-framework/pie-lib/compare/@pie-lib/graphing-solution-set@4.0.5...@pie-lib/graphing-solution-set@4.0.6) (2026-06-03)
37
-
38
- **Note:** Version bump only for package @pie-lib/graphing-solution-set
39
-
40
- ## [4.0.5](https://github.com/pie-framework/pie-lib/compare/@pie-lib/graphing-solution-set@4.0.4...@pie-lib/graphing-solution-set@4.0.5) (2026-06-01)
41
-
42
- ### Bug Fixes
43
-
44
- - **graphing:** make sure evaluate mode marks are not included in undo/redo history PIE-582 ([74f4820](https://github.com/pie-framework/pie-lib/commit/74f482052b5331d918212dcfd847a477f1e5e2d4))
45
-
46
- ## [4.0.4](https://github.com/pie-framework/pie-lib/compare/@pie-lib/graphing-solution-set@4.0.3...@pie-lib/graphing-solution-set@4.0.4) (2026-05-21)
47
-
48
- **Note:** Version bump only for package @pie-lib/graphing-solution-set
49
-
50
6
  ## [4.0.3](https://github.com/pie-framework/pie-lib/compare/@pie-lib/graphing-solution-set@4.0.2...@pie-lib/graphing-solution-set@4.0.3) (2026-05-15)
51
7
 
52
8
  **Note:** Version bump only for package @pie-lib/graphing-solution-set
@@ -0,0 +1,282 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
+ var _react = _interopRequireDefault(require("react"));
6
+ var _testUtils = require("@pie-lib/test-utils");
7
+ var _d3Selection = require("d3-selection");
8
+ var _bg = _interopRequireDefault(require("../bg"));
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
+ pointer: jest.fn(function () {
15
+ return [50, 50];
16
+ })
17
+ };
18
+ });
19
+ describe('Bg', function () {
20
+ var defaultProps;
21
+ var mockRect;
22
+ var clickHandler;
23
+ beforeEach(function () {
24
+ clickHandler = null;
25
+ mockRect = {
26
+ on: jest.fn(function (event, handler) {
27
+ if (event === 'click') {
28
+ clickHandler = handler;
29
+ }
30
+ }),
31
+ node: jest.fn(function () {
32
+ return {};
33
+ })
34
+ };
35
+ _d3Selection.select.mockReturnValue(mockRect);
36
+ defaultProps = {
37
+ width: 500,
38
+ height: 400,
39
+ onClick: jest.fn(),
40
+ graphProps: {
41
+ domain: {
42
+ min: -10,
43
+ max: 10,
44
+ step: 1,
45
+ label: 'x',
46
+ axisLabel: 'X'
47
+ },
48
+ range: {
49
+ min: -10,
50
+ max: 10,
51
+ step: 1,
52
+ label: 'y',
53
+ axisLabel: 'Y'
54
+ },
55
+ size: {
56
+ width: 500,
57
+ height: 400
58
+ },
59
+ scale: {
60
+ x: {
61
+ invert: jest.fn(function (val) {
62
+ return val / 10;
63
+ })
64
+ },
65
+ y: {
66
+ invert: jest.fn(function (val) {
67
+ return val / 10;
68
+ })
69
+ }
70
+ }
71
+ }
72
+ };
73
+ });
74
+ describe('rendering', function () {
75
+ it('renders without crashing', function () {
76
+ var _render = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bg["default"], defaultProps)),
77
+ container = _render.container;
78
+ expect(container).toBeTruthy();
79
+ });
80
+ it('renders a rect element', function () {
81
+ var _render2 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bg["default"], defaultProps)),
82
+ container = _render2.container;
83
+ var rect = container.querySelector('rect');
84
+ expect(rect).toBeTruthy();
85
+ });
86
+ it('applies correct dimensions', function () {
87
+ var _render3 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bg["default"], defaultProps)),
88
+ container = _render3.container;
89
+ var rect = container.querySelector('rect');
90
+
91
+ // Width and height should be expanded by padding * 2
92
+ var padding = 10; // default padding
93
+ expect(rect.getAttribute('width')).toBe(String(defaultProps.width + padding * 2));
94
+ expect(rect.getAttribute('height')).toBe(String(defaultProps.height + padding * 2));
95
+ });
96
+ it('applies correct transform', function () {
97
+ var _render4 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bg["default"], defaultProps)),
98
+ container = _render4.container;
99
+ var rect = container.querySelector('rect');
100
+ var padding = 10;
101
+ expect(rect.getAttribute('transform')).toBe("translate(-".concat(padding, ", -").concat(padding, ")"));
102
+ });
103
+ it('sets fill opacity to make it invisible', function () {
104
+ var _render5 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bg["default"], defaultProps)),
105
+ container = _render5.container;
106
+ var rect = container.querySelector('rect');
107
+ expect(rect.getAttribute('fill-opacity')).toBe('0.0');
108
+ });
109
+ });
110
+ describe('componentDidMount', function () {
111
+ it('attaches click handler to rect', function () {
112
+ (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bg["default"], defaultProps));
113
+ expect(_d3Selection.select).toHaveBeenCalled();
114
+ expect(mockRect.on).toHaveBeenCalledWith('click', expect.any(Function));
115
+ });
116
+ });
117
+ describe('getRectPadding', function () {
118
+ it('returns 10 for normal graphs', function () {
119
+ var _render6 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bg["default"], defaultProps)),
120
+ container = _render6.container;
121
+ var rect = container.querySelector('rect');
122
+ var padding = 10;
123
+ expect(rect.getAttribute('width')).toBe(String(defaultProps.width + padding * 2));
124
+ });
125
+ it('returns 6 for graphs with thinner shapes', function () {
126
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
127
+ graphProps: _objectSpread(_objectSpread({}, defaultProps.graphProps), {}, {
128
+ domain: {
129
+ min: -100,
130
+ max: 100,
131
+ step: 1,
132
+ label: 'x',
133
+ axisLabel: 'X'
134
+ }
135
+ })
136
+ });
137
+ var _render7 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bg["default"], props)),
138
+ container = _render7.container;
139
+ var rect = container.querySelector('rect');
140
+ var padding = 6;
141
+ expect(rect.getAttribute('width')).toBe(String(props.width + padding * 2));
142
+ });
143
+ });
144
+ describe('onRectClick', function () {
145
+ it('calls onClick with snapped coordinates', function () {
146
+ var _require = require('d3-selection'),
147
+ pointer = _require.pointer;
148
+ pointer.mockReturnValue([100, 100]);
149
+ (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bg["default"], defaultProps));
150
+ var event = new MouseEvent('click');
151
+ clickHandler(event);
152
+ expect(defaultProps.onClick).toHaveBeenCalled();
153
+ var calledWith = defaultProps.onClick.mock.calls[0][0];
154
+ expect(calledWith).toHaveProperty('x');
155
+ expect(calledWith).toHaveProperty('y');
156
+ });
157
+ it('snaps coordinates to nearest tick', function () {
158
+ var _require2 = require('d3-selection'),
159
+ pointer = _require2.pointer;
160
+ (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bg["default"], defaultProps));
161
+ var event = new MouseEvent('click');
162
+ clickHandler(event);
163
+ expect(defaultProps.onClick).toHaveBeenCalled();
164
+ var _defaultProps$onClick = defaultProps.onClick.mock.calls[0][0],
165
+ x = _defaultProps$onClick.x,
166
+ y = _defaultProps$onClick.y;
167
+ expect(Number.isInteger(x) || x.toString().length <= 4).toBe(true);
168
+ expect(Number.isInteger(y) || y.toString().length <= 4).toBe(true);
169
+ });
170
+ it('accounts for padding when converting coordinates', function () {
171
+ var _require3 = require('d3-selection'),
172
+ pointer = _require3.pointer;
173
+ var coords = [50, 50];
174
+ pointer.mockReturnValue(coords);
175
+ (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bg["default"], defaultProps));
176
+ var event = new MouseEvent('click');
177
+ clickHandler(event);
178
+ expect(defaultProps.graphProps.scale.x.invert).toHaveBeenCalled();
179
+ expect(defaultProps.graphProps.scale.y.invert).toHaveBeenCalled();
180
+ });
181
+ });
182
+ describe('shouldComponentUpdate', function () {
183
+ it('returns true when width changes', function () {
184
+ var _render8 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bg["default"], defaultProps)),
185
+ rerender = _render8.rerender;
186
+ var newProps = _objectSpread(_objectSpread({}, defaultProps), {}, {
187
+ width: 600,
188
+ graphProps: _objectSpread(_objectSpread({}, defaultProps.graphProps), {}, {
189
+ size: {
190
+ width: 600,
191
+ height: defaultProps.height
192
+ }
193
+ })
194
+ });
195
+ expect(function () {
196
+ rerender(/*#__PURE__*/_react["default"].createElement(_bg["default"], newProps));
197
+ }).not.toThrow();
198
+ });
199
+ it('returns true when height changes', function () {
200
+ var _render9 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bg["default"], defaultProps)),
201
+ rerender = _render9.rerender;
202
+ var newProps = _objectSpread(_objectSpread({}, defaultProps), {}, {
203
+ height: 500,
204
+ graphProps: _objectSpread(_objectSpread({}, defaultProps.graphProps), {}, {
205
+ size: {
206
+ width: defaultProps.width,
207
+ height: 500
208
+ }
209
+ })
210
+ });
211
+ expect(function () {
212
+ rerender(/*#__PURE__*/_react["default"].createElement(_bg["default"], newProps));
213
+ }).not.toThrow();
214
+ });
215
+ it('returns true when graphProps domain/range changes', function () {
216
+ var _render0 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bg["default"], defaultProps)),
217
+ rerender = _render0.rerender;
218
+ var newProps = _objectSpread(_objectSpread({}, defaultProps), {}, {
219
+ graphProps: _objectSpread(_objectSpread({}, defaultProps.graphProps), {}, {
220
+ domain: {
221
+ min: -5,
222
+ max: 5,
223
+ step: 1,
224
+ label: 'x',
225
+ axisLabel: 'X'
226
+ }
227
+ })
228
+ });
229
+ expect(function () {
230
+ rerender(/*#__PURE__*/_react["default"].createElement(_bg["default"], newProps));
231
+ }).not.toThrow();
232
+ });
233
+ });
234
+ describe('edge cases', function () {
235
+ it('handles zero dimensions', function () {
236
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
237
+ width: 0,
238
+ height: 0
239
+ });
240
+ var _render1 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bg["default"], props)),
241
+ container = _render1.container;
242
+ var rect = container.querySelector('rect');
243
+ expect(rect).toBeTruthy();
244
+ });
245
+ it('handles large dimensions', function () {
246
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
247
+ width: 10000,
248
+ height: 10000
249
+ });
250
+ var _render10 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bg["default"], props)),
251
+ container = _render10.container;
252
+ var rect = container.querySelector('rect');
253
+ expect(rect).toBeTruthy();
254
+ expect(rect.getAttribute('width')).toBe('10020');
255
+ expect(rect.getAttribute('height')).toBe('10020');
256
+ });
257
+ it('handles negative coordinates in domain/range', function () {
258
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
259
+ graphProps: _objectSpread(_objectSpread({}, defaultProps.graphProps), {}, {
260
+ domain: {
261
+ min: -100,
262
+ max: -10,
263
+ step: 1,
264
+ label: 'x',
265
+ axisLabel: 'X'
266
+ },
267
+ range: {
268
+ min: -100,
269
+ max: -10,
270
+ step: 1,
271
+ label: 'y',
272
+ axisLabel: 'Y'
273
+ }
274
+ })
275
+ });
276
+ var _render11 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_bg["default"], props)),
277
+ container = _render11.container;
278
+ expect(container.querySelector('rect')).toBeTruthy();
279
+ });
280
+ });
281
+ });
282
+ //# sourceMappingURL=bg.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bg.test.js","names":["_react","_interopRequireDefault","require","_testUtils","_d3Selection","_bg","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","jest","mock","select","fn","pointer","describe","defaultProps","mockRect","clickHandler","beforeEach","on","event","handler","node","mockReturnValue","width","height","onClick","graphProps","domain","min","max","step","label","axisLabel","range","size","scale","x","invert","val","y","it","_render","render","createElement","container","expect","toBeTruthy","_render2","rect","querySelector","_render3","padding","getAttribute","toBe","String","_render4","concat","_render5","toHaveBeenCalled","toHaveBeenCalledWith","any","Function","_render6","props","_render7","_require","MouseEvent","calledWith","calls","toHaveProperty","_require2","_defaultProps$onClick","Number","isInteger","toString","_require3","coords","_render8","rerender","newProps","not","toThrow","_render9","_render0","_render1","_render10","_render11"],"sources":["../../src/__tests__/bg.test.jsx"],"sourcesContent":["import React from 'react';\nimport { render } from '@pie-lib/test-utils';\nimport { select } from 'd3-selection';\nimport Bg from '../bg';\n\njest.mock('d3-selection', () => ({\n select: jest.fn(),\n pointer: jest.fn(() => [50, 50]),\n}));\n\ndescribe('Bg', () => {\n let defaultProps;\n let mockRect;\n let clickHandler;\n\n beforeEach(() => {\n clickHandler = null;\n mockRect = {\n on: jest.fn((event, handler) => {\n if (event === 'click') {\n clickHandler = handler;\n }\n }),\n node: jest.fn(() => ({})),\n };\n\n select.mockReturnValue(mockRect);\n\n defaultProps = {\n width: 500,\n height: 400,\n onClick: jest.fn(),\n graphProps: {\n domain: { min: -10, max: 10, step: 1, label: 'x', axisLabel: 'X' },\n range: { min: -10, max: 10, step: 1, label: 'y', axisLabel: 'Y' },\n size: { width: 500, height: 400 },\n scale: {\n x: {\n invert: jest.fn((val) => val / 10),\n },\n y: {\n invert: jest.fn((val) => val / 10),\n },\n },\n },\n };\n });\n\n describe('rendering', () => {\n it('renders without crashing', () => {\n const { container } = render(<Bg {...defaultProps} />);\n expect(container).toBeTruthy();\n });\n\n it('renders a rect element', () => {\n const { container } = render(<Bg {...defaultProps} />);\n const rect = container.querySelector('rect');\n expect(rect).toBeTruthy();\n });\n\n it('applies correct dimensions', () => {\n const { container } = render(<Bg {...defaultProps} />);\n const rect = container.querySelector('rect');\n\n // Width and height should be expanded by padding * 2\n const padding = 10; // default padding\n expect(rect.getAttribute('width')).toBe(String(defaultProps.width + padding * 2));\n expect(rect.getAttribute('height')).toBe(String(defaultProps.height + padding * 2));\n });\n\n it('applies correct transform', () => {\n const { container } = render(<Bg {...defaultProps} />);\n const rect = container.querySelector('rect');\n const padding = 10;\n\n expect(rect.getAttribute('transform')).toBe(`translate(-${padding}, -${padding})`);\n });\n\n it('sets fill opacity to make it invisible', () => {\n const { container } = render(<Bg {...defaultProps} />);\n const rect = container.querySelector('rect');\n\n expect(rect.getAttribute('fill-opacity')).toBe('0.0');\n });\n });\n\n describe('componentDidMount', () => {\n it('attaches click handler to rect', () => {\n render(<Bg {...defaultProps} />);\n\n expect(select).toHaveBeenCalled();\n expect(mockRect.on).toHaveBeenCalledWith('click', expect.any(Function));\n });\n });\n\n describe('getRectPadding', () => {\n it('returns 10 for normal graphs', () => {\n const { container } = render(<Bg {...defaultProps} />);\n const rect = container.querySelector('rect');\n const padding = 10;\n\n expect(rect.getAttribute('width')).toBe(String(defaultProps.width + padding * 2));\n });\n\n it('returns 6 for graphs with thinner shapes', () => {\n const props = {\n ...defaultProps,\n graphProps: {\n ...defaultProps.graphProps,\n domain: { min: -100, max: 100, step: 1, label: 'x', axisLabel: 'X' },\n },\n };\n\n const { container } = render(<Bg {...props} />);\n const rect = container.querySelector('rect');\n const padding = 6;\n\n expect(rect.getAttribute('width')).toBe(String(props.width + padding * 2));\n });\n });\n\n describe('onRectClick', () => {\n it('calls onClick with snapped coordinates', () => {\n const { pointer } = require('d3-selection');\n pointer.mockReturnValue([100, 100]);\n\n render(<Bg {...defaultProps} />);\n\n const event = new MouseEvent('click');\n clickHandler(event);\n\n expect(defaultProps.onClick).toHaveBeenCalled();\n const calledWith = defaultProps.onClick.mock.calls[0][0];\n expect(calledWith).toHaveProperty('x');\n expect(calledWith).toHaveProperty('y');\n });\n\n it('snaps coordinates to nearest tick', () => {\n const { pointer } = require('d3-selection');\n\n render(<Bg {...defaultProps} />);\n\n const event = new MouseEvent('click');\n clickHandler(event);\n\n expect(defaultProps.onClick).toHaveBeenCalled();\n const { x, y } = defaultProps.onClick.mock.calls[0][0];\n\n expect(Number.isInteger(x) || x.toString().length <= 4).toBe(true);\n expect(Number.isInteger(y) || y.toString().length <= 4).toBe(true);\n });\n\n it('accounts for padding when converting coordinates', () => {\n const { pointer } = require('d3-selection');\n const coords = [50, 50];\n pointer.mockReturnValue(coords);\n\n render(<Bg {...defaultProps} />);\n\n const event = new MouseEvent('click');\n clickHandler(event);\n\n expect(defaultProps.graphProps.scale.x.invert).toHaveBeenCalled();\n expect(defaultProps.graphProps.scale.y.invert).toHaveBeenCalled();\n });\n });\n\n describe('shouldComponentUpdate', () => {\n it('returns true when width changes', () => {\n const { rerender } = render(<Bg {...defaultProps} />);\n const newProps = {\n ...defaultProps,\n width: 600,\n graphProps: {\n ...defaultProps.graphProps,\n size: { width: 600, height: defaultProps.height },\n },\n };\n\n expect(() => {\n rerender(<Bg {...newProps} />);\n }).not.toThrow();\n });\n\n it('returns true when height changes', () => {\n const { rerender } = render(<Bg {...defaultProps} />);\n const newProps = {\n ...defaultProps,\n height: 500,\n graphProps: {\n ...defaultProps.graphProps,\n size: { width: defaultProps.width, height: 500 },\n },\n };\n\n expect(() => {\n rerender(<Bg {...newProps} />);\n }).not.toThrow();\n });\n\n it('returns true when graphProps domain/range changes', () => {\n const { rerender } = render(<Bg {...defaultProps} />);\n const newProps = {\n ...defaultProps,\n graphProps: {\n ...defaultProps.graphProps,\n domain: { min: -5, max: 5, step: 1, label: 'x', axisLabel: 'X' },\n },\n };\n\n expect(() => {\n rerender(<Bg {...newProps} />);\n }).not.toThrow();\n });\n });\n\n describe('edge cases', () => {\n it('handles zero dimensions', () => {\n const props = { ...defaultProps, width: 0, height: 0 };\n const { container } = render(<Bg {...props} />);\n const rect = container.querySelector('rect');\n\n expect(rect).toBeTruthy();\n });\n\n it('handles large dimensions', () => {\n const props = { ...defaultProps, width: 10000, height: 10000 };\n const { container } = render(<Bg {...props} />);\n const rect = container.querySelector('rect');\n\n expect(rect).toBeTruthy();\n expect(rect.getAttribute('width')).toBe('10020');\n expect(rect.getAttribute('height')).toBe('10020');\n });\n\n it('handles negative coordinates in domain/range', () => {\n const props = {\n ...defaultProps,\n graphProps: {\n ...defaultProps.graphProps,\n domain: { min: -100, max: -10, step: 1, label: 'x', axisLabel: 'X' },\n range: { min: -100, max: -10, step: 1, label: 'y', axisLabel: 'Y' },\n },\n };\n\n const { container } = render(<Bg {...props} />);\n expect(container.querySelector('rect')).toBeTruthy();\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,276 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
5
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
6
+ var _react = _interopRequireDefault(require("react"));
7
+ var _testUtils = require("@pie-lib/test-utils");
8
+ var _coordinatesLabel = require("../coordinates-label");
9
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
11
+ describe('CoordinatesLabel', function () {
12
+ var defaultProps;
13
+ var graphProps;
14
+ beforeEach(function () {
15
+ graphProps = {
16
+ domain: {
17
+ min: -10,
18
+ max: 10,
19
+ step: 1,
20
+ label: 'x',
21
+ axisLabel: 'X'
22
+ },
23
+ range: {
24
+ min: -10,
25
+ max: 10,
26
+ step: 1,
27
+ label: 'y',
28
+ axisLabel: 'Y'
29
+ },
30
+ scale: {
31
+ x: jest.fn(function (val) {
32
+ return (val + 10) * 20;
33
+ }),
34
+ y: jest.fn(function (val) {
35
+ return (10 - val) * 20;
36
+ })
37
+ }
38
+ };
39
+ defaultProps = {
40
+ x: 5,
41
+ y: 5,
42
+ graphProps: graphProps
43
+ };
44
+ });
45
+ describe('rendering', function () {
46
+ it('renders without crashing', function () {
47
+ var _render = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, defaultProps)),
48
+ container = _render.container;
49
+ expect(container).toBeTruthy();
50
+ });
51
+ it('displays formatted coordinates', function () {
52
+ var _render2 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, defaultProps)),
53
+ container = _render2.container;
54
+ var input = container.querySelector('input');
55
+ expect(input.value).toBe('(5, 5)');
56
+ });
57
+ it('rounds coordinates to 4 decimal places', function () {
58
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
59
+ x: 1.123456,
60
+ y: 2.987654
61
+ });
62
+ var _render3 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, props)),
63
+ container = _render3.container;
64
+ var input = container.querySelector('input');
65
+ expect(input.value).toBe('(1.1235, 2.9877)');
66
+ });
67
+ it('handles integer coordinates', function () {
68
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
69
+ x: 0,
70
+ y: 0
71
+ });
72
+ var _render4 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, props)),
73
+ container = _render4.container;
74
+ var input = container.querySelector('input');
75
+ expect(input.value).toBe('(0, 0)');
76
+ });
77
+ it('handles negative coordinates', function () {
78
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
79
+ x: -3,
80
+ y: -7
81
+ });
82
+ var _render5 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, props)),
83
+ container = _render5.container;
84
+ var input = container.querySelector('input');
85
+ expect(input.value).toBe('(-3, -7)');
86
+ });
87
+ it('renders as an input element', function () {
88
+ var _render6 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, defaultProps)),
89
+ container = _render6.container;
90
+ var input = container.querySelector('input');
91
+ expect(input).toBeTruthy();
92
+ expect(input.tagName).toBe('INPUT');
93
+ });
94
+ it('applies correct styles', function () {
95
+ var _render7 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, defaultProps)),
96
+ container = _render7.container;
97
+ var wrapper = container.firstChild;
98
+ expect(wrapper).toHaveStyle({
99
+ position: 'absolute'
100
+ });
101
+ expect(wrapper).toHaveStyle({
102
+ pointerEvents: 'auto'
103
+ });
104
+ });
105
+ });
106
+ describe('getLabelPosition', function () {
107
+ it('positions label to the right by default', function () {
108
+ var position = (0, _coordinatesLabel.getLabelPosition)(graphProps, 0, 0, 60);
109
+ expect(position.left).toBeGreaterThan(graphProps.scale.x(0));
110
+ expect(position.top).toBeDefined();
111
+ });
112
+ it('positions label to the left when near right edge', function () {
113
+ var x = 9; // Near max
114
+ var labelLength = 100;
115
+ var position = (0, _coordinatesLabel.getLabelPosition)(graphProps, x, 0, labelLength);
116
+ expect(position.left).toBeLessThan(graphProps.scale.x(x));
117
+ });
118
+ it('adjusts top position for minimum y value', function () {
119
+ var position = (0, _coordinatesLabel.getLabelPosition)(graphProps, 0, -10, 60);
120
+ expect(position.top).toBe(graphProps.scale.y(-10) - 16);
121
+ });
122
+ it('adjusts top position for maximum y value', function () {
123
+ var position = (0, _coordinatesLabel.getLabelPosition)(graphProps, 0, 10, 60);
124
+ expect(position.top).toBe(graphProps.scale.y(10) - 0);
125
+ });
126
+ it('centers label vertically for middle values', function () {
127
+ var position = (0, _coordinatesLabel.getLabelPosition)(graphProps, 0, 0, 60);
128
+ expect(position.top).toBe(graphProps.scale.y(0) - 8);
129
+ });
130
+ it('applies left shift consistently', function () {
131
+ var leftShift = 10;
132
+ var labelLength = 60;
133
+ var rightPos = (0, _coordinatesLabel.getLabelPosition)(graphProps, 0, 0, labelLength);
134
+ expect(rightPos.left).toBe(graphProps.scale.x(0) + leftShift);
135
+ var leftPos = (0, _coordinatesLabel.getLabelPosition)(graphProps, 9, 0, labelLength);
136
+ expect(leftPos.left).toBe(graphProps.scale.x(9) - leftShift - labelLength);
137
+ });
138
+ });
139
+ describe('label width calculation', function () {
140
+ it('calculates width based on label length', function () {
141
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
142
+ x: 1,
143
+ y: 2
144
+ });
145
+ var _render8 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, props)),
146
+ container = _render8.container;
147
+ var wrapper = container.firstChild;
148
+ var expectedWidth = 6 * 6;
149
+ expect(wrapper).toHaveStyle({
150
+ width: "".concat(expectedWidth, "px")
151
+ });
152
+ });
153
+ it('adjusts width for longer coordinates', function () {
154
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
155
+ x: -10.123,
156
+ y: 10.456
157
+ });
158
+ var _render9 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, props)),
159
+ container = _render9.container;
160
+ var wrapper = container.firstChild;
161
+ var style = window.getComputedStyle(wrapper);
162
+ expect(parseInt(style.width)).toBeGreaterThan(42);
163
+ });
164
+ });
165
+ describe('edge cases', function () {
166
+ it('handles very small coordinates', function () {
167
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
168
+ x: 0.0001,
169
+ y: 0.0002
170
+ });
171
+ var _render0 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, props)),
172
+ container = _render0.container;
173
+ var input = container.querySelector('input');
174
+ expect(input.value).toContain('(');
175
+ expect(input.value).toContain(')');
176
+ expect(input.value).toContain(',');
177
+ });
178
+ it('handles very large coordinates', function () {
179
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
180
+ x: 999999,
181
+ y: 888888
182
+ });
183
+ var _render1 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, props)),
184
+ container = _render1.container;
185
+ var input = container.querySelector('input');
186
+ expect(input.value).toBe('(999999, 888888)');
187
+ });
188
+ it('handles zero coordinates', function () {
189
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
190
+ x: 0,
191
+ y: 0
192
+ });
193
+ var _render10 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, props)),
194
+ container = _render10.container;
195
+ var input = container.querySelector('input');
196
+ expect(input.value).toBe('(0, 0)');
197
+ });
198
+ it('handles coordinates at domain/range boundaries', function () {
199
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
200
+ x: 10,
201
+ y: 10
202
+ });
203
+ var _render11 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, props)),
204
+ container = _render11.container;
205
+ var input = container.querySelector('input');
206
+ expect(input.value).toBe('(10, 10)');
207
+ });
208
+ it('handles negative boundaries', function () {
209
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
210
+ x: -10,
211
+ y: -10
212
+ });
213
+ var _render12 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, props)),
214
+ container = _render12.container;
215
+ var input = container.querySelector('input');
216
+ expect(input.value).toBe('(-10, -10)');
217
+ });
218
+ });
219
+ describe('prop types and validation', function () {
220
+ it('accepts required props', function () {
221
+ expect(function () {
222
+ (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, defaultProps));
223
+ }).not.toThrow();
224
+ });
225
+ it('renders with missing optional props', function () {
226
+ var props = {
227
+ x: 1,
228
+ y: 2,
229
+ graphProps: graphProps
230
+ };
231
+ expect(function () {
232
+ (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, props));
233
+ }).not.toThrow();
234
+ });
235
+ });
236
+ describe('updates', function () {
237
+ it('updates when x coordinate changes', function () {
238
+ var _render13 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, defaultProps)),
239
+ container = _render13.container,
240
+ rerender = _render13.rerender;
241
+ var input = container.querySelector('input');
242
+ expect(input.value).toBe('(5, 5)');
243
+ rerender(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, (0, _extends2["default"])({}, defaultProps, {
244
+ x: 7
245
+ })));
246
+ input = container.querySelector('input');
247
+ expect(input.value).toBe('(7, 5)');
248
+ });
249
+ it('updates when y coordinate changes', function () {
250
+ var _render14 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, defaultProps)),
251
+ container = _render14.container,
252
+ rerender = _render14.rerender;
253
+ var input = container.querySelector('input');
254
+ expect(input.value).toBe('(5, 5)');
255
+ rerender(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, (0, _extends2["default"])({}, defaultProps, {
256
+ y: 3
257
+ })));
258
+ input = container.querySelector('input');
259
+ expect(input.value).toBe('(5, 3)');
260
+ });
261
+ it('updates position when coordinates change', function () {
262
+ var _render15 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, defaultProps)),
263
+ container = _render15.container,
264
+ rerender = _render15.rerender;
265
+ var initialStyle = window.getComputedStyle(container.firstChild);
266
+ var initialLeft = initialStyle.left;
267
+ rerender(/*#__PURE__*/_react["default"].createElement(_coordinatesLabel.CoordinatesLabel, (0, _extends2["default"])({}, defaultProps, {
268
+ x: 8
269
+ })));
270
+ var newStyle = window.getComputedStyle(container.firstChild);
271
+ var newLeft = newStyle.left;
272
+ expect(newLeft).not.toBe(initialLeft);
273
+ });
274
+ });
275
+ });
276
+ //# sourceMappingURL=coordinates-label.test.js.map