@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.
- package/CHANGELOG.md +0 -44
- package/lib/__tests__/actions-button.test.js +332 -0
- package/lib/__tests__/actions-button.test.js.map +1 -0
- package/lib/__tests__/axes.test.js +746 -0
- package/lib/__tests__/axes.test.js.map +1 -0
- package/lib/__tests__/chart-setup.test.js +796 -0
- package/lib/__tests__/chart-setup.test.js.map +1 -0
- package/lib/__tests__/chart-type.test.js +25 -0
- package/lib/__tests__/chart-type.test.js.map +1 -0
- package/lib/__tests__/chart.test.js +103 -0
- package/lib/__tests__/chart.test.js.map +1 -0
- package/lib/__tests__/grid.test.js +39 -0
- package/lib/__tests__/grid.test.js.map +1 -0
- package/lib/__tests__/key-legend.test.js +235 -0
- package/lib/__tests__/key-legend.test.js.map +1 -0
- package/lib/__tests__/mark-label.test.js +46 -0
- package/lib/__tests__/mark-label.test.js.map +1 -0
- package/lib/__tests__/tool-menu.test.js +627 -0
- package/lib/__tests__/tool-menu.test.js.map +1 -0
- package/lib/__tests__/utils.js +56 -0
- package/lib/__tests__/utils.js.map +1 -0
- package/lib/__tests__/utils.test.js +186 -0
- package/lib/__tests__/utils.test.js.map +1 -0
- package/lib/bars/__tests__/bar.test.js +53 -0
- package/lib/bars/__tests__/bar.test.js.map +1 -0
- package/lib/bars/__tests__/histogram.test.js +53 -0
- package/lib/bars/__tests__/histogram.test.js.map +1 -0
- package/lib/bars/__tests__/utils.js +50 -0
- package/lib/bars/__tests__/utils.js.map +1 -0
- package/lib/bars/common/__tests__/bars.test.js +76 -0
- package/lib/bars/common/__tests__/bars.test.js.map +1 -0
- package/lib/bars/common/__tests__/utils.js +50 -0
- package/lib/bars/common/__tests__/utils.js.map +1 -0
- package/lib/common/__tests__/correctness-indicators.test.js +887 -0
- package/lib/common/__tests__/correctness-indicators.test.js.map +1 -0
- package/lib/common/__tests__/drag-handle.test.js +73 -0
- package/lib/common/__tests__/drag-handle.test.js.map +1 -0
- package/lib/common/__tests__/utils.js +50 -0
- package/lib/common/__tests__/utils.js.map +1 -0
- package/lib/line/__tests__/line-cross.test.js +617 -0
- package/lib/line/__tests__/line-cross.test.js.map +1 -0
- package/lib/line/__tests__/line-dot.test.js +47 -0
- package/lib/line/__tests__/line-dot.test.js.map +1 -0
- package/lib/line/__tests__/utils.js +56 -0
- package/lib/line/__tests__/utils.js.map +1 -0
- package/lib/line/common/__tests__/drag-handle.test.js +73 -0
- package/lib/line/common/__tests__/drag-handle.test.js.map +1 -0
- package/lib/line/common/__tests__/line.test.js +92 -0
- package/lib/line/common/__tests__/line.test.js.map +1 -0
- package/lib/line/common/__tests__/utils.js +50 -0
- package/lib/line/common/__tests__/utils.js.map +1 -0
- package/lib/plot/__tests__/dot.test.js +513 -0
- package/lib/plot/__tests__/dot.test.js.map +1 -0
- package/lib/plot/__tests__/line.test.js +566 -0
- package/lib/plot/__tests__/line.test.js.map +1 -0
- package/lib/plot/__tests__/utils.js +50 -0
- package/lib/plot/__tests__/utils.js.map +1 -0
- package/lib/plot/common/__tests__/plot.test.js +79 -0
- package/lib/plot/common/__tests__/plot.test.js.map +1 -0
- package/lib/plot/common/__tests__/utils.js +50 -0
- package/lib/plot/common/__tests__/utils.js.map +1 -0
- package/package.json +5 -5
- 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
|