@pie-lib/math-input-mathlive 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/lib/__tests__/composites.test.js +255 -0
  2. package/lib/__tests__/composites.test.js.map +1 -0
  3. package/lib/__tests__/keypad-label.test.js +6 -7
  4. package/lib/__tests__/keypad-label.test.js.map +1 -1
  5. package/lib/__tests__/keypad-render.test.js +206 -0
  6. package/lib/__tests__/keypad-render.test.js.map +1 -0
  7. package/lib/__tests__/latex-bridge.test.js +65 -0
  8. package/lib/__tests__/latex-bridge.test.js.map +1 -1
  9. package/lib/__tests__/mathlive-instance.test.js +18 -0
  10. package/lib/__tests__/mathlive-instance.test.js.map +1 -1
  11. package/lib/__tests__/mount-race.test.js +194 -0
  12. package/lib/__tests__/mount-race.test.js.map +1 -0
  13. package/lib/__tests__/static-prompts.test.js +282 -0
  14. package/lib/__tests__/static-prompts.test.js.map +1 -0
  15. package/lib/keypad/index.js +4 -28
  16. package/lib/keypad/index.js.map +1 -1
  17. package/lib/latex-bridge.js +124 -4
  18. package/lib/latex-bridge.js.map +1 -1
  19. package/lib/mathlive-instance.js +28 -4
  20. package/lib/mathlive-instance.js.map +1 -1
  21. package/lib/mf/common-styles.js +13 -0
  22. package/lib/mf/common-styles.js.map +1 -1
  23. package/lib/mf/input.js +18 -5
  24. package/lib/mf/input.js.map +1 -1
  25. package/lib/mf/static.js +24 -7
  26. package/lib/mf/static.js.map +1 -1
  27. package/package.json +1 -1
  28. package/src/__tests__/composites.test.jsx +220 -0
  29. package/src/__tests__/keypad-label.test.jsx +1 -1
  30. package/src/__tests__/keypad-render.test.jsx +123 -0
  31. package/src/__tests__/latex-bridge.test.js +87 -1
  32. package/src/__tests__/mathlive-instance.test.js +20 -0
  33. package/src/__tests__/mount-race.test.jsx +129 -0
  34. package/src/__tests__/static-prompts.test.jsx +251 -0
  35. package/src/keypad/index.jsx +3 -25
  36. package/src/latex-bridge.js +128 -3
  37. package/src/mathlive-instance.js +29 -5
  38. package/src/mf/common-styles.js +13 -0
  39. package/src/mf/input.jsx +19 -5
  40. package/src/mf/static.jsx +23 -4
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _react = _interopRequireDefault(require("react"));
5
+ var _react2 = require("@testing-library/react");
6
+ var _mathInput = _interopRequireDefault(require("../math-input"));
7
+ var _horizontalKeypad = _interopRequireDefault(require("../horizontal-keypad"));
8
+ var _input = _interopRequireDefault(require("../mf/input"));
9
+ /**
10
+ * The pieces that sit between the keypad and the field: how a pressed key is
11
+ * routed into the field, and the legacy `{value,type}` shape math-toolbar
12
+ * consumes.
13
+ */
14
+ describe('MathInput.keypadPress routing', function () {
15
+ var withInput = function withInput() {
16
+ var mi = new _mathInput["default"]({});
17
+ var calls = {
18
+ write: [],
19
+ keystroke: []
20
+ };
21
+ mi.input = {
22
+ write: function write(v) {
23
+ return calls.write.push(v);
24
+ },
25
+ keystroke: function keystroke(v) {
26
+ return calls.keystroke.push(v);
27
+ }
28
+ };
29
+ return {
30
+ mi: mi,
31
+ calls: calls
32
+ };
33
+ };
34
+ it('routes an insert action to write()', function () {
35
+ var _withInput = withInput(),
36
+ mi = _withInput.mi,
37
+ calls = _withInput.calls;
38
+ mi.keypadPress({
39
+ latex: '\\pi'
40
+ });
41
+ expect(calls.write).toEqual(['\\pi']);
42
+ expect(calls.keystroke).toEqual([]);
43
+ });
44
+ it('expands an argument-taking command before writing', function () {
45
+ var _withInput2 = withInput(),
46
+ mi = _withInput2.mi,
47
+ calls = _withInput2.calls;
48
+ mi.keypadPress({
49
+ command: '\\frac'
50
+ });
51
+ expect(calls.write).toEqual(['\\frac{#?}{#?}']);
52
+ });
53
+ it('routes a cursor keystroke to keystroke()', function () {
54
+ var _withInput3 = withInput(),
55
+ mi = _withInput3.mi,
56
+ calls = _withInput3.calls;
57
+ mi.keypadPress({
58
+ keystroke: 'Left'
59
+ });
60
+ expect(calls.keystroke).toEqual(['moveToPreviousChar']);
61
+ expect(calls.write).toEqual([]);
62
+ });
63
+ it('ignores keys with no action', function () {
64
+ var _withInput4 = withInput(),
65
+ mi = _withInput4.mi,
66
+ calls = _withInput4.calls;
67
+ mi.keypadPress({});
68
+ mi.keypadPress({
69
+ keystroke: 'Nonsense'
70
+ });
71
+ expect(calls.write).toEqual([]);
72
+ expect(calls.keystroke).toEqual([]);
73
+ });
74
+ it('is a no-op before the field ref exists', function () {
75
+ var mi = new _mathInput["default"]({});
76
+ expect(function () {
77
+ return mi.keypadPress({
78
+ latex: '\\pi'
79
+ });
80
+ }).not.toThrow();
81
+ });
82
+ it('changeLatex only fires onChange when the value differs', function () {
83
+ var onChange = jest.fn();
84
+ var mi = new _mathInput["default"]({
85
+ latex: 'x',
86
+ onChange: onChange
87
+ });
88
+ mi.changeLatex('x');
89
+ expect(onChange).not.toHaveBeenCalled();
90
+ mi.changeLatex('y');
91
+ expect(onChange).toHaveBeenCalledWith('y');
92
+ });
93
+ it('tracks focus state', function () {
94
+ var mi = new _mathInput["default"]({});
95
+ mi.setState = function (s) {
96
+ return Object.assign(mi.state, s);
97
+ };
98
+ mi.inputFocus();
99
+ expect(mi.state.focused).toBe(true);
100
+ mi.inputBlur();
101
+ expect(mi.state.focused).toBe(false);
102
+ });
103
+ });
104
+ describe('HorizontalKeypad legacy {value,type} model', function () {
105
+ var pressed = function pressed(key) {
106
+ var onClick = jest.fn();
107
+ var hk = new _horizontalKeypad["default"]({
108
+ onClick: onClick
109
+ });
110
+ hk.keypadPress(key);
111
+ return onClick.mock.calls[0][0];
112
+ };
113
+ it('maps a command to {value, type: command}', function () {
114
+ expect(pressed({
115
+ command: '\\frac'
116
+ })).toEqual({
117
+ value: '\\frac',
118
+ type: 'command'
119
+ });
120
+ });
121
+ it('maps a write to {value}', function () {
122
+ expect(pressed({
123
+ write: 'x'
124
+ })).toEqual({
125
+ value: 'x'
126
+ });
127
+ });
128
+ it('maps a keystroke to {type: cursor}', function () {
129
+ expect(pressed({
130
+ keystroke: 'Left'
131
+ })).toEqual({
132
+ type: 'cursor',
133
+ value: 'Left'
134
+ });
135
+ });
136
+ it('renders without throwing', function () {
137
+ expect(function () {
138
+ return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_horizontalKeypad["default"], {
139
+ onClick: function onClick() {}
140
+ }));
141
+ }).not.toThrow();
142
+ });
143
+ });
144
+ describe('Input: controlled-value sync and events', function () {
145
+ var withField = function withField() {
146
+ var input = new _input["default"]({});
147
+ input.mathField = {
148
+ value: '',
149
+ getValue: function getValue() {
150
+ return input.mathField.value;
151
+ },
152
+ insert: function insert(v) {
153
+ input.mathField.value += v;
154
+ },
155
+ executeCommand: function executeCommand() {},
156
+ focus: function focus() {},
157
+ blur: function blur() {},
158
+ addEventListener: function addEventListener() {},
159
+ removeEventListener: function removeEventListener() {},
160
+ remove: function remove() {}
161
+ };
162
+ return input;
163
+ };
164
+ it('emits stored-form latex on edit', function () {
165
+ var onChange = jest.fn();
166
+ var input = withField();
167
+ input.props = {
168
+ onChange: onChange
169
+ };
170
+ input.mathField.value = '\\longdiv{\\placeholder{}}';
171
+ input.onInputEdit();
172
+
173
+ // \placeholder is MathLive-internal and must not reach the model
174
+ expect(onChange).toHaveBeenCalledWith('\\longdiv{}');
175
+ expect(input.lastEmitted).toEqual('\\longdiv{}');
176
+ });
177
+ it('does not push a prop echo back into the field', function () {
178
+ var input = withField();
179
+ input.mathField.value = 'x';
180
+ input.lastEmitted = 'x';
181
+ input.props = {
182
+ latex: 'x'
183
+ };
184
+ input.componentDidUpdate({
185
+ latex: ''
186
+ });
187
+ expect(input.mathField.value).toEqual('x');
188
+ });
189
+ it('pushes a genuinely new latex prop into the field', function () {
190
+ var input = withField();
191
+ input.mathField.value = 'x';
192
+ input.lastEmitted = 'x';
193
+ input.props = {
194
+ latex: 'y'
195
+ };
196
+ input.componentDidUpdate({
197
+ latex: 'x'
198
+ });
199
+ expect(input.mathField.value).toEqual('y');
200
+ });
201
+ it('bridges stored latex on the way in', function () {
202
+ var input = withField();
203
+ input.props = {
204
+ latex: '\\longdiv{5}'
205
+ };
206
+ input.componentDidUpdate({
207
+ latex: ''
208
+ });
209
+
210
+ // must become native \enclose so the content stays editable
211
+ expect(input.mathField.value).toEqual('\\enclose{longdiv}{5}');
212
+ });
213
+ it('toggles readOnly', function () {
214
+ var input = withField();
215
+ input.props = {
216
+ readOnly: true
217
+ };
218
+ input.componentDidUpdate({
219
+ readOnly: false
220
+ });
221
+ expect(input.mathField.readOnly).toBe(true);
222
+ });
223
+ it('clear() empties the field', function () {
224
+ var input = withField();
225
+ input.mathField.value = 'abc';
226
+ expect(input.clear()).toEqual('');
227
+ expect(input.mathField.value).toEqual('');
228
+ });
229
+ it('suppresses Enter so it cannot insert a line break', function () {
230
+ var input = withField();
231
+ var preventDefault = jest.fn();
232
+ input.onKeyDown({
233
+ key: 'Enter',
234
+ preventDefault: preventDefault
235
+ });
236
+ expect(preventDefault).toHaveBeenCalled();
237
+ preventDefault.mockClear();
238
+ input.onKeyDown({
239
+ key: 'a',
240
+ preventDefault: preventDefault
241
+ });
242
+ expect(preventDefault).not.toHaveBeenCalled();
243
+ });
244
+ it('componentDidUpdate is safe before the field exists', function () {
245
+ var input = new _input["default"]({
246
+ latex: 'x'
247
+ });
248
+ expect(function () {
249
+ return input.componentDidUpdate({
250
+ latex: ''
251
+ });
252
+ }).not.toThrow();
253
+ });
254
+ });
255
+ //# sourceMappingURL=composites.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composites.test.js","names":["_react","_interopRequireDefault","require","_react2","_mathInput","_horizontalKeypad","_input","describe","withInput","mi","MathInput","calls","write","keystroke","input","v","push","it","_withInput","keypadPress","latex","expect","toEqual","_withInput2","command","_withInput3","_withInput4","not","toThrow","onChange","jest","fn","changeLatex","toHaveBeenCalled","toHaveBeenCalledWith","setState","s","Object","assign","state","inputFocus","focused","toBe","inputBlur","pressed","key","onClick","hk","HorizontalKeypad","mock","value","type","render","createElement","withField","Input","mathField","getValue","insert","executeCommand","focus","blur","addEventListener","removeEventListener","remove","props","onInputEdit","lastEmitted","componentDidUpdate","readOnly","clear","preventDefault","onKeyDown","mockClear"],"sources":["../../src/__tests__/composites.test.jsx"],"sourcesContent":["import React from 'react';\nimport { render } from '@testing-library/react';\n\nimport MathInput from '../math-input';\nimport HorizontalKeypad from '../horizontal-keypad';\nimport Input from '../mf/input';\n\n/**\n * The pieces that sit between the keypad and the field: how a pressed key is\n * routed into the field, and the legacy `{value,type}` shape math-toolbar\n * consumes.\n */\ndescribe('MathInput.keypadPress routing', () => {\n const withInput = () => {\n const mi = new MathInput({});\n const calls = { write: [], keystroke: [] };\n\n mi.input = {\n write: (v) => calls.write.push(v),\n keystroke: (v) => calls.keystroke.push(v),\n };\n\n return { mi, calls };\n };\n\n it('routes an insert action to write()', () => {\n const { mi, calls } = withInput();\n\n mi.keypadPress({ latex: '\\\\pi' });\n\n expect(calls.write).toEqual(['\\\\pi']);\n expect(calls.keystroke).toEqual([]);\n });\n\n it('expands an argument-taking command before writing', () => {\n const { mi, calls } = withInput();\n\n mi.keypadPress({ command: '\\\\frac' });\n\n expect(calls.write).toEqual(['\\\\frac{#?}{#?}']);\n });\n\n it('routes a cursor keystroke to keystroke()', () => {\n const { mi, calls } = withInput();\n\n mi.keypadPress({ keystroke: 'Left' });\n\n expect(calls.keystroke).toEqual(['moveToPreviousChar']);\n expect(calls.write).toEqual([]);\n });\n\n it('ignores keys with no action', () => {\n const { mi, calls } = withInput();\n\n mi.keypadPress({});\n mi.keypadPress({ keystroke: 'Nonsense' });\n\n expect(calls.write).toEqual([]);\n expect(calls.keystroke).toEqual([]);\n });\n\n it('is a no-op before the field ref exists', () => {\n const mi = new MathInput({});\n\n expect(() => mi.keypadPress({ latex: '\\\\pi' })).not.toThrow();\n });\n\n it('changeLatex only fires onChange when the value differs', () => {\n const onChange = jest.fn();\n const mi = new MathInput({ latex: 'x', onChange });\n\n mi.changeLatex('x');\n expect(onChange).not.toHaveBeenCalled();\n\n mi.changeLatex('y');\n expect(onChange).toHaveBeenCalledWith('y');\n });\n\n it('tracks focus state', () => {\n const mi = new MathInput({});\n\n mi.setState = (s) => Object.assign(mi.state, s);\n mi.inputFocus();\n expect(mi.state.focused).toBe(true);\n\n mi.inputBlur();\n expect(mi.state.focused).toBe(false);\n });\n});\n\ndescribe('HorizontalKeypad legacy {value,type} model', () => {\n const pressed = (key) => {\n const onClick = jest.fn();\n const hk = new HorizontalKeypad({ onClick });\n\n hk.keypadPress(key);\n\n return onClick.mock.calls[0][0];\n };\n\n it('maps a command to {value, type: command}', () => {\n expect(pressed({ command: '\\\\frac' })).toEqual({ value: '\\\\frac', type: 'command' });\n });\n\n it('maps a write to {value}', () => {\n expect(pressed({ write: 'x' })).toEqual({ value: 'x' });\n });\n\n it('maps a keystroke to {type: cursor}', () => {\n expect(pressed({ keystroke: 'Left' })).toEqual({ type: 'cursor', value: 'Left' });\n });\n\n it('renders without throwing', () => {\n expect(() => render(<HorizontalKeypad onClick={() => {}} />)).not.toThrow();\n });\n});\n\ndescribe('Input: controlled-value sync and events', () => {\n const withField = () => {\n const input = new Input({});\n\n input.mathField = {\n value: '',\n getValue: () => input.mathField.value,\n insert(v) {\n input.mathField.value += v;\n },\n executeCommand() {},\n focus() {},\n blur() {},\n addEventListener() {},\n removeEventListener() {},\n remove() {},\n };\n\n return input;\n };\n\n it('emits stored-form latex on edit', () => {\n const onChange = jest.fn();\n const input = withField();\n\n input.props = { onChange };\n input.mathField.value = '\\\\longdiv{\\\\placeholder{}}';\n input.onInputEdit();\n\n // \\placeholder is MathLive-internal and must not reach the model\n expect(onChange).toHaveBeenCalledWith('\\\\longdiv{}');\n expect(input.lastEmitted).toEqual('\\\\longdiv{}');\n });\n\n it('does not push a prop echo back into the field', () => {\n const input = withField();\n\n input.mathField.value = 'x';\n input.lastEmitted = 'x';\n input.props = { latex: 'x' };\n\n input.componentDidUpdate({ latex: '' });\n\n expect(input.mathField.value).toEqual('x');\n });\n\n it('pushes a genuinely new latex prop into the field', () => {\n const input = withField();\n\n input.mathField.value = 'x';\n input.lastEmitted = 'x';\n input.props = { latex: 'y' };\n\n input.componentDidUpdate({ latex: 'x' });\n\n expect(input.mathField.value).toEqual('y');\n });\n\n it('bridges stored latex on the way in', () => {\n const input = withField();\n\n input.props = { latex: '\\\\longdiv{5}' };\n input.componentDidUpdate({ latex: '' });\n\n // must become native \\enclose so the content stays editable\n expect(input.mathField.value).toEqual('\\\\enclose{longdiv}{5}');\n });\n\n it('toggles readOnly', () => {\n const input = withField();\n\n input.props = { readOnly: true };\n input.componentDidUpdate({ readOnly: false });\n\n expect(input.mathField.readOnly).toBe(true);\n });\n\n it('clear() empties the field', () => {\n const input = withField();\n\n input.mathField.value = 'abc';\n expect(input.clear()).toEqual('');\n expect(input.mathField.value).toEqual('');\n });\n\n it('suppresses Enter so it cannot insert a line break', () => {\n const input = withField();\n const preventDefault = jest.fn();\n\n input.onKeyDown({ key: 'Enter', preventDefault });\n expect(preventDefault).toHaveBeenCalled();\n\n preventDefault.mockClear();\n input.onKeyDown({ key: 'a', preventDefault });\n expect(preventDefault).not.toHaveBeenCalled();\n });\n\n it('componentDidUpdate is safe before the field exists', () => {\n const input = new Input({ latex: 'x' });\n\n expect(() => input.componentDidUpdate({ latex: '' })).not.toThrow();\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
 
