@pie-lib/math-toolbar 3.0.11-beta.6 → 3.0.11-beta.7
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/lib/__tests__/editor-and-pad-mathlive.test.js +272 -0
- package/lib/__tests__/editor-and-pad.test.js +78 -0
- package/lib/__tests__/index.test.js +27 -0
- package/lib/__tests__/math-preview.test.js +91 -0
- package/package.json +2 -2
- package/src/__tests__/editor-and-pad-mathlive.test.js +178 -0
- package/src/__tests__/editor-and-pad.test.js +74 -0
- package/src/__tests__/index.test.js +21 -0
- package/src/__tests__/math-preview.test.js +83 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
5
|
+
var _editorAndPad = require("../editor-and-pad");
|
|
6
|
+
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; }
|
|
7
|
+
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; }
|
|
8
|
+
/**
|
|
9
|
+
* Covers the call sites that changed when this package moved from
|
|
10
|
+
* @pie-lib/math-input (MathQuill) to @pie-lib/math-input-mathlive.
|
|
11
|
+
*
|
|
12
|
+
* All three were MathQuill-shaped and silently changed meaning:
|
|
13
|
+
* - shouldComponentUpdate read `this.input.mathField.latex()`, which throws now
|
|
14
|
+
* (and the field loads asynchronously, so `this.input` can be null)
|
|
15
|
+
* - the mixed-number workaround poked `__controller.cursor`, a MathQuill
|
|
16
|
+
* internal with no MathLive equivalent
|
|
17
|
+
* - onClick routes keypad presses through the imperative field API
|
|
18
|
+
*/
|
|
19
|
+
describe('EditorAndPad after the MathLive migration', function () {
|
|
20
|
+
var props = function props() {
|
|
21
|
+
var over = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
22
|
+
return _objectSpread({
|
|
23
|
+
classes: {},
|
|
24
|
+
classNames: {},
|
|
25
|
+
onChange: jest.fn()
|
|
26
|
+
}, over);
|
|
27
|
+
};
|
|
28
|
+
describe('shouldComponentUpdate', function () {
|
|
29
|
+
it('treats a missing input ref as different, so the first render is not skipped', function () {
|
|
30
|
+
var c = new _editorAndPad.EditorAndPad(props({
|
|
31
|
+
latex: 'x'
|
|
32
|
+
}));
|
|
33
|
+
c.input = null;
|
|
34
|
+
expect(c.shouldComponentUpdate({
|
|
35
|
+
latex: 'x'
|
|
36
|
+
}, {})).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
it('does not throw when the math engine has not loaded yet', function () {
|
|
39
|
+
var c = new _editorAndPad.EditorAndPad(props({
|
|
40
|
+
latex: 'x'
|
|
41
|
+
}));
|
|
42
|
+
|
|
43
|
+
// latex() returns '' until MathLive is ready
|
|
44
|
+
c.input = {
|
|
45
|
+
latex: function latex() {
|
|
46
|
+
return '';
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
expect(function () {
|
|
50
|
+
return c.shouldComponentUpdate({
|
|
51
|
+
latex: 'x'
|
|
52
|
+
}, {});
|
|
53
|
+
}).not.toThrow();
|
|
54
|
+
expect(c.shouldComponentUpdate({
|
|
55
|
+
latex: 'x'
|
|
56
|
+
}, {})).toBe(true);
|
|
57
|
+
});
|
|
58
|
+
it('skips the update when the field already holds the incoming latex', function () {
|
|
59
|
+
var c = new _editorAndPad.EditorAndPad(props({
|
|
60
|
+
latex: 'x',
|
|
61
|
+
keypadMode: 'a',
|
|
62
|
+
noDecimal: false
|
|
63
|
+
}));
|
|
64
|
+
c.input = {
|
|
65
|
+
latex: function latex() {
|
|
66
|
+
return 'x';
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
c.state = {
|
|
70
|
+
equationEditor: 'geometry'
|
|
71
|
+
};
|
|
72
|
+
expect(c.shouldComponentUpdate({
|
|
73
|
+
latex: 'x',
|
|
74
|
+
keypadMode: 'a',
|
|
75
|
+
noDecimal: false
|
|
76
|
+
}, c.state)).toBe(false);
|
|
77
|
+
});
|
|
78
|
+
it('re-renders when the field differs from the incoming latex', function () {
|
|
79
|
+
var c = new _editorAndPad.EditorAndPad(props({
|
|
80
|
+
latex: 'y'
|
|
81
|
+
}));
|
|
82
|
+
c.input = {
|
|
83
|
+
latex: function latex() {
|
|
84
|
+
return 'x';
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
expect(c.shouldComponentUpdate({
|
|
88
|
+
latex: 'y'
|
|
89
|
+
}, {})).toBe(true);
|
|
90
|
+
});
|
|
91
|
+
it('uses input.latex(), never input.mathField.latex()', function () {
|
|
92
|
+
var c = new _editorAndPad.EditorAndPad(props({
|
|
93
|
+
latex: 'x'
|
|
94
|
+
}));
|
|
95
|
+
var latex = jest.fn(function () {
|
|
96
|
+
return 'x';
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// deliberately no `mathField` - the old code would have thrown here
|
|
100
|
+
c.input = {
|
|
101
|
+
latex: latex
|
|
102
|
+
};
|
|
103
|
+
c.state = {
|
|
104
|
+
equationEditor: 'geometry'
|
|
105
|
+
};
|
|
106
|
+
c.shouldComponentUpdate({
|
|
107
|
+
latex: 'x'
|
|
108
|
+
}, c.state);
|
|
109
|
+
expect(latex).toHaveBeenCalled();
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
describe('onClick key routing', function () {
|
|
113
|
+
var withInput = function withInput() {
|
|
114
|
+
var over = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
115
|
+
var c = new _editorAndPad.EditorAndPad(props(over));
|
|
116
|
+
var calls = {
|
|
117
|
+
write: [],
|
|
118
|
+
command: [],
|
|
119
|
+
keystroke: [],
|
|
120
|
+
clear: 0
|
|
121
|
+
};
|
|
122
|
+
c.input = {
|
|
123
|
+
write: function write(v) {
|
|
124
|
+
return calls.write.push(v);
|
|
125
|
+
},
|
|
126
|
+
command: function command(v) {
|
|
127
|
+
return calls.command.push(v);
|
|
128
|
+
},
|
|
129
|
+
keystroke: function keystroke(v) {
|
|
130
|
+
return calls.keystroke.push(v);
|
|
131
|
+
},
|
|
132
|
+
clear: function clear() {
|
|
133
|
+
return calls.clear++;
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
c.updateDisable = function () {};
|
|
137
|
+
return {
|
|
138
|
+
c: c,
|
|
139
|
+
calls: calls
|
|
140
|
+
};
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
// toNodeData keys this off `value === 'clear'`, not `type`
|
|
144
|
+
it('clear', function () {
|
|
145
|
+
var _withInput = withInput(),
|
|
146
|
+
c = _withInput.c,
|
|
147
|
+
calls = _withInput.calls;
|
|
148
|
+
c.onClick({
|
|
149
|
+
value: 'clear'
|
|
150
|
+
});
|
|
151
|
+
expect(calls.clear).toBe(1);
|
|
152
|
+
});
|
|
153
|
+
it('command', function () {
|
|
154
|
+
var _withInput2 = withInput(),
|
|
155
|
+
c = _withInput2.c,
|
|
156
|
+
calls = _withInput2.calls;
|
|
157
|
+
c.onClick({
|
|
158
|
+
type: 'command',
|
|
159
|
+
value: '\\frac'
|
|
160
|
+
});
|
|
161
|
+
expect(calls.command).toEqual(['\\frac']);
|
|
162
|
+
});
|
|
163
|
+
it('cursor keystroke', function () {
|
|
164
|
+
var _withInput3 = withInput(),
|
|
165
|
+
c = _withInput3.c,
|
|
166
|
+
calls = _withInput3.calls;
|
|
167
|
+
c.onClick({
|
|
168
|
+
type: 'cursor',
|
|
169
|
+
value: 'Left'
|
|
170
|
+
});
|
|
171
|
+
expect(calls.keystroke).toEqual(['Left']);
|
|
172
|
+
});
|
|
173
|
+
it('answer block writes the response token', function () {
|
|
174
|
+
var _withInput4 = withInput(),
|
|
175
|
+
c = _withInput4.c,
|
|
176
|
+
calls = _withInput4.calls;
|
|
177
|
+
c.onClick({
|
|
178
|
+
type: 'answer'
|
|
179
|
+
});
|
|
180
|
+
expect(calls.write).toEqual(['%response%']);
|
|
181
|
+
});
|
|
182
|
+
it('plain value', function () {
|
|
183
|
+
var _withInput5 = withInput(),
|
|
184
|
+
c = _withInput5.c,
|
|
185
|
+
calls = _withInput5.calls;
|
|
186
|
+
c.onClick({
|
|
187
|
+
value: 'x'
|
|
188
|
+
});
|
|
189
|
+
expect(calls.write).toEqual(['x']);
|
|
190
|
+
});
|
|
191
|
+
it('ignores a nullish key', function () {
|
|
192
|
+
var _withInput6 = withInput(),
|
|
193
|
+
c = _withInput6.c,
|
|
194
|
+
calls = _withInput6.calls;
|
|
195
|
+
expect(function () {
|
|
196
|
+
return c.onClick(null);
|
|
197
|
+
}).not.toThrow();
|
|
198
|
+
expect(calls.write).toEqual([]);
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
describe('onEditorChange', function () {
|
|
202
|
+
var withInput = function withInput() {
|
|
203
|
+
var over = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
204
|
+
var onChange = jest.fn();
|
|
205
|
+
var c = new _editorAndPad.EditorAndPad(props(_objectSpread({
|
|
206
|
+
onChange: onChange
|
|
207
|
+
}, over)));
|
|
208
|
+
var calls = {
|
|
209
|
+
keystroke: [],
|
|
210
|
+
clear: 0,
|
|
211
|
+
write: []
|
|
212
|
+
};
|
|
213
|
+
c.input = {
|
|
214
|
+
keystroke: function keystroke(v) {
|
|
215
|
+
return calls.keystroke.push(v);
|
|
216
|
+
},
|
|
217
|
+
clear: function clear() {
|
|
218
|
+
return calls.clear++;
|
|
219
|
+
},
|
|
220
|
+
write: function write(v) {
|
|
221
|
+
return calls.write.push(v);
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
c.updateDisable = function () {};
|
|
225
|
+
return {
|
|
226
|
+
c: c,
|
|
227
|
+
onChange: onChange,
|
|
228
|
+
calls: calls
|
|
229
|
+
};
|
|
230
|
+
};
|
|
231
|
+
it('propagates ordinary latex to onChange', function () {
|
|
232
|
+
var _withInput7 = withInput(),
|
|
233
|
+
c = _withInput7.c,
|
|
234
|
+
onChange = _withInput7.onChange;
|
|
235
|
+
c.onEditorChange('\\frac{1}{2}');
|
|
236
|
+
expect(onChange).toHaveBeenCalledWith('\\frac{1}{2}');
|
|
237
|
+
});
|
|
238
|
+
it('strips decimals when noDecimal is set', function () {
|
|
239
|
+
var _withInput8 = withInput({
|
|
240
|
+
noDecimal: true
|
|
241
|
+
}),
|
|
242
|
+
c = _withInput8.c,
|
|
243
|
+
onChange = _withInput8.onChange,
|
|
244
|
+
calls = _withInput8.calls;
|
|
245
|
+
c.onEditorChange('1.5');
|
|
246
|
+
expect(calls.clear).toBe(1);
|
|
247
|
+
expect(calls.write).toEqual(['15']);
|
|
248
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
249
|
+
});
|
|
250
|
+
it('undoes the empty fraction after a digit with a public delete, not MathQuill internals', function () {
|
|
251
|
+
var _withInput9 = withInput(),
|
|
252
|
+
c = _withInput9.c,
|
|
253
|
+
onChange = _withInput9.onChange,
|
|
254
|
+
calls = _withInput9.calls;
|
|
255
|
+
|
|
256
|
+
// the shape the old __controller hack targeted
|
|
257
|
+
c.onEditorChange('2\\ \\frac{1}{ }');
|
|
258
|
+
expect(calls.keystroke).toEqual(['Backspace']);
|
|
259
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
260
|
+
});
|
|
261
|
+
it('does not treat normal fractions as the mixed-number case', function () {
|
|
262
|
+
var _withInput0 = withInput(),
|
|
263
|
+
c = _withInput0.c,
|
|
264
|
+
onChange = _withInput0.onChange,
|
|
265
|
+
calls = _withInput0.calls;
|
|
266
|
+
c.onEditorChange('\\frac{1}{2}');
|
|
267
|
+
expect(calls.keystroke).toEqual([]);
|
|
268
|
+
expect(onChange).toHaveBeenCalled();
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZWRpdG9yQW5kUGFkIiwicmVxdWlyZSIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiZGVzY3JpYmUiLCJwcm9wcyIsIm92ZXIiLCJ1bmRlZmluZWQiLCJjbGFzc2VzIiwiY2xhc3NOYW1lcyIsIm9uQ2hhbmdlIiwiamVzdCIsImZuIiwiaXQiLCJjIiwiRWRpdG9yQW5kUGFkIiwibGF0ZXgiLCJpbnB1dCIsImV4cGVjdCIsInNob3VsZENvbXBvbmVudFVwZGF0ZSIsInRvQmUiLCJub3QiLCJ0b1Rocm93Iiwia2V5cGFkTW9kZSIsIm5vRGVjaW1hbCIsInN0YXRlIiwiZXF1YXRpb25FZGl0b3IiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwid2l0aElucHV0IiwiY2FsbHMiLCJ3cml0ZSIsImNvbW1hbmQiLCJrZXlzdHJva2UiLCJjbGVhciIsInYiLCJ1cGRhdGVEaXNhYmxlIiwiX3dpdGhJbnB1dCIsIm9uQ2xpY2siLCJ2YWx1ZSIsIl93aXRoSW5wdXQyIiwidHlwZSIsInRvRXF1YWwiLCJfd2l0aElucHV0MyIsIl93aXRoSW5wdXQ0IiwiX3dpdGhJbnB1dDUiLCJfd2l0aElucHV0NiIsIl93aXRoSW5wdXQ3Iiwib25FZGl0b3JDaGFuZ2UiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsIl93aXRoSW5wdXQ4IiwiX3dpdGhJbnB1dDkiLCJfd2l0aElucHV0MCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vZWRpdG9yLWFuZC1wYWQtbWF0aGxpdmUudGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFZGl0b3JBbmRQYWQgfSBmcm9tICcuLi9lZGl0b3ItYW5kLXBhZCc7XG5cbi8qKlxuICogQ292ZXJzIHRoZSBjYWxsIHNpdGVzIHRoYXQgY2hhbmdlZCB3aGVuIHRoaXMgcGFja2FnZSBtb3ZlZCBmcm9tXG4gKiBAcGllLWxpYi9tYXRoLWlucHV0IChNYXRoUXVpbGwpIHRvIEBwaWUtbGliL21hdGgtaW5wdXQtbWF0aGxpdmUuXG4gKlxuICogQWxsIHRocmVlIHdlcmUgTWF0aFF1aWxsLXNoYXBlZCBhbmQgc2lsZW50bHkgY2hhbmdlZCBtZWFuaW5nOlxuICogIC0gc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJlYWQgYHRoaXMuaW5wdXQubWF0aEZpZWxkLmxhdGV4KClgLCB3aGljaCB0aHJvd3Mgbm93XG4gKiAgICAoYW5kIHRoZSBmaWVsZCBsb2FkcyBhc3luY2hyb25vdXNseSwgc28gYHRoaXMuaW5wdXRgIGNhbiBiZSBudWxsKVxuICogIC0gdGhlIG1peGVkLW51bWJlciB3b3JrYXJvdW5kIHBva2VkIGBfX2NvbnRyb2xsZXIuY3Vyc29yYCwgYSBNYXRoUXVpbGxcbiAqICAgIGludGVybmFsIHdpdGggbm8gTWF0aExpdmUgZXF1aXZhbGVudFxuICogIC0gb25DbGljayByb3V0ZXMga2V5cGFkIHByZXNzZXMgdGhyb3VnaCB0aGUgaW1wZXJhdGl2ZSBmaWVsZCBBUElcbiAqL1xuZGVzY3JpYmUoJ0VkaXRvckFuZFBhZCBhZnRlciB0aGUgTWF0aExpdmUgbWlncmF0aW9uJywgKCkgPT4ge1xuICBjb25zdCBwcm9wcyA9IChvdmVyID0ge30pID0+ICh7IGNsYXNzZXM6IHt9LCBjbGFzc05hbWVzOiB7fSwgb25DaGFuZ2U6IGplc3QuZm4oKSwgLi4ub3ZlciB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkQ29tcG9uZW50VXBkYXRlJywgKCkgPT4ge1xuICAgIGl0KCd0cmVhdHMgYSBtaXNzaW5nIGlucHV0IHJlZiBhcyBkaWZmZXJlbnQsIHNvIHRoZSBmaXJzdCByZW5kZXIgaXMgbm90IHNraXBwZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjID0gbmV3IEVkaXRvckFuZFBhZChwcm9wcyh7IGxhdGV4OiAneCcgfSkpO1xuXG4gICAgICBjLmlucHV0ID0gbnVsbDtcblxuICAgICAgZXhwZWN0KGMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKHsgbGF0ZXg6ICd4JyB9LCB7fSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgdGhyb3cgd2hlbiB0aGUgbWF0aCBlbmdpbmUgaGFzIG5vdCBsb2FkZWQgeWV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgYyA9IG5ldyBFZGl0b3JBbmRQYWQocHJvcHMoeyBsYXRleDogJ3gnIH0pKTtcblxuICAgICAgLy8gbGF0ZXgoKSByZXR1cm5zICcnIHVudGlsIE1hdGhMaXZlIGlzIHJlYWR5XG4gICAgICBjLmlucHV0ID0geyBsYXRleDogKCkgPT4gJycgfTtcblxuICAgICAgZXhwZWN0KCgpID0+IGMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKHsgbGF0ZXg6ICd4JyB9LCB7fSkpLm5vdC50b1Rocm93KCk7XG4gICAgICBleHBlY3QoYy5zaG91bGRDb21wb25lbnRVcGRhdGUoeyBsYXRleDogJ3gnIH0sIHt9KSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdza2lwcyB0aGUgdXBkYXRlIHdoZW4gdGhlIGZpZWxkIGFscmVhZHkgaG9sZHMgdGhlIGluY29taW5nIGxhdGV4JywgKCkgPT4ge1xuICAgICAgY29uc3QgYyA9IG5ldyBFZGl0b3JBbmRQYWQocHJvcHMoeyBsYXRleDogJ3gnLCBrZXlwYWRNb2RlOiAnYScsIG5vRGVjaW1hbDogZmFsc2UgfSkpO1xuXG4gICAgICBjLmlucHV0ID0geyBsYXRleDogKCkgPT4gJ3gnIH07XG4gICAgICBjLnN0YXRlID0geyBlcXVhdGlvbkVkaXRvcjogJ2dlb21ldHJ5JyB9O1xuXG4gICAgICBleHBlY3QoYy5zaG91bGRDb21wb25lbnRVcGRhdGUoeyBsYXRleDogJ3gnLCBrZXlwYWRNb2RlOiAnYScsIG5vRGVjaW1hbDogZmFsc2UgfSwgYy5zdGF0ZSkpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlLXJlbmRlcnMgd2hlbiB0aGUgZmllbGQgZGlmZmVycyBmcm9tIHRoZSBpbmNvbWluZyBsYXRleCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGMgPSBuZXcgRWRpdG9yQW5kUGFkKHByb3BzKHsgbGF0ZXg6ICd5JyB9KSk7XG5cbiAgICAgIGMuaW5wdXQgPSB7IGxhdGV4OiAoKSA9PiAneCcgfTtcblxuICAgICAgZXhwZWN0KGMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKHsgbGF0ZXg6ICd5JyB9LCB7fSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgndXNlcyBpbnB1dC5sYXRleCgpLCBuZXZlciBpbnB1dC5tYXRoRmllbGQubGF0ZXgoKScsICgpID0+IHtcbiAgICAgIGNvbnN0IGMgPSBuZXcgRWRpdG9yQW5kUGFkKHByb3BzKHsgbGF0ZXg6ICd4JyB9KSk7XG4gICAgICBjb25zdCBsYXRleCA9IGplc3QuZm4oKCkgPT4gJ3gnKTtcblxuICAgICAgLy8gZGVsaWJlcmF0ZWx5IG5vIGBtYXRoRmllbGRgIC0gdGhlIG9sZCBjb2RlIHdvdWxkIGhhdmUgdGhyb3duIGhlcmVcbiAgICAgIGMuaW5wdXQgPSB7IGxhdGV4IH07XG4gICAgICBjLnN0YXRlID0geyBlcXVhdGlvbkVkaXRvcjogJ2dlb21ldHJ5JyB9O1xuICAgICAgYy5zaG91bGRDb21wb25lbnRVcGRhdGUoeyBsYXRleDogJ3gnIH0sIGMuc3RhdGUpO1xuXG4gICAgICBleHBlY3QobGF0ZXgpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ29uQ2xpY2sga2V5IHJvdXRpbmcnLCAoKSA9PiB7XG4gICAgY29uc3Qgd2l0aElucHV0ID0gKG92ZXIgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgYyA9IG5ldyBFZGl0b3JBbmRQYWQocHJvcHMob3ZlcikpO1xuICAgICAgY29uc3QgY2FsbHMgPSB7IHdyaXRlOiBbXSwgY29tbWFuZDogW10sIGtleXN0cm9rZTogW10sIGNsZWFyOiAwIH07XG5cbiAgICAgIGMuaW5wdXQgPSB7XG4gICAgICAgIHdyaXRlOiAodikgPT4gY2FsbHMud3JpdGUucHVzaCh2KSxcbiAgICAgICAgY29tbWFuZDogKHYpID0+IGNhbGxzLmNvbW1hbmQucHVzaCh2KSxcbiAgICAgICAga2V5c3Ryb2tlOiAodikgPT4gY2FsbHMua2V5c3Ryb2tlLnB1c2godiksXG4gICAgICAgIGNsZWFyOiAoKSA9PiBjYWxscy5jbGVhcisrLFxuICAgICAgfTtcbiAgICAgIGMudXBkYXRlRGlzYWJsZSA9ICgpID0+IHt9O1xuXG4gICAgICByZXR1cm4geyBjLCBjYWxscyB9O1xuICAgIH07XG5cbiAgICAvLyB0b05vZGVEYXRhIGtleXMgdGhpcyBvZmYgYHZhbHVlID09PSAnY2xlYXInYCwgbm90IGB0eXBlYFxuICAgIGl0KCdjbGVhcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgYywgY2FsbHMgfSA9IHdpdGhJbnB1dCgpO1xuXG4gICAgICBjLm9uQ2xpY2soeyB2YWx1ZTogJ2NsZWFyJyB9KTtcbiAgICAgIGV4cGVjdChjYWxscy5jbGVhcikudG9CZSgxKTtcbiAgICB9KTtcblxuICAgIGl0KCdjb21tYW5kJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjLCBjYWxscyB9ID0gd2l0aElucHV0KCk7XG5cbiAgICAgIGMub25DbGljayh7IHR5cGU6ICdjb21tYW5kJywgdmFsdWU6ICdcXFxcZnJhYycgfSk7XG4gICAgICBleHBlY3QoY2FsbHMuY29tbWFuZCkudG9FcXVhbChbJ1xcXFxmcmFjJ10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2N1cnNvciBrZXlzdHJva2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGMsIGNhbGxzIH0gPSB3aXRoSW5wdXQoKTtcblxuICAgICAgYy5vbkNsaWNrKHsgdHlwZTogJ2N1cnNvcicsIHZhbHVlOiAnTGVmdCcgfSk7XG4gICAgICBleHBlY3QoY2FsbHMua2V5c3Ryb2tlKS50b0VxdWFsKFsnTGVmdCddKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbnN3ZXIgYmxvY2sgd3JpdGVzIHRoZSByZXNwb25zZSB0b2tlbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgYywgY2FsbHMgfSA9IHdpdGhJbnB1dCgpO1xuXG4gICAgICBjLm9uQ2xpY2soeyB0eXBlOiAnYW5zd2VyJyB9KTtcbiAgICAgIGV4cGVjdChjYWxscy53cml0ZSkudG9FcXVhbChbJyVyZXNwb25zZSUnXSk7XG4gICAgfSk7XG5cbiAgICBpdCgncGxhaW4gdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGMsIGNhbGxzIH0gPSB3aXRoSW5wdXQoKTtcblxuICAgICAgYy5vbkNsaWNrKHsgdmFsdWU6ICd4JyB9KTtcbiAgICAgIGV4cGVjdChjYWxscy53cml0ZSkudG9FcXVhbChbJ3gnXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaWdub3JlcyBhIG51bGxpc2gga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjLCBjYWxscyB9ID0gd2l0aElucHV0KCk7XG5cbiAgICAgIGV4cGVjdCgoKSA9PiBjLm9uQ2xpY2sobnVsbCkpLm5vdC50b1Rocm93KCk7XG4gICAgICBleHBlY3QoY2FsbHMud3JpdGUpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnb25FZGl0b3JDaGFuZ2UnLCAoKSA9PiB7XG4gICAgY29uc3Qgd2l0aElucHV0ID0gKG92ZXIgPSB7fSkgPT4ge1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBjID0gbmV3IEVkaXRvckFuZFBhZChwcm9wcyh7IG9uQ2hhbmdlLCAuLi5vdmVyIH0pKTtcbiAgICAgIGNvbnN0IGNhbGxzID0geyBrZXlzdHJva2U6IFtdLCBjbGVhcjogMCwgd3JpdGU6IFtdIH07XG5cbiAgICAgIGMuaW5wdXQgPSB7XG4gICAgICAgIGtleXN0cm9rZTogKHYpID0+IGNhbGxzLmtleXN0cm9rZS5wdXNoKHYpLFxuICAgICAgICBjbGVhcjogKCkgPT4gY2FsbHMuY2xlYXIrKyxcbiAgICAgICAgd3JpdGU6ICh2KSA9PiBjYWxscy53cml0ZS5wdXNoKHYpLFxuICAgICAgfTtcbiAgICAgIGMudXBkYXRlRGlzYWJsZSA9ICgpID0+IHt9O1xuXG4gICAgICByZXR1cm4geyBjLCBvbkNoYW5nZSwgY2FsbHMgfTtcbiAgICB9O1xuXG4gICAgaXQoJ3Byb3BhZ2F0ZXMgb3JkaW5hcnkgbGF0ZXggdG8gb25DaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGMsIG9uQ2hhbmdlIH0gPSB3aXRoSW5wdXQoKTtcblxuICAgICAgYy5vbkVkaXRvckNoYW5nZSgnXFxcXGZyYWN7MX17Mn0nKTtcbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ1xcXFxmcmFjezF9ezJ9Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3RyaXBzIGRlY2ltYWxzIHdoZW4gbm9EZWNpbWFsIGlzIHNldCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgYywgb25DaGFuZ2UsIGNhbGxzIH0gPSB3aXRoSW5wdXQoeyBub0RlY2ltYWw6IHRydWUgfSk7XG5cbiAgICAgIGMub25FZGl0b3JDaGFuZ2UoJzEuNScpO1xuXG4gICAgICBleHBlY3QoY2FsbHMuY2xlYXIpLnRvQmUoMSk7XG4gICAgICBleHBlY3QoY2FsbHMud3JpdGUpLnRvRXF1YWwoWycxNSddKTtcbiAgICAgIGV4cGVjdChvbkNoYW5nZSkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCd1bmRvZXMgdGhlIGVtcHR5IGZyYWN0aW9uIGFmdGVyIGEgZGlnaXQgd2l0aCBhIHB1YmxpYyBkZWxldGUsIG5vdCBNYXRoUXVpbGwgaW50ZXJuYWxzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjLCBvbkNoYW5nZSwgY2FsbHMgfSA9IHdpdGhJbnB1dCgpO1xuXG4gICAgICAvLyB0aGUgc2hhcGUgdGhlIG9sZCBfX2NvbnRyb2xsZXIgaGFjayB0YXJnZXRlZFxuICAgICAgYy5vbkVkaXRvckNoYW5nZSgnMlxcXFwgXFxcXGZyYWN7MX17IH0nKTtcblxuICAgICAgZXhwZWN0KGNhbGxzLmtleXN0cm9rZSkudG9FcXVhbChbJ0JhY2tzcGFjZSddKTtcbiAgICAgIGV4cGVjdChvbkNoYW5nZSkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCB0cmVhdCBub3JtYWwgZnJhY3Rpb25zIGFzIHRoZSBtaXhlZC1udW1iZXIgY2FzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgYywgb25DaGFuZ2UsIGNhbGxzIH0gPSB3aXRoSW5wdXQoKTtcblxuICAgICAgYy5vbkVkaXRvckNoYW5nZSgnXFxcXGZyYWN7MX17Mn0nKTtcblxuICAgICAgZXhwZWN0KGNhbGxzLmtleXN0cm9rZSkudG9FcXVhbChbXSk7XG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLGFBQUEsR0FBQUMsT0FBQTtBQUFpRCxTQUFBQyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEs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
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
5
|
+
var _editorAndPad = require("../editor-and-pad");
|
|
6
|
+
var _react = require("@testing-library/react");
|
|
7
|
+
var _react2 = _interopRequireDefault(require("react"));
|
|
8
|
+
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; }
|
|
9
|
+
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; }
|
|
10
|
+
describe('EditorAndPad', function () {
|
|
11
|
+
var defaultProps = {
|
|
12
|
+
classes: {},
|
|
13
|
+
classNames: {},
|
|
14
|
+
onBlur: jest.fn()
|
|
15
|
+
};
|
|
16
|
+
beforeEach(function () {
|
|
17
|
+
jest.useFakeTimers();
|
|
18
|
+
});
|
|
19
|
+
afterEach(function () {
|
|
20
|
+
jest.useRealTimers();
|
|
21
|
+
});
|
|
22
|
+
it('renders with default props', function () {
|
|
23
|
+
var _render = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_editorAndPad.EditorAndPad, defaultProps)),
|
|
24
|
+
container = _render.container;
|
|
25
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
26
|
+
});
|
|
27
|
+
describe('autoFocus', function () {
|
|
28
|
+
it('focuses input immediately via setTimeout when autoFocus is true', function () {
|
|
29
|
+
var mockFocus = jest.fn();
|
|
30
|
+
var component = new _editorAndPad.EditorAndPad(_objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
31
|
+
autoFocus: true
|
|
32
|
+
}));
|
|
33
|
+
component.input = {
|
|
34
|
+
focus: mockFocus
|
|
35
|
+
};
|
|
36
|
+
component.componentDidMount();
|
|
37
|
+
expect(mockFocus).not.toHaveBeenCalled();
|
|
38
|
+
jest.runAllTimers();
|
|
39
|
+
expect(mockFocus).toHaveBeenCalledTimes(1);
|
|
40
|
+
});
|
|
41
|
+
it('does not focus input when autoFocus is false', function () {
|
|
42
|
+
var mockFocus = jest.fn();
|
|
43
|
+
var component = new _editorAndPad.EditorAndPad(_objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
44
|
+
autoFocus: false
|
|
45
|
+
}));
|
|
46
|
+
component.input = {
|
|
47
|
+
focus: mockFocus
|
|
48
|
+
};
|
|
49
|
+
component.componentDidMount();
|
|
50
|
+
jest.runAllTimers();
|
|
51
|
+
expect(mockFocus).not.toHaveBeenCalled();
|
|
52
|
+
});
|
|
53
|
+
it('does not focus when input ref is not set', function () {
|
|
54
|
+
var component = new _editorAndPad.EditorAndPad(_objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
55
|
+
autoFocus: true
|
|
56
|
+
}));
|
|
57
|
+
component.input = null;
|
|
58
|
+
expect(function () {
|
|
59
|
+
component.componentDidMount();
|
|
60
|
+
jest.runAllTimers();
|
|
61
|
+
}).not.toThrow();
|
|
62
|
+
});
|
|
63
|
+
it('uses setTimeout with 0ms delay to defer focus', function () {
|
|
64
|
+
var setTimeoutSpy = jest.spyOn(global, 'setTimeout');
|
|
65
|
+
var mockFocus = jest.fn();
|
|
66
|
+
var component = new _editorAndPad.EditorAndPad(_objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
67
|
+
autoFocus: true
|
|
68
|
+
}));
|
|
69
|
+
component.input = {
|
|
70
|
+
focus: mockFocus
|
|
71
|
+
};
|
|
72
|
+
component.componentDidMount();
|
|
73
|
+
expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 0);
|
|
74
|
+
setTimeoutSpy.mockRestore();
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZWRpdG9yQW5kUGFkIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9yZWFjdDIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0Iiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkZXNjcmliZSIsImRlZmF1bHRQcm9wcyIsImNsYXNzZXMiLCJjbGFzc05hbWVzIiwib25CbHVyIiwiamVzdCIsImZuIiwiYmVmb3JlRWFjaCIsInVzZUZha2VUaW1lcnMiLCJhZnRlckVhY2giLCJ1c2VSZWFsVGltZXJzIiwiaXQiLCJfcmVuZGVyIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsIkVkaXRvckFuZFBhZCIsImNvbnRhaW5lciIsImV4cGVjdCIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsIm1vY2tGb2N1cyIsImNvbXBvbmVudCIsImF1dG9Gb2N1cyIsImlucHV0IiwiZm9jdXMiLCJjb21wb25lbnREaWRNb3VudCIsIm5vdCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJydW5BbGxUaW1lcnMiLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJ0b1Rocm93Iiwic2V0VGltZW91dFNweSIsInNweU9uIiwiZ2xvYmFsIiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJhbnkiLCJGdW5jdGlvbiIsIm1vY2tSZXN0b3JlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9lZGl0b3ItYW5kLXBhZC50ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVkaXRvckFuZFBhZCB9IGZyb20gJy4uL2VkaXRvci1hbmQtcGFkJztcbmltcG9ydCB7IHJlbmRlciB9IGZyb20gJ0B0ZXN0aW5nLWxpYnJhcnkvcmVhY3QnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZGVzY3JpYmUoJ0VkaXRvckFuZFBhZCcsICgpID0+IHtcbiAgY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICAgIGNsYXNzZXM6IHt9LFxuICAgIGNsYXNzTmFtZXM6IHt9LFxuICAgIG9uQmx1cjogamVzdC5mbigpLFxuICB9O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGplc3QudXNlRmFrZVRpbWVycygpO1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIGplc3QudXNlUmVhbFRpbWVycygpO1xuICB9KTtcblxuICBpdCgncmVuZGVycyB3aXRoIGRlZmF1bHQgcHJvcHMnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8RWRpdG9yQW5kUGFkIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhdXRvRm9jdXMnLCAoKSA9PiB7XG4gICAgaXQoJ2ZvY3VzZXMgaW5wdXQgaW1tZWRpYXRlbHkgdmlhIHNldFRpbWVvdXQgd2hlbiBhdXRvRm9jdXMgaXMgdHJ1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vY2tGb2N1cyA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBFZGl0b3JBbmRQYWQoeyAuLi5kZWZhdWx0UHJvcHMsIGF1dG9Gb2N1czogdHJ1ZSB9KTtcbiAgICAgIGNvbXBvbmVudC5pbnB1dCA9IHsgZm9jdXM6IG1vY2tGb2N1cyB9O1xuXG4gICAgICBjb21wb25lbnQuY29tcG9uZW50RGlkTW91bnQoKTtcblxuICAgICAgZXhwZWN0KG1vY2tGb2N1cykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcblxuICAgICAgamVzdC5ydW5BbGxUaW1lcnMoKTtcblxuICAgICAgZXhwZWN0KG1vY2tGb2N1cykudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGZvY3VzIGlucHV0IHdoZW4gYXV0b0ZvY3VzIGlzIGZhbHNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9ja0ZvY3VzID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IEVkaXRvckFuZFBhZCh7IC4uLmRlZmF1bHRQcm9wcywgYXV0b0ZvY3VzOiBmYWxzZSB9KTtcbiAgICAgIGNvbXBvbmVudC5pbnB1dCA9IHsgZm9jdXM6IG1vY2tGb2N1cyB9O1xuXG4gICAgICBjb21wb25lbnQuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgIGplc3QucnVuQWxsVGltZXJzKCk7XG5cbiAgICAgIGV4cGVjdChtb2NrRm9jdXMpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgZm9jdXMgd2hlbiBpbnB1dCByZWYgaXMgbm90IHNldCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBFZGl0b3JBbmRQYWQoeyAuLi5kZWZhdWx0UHJvcHMsIGF1dG9Gb2N1czogdHJ1ZSB9KTtcbiAgICAgIGNvbXBvbmVudC5pbnB1dCA9IG51bGw7XG5cbiAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICBqZXN0LnJ1bkFsbFRpbWVycygpO1xuICAgICAgfSkubm90LnRvVGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KCd1c2VzIHNldFRpbWVvdXQgd2l0aCAwbXMgZGVsYXkgdG8gZGVmZXIgZm9jdXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZXRUaW1lb3V0U3B5ID0gamVzdC5zcHlPbihnbG9iYWwsICdzZXRUaW1lb3V0Jyk7XG4gICAgICBjb25zdCBtb2NrRm9jdXMgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgRWRpdG9yQW5kUGFkKHsgLi4uZGVmYXVsdFByb3BzLCBhdXRvRm9jdXM6IHRydWUgfSk7XG4gICAgICBjb21wb25lbnQuaW5wdXQgPSB7IGZvY3VzOiBtb2NrRm9jdXMgfTtcblxuICAgICAgY29tcG9uZW50LmNvbXBvbmVudERpZE1vdW50KCk7XG5cbiAgICAgIGV4cGVjdChzZXRUaW1lb3V0U3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3QuYW55KEZ1bmN0aW9uKSwgMCk7XG5cbiAgICAgIHNldFRpbWVvdXRTcHkubW9ja1Jlc3RvcmUoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLGFBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUEwQixTQUFBSSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVks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
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
5
|
+
var _index = require("../index");
|
|
6
|
+
var _react = require("@testing-library/react");
|
|
7
|
+
var _react2 = _interopRequireDefault(require("react"));
|
|
8
|
+
describe('RawPureToolbar', function () {
|
|
9
|
+
var defaultProps = {
|
|
10
|
+
classes: {},
|
|
11
|
+
controlledKeypad: true,
|
|
12
|
+
showKeypad: true
|
|
13
|
+
};
|
|
14
|
+
it('renders with DONE button if hideDoneButton is not defined', function () {
|
|
15
|
+
var _render = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_index.RawPureToolbar, defaultProps)),
|
|
16
|
+
container = _render.container;
|
|
17
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
18
|
+
});
|
|
19
|
+
it('renders without DONE button if hideDoneButton value is true', function () {
|
|
20
|
+
var _render2 = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_index.RawPureToolbar, (0, _extends2["default"])({}, defaultProps, {
|
|
21
|
+
hideDoneButton: true
|
|
22
|
+
}))),
|
|
23
|
+
container = _render2.container;
|
|
24
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaW5kZXgiLCJyZXF1aXJlIiwiX3JlYWN0IiwiX3JlYWN0MiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJkZXNjcmliZSIsImRlZmF1bHRQcm9wcyIsImNsYXNzZXMiLCJjb250cm9sbGVkS2V5cGFkIiwic2hvd0tleXBhZCIsIml0IiwiX3JlbmRlciIsInJlbmRlciIsImNyZWF0ZUVsZW1lbnQiLCJSYXdQdXJlVG9vbGJhciIsImNvbnRhaW5lciIsImV4cGVjdCIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsIl9yZW5kZXIyIiwiX2V4dGVuZHMyIiwiaGlkZURvbmVCdXR0b24iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2luZGV4LnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmF3UHVyZVRvb2xiYXIgfSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyByZW5kZXIgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmRlc2NyaWJlKCdSYXdQdXJlVG9vbGJhcicsICgpID0+IHtcbiAgY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICAgIGNsYXNzZXM6IHt9LFxuICAgIGNvbnRyb2xsZWRLZXlwYWQ6IHRydWUsXG4gICAgc2hvd0tleXBhZDogdHJ1ZSxcbiAgfTtcblxuICBpdCgncmVuZGVycyB3aXRoIERPTkUgYnV0dG9uIGlmIGhpZGVEb25lQnV0dG9uIGlzIG5vdCBkZWZpbmVkJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPFJhd1B1cmVUb29sYmFyIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIHdpdGhvdXQgRE9ORSBidXR0b24gaWYgaGlkZURvbmVCdXR0b24gdmFsdWUgaXMgdHJ1ZScsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxSYXdQdXJlVG9vbGJhciB7Li4uZGVmYXVsdFByb3BzfSBoaWRlRG9uZUJ1dHRvbj17dHJ1ZX0gLz4pO1xuICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUVBSSxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsWUFBTTtFQUMvQixJQUFNQyxZQUFZLEdBQUc7SUFDbkJDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDWEMsZ0JBQWdCLEVBQUUsSUFBSTtJQUN0QkMsVUFBVSxFQUFFO0VBQ2QsQ0FBQztFQUVEQyxFQUFFLENBQUMsMkRBQTJELEVBQUUsWUFBTTtJQUNwRSxJQUFBQyxPQUFBLEdBQXNCLElBQUFDLGFBQU0sZUFBQ1QsT0FBQSxZQUFBVSxhQUFBLENBQUNiLE1BQUEsQ0FBQWMsY0FBYyxFQUFLUixZQUFlLENBQUMsQ0FBQztNQUExRFMsU0FBUyxHQUFBSixPQUFBLENBQVRJLFNBQVM7SUFDakJDLE1BQU0sQ0FBQ0QsU0FBUyxDQUFDRSxVQUFVLENBQUMsQ0FBQ0MsaUJBQWlCLENBQUMsQ0FBQztFQUNsRCxDQUFDLENBQUM7RUFFRlIsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLFlBQU07SUFDdEUsSUFBQVMsUUFBQSxHQUFzQixJQUFBUCxhQUFNLGVBQUNULE9BQUEsWUFBQVUsYUFBQSxDQUFDYixNQUFBLENBQUFjLGNBQWMsTUFBQU0sU0FBQSxpQkFBS2QsWUFBWTtRQUFFZSxjQUFjLEVBQUU7TUFBSyxFQUFFLENBQUMsQ0FBQztNQUFoRk4sU0FBUyxHQUFBSSxRQUFBLENBQVRKLFNBQVM7SUFDakJDLE1BQU0sQ0FBQ0QsU0FBUyxDQUFDRSxVQUFVLENBQUMsQ0FBQ0MsaUJBQWlCLENBQUMsQ0FBQztFQUNsRCxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
5
|
+
var _react = _interopRequireDefault(require("react"));
|
|
6
|
+
var _react2 = require("@testing-library/react");
|
|
7
|
+
var _mathPreview = _interopRequireDefault(require("../math-preview"));
|
|
8
|
+
/** Every rule emotion has injected so far, as CSSStyleRule objects. */
|
|
9
|
+
var injectedRules = function injectedRules() {
|
|
10
|
+
return Array.from(document.querySelectorAll('style[data-emotion]')).flatMap(function (tag) {
|
|
11
|
+
return tag.sheet ? Array.from(tag.sheet.cssRules) : [];
|
|
12
|
+
}).filter(function (rule) {
|
|
13
|
+
return rule.selectorText;
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The `.ML__latex` rule that actually applies to `element`.
|
|
19
|
+
*
|
|
20
|
+
* Matching with `element.matches` rather than string comparison means the
|
|
21
|
+
* assertions cover the selector too: a rule written as `& > .ML__latex` would
|
|
22
|
+
* not match the nested markup MathLive emits, and these tests would fail.
|
|
23
|
+
*/
|
|
24
|
+
var mathLiveRuleFor = function mathLiveRuleFor(element) {
|
|
25
|
+
return injectedRules().find(function (rule) {
|
|
26
|
+
return rule.selectorText.includes('.ML__latex') && element.matches(rule.selectorText);
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Stand in for MathLive's `convertLatexToMarkup` output, which is
|
|
32
|
+
* `<span class="ML__latex">...</span>` nested inside `mf.Static`'s holder span.
|
|
33
|
+
* MathLive does not load under jsdom, so the markup is added by hand.
|
|
34
|
+
*/
|
|
35
|
+
var addStaticMarkup = function addStaticMarkup(container) {
|
|
36
|
+
var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
|
|
37
|
+
var parent = container.firstChild;
|
|
38
|
+
for (var i = 1; i < depth; i += 1) {
|
|
39
|
+
var wrapper = document.createElement('span');
|
|
40
|
+
parent.appendChild(wrapper);
|
|
41
|
+
parent = wrapper;
|
|
42
|
+
}
|
|
43
|
+
var markup = document.createElement('span');
|
|
44
|
+
markup.className = 'ML__latex';
|
|
45
|
+
parent.appendChild(markup);
|
|
46
|
+
return markup;
|
|
47
|
+
};
|
|
48
|
+
describe('MathPreview', function () {
|
|
49
|
+
var defaultProps = {
|
|
50
|
+
latex: 'sqrt(5)',
|
|
51
|
+
classes: {},
|
|
52
|
+
isSelected: false,
|
|
53
|
+
onFocus: jest.fn(),
|
|
54
|
+
onBlur: jest.fn()
|
|
55
|
+
};
|
|
56
|
+
it('renders with default props', function () {
|
|
57
|
+
var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_mathPreview["default"], defaultProps)),
|
|
58
|
+
container = _render.container;
|
|
59
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
60
|
+
});
|
|
61
|
+
describe('MathLive static markup', function () {
|
|
62
|
+
it('is outlined and padded when not selected', function () {
|
|
63
|
+
var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_mathPreview["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
64
|
+
isSelected: false
|
|
65
|
+
}))),
|
|
66
|
+
container = _render2.container;
|
|
67
|
+
var rule = mathLiveRuleFor(addStaticMarkup(container));
|
|
68
|
+
expect(rule).toBeDefined();
|
|
69
|
+
expect(rule.style.getPropertyValue('border')).toEqual('solid 1px lightgrey');
|
|
70
|
+
expect(rule.style.getPropertyValue('padding')).toEqual('5px');
|
|
71
|
+
});
|
|
72
|
+
it('drops its outline and padding when selected, so only the container border shows', function () {
|
|
73
|
+
var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_mathPreview["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
74
|
+
isSelected: true
|
|
75
|
+
}))),
|
|
76
|
+
container = _render3.container;
|
|
77
|
+
var rule = mathLiveRuleFor(addStaticMarkup(container));
|
|
78
|
+
expect(rule).toBeDefined();
|
|
79
|
+
expect(rule.style.getPropertyValue('border')).toEqual('solid 0px lightgrey');
|
|
80
|
+
expect(rule.style.getPropertyValue('padding')).toEqual('0px');
|
|
81
|
+
});
|
|
82
|
+
it('is styled at any depth below the container, not just as a direct child', function () {
|
|
83
|
+
var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_mathPreview["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
84
|
+
isSelected: false
|
|
85
|
+
}))),
|
|
86
|
+
container = _render4.container;
|
|
87
|
+
expect(mathLiveRuleFor(addStaticMarkup(container, 3))).toBeDefined();
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfbWF0aFByZXZpZXciLCJpbmplY3RlZFJ1bGVzIiwiQXJyYXkiLCJmcm9tIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yQWxsIiwiZmxhdE1hcCIsInRhZyIsInNoZWV0IiwiY3NzUnVsZXMiLCJmaWx0ZXIiLCJydWxlIiwic2VsZWN0b3JUZXh0IiwibWF0aExpdmVSdWxlRm9yIiwiZWxlbWVudCIsImZpbmQiLCJpbmNsdWRlcyIsIm1hdGNoZXMiLCJhZGRTdGF0aWNNYXJrdXAiLCJjb250YWluZXIiLCJkZXB0aCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsInBhcmVudCIsImZpcnN0Q2hpbGQiLCJpIiwid3JhcHBlciIsImNyZWF0ZUVsZW1lbnQiLCJhcHBlbmRDaGlsZCIsIm1hcmt1cCIsImNsYXNzTmFtZSIsImRlc2NyaWJlIiwiZGVmYXVsdFByb3BzIiwibGF0ZXgiLCJjbGFzc2VzIiwiaXNTZWxlY3RlZCIsIm9uRm9jdXMiLCJqZXN0IiwiZm4iLCJvbkJsdXIiLCJpdCIsIl9yZW5kZXIiLCJyZW5kZXIiLCJleHBlY3QiLCJ0b0JlSW5UaGVEb2N1bWVudCIsIl9yZW5kZXIyIiwiX2V4dGVuZHMyIiwidG9CZURlZmluZWQiLCJzdHlsZSIsImdldFByb3BlcnR5VmFsdWUiLCJ0b0VxdWFsIiwiX3JlbmRlcjMiLCJfcmVuZGVyNCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vbWF0aC1wcmV2aWV3LnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHJlbmRlciB9IGZyb20gJ0B0ZXN0aW5nLWxpYnJhcnkvcmVhY3QnO1xuaW1wb3J0IE1hdGhQcmV2aWV3IGZyb20gJy4uL21hdGgtcHJldmlldyc7XG5cbi8qKiBFdmVyeSBydWxlIGVtb3Rpb24gaGFzIGluamVjdGVkIHNvIGZhciwgYXMgQ1NTU3R5bGVSdWxlIG9iamVjdHMuICovXG5jb25zdCBpbmplY3RlZFJ1bGVzID0gKCkgPT5cbiAgQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzdHlsZVtkYXRhLWVtb3Rpb25dJykpXG4gICAgLmZsYXRNYXAoKHRhZykgPT4gKHRhZy5zaGVldCA/IEFycmF5LmZyb20odGFnLnNoZWV0LmNzc1J1bGVzKSA6IFtdKSlcbiAgICAuZmlsdGVyKChydWxlKSA9PiBydWxlLnNlbGVjdG9yVGV4dCk7XG5cbi8qKlxuICogVGhlIGAuTUxfX2xhdGV4YCBydWxlIHRoYXQgYWN0dWFsbHkgYXBwbGllcyB0byBgZWxlbWVudGAuXG4gKlxuICogTWF0Y2hpbmcgd2l0aCBgZWxlbWVudC5tYXRjaGVzYCByYXRoZXIgdGhhbiBzdHJpbmcgY29tcGFyaXNvbiBtZWFucyB0aGVcbiAqIGFzc2VydGlvbnMgY292ZXIgdGhlIHNlbGVjdG9yIHRvbzogYSBydWxlIHdyaXR0ZW4gYXMgYCYgPiAuTUxfX2xhdGV4YCB3b3VsZFxuICogbm90IG1hdGNoIHRoZSBuZXN0ZWQgbWFya3VwIE1hdGhMaXZlIGVtaXRzLCBhbmQgdGhlc2UgdGVzdHMgd291bGQgZmFpbC5cbiAqL1xuY29uc3QgbWF0aExpdmVSdWxlRm9yID0gKGVsZW1lbnQpID0+XG4gIGluamVjdGVkUnVsZXMoKS5maW5kKChydWxlKSA9PiBydWxlLnNlbGVjdG9yVGV4dC5pbmNsdWRlcygnLk1MX19sYXRleCcpICYmIGVsZW1lbnQubWF0Y2hlcyhydWxlLnNlbGVjdG9yVGV4dCkpO1xuXG4vKipcbiAqIFN0YW5kIGluIGZvciBNYXRoTGl2ZSdzIGBjb252ZXJ0TGF0ZXhUb01hcmt1cGAgb3V0cHV0LCB3aGljaCBpc1xuICogYDxzcGFuIGNsYXNzPVwiTUxfX2xhdGV4XCI+Li4uPC9zcGFuPmAgbmVzdGVkIGluc2lkZSBgbWYuU3RhdGljYCdzIGhvbGRlciBzcGFuLlxuICogTWF0aExpdmUgZG9lcyBub3QgbG9hZCB1bmRlciBqc2RvbSwgc28gdGhlIG1hcmt1cCBpcyBhZGRlZCBieSBoYW5kLlxuICovXG5jb25zdCBhZGRTdGF0aWNNYXJrdXAgPSAoY29udGFpbmVyLCBkZXB0aCA9IDEpID0+IHtcbiAgbGV0IHBhcmVudCA9IGNvbnRhaW5lci5maXJzdENoaWxkO1xuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgZGVwdGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG5cbiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQod3JhcHBlcik7XG4gICAgcGFyZW50ID0gd3JhcHBlcjtcbiAgfVxuXG4gIGNvbnN0IG1hcmt1cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblxuICBtYXJrdXAuY2xhc3NOYW1lID0gJ01MX19sYXRleCc7XG4gIHBhcmVudC5hcHBlbmRDaGlsZChtYXJrdXApO1xuXG4gIHJldHVybiBtYXJrdXA7XG59O1xuXG5kZXNjcmliZSgnTWF0aFByZXZpZXcnLCAoKSA9PiB7XG4gIGNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgICBsYXRleDogJ3NxcnQoNSknLFxuICAgIGNsYXNzZXM6IHt9LFxuICAgIGlzU2VsZWN0ZWQ6IGZhbHNlLFxuICAgIG9uRm9jdXM6IGplc3QuZm4oKSxcbiAgICBvbkJsdXI6IGplc3QuZm4oKSxcbiAgfTtcblxuICBpdCgncmVuZGVycyB3aXRoIGRlZmF1bHQgcHJvcHMnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8TWF0aFByZXZpZXcgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ01hdGhMaXZlIHN0YXRpYyBtYXJrdXAnLCAoKSA9PiB7XG4gICAgaXQoJ2lzIG91dGxpbmVkIGFuZCBwYWRkZWQgd2hlbiBub3Qgc2VsZWN0ZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxNYXRoUHJldmlldyB7Li4uZGVmYXVsdFByb3BzfSBpc1NlbGVjdGVkPXtmYWxzZX0gLz4pO1xuICAgICAgY29uc3QgcnVsZSA9IG1hdGhMaXZlUnVsZUZvcihhZGRTdGF0aWNNYXJrdXAoY29udGFpbmVyKSk7XG5cbiAgICAgIGV4cGVjdChydWxlKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHJ1bGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyJykpLnRvRXF1YWwoJ3NvbGlkIDFweCBsaWdodGdyZXknKTtcbiAgICAgIGV4cGVjdChydWxlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmcnKSkudG9FcXVhbCgnNXB4Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZHJvcHMgaXRzIG91dGxpbmUgYW5kIHBhZGRpbmcgd2hlbiBzZWxlY3RlZCwgc28gb25seSB0aGUgY29udGFpbmVyIGJvcmRlciBzaG93cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPE1hdGhQcmV2aWV3IHsuLi5kZWZhdWx0UHJvcHN9IGlzU2VsZWN0ZWQgLz4pO1xuICAgICAgY29uc3QgcnVsZSA9IG1hdGhMaXZlUnVsZUZvcihhZGRTdGF0aWNNYXJrdXAoY29udGFpbmVyKSk7XG5cbiAgICAgIGV4cGVjdChydWxlKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHJ1bGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyJykpLnRvRXF1YWwoJ3NvbGlkIDBweCBsaWdodGdyZXknKTtcbiAgICAgIGV4cGVjdChydWxlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmcnKSkudG9FcXVhbCgnMHB4Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXMgc3R5bGVkIGF0IGFueSBkZXB0aCBiZWxvdyB0aGUgY29udGFpbmVyLCBub3QganVzdCBhcyBhIGRpcmVjdCBjaGlsZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPE1hdGhQcmV2aWV3IHsuLi5kZWZhdWx0UHJvcHN9IGlzU2VsZWN0ZWQ9e2ZhbHNlfSAvPik7XG5cbiAgICAgIGV4cGVjdChtYXRoTGl2ZVJ1bGVGb3IoYWRkU3RhdGljTWFya3VwKGNvbnRhaW5lciwgMykpKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsWUFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBRUE7QUFDQSxJQUFNRyxhQUFhLEdBQUcsU0FBaEJBLGFBQWFBLENBQUE7RUFBQSxPQUNqQkMsS0FBSyxDQUFDQyxJQUFJLENBQUNDLFFBQVEsQ0FBQ0MsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUN6REMsT0FBTyxDQUFDLFVBQUNDLEdBQUc7SUFBQSxPQUFNQSxHQUFHLENBQUNDLEtBQUssR0FBR04sS0FBSyxDQUFDQyxJQUFJLENBQUNJLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDQyxRQUFRLENBQUMsR0FBRyxFQUFFO0VBQUEsQ0FBQyxDQUFDLENBQ25FQyxNQUFNLENBQUMsVUFBQ0MsSUFBSTtJQUFBLE9BQUtBLElBQUksQ0FBQ0MsWUFBWTtFQUFBLEVBQUM7QUFBQTs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNQyxlQUFlLEdBQUcsU0FBbEJBLGVBQWVBLENBQUlDLE9BQU87RUFBQSxPQUM5QmIsYUFBYSxDQUFDLENBQUMsQ0FBQ2MsSUFBSSxDQUFDLFVBQUNKLElBQUk7SUFBQSxPQUFLQSxJQUFJLENBQUNDLFlBQVksQ0FBQ0ksUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJRixPQUFPLENBQUNHLE9BQU8sQ0FBQ04sSUFBSSxDQUFDQyxZQUFZLENBQUM7RUFBQSxFQUFD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
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "3.0.11-beta.
|
|
6
|
+
"version": "3.0.11-beta.7",
|
|
7
7
|
"description": "Math toolbar for editing math equations",
|
|
8
8
|
"keywords": [
|
|
9
9
|
"math",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"@emotion/styled": "^11.14.1",
|
|
22
22
|
"@mui/icons-material": "^7.3.4",
|
|
23
23
|
"@mui/material": "^7.3.4",
|
|
24
|
-
"@pie-lib/math-input-mathlive": "^1.1.5-beta.
|
|
24
|
+
"@pie-lib/math-input-mathlive": "^1.1.5-beta.7",
|
|
25
25
|
"@pie-lib/render-ui": "^6.1.0",
|
|
26
26
|
"debug": "^4.1.1",
|
|
27
27
|
"lodash-es": "^4.17.23",
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { EditorAndPad } from '../editor-and-pad';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Covers the call sites that changed when this package moved from
|
|
5
|
+
* @pie-lib/math-input (MathQuill) to @pie-lib/math-input-mathlive.
|
|
6
|
+
*
|
|
7
|
+
* All three were MathQuill-shaped and silently changed meaning:
|
|
8
|
+
* - shouldComponentUpdate read `this.input.mathField.latex()`, which throws now
|
|
9
|
+
* (and the field loads asynchronously, so `this.input` can be null)
|
|
10
|
+
* - the mixed-number workaround poked `__controller.cursor`, a MathQuill
|
|
11
|
+
* internal with no MathLive equivalent
|
|
12
|
+
* - onClick routes keypad presses through the imperative field API
|
|
13
|
+
*/
|
|
14
|
+
describe('EditorAndPad after the MathLive migration', () => {
|
|
15
|
+
const props = (over = {}) => ({ classes: {}, classNames: {}, onChange: jest.fn(), ...over });
|
|
16
|
+
|
|
17
|
+
describe('shouldComponentUpdate', () => {
|
|
18
|
+
it('treats a missing input ref as different, so the first render is not skipped', () => {
|
|
19
|
+
const c = new EditorAndPad(props({ latex: 'x' }));
|
|
20
|
+
|
|
21
|
+
c.input = null;
|
|
22
|
+
|
|
23
|
+
expect(c.shouldComponentUpdate({ latex: 'x' }, {})).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('does not throw when the math engine has not loaded yet', () => {
|
|
27
|
+
const c = new EditorAndPad(props({ latex: 'x' }));
|
|
28
|
+
|
|
29
|
+
// latex() returns '' until MathLive is ready
|
|
30
|
+
c.input = { latex: () => '' };
|
|
31
|
+
|
|
32
|
+
expect(() => c.shouldComponentUpdate({ latex: 'x' }, {})).not.toThrow();
|
|
33
|
+
expect(c.shouldComponentUpdate({ latex: 'x' }, {})).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('skips the update when the field already holds the incoming latex', () => {
|
|
37
|
+
const c = new EditorAndPad(props({ latex: 'x', keypadMode: 'a', noDecimal: false }));
|
|
38
|
+
|
|
39
|
+
c.input = { latex: () => 'x' };
|
|
40
|
+
c.state = { equationEditor: 'geometry' };
|
|
41
|
+
|
|
42
|
+
expect(c.shouldComponentUpdate({ latex: 'x', keypadMode: 'a', noDecimal: false }, c.state)).toBe(false);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('re-renders when the field differs from the incoming latex', () => {
|
|
46
|
+
const c = new EditorAndPad(props({ latex: 'y' }));
|
|
47
|
+
|
|
48
|
+
c.input = { latex: () => 'x' };
|
|
49
|
+
|
|
50
|
+
expect(c.shouldComponentUpdate({ latex: 'y' }, {})).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('uses input.latex(), never input.mathField.latex()', () => {
|
|
54
|
+
const c = new EditorAndPad(props({ latex: 'x' }));
|
|
55
|
+
const latex = jest.fn(() => 'x');
|
|
56
|
+
|
|
57
|
+
// deliberately no `mathField` - the old code would have thrown here
|
|
58
|
+
c.input = { latex };
|
|
59
|
+
c.state = { equationEditor: 'geometry' };
|
|
60
|
+
c.shouldComponentUpdate({ latex: 'x' }, c.state);
|
|
61
|
+
|
|
62
|
+
expect(latex).toHaveBeenCalled();
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
describe('onClick key routing', () => {
|
|
67
|
+
const withInput = (over = {}) => {
|
|
68
|
+
const c = new EditorAndPad(props(over));
|
|
69
|
+
const calls = { write: [], command: [], keystroke: [], clear: 0 };
|
|
70
|
+
|
|
71
|
+
c.input = {
|
|
72
|
+
write: (v) => calls.write.push(v),
|
|
73
|
+
command: (v) => calls.command.push(v),
|
|
74
|
+
keystroke: (v) => calls.keystroke.push(v),
|
|
75
|
+
clear: () => calls.clear++,
|
|
76
|
+
};
|
|
77
|
+
c.updateDisable = () => {};
|
|
78
|
+
|
|
79
|
+
return { c, calls };
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// toNodeData keys this off `value === 'clear'`, not `type`
|
|
83
|
+
it('clear', () => {
|
|
84
|
+
const { c, calls } = withInput();
|
|
85
|
+
|
|
86
|
+
c.onClick({ value: 'clear' });
|
|
87
|
+
expect(calls.clear).toBe(1);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('command', () => {
|
|
91
|
+
const { c, calls } = withInput();
|
|
92
|
+
|
|
93
|
+
c.onClick({ type: 'command', value: '\\frac' });
|
|
94
|
+
expect(calls.command).toEqual(['\\frac']);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('cursor keystroke', () => {
|
|
98
|
+
const { c, calls } = withInput();
|
|
99
|
+
|
|
100
|
+
c.onClick({ type: 'cursor', value: 'Left' });
|
|
101
|
+
expect(calls.keystroke).toEqual(['Left']);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('answer block writes the response token', () => {
|
|
105
|
+
const { c, calls } = withInput();
|
|
106
|
+
|
|
107
|
+
c.onClick({ type: 'answer' });
|
|
108
|
+
expect(calls.write).toEqual(['%response%']);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('plain value', () => {
|
|
112
|
+
const { c, calls } = withInput();
|
|
113
|
+
|
|
114
|
+
c.onClick({ value: 'x' });
|
|
115
|
+
expect(calls.write).toEqual(['x']);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('ignores a nullish key', () => {
|
|
119
|
+
const { c, calls } = withInput();
|
|
120
|
+
|
|
121
|
+
expect(() => c.onClick(null)).not.toThrow();
|
|
122
|
+
expect(calls.write).toEqual([]);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
describe('onEditorChange', () => {
|
|
127
|
+
const withInput = (over = {}) => {
|
|
128
|
+
const onChange = jest.fn();
|
|
129
|
+
const c = new EditorAndPad(props({ onChange, ...over }));
|
|
130
|
+
const calls = { keystroke: [], clear: 0, write: [] };
|
|
131
|
+
|
|
132
|
+
c.input = {
|
|
133
|
+
keystroke: (v) => calls.keystroke.push(v),
|
|
134
|
+
clear: () => calls.clear++,
|
|
135
|
+
write: (v) => calls.write.push(v),
|
|
136
|
+
};
|
|
137
|
+
c.updateDisable = () => {};
|
|
138
|
+
|
|
139
|
+
return { c, onChange, calls };
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
it('propagates ordinary latex to onChange', () => {
|
|
143
|
+
const { c, onChange } = withInput();
|
|
144
|
+
|
|
145
|
+
c.onEditorChange('\\frac{1}{2}');
|
|
146
|
+
expect(onChange).toHaveBeenCalledWith('\\frac{1}{2}');
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it('strips decimals when noDecimal is set', () => {
|
|
150
|
+
const { c, onChange, calls } = withInput({ noDecimal: true });
|
|
151
|
+
|
|
152
|
+
c.onEditorChange('1.5');
|
|
153
|
+
|
|
154
|
+
expect(calls.clear).toBe(1);
|
|
155
|
+
expect(calls.write).toEqual(['15']);
|
|
156
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it('undoes the empty fraction after a digit with a public delete, not MathQuill internals', () => {
|
|
160
|
+
const { c, onChange, calls } = withInput();
|
|
161
|
+
|
|
162
|
+
// the shape the old __controller hack targeted
|
|
163
|
+
c.onEditorChange('2\\ \\frac{1}{ }');
|
|
164
|
+
|
|
165
|
+
expect(calls.keystroke).toEqual(['Backspace']);
|
|
166
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('does not treat normal fractions as the mixed-number case', () => {
|
|
170
|
+
const { c, onChange, calls } = withInput();
|
|
171
|
+
|
|
172
|
+
c.onEditorChange('\\frac{1}{2}');
|
|
173
|
+
|
|
174
|
+
expect(calls.keystroke).toEqual([]);
|
|
175
|
+
expect(onChange).toHaveBeenCalled();
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
});
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { EditorAndPad } from '../editor-and-pad';
|
|
2
|
+
import { render } from '@testing-library/react';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
|
|
5
|
+
describe('EditorAndPad', () => {
|
|
6
|
+
const defaultProps = {
|
|
7
|
+
classes: {},
|
|
8
|
+
classNames: {},
|
|
9
|
+
onBlur: jest.fn(),
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
jest.useFakeTimers();
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
jest.useRealTimers();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('renders with default props', () => {
|
|
21
|
+
const { container } = render(<EditorAndPad {...defaultProps} />);
|
|
22
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe('autoFocus', () => {
|
|
26
|
+
it('focuses input immediately via setTimeout when autoFocus is true', () => {
|
|
27
|
+
const mockFocus = jest.fn();
|
|
28
|
+
const component = new EditorAndPad({ ...defaultProps, autoFocus: true });
|
|
29
|
+
component.input = { focus: mockFocus };
|
|
30
|
+
|
|
31
|
+
component.componentDidMount();
|
|
32
|
+
|
|
33
|
+
expect(mockFocus).not.toHaveBeenCalled();
|
|
34
|
+
|
|
35
|
+
jest.runAllTimers();
|
|
36
|
+
|
|
37
|
+
expect(mockFocus).toHaveBeenCalledTimes(1);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('does not focus input when autoFocus is false', () => {
|
|
41
|
+
const mockFocus = jest.fn();
|
|
42
|
+
const component = new EditorAndPad({ ...defaultProps, autoFocus: false });
|
|
43
|
+
component.input = { focus: mockFocus };
|
|
44
|
+
|
|
45
|
+
component.componentDidMount();
|
|
46
|
+
jest.runAllTimers();
|
|
47
|
+
|
|
48
|
+
expect(mockFocus).not.toHaveBeenCalled();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('does not focus when input ref is not set', () => {
|
|
52
|
+
const component = new EditorAndPad({ ...defaultProps, autoFocus: true });
|
|
53
|
+
component.input = null;
|
|
54
|
+
|
|
55
|
+
expect(() => {
|
|
56
|
+
component.componentDidMount();
|
|
57
|
+
jest.runAllTimers();
|
|
58
|
+
}).not.toThrow();
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('uses setTimeout with 0ms delay to defer focus', () => {
|
|
62
|
+
const setTimeoutSpy = jest.spyOn(global, 'setTimeout');
|
|
63
|
+
const mockFocus = jest.fn();
|
|
64
|
+
const component = new EditorAndPad({ ...defaultProps, autoFocus: true });
|
|
65
|
+
component.input = { focus: mockFocus };
|
|
66
|
+
|
|
67
|
+
component.componentDidMount();
|
|
68
|
+
|
|
69
|
+
expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 0);
|
|
70
|
+
|
|
71
|
+
setTimeoutSpy.mockRestore();
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { RawPureToolbar } from '../index';
|
|
2
|
+
import { render } from '@testing-library/react';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
|
|
5
|
+
describe('RawPureToolbar', () => {
|
|
6
|
+
const defaultProps = {
|
|
7
|
+
classes: {},
|
|
8
|
+
controlledKeypad: true,
|
|
9
|
+
showKeypad: true,
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
it('renders with DONE button if hideDoneButton is not defined', () => {
|
|
13
|
+
const { container } = render(<RawPureToolbar {...defaultProps} />);
|
|
14
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('renders without DONE button if hideDoneButton value is true', () => {
|
|
18
|
+
const { container } = render(<RawPureToolbar {...defaultProps} hideDoneButton={true} />);
|
|
19
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
20
|
+
});
|
|
21
|
+
});
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { render } from '@testing-library/react';
|
|
3
|
+
import MathPreview from '../math-preview';
|
|
4
|
+
|
|
5
|
+
/** Every rule emotion has injected so far, as CSSStyleRule objects. */
|
|
6
|
+
const injectedRules = () =>
|
|
7
|
+
Array.from(document.querySelectorAll('style[data-emotion]'))
|
|
8
|
+
.flatMap((tag) => (tag.sheet ? Array.from(tag.sheet.cssRules) : []))
|
|
9
|
+
.filter((rule) => rule.selectorText);
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The `.ML__latex` rule that actually applies to `element`.
|
|
13
|
+
*
|
|
14
|
+
* Matching with `element.matches` rather than string comparison means the
|
|
15
|
+
* assertions cover the selector too: a rule written as `& > .ML__latex` would
|
|
16
|
+
* not match the nested markup MathLive emits, and these tests would fail.
|
|
17
|
+
*/
|
|
18
|
+
const mathLiveRuleFor = (element) =>
|
|
19
|
+
injectedRules().find((rule) => rule.selectorText.includes('.ML__latex') && element.matches(rule.selectorText));
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Stand in for MathLive's `convertLatexToMarkup` output, which is
|
|
23
|
+
* `<span class="ML__latex">...</span>` nested inside `mf.Static`'s holder span.
|
|
24
|
+
* MathLive does not load under jsdom, so the markup is added by hand.
|
|
25
|
+
*/
|
|
26
|
+
const addStaticMarkup = (container, depth = 1) => {
|
|
27
|
+
let parent = container.firstChild;
|
|
28
|
+
|
|
29
|
+
for (let i = 1; i < depth; i += 1) {
|
|
30
|
+
const wrapper = document.createElement('span');
|
|
31
|
+
|
|
32
|
+
parent.appendChild(wrapper);
|
|
33
|
+
parent = wrapper;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const markup = document.createElement('span');
|
|
37
|
+
|
|
38
|
+
markup.className = 'ML__latex';
|
|
39
|
+
parent.appendChild(markup);
|
|
40
|
+
|
|
41
|
+
return markup;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
describe('MathPreview', () => {
|
|
45
|
+
const defaultProps = {
|
|
46
|
+
latex: 'sqrt(5)',
|
|
47
|
+
classes: {},
|
|
48
|
+
isSelected: false,
|
|
49
|
+
onFocus: jest.fn(),
|
|
50
|
+
onBlur: jest.fn(),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
it('renders with default props', () => {
|
|
54
|
+
const { container } = render(<MathPreview {...defaultProps} />);
|
|
55
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe('MathLive static markup', () => {
|
|
59
|
+
it('is outlined and padded when not selected', () => {
|
|
60
|
+
const { container } = render(<MathPreview {...defaultProps} isSelected={false} />);
|
|
61
|
+
const rule = mathLiveRuleFor(addStaticMarkup(container));
|
|
62
|
+
|
|
63
|
+
expect(rule).toBeDefined();
|
|
64
|
+
expect(rule.style.getPropertyValue('border')).toEqual('solid 1px lightgrey');
|
|
65
|
+
expect(rule.style.getPropertyValue('padding')).toEqual('5px');
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('drops its outline and padding when selected, so only the container border shows', () => {
|
|
69
|
+
const { container } = render(<MathPreview {...defaultProps} isSelected />);
|
|
70
|
+
const rule = mathLiveRuleFor(addStaticMarkup(container));
|
|
71
|
+
|
|
72
|
+
expect(rule).toBeDefined();
|
|
73
|
+
expect(rule.style.getPropertyValue('border')).toEqual('solid 0px lightgrey');
|
|
74
|
+
expect(rule.style.getPropertyValue('padding')).toEqual('0px');
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('is styled at any depth below the container, not just as a direct child', () => {
|
|
78
|
+
const { container } = render(<MathPreview {...defaultProps} isSelected={false} />);
|
|
79
|
+
|
|
80
|
+
expect(mathLiveRuleFor(addStaticMarkup(container, 3))).toBeDefined();
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
});
|