@pie-lib/charting 7.0.13 → 7.1.0-beta

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 (63) hide show
  1. package/CHANGELOG.md +0 -44
  2. package/lib/__tests__/actions-button.test.js +332 -0
  3. package/lib/__tests__/actions-button.test.js.map +1 -0
  4. package/lib/__tests__/axes.test.js +746 -0
  5. package/lib/__tests__/axes.test.js.map +1 -0
  6. package/lib/__tests__/chart-setup.test.js +796 -0
  7. package/lib/__tests__/chart-setup.test.js.map +1 -0
  8. package/lib/__tests__/chart-type.test.js +25 -0
  9. package/lib/__tests__/chart-type.test.js.map +1 -0
  10. package/lib/__tests__/chart.test.js +103 -0
  11. package/lib/__tests__/chart.test.js.map +1 -0
  12. package/lib/__tests__/grid.test.js +39 -0
  13. package/lib/__tests__/grid.test.js.map +1 -0
  14. package/lib/__tests__/key-legend.test.js +235 -0
  15. package/lib/__tests__/key-legend.test.js.map +1 -0
  16. package/lib/__tests__/mark-label.test.js +46 -0
  17. package/lib/__tests__/mark-label.test.js.map +1 -0
  18. package/lib/__tests__/tool-menu.test.js +627 -0
  19. package/lib/__tests__/tool-menu.test.js.map +1 -0
  20. package/lib/__tests__/utils.js +56 -0
  21. package/lib/__tests__/utils.js.map +1 -0
  22. package/lib/__tests__/utils.test.js +186 -0
  23. package/lib/__tests__/utils.test.js.map +1 -0
  24. package/lib/bars/__tests__/bar.test.js +53 -0
  25. package/lib/bars/__tests__/bar.test.js.map +1 -0
  26. package/lib/bars/__tests__/histogram.test.js +53 -0
  27. package/lib/bars/__tests__/histogram.test.js.map +1 -0
  28. package/lib/bars/__tests__/utils.js +50 -0
  29. package/lib/bars/__tests__/utils.js.map +1 -0
  30. package/lib/bars/common/__tests__/bars.test.js +76 -0
  31. package/lib/bars/common/__tests__/bars.test.js.map +1 -0
  32. package/lib/bars/common/__tests__/utils.js +50 -0
  33. package/lib/bars/common/__tests__/utils.js.map +1 -0
  34. package/lib/common/__tests__/correctness-indicators.test.js +887 -0
  35. package/lib/common/__tests__/correctness-indicators.test.js.map +1 -0
  36. package/lib/common/__tests__/drag-handle.test.js +73 -0
  37. package/lib/common/__tests__/drag-handle.test.js.map +1 -0
  38. package/lib/common/__tests__/utils.js +50 -0
  39. package/lib/common/__tests__/utils.js.map +1 -0
  40. package/lib/line/__tests__/line-cross.test.js +617 -0
  41. package/lib/line/__tests__/line-cross.test.js.map +1 -0
  42. package/lib/line/__tests__/line-dot.test.js +47 -0
  43. package/lib/line/__tests__/line-dot.test.js.map +1 -0
  44. package/lib/line/__tests__/utils.js +56 -0
  45. package/lib/line/__tests__/utils.js.map +1 -0
  46. package/lib/line/common/__tests__/drag-handle.test.js +73 -0
  47. package/lib/line/common/__tests__/drag-handle.test.js.map +1 -0
  48. package/lib/line/common/__tests__/line.test.js +92 -0
  49. package/lib/line/common/__tests__/line.test.js.map +1 -0
  50. package/lib/line/common/__tests__/utils.js +50 -0
  51. package/lib/line/common/__tests__/utils.js.map +1 -0
  52. package/lib/plot/__tests__/dot.test.js +513 -0
  53. package/lib/plot/__tests__/dot.test.js.map +1 -0
  54. package/lib/plot/__tests__/line.test.js +566 -0
  55. package/lib/plot/__tests__/line.test.js.map +1 -0
  56. package/lib/plot/__tests__/utils.js +50 -0
  57. package/lib/plot/__tests__/utils.js.map +1 -0
  58. package/lib/plot/common/__tests__/plot.test.js +79 -0
  59. package/lib/plot/common/__tests__/plot.test.js.map +1 -0
  60. package/lib/plot/common/__tests__/utils.js +50 -0
  61. package/lib/plot/common/__tests__/utils.js.map +1 -0
  62. package/package.json +5 -5
  63. package/LICENSE.md +0 -5