3
- var _keypad = require("../keypad");
4
3
  var _latexBridge = require("../latex-bridge");
5
4
  /**
6
5
  * Keys use empty groups to show a command's shape (`\frac{}{}`, `x^{}`).
@@ -9,28 +8,28 @@ var _latexBridge = require("../latex-bridge");
9
8
  */
10
9
  describe('keypad label display normalisation', function () {
11
10
  it('gives empty groups a visible glyph', function () {
12
- var out = (0, _keypad.latexForDisplay)('\\frac{}{}');
11
+ var out = (0, _latexBridge.withVisibleEmptySlots)('\\frac{}{}');
13
12
  expect(out).not.toEqual('\\frac{}{}');
14
13
  expect(out).toContain('25AB'); // white small square
15
14
  expect(out).toContain('pie-empty');
16
15
  });
17
16
  it('handles every empty-group key shape', function () {
18
17
  ['\\frac{}{}', '\\overline{}', 'x^{}', 'x_{}', '\\sqrt{}', '\\sqrt[{}]{}', '\\abs{}', '\\log_{}', '\\longdiv{}'].forEach(function (latex) {
19
- expect((0, _keypad.latexForDisplay)(latex)).not.toContain('{}');
18
+ expect((0, _latexBridge.withVisibleEmptySlots)(latex)).not.toContain('{}');
20
19
  });
21
20
  });
22
21
  it('treats a whitespace-only group as empty', function () {
23
22
  // e.g. \frac{x}{ }
24
- expect((0, _keypad.latexForDisplay)('\\frac{x}{ }')).toContain('pie-empty');
23
+ expect((0, _latexBridge.withVisibleEmptySlots)('\\frac{x}{ }')).toContain('pie-empty');
25
24
  });
26
25
  it('leaves latex without empty groups alone', function () {
27
26
  ['\\pi', '\\sin', 'x^2', '\\overline{AB}'].forEach(function (latex) {
28
- expect((0, _keypad.latexForDisplay)(latex)).toEqual(latex);
27
+ expect((0, _latexBridge.withVisibleEmptySlots)(latex)).toEqual(latex);
29
28
  });
30
29
  });
31
30
  it('handles nullish input', function () {
32
- expect((0, _keypad.latexForDisplay)(undefined)).toEqual('');
33
- expect((0, _keypad.latexForDisplay)('')).toEqual('');
31
+ expect((0, _latexBridge.withVisibleEmptySlots)(undefined)).toEqual('');
32
+ expect((0, _latexBridge.withVisibleEmptySlots)('')).toEqual('');
34
33
  });
35
34
  it('does NOT affect what gets inserted into the field', function () {
36
35
  // the action must use the key's own latex, never the display form
@@ -1 +1 @@
1
- {"version":3,"file":"keypad-label.test.js","names":["_keypad","require","_latexBridge","describe","it","out","latexForDisplay","expect","not","toEqual","toContain","forEach","latex","undefined","key","name","keyToAction","value"],"sources":["../../src/__tests__/keypad-label.test.jsx"],"sourcesContent":["import { latexForDisplay } from '../keypad';\nimport { keyToAction } from '../latex-bridge';\n\n/**\n * Keys use empty groups to show a command's shape (`\\frac{}{}`, `x^{}`).\n * MathLive renders `{}` as nothing, so labels need a visible stand-in - but the\n * value that gets *inserted* must stay untouched.\n */\ndescribe('keypad label display normalisation', () => {\n it('gives empty groups a visible glyph', () => {\n const out = latexForDisplay('\\\\frac{}{}');\n\n expect(out).not.toEqual('\\\\frac{}{}');\n expect(out).toContain('25AB'); // white small square\n expect(out).toContain('pie-empty');\n });\n\n it('handles every empty-group key shape', () => {\n ['\\\\frac{}{}', '\\\\overline{}', 'x^{}', 'x_{}', '\\\\sqrt{}', '\\\\sqrt[{}]{}', '\\\\abs{}', '\\\\log_{}', '\\\\longdiv{}'].forEach(\n (latex) => {\n expect(latexForDisplay(latex)).not.toContain('{}');\n },\n );\n });\n\n it('treats a whitespace-only group as empty', () => {\n // e.g. \\frac{x}{ }\n expect(latexForDisplay('\\\\frac{x}{ }')).toContain('pie-empty');\n });\n\n it('leaves latex without empty groups alone', () => {\n ['\\\\pi', '\\\\sin', 'x^2', '\\\\overline{AB}'].forEach((latex) => {\n expect(latexForDisplay(latex)).toEqual(latex);\n });\n });\n\n it('handles nullish input', () => {\n expect(latexForDisplay(undefined)).toEqual('');\n expect(latexForDisplay('')).toEqual('');\n });\n\n it('does NOT affect what gets inserted into the field', () => {\n // the action must use the key's own latex, never the display form\n const key = { name: 'frac', latex: '\\\\frac{}{}' };\n\n expect(keyToAction(key).value).toEqual('\\\\frac{}{}');\n expect(keyToAction(key).value).not.toContain('pie-empty');\n });\n});\n"],"mappings":";;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAEA;AACA;AACA;AACA;AACA;AACAE,QAAQ,CAAC,oCAAoC,EAAE,YAAM;EACnDC,EAAE,CAAC,oCAAoC,EAAE,YAAM;IAC7C,IAAMC,GAAG,GAAG,IAAAC,uBAAe,EAAC,YAAY,CAAC;IAEzCC,MAAM,CAACF,GAAG,CAAC,CAACG,GAAG,CAACC,OAAO,CAAC,YAAY,CAAC;IACrCF,MAAM,CAACF,GAAG,CAAC,CAACK,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/BH,MAAM,CAACF,GAAG,CAAC,CAACK,SAAS,CAAC,WAAW,CAAC;EACpC,CAAC,CAAC;EAEFN,EAAE,CAAC,qCAAqC,EAAE,YAAM;IAC9C,CAAC,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,CAACO,OAAO,CACtH,UAACC,KAAK,EAAK;MACTL,MAAM,CAAC,IAAAD,uBAAe,EAACM,KAAK,CAAC,CAAC,CAACJ,GAAG,CAACE,SAAS,CAAC,IAAI,CAAC;IACpD,CACF,CAAC;EACH,CAAC,CAAC;EAEFN,EAAE,CAAC,yCAAyC,EAAE,YAAM;IAClD;IACAG,MAAM,CAAC,IAAAD,uBAAe,EAAC,cAAc,CAAC,CAAC,CAACI,SAAS,CAAC,WAAW,CAAC;EAChE,CAAC,CAAC;EAEFN,EAAE,CAAC,yCAAyC,EAAE,YAAM;IAClD,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAACO,OAAO,CAAC,UAACC,KAAK,EAAK;MAC5DL,MAAM,CAAC,IAAAD,uBAAe,EAACM,KAAK,CAAC,CAAC,CAACH,OAAO,CAACG,KAAK,CAAC;IAC/C,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFR,EAAE,CAAC,uBAAuB,EAAE,YAAM;IAChCG,MAAM,CAAC,IAAAD,uBAAe,EAACO,SAAS,CAAC,CAAC,CAACJ,OAAO,CAAC,EAAE,CAAC;IAC9CF,MAAM,CAAC,IAAAD,uBAAe,EAAC,EAAE,CAAC,CAAC,CAACG,OAAO,CAAC,EAAE,CAAC;EACzC,CAAC,CAAC;EAEFL,EAAE,CAAC,mDAAmD,EAAE,YAAM;IAC5D;IACA,IAAMU,GAAG,GAAG;MAAEC,IAAI,EAAE,MAAM;MAAEH,KAAK,EAAE;IAAa,CAAC;IAEjDL,MAAM,CAAC,IAAAS,wBAAW,EAACF,GAAG,CAAC,CAACG,KAAK,CAAC,CAACR,OAAO,CAAC,YAAY,CAAC;IACpDF,MAAM,CAAC,IAAAS,wBAAW,EAACF,GAAG,CAAC,CAACG,KAAK,CAAC,CAACT,GAAG,CAACE,SAAS,CAAC,WAAW,CAAC;EAC3D,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"keypad-label.test.js","names":["_latexBridge","require","describe","it","out","latexForDisplay","expect","not","toEqual","toContain","forEach","latex","undefined","key","name","keyToAction","value"],"sources":["../../src/__tests__/keypad-label.test.jsx"],"sourcesContent":["import { withVisibleEmptySlots as latexForDisplay } from '../latex-bridge';\nimport { keyToAction } from '../latex-bridge';\n\n/**\n * Keys use empty groups to show a command's shape (`\\frac{}{}`, `x^{}`).\n * MathLive renders `{}` as nothing, so labels need a visible stand-in - but the\n * value that gets *inserted* must stay untouched.\n */\ndescribe('keypad label display normalisation', () => {\n it('gives empty groups a visible glyph', () => {\n const out = latexForDisplay('\\\\frac{}{}');\n\n expect(out).not.toEqual('\\\\frac{}{}');\n expect(out).toContain('25AB'); // white small square\n expect(out).toContain('pie-empty');\n });\n\n it('handles every empty-group key shape', () => {\n ['\\\\frac{}{}', '\\\\overline{}', 'x^{}', 'x_{}', '\\\\sqrt{}', '\\\\sqrt[{}]{}', '\\\\abs{}', '\\\\log_{}', '\\\\longdiv{}'].forEach(\n (latex) => {\n expect(latexForDisplay(latex)).not.toContain('{}');\n },\n );\n });\n\n it('treats a whitespace-only group as empty', () => {\n // e.g. \\frac{x}{ }\n expect(latexForDisplay('\\\\frac{x}{ }')).toContain('pie-empty');\n });\n\n it('leaves latex without empty groups alone', () => {\n ['\\\\pi', '\\\\sin', 'x^2', '\\\\overline{AB}'].forEach((latex) => {\n expect(latexForDisplay(latex)).toEqual(latex);\n });\n });\n\n it('handles nullish input', () => {\n expect(latexForDisplay(undefined)).toEqual('');\n expect(latexForDisplay('')).toEqual('');\n });\n\n it('does NOT affect what gets inserted into the field', () => {\n // the action must use the key's own latex, never the display form\n const key = { name: 'frac', latex: '\\\\frac{}{}' };\n\n expect(keyToAction(key).value).toEqual('\\\\frac{}{}');\n expect(keyToAction(key).value).not.toContain('pie-empty');\n });\n});\n"],"mappings":";;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAGA;AACA;AACA;AACA;AACA;AACAC,QAAQ,CAAC,oCAAoC,EAAE,YAAM;EACnDC,EAAE,CAAC,oCAAoC,EAAE,YAAM;IAC7C,IAAMC,GAAG,GAAG,IAAAC,kCAAe,EAAC,YAAY,CAAC;IAEzCC,MAAM,CAACF,GAAG,CAAC,CAACG,GAAG,CAACC,OAAO,CAAC,YAAY,CAAC;IACrCF,MAAM,CAACF,GAAG,CAAC,CAACK,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/BH,MAAM,CAACF,GAAG,CAAC,CAACK,SAAS,CAAC,WAAW,CAAC;EACpC,CAAC,CAAC;EAEFN,EAAE,CAAC,qCAAqC,EAAE,YAAM;IAC9C,CAAC,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,CAACO,OAAO,CACtH,UAACC,KAAK,EAAK;MACTL,MAAM,CAAC,IAAAD,kCAAe,EAACM,KAAK,CAAC,CAAC,CAACJ,GAAG,CAACE,SAAS,CAAC,IAAI,CAAC;IACpD,CACF,CAAC;EACH,CAAC,CAAC;EAEFN,EAAE,CAAC,yCAAyC,EAAE,YAAM;IAClD;IACAG,MAAM,CAAC,IAAAD,kCAAe,EAAC,cAAc,CAAC,CAAC,CAACI,SAAS,CAAC,WAAW,CAAC;EAChE,CAAC,CAAC;EAEFN,EAAE,CAAC,yCAAyC,EAAE,YAAM;IAClD,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAACO,OAAO,CAAC,UAACC,KAAK,EAAK;MAC5DL,MAAM,CAAC,IAAAD,kCAAe,EAACM,KAAK,CAAC,CAAC,CAACH,OAAO,CAACG,KAAK,CAAC;IAC/C,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFR,EAAE,CAAC,uBAAuB,EAAE,YAAM;IAChCG,MAAM,CAAC,IAAAD,kCAAe,EAACO,SAAS,CAAC,CAAC,CAACJ,OAAO,CAAC,EAAE,CAAC;IAC9CF,MAAM,CAAC,IAAAD,kCAAe,EAAC,EAAE,CAAC,CAAC,CAACG,OAAO,CAAC,EAAE,CAAC;EACzC,CAAC,CAAC;EAEFL,EAAE,CAAC,mDAAmD,EAAE,YAAM;IAC5D;IACA,IAAMU,GAAG,GAAG;MAAEC,IAAI,EAAE,MAAM;MAAEH,KAAK,EAAE;IAAa,CAAC;IAEjDL,MAAM,CAAC,IAAAS,wBAAW,EAACF,GAAG,CAAC,CAACG,KAAK,CAAC,CAACR,OAAO,CAAC,YAAY,CAAC;IACpDF,MAAM,CAAC,IAAAS,wBAAW,EAACF,GAAG,CAAC,CAACG,KAAK,CAAC,CAACT,GAAG,CAACE,SAAS,CAAC,WAAW,CAAC;EAC3D,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
6
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
7
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _react2 = require("@testing-library/react");
10
+ var _keypad = _interopRequireWildcard(require("../keypad"));
11
+ 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); }
12
+ 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; }
13
+ 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; }
14
+ /**
15
+ * Keypad behaviour that is new in this package: labels are static markup from
16
+ * convertLatexToMarkup (the MathQuill version created a live StaticMath per
17
+ * button), with a raw-latex fallback when the engine is unavailable.
18
+ */
19
+ describe('LatexLabel', function () {
20
+ it('falls back to raw latex when MathLive is unavailable', function () {
21
+ // jsdom cannot load MathLive, so latexToMarkup returns '' - the button must
22
+ // still show something rather than render blank.
23
+ var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad.LatexLabel, {
24
+ latex: '\\pi'
25
+ })),
26
+ container = _render.container;
27
+ expect(container.textContent).toContain('\\pi');
28
+ });
29
+ it('re-renders when the latex prop changes', function () {
30
+ var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad.LatexLabel, {
31
+ latex: '\\pi'
32
+ })),
33
+ container = _render2.container,
34
+ rerender = _render2.rerender;
35
+ rerender(/*#__PURE__*/_react["default"].createElement(_keypad.LatexLabel, {
36
+ latex: '\\theta'
37
+ }));
38
+ expect(container.textContent).toContain('\\theta');
39
+ });
40
+ it('does not warn more than once about a missing engine', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
41
+ var a, b;
42
+ return _regenerator["default"].wrap(function (_context) {
43
+ while (1) switch (_context.prev = _context.next) {
44
+ case 0:
45
+ _keypad.LatexLabel.warned = false;
46
+ a = new _keypad.LatexLabel({
47
+ latex: '\\pi'
48
+ });
49
+ b = new _keypad.LatexLabel({
50
+ latex: '\\theta'
51
+ });
52
+ a.state = {
53
+ markup: ''
54
+ };
55
+ b.state = {
56
+ markup: ''
57
+ };
58
+ a.setState = function () {};
59
+ b.setState = function () {};
60
+ _context.next = 1;
61
+ return a.componentDidMount();
62
+ case 1:
63
+ _context.next = 2;
64
+ return b.componentDidMount();
65
+ case 2:
66
+ expect(_keypad.LatexLabel.warned).toBe(true);
67
+ case 3:
68
+ case "end":
69
+ return _context.stop();
70
+ }
71
+ }, _callee);
72
+ })));
73
+ });
74
+ describe('KeyPad', function () {
75
+ var key = function key() {
76
+ var over = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
77
+ return _objectSpread({
78
+ name: 'x',
79
+ label: 'x',
80
+ write: 'x',
81
+ category: 'vars'
82
+ }, over);
83
+ };
84
+ it('renders a button per key', function () {
85
+ var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
86
+ onPress: function onPress() {},
87
+ baseSet: [[key(), key({
88
+ name: 'y',
89
+ label: 'y'
90
+ })]]
91
+ })),
92
+ container = _render3.container;
93
+ expect(container.querySelectorAll('button').length).toBe(2);
94
+ });
95
+ it('calls onPress with the whole key definition', function () {
96
+ var onPress = jest.fn();
97
+ var k = key();
98
+ var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
99
+ onPress: onPress,
100
+ baseSet: [[k]]
101
+ })),
102
+ container = _render4.container;
103
+ container.querySelector('button').click();
104
+ expect(onPress).toHaveBeenCalledWith(k);
105
+ });
106
+ it('renders a latex key through LatexLabel', function () {
107
+ var _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
108
+ onPress: function onPress() {},
109
+ baseSet: [[{
110
+ name: 'pi',
111
+ latex: '\\pi'
112
+ }]]
113
+ })),
114
+ container = _render5.container;
115
+ expect(container.textContent).toContain('\\pi');
116
+ });
117
+ it('disables the decimal separators when noDecimal is set', function () {
118
+ var dot = key({
119
+ name: '.',
120
+ label: '.',
121
+ write: '.'
122
+ });
123
+ var comma = key({
124
+ name: ',',
125
+ label: ',',
126
+ write: ','
127
+ });
128
+ var _render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
129
+ onPress: function onPress() {},
130
+ noDecimal: true,
131
+ baseSet: [[dot, comma]]
132
+ })),
133
+ container = _render6.container;
134
+ var disabled = Array.from(container.querySelectorAll('button')).filter(function (b) {
135
+ return b.disabled;
136
+ });
137
+ expect(disabled.length).toBe(2);
138
+ });
139
+ it('leaves the separators enabled otherwise', function () {
140
+ var dot = key({
141
+ name: '.',
142
+ label: '.',
143
+ write: '.'
144
+ });
145
+ var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
146
+ onPress: function onPress() {},
147
+ baseSet: [[dot]]
148
+ })),
149
+ container = _render7.container;
150
+ expect(container.querySelector('button').disabled).toBe(false);
151
+ });
152
+ it('renders a placeholder for empty grid slots', function () {
153
+ expect(function () {
154
+ return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
155
+ onPress: function onPress() {},
156
+ baseSet: [[null]]
157
+ }));
158
+ }).not.toThrow();
159
+ });
160
+ it('notifies setKeypadInteraction on pointer interaction', function () {
161
+ var setKeypadInteraction = jest.fn();
162
+ var _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
163
+ onPress: function onPress() {},
164
+ setKeypadInteraction: setKeypadInteraction,
165
+ baseSet: [[key()]]
166
+ })),
167
+ container = _render8.container;
168
+ container.firstChild.dispatchEvent(new MouseEvent('mousedown', {
169
+ bubbles: true
170
+ }));
171
+ expect(setKeypadInteraction).toHaveBeenCalledWith(true);
172
+ });
173
+ it('uses the mode as a class so mode-specific styling applies', function () {
174
+ var _render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
175
+ onPress: function onPress() {},
176
+ mode: "language",
177
+ baseSet: [[key()]]
178
+ })),
179
+ container = _render9.container;
180
+ expect(container.firstChild.className).toContain('language');
181
+ });
182
+ it('drops the base set for the modes that supply their own keys', function () {
183
+ var _render0 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
184
+ onPress: function onPress() {},
185
+ mode: "language",
186
+ baseSet: [[key(), key()]],
187
+ additionalKeys: [[key()]]
188
+ })),
189
+ container = _render0.container;
190
+
191
+ // base set ignored, only the additional key renders
192
+ expect(container.querySelectorAll('button').length).toBe(1);
193
+ });
194
+ it('unmounts without throwing', function () {
195
+ var _render1 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
196
+ onPress: function onPress() {},
197
+ controlledKeypadMode: true,
198
+ baseSet: [[key()]]
199
+ })),
200
+ unmount = _render1.unmount;
201
+ expect(function () {
202
+ return unmount();
203
+ }).not.toThrow();
204
+ });
205
+ });
206
+ //# sourceMappingURL=keypad-render.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keypad-render.test.js","names":["_react","_interopRequireDefault","require","_react2","_keypad","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","_typeof","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","describe","it","_render","render","createElement","LatexLabel","latex","container","expect","textContent","toContain","_render2","rerender","_asyncToGenerator2","_regenerator","mark","_callee","a","b","wrap","_context","prev","next","warned","state","markup","setState","componentDidMount","toBe","stop","key","over","undefined","name","label","write","category","_render3","onPress","baseSet","querySelectorAll","jest","fn","k","_render4","querySelector","click","toHaveBeenCalledWith","_render5","dot","comma","_render6","noDecimal","disabled","Array","from","_render7","not","toThrow","setKeypadInteraction","_render8","firstChild","dispatchEvent","MouseEvent","bubbles","_render9","mode","className","_render0","additionalKeys","_render1","controlledKeypadMode","unmount"],"sources":["../../src/__tests__/keypad-render.test.jsx"],"sourcesContent":["import React from 'react';\nimport { render } from '@testing-library/react';\n\nimport KeyPad, { LatexLabel } from '../keypad';\n\n/**\n * Keypad behaviour that is new in this package: labels are static markup from\n * convertLatexToMarkup (the MathQuill version created a live StaticMath per\n * button), with a raw-latex fallback when the engine is unavailable.\n */\ndescribe('LatexLabel', () => {\n it('falls back to raw latex when MathLive is unavailable', () => {\n // jsdom cannot load MathLive, so latexToMarkup returns '' - the button must\n // still show something rather than render blank.\n const { container } = render(<LatexLabel latex={'\\\\pi'} />);\n\n expect(container.textContent).toContain('\\\\pi');\n });\n\n it('re-renders when the latex prop changes', () => {\n const { container, rerender } = render(<LatexLabel latex={'\\\\pi'} />);\n\n rerender(<LatexLabel latex={'\\\\theta'} />);\n\n expect(container.textContent).toContain('\\\\theta');\n });\n\n it('does not warn more than once about a missing engine', async () => {\n LatexLabel.warned = false;\n\n const a = new LatexLabel({ latex: '\\\\pi' });\n const b = new LatexLabel({ latex: '\\\\theta' });\n\n a.state = { markup: '' };\n b.state = { markup: '' };\n a.setState = () => {};\n b.setState = () => {};\n\n await a.componentDidMount();\n await b.componentDidMount();\n\n expect(LatexLabel.warned).toBe(true);\n });\n});\n\ndescribe('KeyPad', () => {\n const key = (over = {}) => ({ name: 'x', label: 'x', write: 'x', category: 'vars', ...over });\n\n it('renders a button per key', () => {\n const { container } = render(<KeyPad onPress={() => {}} baseSet={[[key(), key({ name: 'y', label: 'y' })]]} />);\n\n expect(container.querySelectorAll('button').length).toBe(2);\n });\n\n it('calls onPress with the whole key definition', () => {\n const onPress = jest.fn();\n const k = key();\n const { container } = render(<KeyPad onPress={onPress} baseSet={[[k]]} />);\n\n container.querySelector('button').click();\n\n expect(onPress).toHaveBeenCalledWith(k);\n });\n\n it('renders a latex key through LatexLabel', () => {\n const { container } = render(<KeyPad onPress={() => {}} baseSet={[[{ name: 'pi', latex: '\\\\pi' }]]} />);\n\n expect(container.textContent).toContain('\\\\pi');\n });\n\n it('disables the decimal separators when noDecimal is set', () => {\n const dot = key({ name: '.', label: '.', write: '.' });\n const comma = key({ name: ',', label: ',', write: ',' });\n const { container } = render(<KeyPad onPress={() => {}} noDecimal baseSet={[[dot, comma]]} />);\n\n const disabled = Array.from(container.querySelectorAll('button')).filter((b) => b.disabled);\n\n expect(disabled.length).toBe(2);\n });\n\n it('leaves the separators enabled otherwise', () => {\n const dot = key({ name: '.', label: '.', write: '.' });\n const { container } = render(<KeyPad onPress={() => {}} baseSet={[[dot]]} />);\n\n expect(container.querySelector('button').disabled).toBe(false);\n });\n\n it('renders a placeholder for empty grid slots', () => {\n expect(() => render(<KeyPad onPress={() => {}} baseSet={[[null]]} />)).not.toThrow();\n });\n\n it('notifies setKeypadInteraction on pointer interaction', () => {\n const setKeypadInteraction = jest.fn();\n const { container } = render(\n <KeyPad onPress={() => {}} setKeypadInteraction={setKeypadInteraction} baseSet={[[key()]]} />,\n );\n\n container.firstChild.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }));\n\n expect(setKeypadInteraction).toHaveBeenCalledWith(true);\n });\n\n it('uses the mode as a class so mode-specific styling applies', () => {\n const { container } = render(<KeyPad onPress={() => {}} mode=\"language\" baseSet={[[key()]]} />);\n\n expect(container.firstChild.className).toContain('language');\n });\n\n it('drops the base set for the modes that supply their own keys', () => {\n const { container } = render(\n <KeyPad onPress={() => {}} mode=\"language\" baseSet={[[key(), key()]]} additionalKeys={[[key()]]} />,\n );\n\n // base set ignored, only the additional key renders\n expect(container.querySelectorAll('button').length).toBe(1);\n });\n\n it('unmounts without throwing', () => {\n const { unmount } = render(<KeyPad onPress={() => {}} controlledKeypadMode baseSet={[[key()]]} />);\n\n expect(() => unmount()).not.toThrow();\n });\n});\n"],"mappings":"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","ignoreList":[]}