@@ -0,0 +1,746 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
6
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
7
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _testUtils = require("@pie-lib/test-utils");
10
+ var _styles = require("@mui/material/styles");
11
+ var _axes = _interopRequireWildcard(require("../axes"));
12
+ var _utils = require("./utils");
13
+ var _excluded = ["children"],
14
+ _excluded2 = ["children", "tickValues"];
15
+ 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" != _typeof(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); }
16
+ 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; }
17
+ 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; }
18
+ jest.mock('@visx/axis', function () {
19
+ return {
20
+ AxisLeft: function AxisLeft(_ref) {
21
+ var children = _ref.children,
22
+ props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
23
+ return /*#__PURE__*/_react["default"].createElement("g", (0, _extends2["default"])({
24
+ "data-testid": "axis-left"
25
+ }, props), typeof children === 'function' ? children({
26
+ formattedValue: '5'
27
+ }) : children);
28
+ },
29
+ AxisBottom: function AxisBottom(_ref2) {
30
+ var children = _ref2.children,
31
+ tickValues = _ref2.tickValues,
32
+ props = (0, _objectWithoutProperties2["default"])(_ref2, _excluded2);
33
+ return /*#__PURE__*/_react["default"].createElement("g", (0, _extends2["default"])({
34
+ "data-testid": "axis-bottom"
35
+ }, props), typeof children === 'function' ? (tickValues || ['0-A', '1-B', '2-C']).map(function (v, i) {
36
+ return children({
37
+ formattedValue: v,
38
+ index: i
39
+ });
40
+ }) : children);
41
+ }
42
+ };
43
+ });
44
+ jest.mock('../mark-label', function () {
45
+ return function MarkLabel(_ref3) {
46
+ var mark = _ref3.mark,
47
+ disabled = _ref3.disabled,
48
+ _onChange = _ref3.onChange,
49
+ error = _ref3.error,
50
+ autoFocus = _ref3.autoFocus,
51
+ inputRef = _ref3.inputRef,
52
+ correctnessIndicator = _ref3.correctnessIndicator;
53
+ return /*#__PURE__*/_react["default"].createElement("div", {
54
+ "data-testid": "mark-label"
55
+ }, /*#__PURE__*/_react["default"].createElement("input", {
56
+ "data-testid": "mark-label-input",
57
+ ref: inputRef,
58
+ value: (mark === null || mark === void 0 ? void 0 : mark.label) || '',
59
+ disabled: disabled,
60
+ onChange: function onChange(e) {
61
+ return _onChange && _onChange(e.target.value);
62
+ },
63
+ autoFocus: autoFocus
64
+ }), error && /*#__PURE__*/_react["default"].createElement("span", {
65
+ "data-testid": "mark-label-error"
66
+ }, error), correctnessIndicator);
67
+ };
68
+ });
69
+ jest.mock('@pie-lib/config-ui', function () {
70
+ return {
71
+ AlertDialog: function AlertDialog(_ref4) {
72
+ var open = _ref4.open,
73
+ title = _ref4.title,
74
+ text = _ref4.text,
75
+ onClose = _ref4.onClose,
76
+ onConfirm = _ref4.onConfirm;
77
+ return open ? /*#__PURE__*/_react["default"].createElement("div", {
78
+ "data-testid": "alert-dialog"
79
+ }, /*#__PURE__*/_react["default"].createElement("h2", null, title), /*#__PURE__*/_react["default"].createElement("p", null, text), /*#__PURE__*/_react["default"].createElement("button", {
80
+ "data-testid": "alert-cancel",
81
+ onClick: onClose
82
+ }, "Cancel"), /*#__PURE__*/_react["default"].createElement("button", {
83
+ "data-testid": "alert-confirm",
84
+ onClick: onConfirm
85
+ }, "Confirm")) : null;
86
+ }
87
+ };
88
+ });
89
+ jest.mock('../common/correctness-indicators', function () {
90
+ return {
91
+ TickCorrectnessIndicator: function TickCorrectnessIndicator(_ref5) {
92
+ var correctness = _ref5.correctness,
93
+ interactive = _ref5.interactive;
94
+ return correctness && interactive ? /*#__PURE__*/_react["default"].createElement("div", {
95
+ "data-testid": "tick-correctness-indicator"
96
+ }, correctness.value === 'correct' ? '✓' : '✗') : null;
97
+ }
98
+ };
99
+ });
100
+ jest.mock('@pie-lib/math-rendering', function () {
101
+ return {
102
+ renderMath: jest.fn(function (text) {
103
+ return text;
104
+ })
105
+ };
106
+ });
107
+ var theme = (0, _styles.createTheme)();
108
+ describe('ChartAxes', function () {
109
+ var renderComponent = function renderComponent(extras) {
110
+ var defaults = {
111
+ classes: {},
112
+ className: 'className',
113
+ graphProps: (0, _utils.graphProps)(),
114
+ xBand: (0, _utils.createBandScale)(['a', 'b', 'c'], [0, 400]),
115
+ categories: []
116
+ };
117
+ var props = _objectSpread(_objectSpread({}, defaults), extras);
118
+ return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
119
+ theme: theme
120
+ }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_axes["default"], props))));
121
+ };
122
+ describe('rendering', function () {
123
+ it('renders axes container', function () {
124
+ var _renderComponent = renderComponent(),
125
+ container = _renderComponent.container;
126
+ expect(container.firstChild).toBeInTheDocument();
127
+ });
128
+ it('renders SVG with axes group', function () {
129
+ var _renderComponent2 = renderComponent(),
130
+ container = _renderComponent2.container;
131
+ var svg = container.querySelector('svg');
132
+ expect(svg).toBeInTheDocument();
133
+ var axesGroup = container.querySelector('g');
134
+ expect(axesGroup).toBeInTheDocument();
135
+ });
136
+ it('renders axes elements', function () {
137
+ var _renderComponent3 = renderComponent(),
138
+ container = _renderComponent3.container;
139
+ var groups = container.querySelectorAll('g');
140
+ expect(groups.length).toBeGreaterThan(0);
141
+ });
142
+ });
143
+ describe('edge cases', function () {
144
+ it('handles missing xBand', function () {
145
+ var _renderComponent4 = renderComponent({
146
+ xBand: undefined
147
+ }),
148
+ container = _renderComponent4.container;
149
+ expect(container).toBeInTheDocument();
150
+ });
151
+ it('handles empty categories', function () {
152
+ var _renderComponent5 = renderComponent({
153
+ categories: []
154
+ }),
155
+ container = _renderComponent5.container;
156
+ expect(container).toBeInTheDocument();
157
+ });
158
+ it('handles null categories', function () {
159
+ var _renderComponent6 = renderComponent({
160
+ categories: null
161
+ }),
162
+ container = _renderComponent6.container;
163
+ expect(container).toBeInTheDocument();
164
+ });
165
+ });
166
+ });
167
+ describe('RawChartAxes', function () {
168
+ var renderComponent = function renderComponent(extras) {
169
+ var defaults = {
170
+ classes: {},
171
+ className: 'className',
172
+ graphProps: (0, _utils.graphProps)(),
173
+ xBand: (0, _utils.createBandScale)(['a', 'b', 'c'], [0, 400]),
174
+ categories: []
175
+ };
176
+ var props = _objectSpread(_objectSpread({}, defaults), extras);
177
+ return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
178
+ theme: theme
179
+ }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_axes.RawChartAxes, props))));
180
+ };
181
+ describe('rendering', function () {
182
+ it('renders raw axes container', function () {
183
+ var _renderComponent7 = renderComponent(),
184
+ container = _renderComponent7.container;
185
+ expect(container.firstChild).toBeInTheDocument();
186
+ });
187
+ it('renders SVG with axes group', function () {
188
+ var _renderComponent8 = renderComponent(),
189
+ container = _renderComponent8.container;
190
+ var svg = container.querySelector('svg');
191
+ expect(svg).toBeInTheDocument();
192
+ var axesGroup = container.querySelector('g');
193
+ expect(axesGroup).toBeInTheDocument();
194
+ });
195
+ it('renders both axes when leftAxis is true', function () {
196
+ var _renderComponent9 = renderComponent({
197
+ leftAxis: true
198
+ }),
199
+ getByTestId = _renderComponent9.getByTestId;
200
+ expect(getByTestId('axis-left')).toBeInTheDocument();
201
+ expect(getByTestId('axis-bottom')).toBeInTheDocument();
202
+ });
203
+ it('renders only bottom axis when leftAxis is false', function () {
204
+ var _renderComponent0 = renderComponent({
205
+ leftAxis: false
206
+ }),
207
+ queryByTestId = _renderComponent0.queryByTestId,
208
+ getByTestId = _renderComponent0.getByTestId;
209
+ expect(queryByTestId('axis-left')).not.toBeInTheDocument();
210
+ expect(getByTestId('axis-bottom')).toBeInTheDocument();
211
+ });
212
+ });
213
+ });
214
+ describe('TickComponent', function () {
215
+ var defaultCategories = [{
216
+ value: 1,
217
+ label: 'Category A',
218
+ editable: true,
219
+ interactive: true
220
+ }, {
221
+ value: 2,
222
+ label: 'Category B',
223
+ editable: true,
224
+ interactive: true
225
+ }];
226
+ var renderComponent = function renderComponent(extras) {
227
+ var defaults = {
228
+ graphProps: (0, _utils.graphProps)(),
229
+ xBand: (0, _utils.createBandScale)(['a', 'b', 'c'], [0, 400]),
230
+ categories: defaultCategories,
231
+ formattedValue: '0-Category A',
232
+ bandWidth: 100,
233
+ barWidth: 100,
234
+ x: 50,
235
+ y: 50,
236
+ top: 0,
237
+ onChangeCategory: jest.fn()
238
+ };
239
+ var props = _objectSpread(_objectSpread({}, defaults), extras);
240
+ return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
241
+ theme: theme
242
+ }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_axes.TickComponent, props))));
243
+ };
244
+ describe('rendering', function () {
245
+ it('renders tick component', function () {
246
+ var _renderComponent1 = renderComponent(),
247
+ container = _renderComponent1.container;
248
+ var svg = container.querySelector('svg');
249
+ expect(svg).toBeInTheDocument();
250
+ expect(container.querySelector('g')).toBeInTheDocument();
251
+ });
252
+ it('renders with categories', function () {
253
+ var _renderComponent10 = renderComponent({
254
+ formattedValue: '0-test',
255
+ categories: [{
256
+ value: 1,
257
+ label: 'test',
258
+ editable: false,
259
+ interactive: false
260
+ }]
261
+ }),
262
+ container = _renderComponent10.container;
263
+ var svg = container.querySelector('svg');
264
+ expect(svg).toBeInTheDocument();
265
+ expect(container.querySelector('g')).toBeInTheDocument();
266
+ });
267
+ it('renders MarkLabel component', function () {
268
+ var _renderComponent11 = renderComponent(),
269
+ getAllByTestId = _renderComponent11.getAllByTestId;
270
+ var markLabels = getAllByTestId('mark-label');
271
+ expect(markLabels.length).toBeGreaterThan(0);
272
+ });
273
+ it('renders foreignObject for labels', function () {
274
+ var _renderComponent12 = renderComponent(),
275
+ container = _renderComponent12.container;
276
+ var foreignObject = container.querySelector('foreignObject');
277
+ expect(foreignObject).toBeInTheDocument();
278
+ });
279
+ it('does not render when formattedValue is null', function () {
280
+ var _renderComponent13 = renderComponent({
281
+ formattedValue: null
282
+ }),
283
+ container = _renderComponent13.container;
284
+ var foreignObject = container.querySelector('foreignObject');
285
+ expect(foreignObject).not.toBeInTheDocument();
286
+ });
287
+ it('does not render when formattedValue is undefined', function () {
288
+ var _renderComponent14 = renderComponent({
289
+ formattedValue: undefined
290
+ }),
291
+ container = _renderComponent14.container;
292
+ var foreignObject = container.querySelector('foreignObject');
293
+ expect(foreignObject).not.toBeInTheDocument();
294
+ });
295
+ it('renders hidden label for longest category', function () {
296
+ var _renderComponent15 = renderComponent(),
297
+ getAllByTestId = _renderComponent15.getAllByTestId;
298
+ var markLabels = getAllByTestId('mark-label');
299
+ expect(markLabels.length).toBeGreaterThan(0);
300
+ });
301
+ });
302
+ describe('category label editing', function () {
303
+ it('allows editing category label', function () {
304
+ var onChangeCategory = jest.fn();
305
+ var _renderComponent16 = renderComponent({
306
+ onChangeCategory: onChangeCategory
307
+ }),
308
+ getAllByTestId = _renderComponent16.getAllByTestId;
309
+ var inputs = getAllByTestId('mark-label-input');
310
+ var input = inputs[inputs.length - 1];
311
+ _testUtils.fireEvent.change(input, {
312
+ target: {
313
+ value: 'New Label'
314
+ }
315
+ });
316
+ expect(onChangeCategory).toHaveBeenCalled();
317
+ });
318
+ it('calls changeCategory with correct parameters', function () {
319
+ var onChangeCategory = jest.fn();
320
+ var _renderComponent17 = renderComponent({
321
+ onChangeCategory: onChangeCategory
322
+ }),
323
+ getAllByTestId = _renderComponent17.getAllByTestId;
324
+ var inputs = getAllByTestId('mark-label-input');
325
+ var input = inputs[inputs.length - 1];
326
+ _testUtils.fireEvent.change(input, {
327
+ target: {
328
+ value: 'Updated'
329
+ }
330
+ });
331
+ expect(onChangeCategory).toHaveBeenCalledWith(0, expect.objectContaining({
332
+ label: 'Updated'
333
+ }));
334
+ });
335
+ it('disables editing when editable is false', function () {
336
+ var categories = [{
337
+ value: 1,
338
+ label: 'test',
339
+ editable: false,
340
+ interactive: true
341
+ }];
342
+ var _renderComponent18 = renderComponent({
343
+ categories: categories,
344
+ formattedValue: '0-test'
345
+ }),
346
+ getAllByTestId = _renderComponent18.getAllByTestId;
347
+ var inputs = getAllByTestId('mark-label-input');
348
+ var input = inputs[inputs.length - 1];
349
+ expect(input).toBeDisabled();
350
+ });
351
+ it('enables editing in define chart mode', function () {
352
+ var categories = [{
353
+ value: 1,
354
+ label: 'test',
355
+ editable: true,
356
+ interactive: true
357
+ }];
358
+ var _renderComponent19 = renderComponent({
359
+ categories: categories,
360
+ formattedValue: '0-test',
361
+ defineChart: true
362
+ }),
363
+ getAllByTestId = _renderComponent19.getAllByTestId;
364
+ var inputs = getAllByTestId('mark-label-input');
365
+ var input = inputs[inputs.length - 1];
366
+ expect(input).not.toBeDisabled();
367
+ });
368
+ it('respects editable property when not in define chart mode', function () {
369
+ var categories = [{
370
+ value: 1,
371
+ label: 'test',
372
+ editable: true,
373
+ interactive: true
374
+ }];
375
+ var _renderComponent20 = renderComponent({
376
+ categories: categories,
377
+ formattedValue: '0-test',
378
+ defineChart: false
379
+ }),
380
+ getAllByTestId = _renderComponent20.getAllByTestId;
381
+ var inputs = getAllByTestId('mark-label-input');
382
+ var input = inputs[inputs.length - 1];
383
+ expect(input).not.toBeDisabled();
384
+ });
385
+ });
386
+ describe('interactive checkbox', function () {
387
+ it('shows warning when disabling interactive with correct answer', function () {
388
+ var categories = [{
389
+ value: 1,
390
+ label: 'test',
391
+ editable: true,
392
+ interactive: true,
393
+ correctness: {
394
+ value: 'correct'
395
+ }
396
+ }];
397
+ var component = new _axes.TickComponent({
398
+ categories: categories,
399
+ onChangeCategory: jest.fn()
400
+ });
401
+ component.setState = jest.fn();
402
+ component.changeInteractive(0, false);
403
+ expect(component.setState).toHaveBeenCalledWith(expect.objectContaining({
404
+ dialog: expect.objectContaining({
405
+ open: true,
406
+ title: 'Warning'
407
+ })
408
+ }));
409
+ });
410
+ it('changes interactive without warning when enabling', function () {
411
+ var onChangeCategory = jest.fn();
412
+ var categories = [{
413
+ value: 1,
414
+ label: 'test',
415
+ editable: true,
416
+ interactive: false
417
+ }];
418
+ var component = new _axes.TickComponent({
419
+ categories: categories,
420
+ onChangeCategory: onChangeCategory
421
+ });
422
+ component.changeInteractive(0, true);
423
+ expect(onChangeCategory).toHaveBeenCalledWith(0, expect.objectContaining({
424
+ interactive: true
425
+ }));
426
+ });
427
+ });
428
+ describe('editable checkbox', function () {
429
+ it('shows warning when disabling editable with correct answer name', function () {
430
+ var categories = [{
431
+ value: 1,
432
+ label: 'test',
433
+ editable: true,
434
+ interactive: true,
435
+ correctness: {
436
+ value: 'correct'
437
+ }
438
+ }];
439
+ var component = new _axes.TickComponent({
440
+ categories: categories,
441
+ onChangeCategory: jest.fn()
442
+ });
443
+ component.setState = jest.fn();
444
+ component.changeEditable(0, false);
445
+ expect(component.setState).toHaveBeenCalledWith(expect.objectContaining({
446
+ dialog: expect.objectContaining({
447
+ open: true,
448
+ title: 'Warning'
449
+ })
450
+ }));
451
+ });
452
+ it('changes editable without warning when enabling', function () {
453
+ var onChangeCategory = jest.fn();
454
+ var categories = [{
455
+ value: 1,
456
+ label: 'test',
457
+ editable: false,
458
+ interactive: true
459
+ }];
460
+ var component = new _axes.TickComponent({
461
+ categories: categories,
462
+ onChangeCategory: onChangeCategory
463
+ });
464
+ component.changeEditable(0, true);
465
+ expect(onChangeCategory).toHaveBeenCalledWith(0, expect.objectContaining({
466
+ editable: true
467
+ }));
468
+ });
469
+ });
470
+ describe('splitText method', function () {
471
+ it('splits text into chunks', function () {
472
+ var component = new _axes.TickComponent({
473
+ categories: []
474
+ });
475
+ var result = component.splitText('This is a long text', 10);
476
+ expect(result.length).toBeGreaterThan(1);
477
+ });
478
+ it('splits at word boundaries', function () {
479
+ var component = new _axes.TickComponent({
480
+ categories: []
481
+ });
482
+ var result = component.splitText('Hello world test', 11);
483
+ expect(result[0]).toBe('Hello world');
484
+ });
485
+ it('handles text shorter than max', function () {
486
+ var component = new _axes.TickComponent({
487
+ categories: []
488
+ });
489
+ var result = component.splitText('Short', 20);
490
+ expect(result).toEqual(['Short']);
491
+ });
492
+ it('handles empty text', function () {
493
+ var component = new _axes.TickComponent({
494
+ categories: []
495
+ });
496
+ var result = component.splitText('', 10);
497
+ expect(result).toEqual([]);
498
+ });
499
+ it('handles null text', function () {
500
+ var component = new _axes.TickComponent({
501
+ categories: []
502
+ });
503
+ var result = component.splitText(null, 10);
504
+ expect(result).toEqual([]);
505
+ });
506
+ it('forces split when no spaces', function () {
507
+ var component = new _axes.TickComponent({
508
+ categories: []
509
+ });
510
+ var result = component.splitText('verylongwordwithoutspaces', 10);
511
+ expect(result.length).toBeGreaterThan(1);
512
+ expect(result[0].length).toBeLessThanOrEqual(10);
513
+ });
514
+ });
515
+ describe('correctness display', function () {
516
+ it('renders correctness indicator when showCorrectness is true', function () {
517
+ var categories = [{
518
+ value: 1,
519
+ label: 'test',
520
+ editable: true,
521
+ interactive: true,
522
+ correctness: {
523
+ value: 'correct',
524
+ label: 'Correct!'
525
+ }
526
+ }];
527
+ var _renderComponent21 = renderComponent({
528
+ categories: categories,
529
+ formattedValue: '0-test',
530
+ showCorrectness: true
531
+ }),
532
+ getByTestId = _renderComponent21.getByTestId;
533
+ expect(getByTestId('tick-correctness-indicator')).toBeInTheDocument();
534
+ });
535
+ it('does not render correctness indicator when showCorrectness is false', function () {
536
+ var categories = [{
537
+ value: 1,
538
+ label: 'test',
539
+ editable: true,
540
+ interactive: true,
541
+ correctness: {
542
+ value: 'correct',
543
+ label: 'Correct!'
544
+ }
545
+ }];
546
+ var _renderComponent22 = renderComponent({
547
+ categories: categories,
548
+ formattedValue: '0-test',
549
+ showCorrectness: false
550
+ }),
551
+ queryByTestId = _renderComponent22.queryByTestId;
552
+ expect(queryByTestId('tick-correctness-indicator')).not.toBeInTheDocument();
553
+ });
554
+ it('does not render correctness indicator when not interactive', function () {
555
+ var categories = [{
556
+ value: 1,
557
+ label: 'test',
558
+ editable: true,
559
+ interactive: false,
560
+ correctness: {
561
+ value: 'correct',
562
+ label: 'Correct!'
563
+ }
564
+ }];
565
+ var _renderComponent23 = renderComponent({
566
+ categories: categories,
567
+ formattedValue: '0-test',
568
+ showCorrectness: true
569
+ }),
570
+ queryByTestId = _renderComponent23.queryByTestId;
571
+ expect(queryByTestId('tick-correctness-indicator')).not.toBeInTheDocument();
572
+ });
573
+ });
574
+ describe('error display', function () {
575
+ it('renders error message for first category', function () {
576
+ var error = {
577
+ 0: 'Error message'
578
+ };
579
+ var _renderComponent24 = renderComponent({
580
+ error: error,
581
+ formattedValue: '0-test'
582
+ }),
583
+ getByTestId = _renderComponent24.getByTestId;
584
+ expect(getByTestId('mark-label-error')).toBeInTheDocument();
585
+ });
586
+ it('renders distinct error messages', function () {
587
+ var error = {
588
+ 0: 'Error 1',
589
+ 1: 'Error 1',
590
+ 2: 'Error 2'
591
+ };
592
+ var _renderComponent25 = renderComponent({
593
+ error: error,
594
+ formattedValue: '0-test'
595
+ }),
596
+ container = _renderComponent25.container;
597
+ var errorText = container.querySelector('text');
598
+ expect(errorText).toBeInTheDocument();
599
+ });
600
+ it('does not render error when no error prop', function () {
601
+ var _renderComponent26 = renderComponent({
602
+ error: null
603
+ }),
604
+ queryByTestId = _renderComponent26.queryByTestId;
605
+ expect(queryByTestId('mark-label-error')).not.toBeInTheDocument();
606
+ });
607
+ });
608
+ describe('autoFocus handling', function () {
609
+ it('handles autoFocus prop', function () {
610
+ var onAutoFocusUsed = jest.fn();
611
+ var _renderComponent27 = renderComponent({
612
+ autoFocus: false,
613
+ onAutoFocusUsed: onAutoFocusUsed
614
+ }),
615
+ rerender = _renderComponent27.rerender;
616
+ rerender(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
617
+ theme: theme
618
+ }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_axes.TickComponent, {
619
+ graphProps: (0, _utils.graphProps)(),
620
+ xBand: (0, _utils.createBandScale)(['a', 'b', 'c'], [0, 400]),
621
+ categories: defaultCategories,
622
+ formattedValue: '0-Category A',
623
+ bandWidth: 100,
624
+ barWidth: 100,
625
+ x: 50,
626
+ y: 50,
627
+ top: 0,
628
+ onChangeCategory: jest.fn(),
629
+ autoFocus: true,
630
+ onAutoFocusUsed: onAutoFocusUsed
631
+ }))));
632
+ expect(onAutoFocusUsed).toHaveBeenCalled();
633
+ });
634
+ });
635
+ describe('define chart mode', function () {
636
+ it('renders interactive checkboxes when changeInteractiveEnabled', function () {
637
+ var chartingOptions = {
638
+ changeInteractive: {
639
+ authoringLabel: 'Allow students to change'
640
+ }
641
+ };
642
+ var _renderComponent28 = renderComponent({
643
+ defineChart: true,
644
+ chartingOptions: chartingOptions,
645
+ changeInteractiveEnabled: true,
646
+ formattedValue: '0-test'
647
+ }),
648
+ container = _renderComponent28.container;
649
+ var text = container.querySelector('text');
650
+ expect(text).toBeInTheDocument();
651
+ });
652
+ it('renders editable checkboxes when changeEditableEnabled', function () {
653
+ var chartingOptions = {
654
+ changeEditable: {
655
+ authoringLabel: 'Allow label editing'
656
+ }
657
+ };
658
+ var _renderComponent29 = renderComponent({
659
+ defineChart: true,
660
+ chartingOptions: chartingOptions,
661
+ changeEditableEnabled: true,
662
+ formattedValue: '0-test'
663
+ }),
664
+ container = _renderComponent29.container;
665
+ var text = container.querySelector('text');
666
+ expect(text).toBeInTheDocument();
667
+ });
668
+ it('splits long authoring labels', function () {
669
+ var chartingOptions = {
670
+ changeInteractive: {
671
+ authoringLabel: 'This is a very long label that needs to be split'
672
+ }
673
+ };
674
+ var _renderComponent30 = renderComponent({
675
+ defineChart: true,
676
+ chartingOptions: chartingOptions,
677
+ changeInteractiveEnabled: true,
678
+ formattedValue: '0-test'
679
+ }),
680
+ container = _renderComponent30.container;
681
+ var tspans = container.querySelectorAll('tspan');
682
+ expect(tspans.length).toBeGreaterThan(1);
683
+ });
684
+ });
685
+ describe('edge cases', function () {
686
+ it('handles missing category', function () {
687
+ var _renderComponent31 = renderComponent({
688
+ categories: [],
689
+ formattedValue: '0-missing'
690
+ }),
691
+ container = _renderComponent31.container;
692
+ expect(container).toBeInTheDocument();
693
+ });
694
+ it('handles invalid formattedValue format', function () {
695
+ var _renderComponent32 = renderComponent({
696
+ formattedValue: 'invalid'
697
+ }),
698
+ container = _renderComponent32.container;
699
+ expect(container).toBeInTheDocument();
700
+ });
701
+ it('handles missing graphProps', function () {
702
+ var _renderComponent33 = renderComponent({
703
+ graphProps: null
704
+ }),
705
+ container = _renderComponent33.container;
706
+ expect(container).toBeInTheDocument();
707
+ });
708
+ it('handles zero barWidth', function () {
709
+ var _renderComponent34 = renderComponent({
710
+ barWidth: 0
711
+ }),
712
+ container = _renderComponent34.container;
713
+ expect(container).toBeInTheDocument();
714
+ });
715
+ it('handles negative coordinates', function () {
716
+ var _renderComponent35 = renderComponent({
717
+ x: -10,
718
+ y: -20
719
+ }),
720
+ container = _renderComponent35.container;
721
+ expect(container).toBeInTheDocument();
722
+ });
723
+ });
724
+ describe('componentDidUpdate', function () {
725
+ it('calls onAutoFocusUsed when autoFocus changes to true', function () {
726
+ var onAutoFocusUsed = jest.fn();
727
+ var component = new _axes.TickComponent({
728
+ autoFocus: false,
729
+ onAutoFocusUsed: onAutoFocusUsed
730
+ });
731
+ component.componentDidUpdate({
732
+ autoFocus: false
733
+ });
734
+ expect(onAutoFocusUsed).not.toHaveBeenCalled();
735
+ component.props = {
736
+ autoFocus: true,
737
+ onAutoFocusUsed: onAutoFocusUsed
738
+ };
739
+ component.componentDidUpdate({
740
+ autoFocus: false
741
+ });
742
+ expect(onAutoFocusUsed).toHaveBeenCalled();
743
+ });
744
+ });
745
+ });
746
+ //# sourceMappingURL=axes.test.js.map