@pie-lib/math-input-mathlive 1.0.9-next.6630 → 1.0.9
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/README.md +15 -6
- package/lib/__tests__/composites.test.js +255 -0
- package/lib/__tests__/composites.test.js.map +1 -0
- package/lib/__tests__/drop-in-compat.test.js +133 -0
- package/lib/__tests__/drop-in-compat.test.js.map +1 -0
- package/lib/__tests__/index.test.js +118 -0
- package/lib/__tests__/index.test.js.map +1 -0
- package/lib/__tests__/input-imperative.test.js +155 -0
- package/lib/__tests__/input-imperative.test.js.map +1 -0
- package/lib/__tests__/keypad-label.test.js +44 -0
- package/lib/__tests__/keypad-label.test.js.map +1 -0
- package/lib/__tests__/keypad-render.test.js +206 -0
- package/lib/__tests__/keypad-render.test.js.map +1 -0
- package/lib/__tests__/latex-bridge.test.js +251 -0
- package/lib/__tests__/latex-bridge.test.js.map +1 -0
- package/lib/__tests__/mathlive-instance.test.js +237 -0
- package/lib/__tests__/mathlive-instance.test.js.map +1 -0
- package/lib/__tests__/mount-race.test.js +194 -0
- package/lib/__tests__/mount-race.test.js.map +1 -0
- package/lib/__tests__/static-prompts.test.js +282 -0
- package/lib/__tests__/static-prompts.test.js.map +1 -0
- package/lib/mathlive-instance.js +47 -10
- package/lib/mathlive-instance.js.map +1 -1
- package/lib/mf/input.js +18 -5
- package/lib/mf/input.js.map +1 -1
- package/lib/mf/static.js +17 -4
- package/lib/mf/static.js.map +1 -1
- package/package.json +3 -4
- package/src/__tests__/composites.test.jsx +220 -0
- package/src/__tests__/keypad-label.test.jsx +5 -13
- package/src/__tests__/keypad-render.test.jsx +123 -0
- package/src/__tests__/mathlive-instance.test.js +40 -0
- package/src/__tests__/mount-race.test.jsx +129 -0
- package/src/__tests__/static-prompts.test.jsx +251 -0
- package/src/mathlive-instance.js +50 -11
- package/src/mf/input.jsx +19 -5
- package/src/mf/static.jsx +20 -4
- package/LICENSE.md +0 -5
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _latexBridge = require("../latex-bridge");
|
|
5
|
+
var _input = _interopRequireDefault(require("../mf/input"));
|
|
6
|
+
/**
|
|
7
|
+
* The imperative surface that @pie-lib/math-toolbar drives
|
|
8
|
+
* (editor-and-pad.jsx: clear/command/keystroke/write/latex).
|
|
9
|
+
*
|
|
10
|
+
* These call the methods against a stub mathfield, because a real
|
|
11
|
+
* <math-field> needs a browser. What matters here is the *translation*:
|
|
12
|
+
* MathQuill-era arguments must become valid MathLive operations.
|
|
13
|
+
*/
|
|
14
|
+
var stubField = function stubField() {
|
|
15
|
+
var calls = {
|
|
16
|
+
insert: [],
|
|
17
|
+
executeCommand: [],
|
|
18
|
+
focus: 0
|
|
19
|
+
};
|
|
20
|
+
return {
|
|
21
|
+
calls: calls,
|
|
22
|
+
value: '',
|
|
23
|
+
getValue: function getValue() {
|
|
24
|
+
return '';
|
|
25
|
+
},
|
|
26
|
+
insert: function insert(v) {
|
|
27
|
+
calls.insert.push(v);
|
|
28
|
+
},
|
|
29
|
+
executeCommand: function executeCommand(v) {
|
|
30
|
+
calls.executeCommand.push(v);
|
|
31
|
+
},
|
|
32
|
+
focus: function focus() {
|
|
33
|
+
calls.focus++;
|
|
34
|
+
},
|
|
35
|
+
blur: function blur() {}
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
var withField = function withField() {
|
|
39
|
+
var input = new _input["default"]({});
|
|
40
|
+
var f = stubField();
|
|
41
|
+
input.mathField = f;
|
|
42
|
+
return {
|
|
43
|
+
input: input,
|
|
44
|
+
f: f
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
describe('Input imperative API (drives math-toolbar)', function () {
|
|
48
|
+
describe('keystroke', function () {
|
|
49
|
+
it('maps MathQuill keystroke names to MathLive selectors', function () {
|
|
50
|
+
var _withField = withField(),
|
|
51
|
+
input = _withField.input,
|
|
52
|
+
f = _withField.f;
|
|
53
|
+
input.keystroke('Left');
|
|
54
|
+
input.keystroke('Right');
|
|
55
|
+
input.keystroke('Backspace');
|
|
56
|
+
expect(f.calls.executeCommand).toEqual(['moveToPreviousChar', 'moveToNextChar', 'deleteBackward']);
|
|
57
|
+
});
|
|
58
|
+
it('passes an unknown value through as a selector', function () {
|
|
59
|
+
var _withField2 = withField(),
|
|
60
|
+
input = _withField2.input,
|
|
61
|
+
f = _withField2.f;
|
|
62
|
+
input.keystroke('deleteForward');
|
|
63
|
+
expect(f.calls.executeCommand).toEqual(['deleteForward']);
|
|
64
|
+
});
|
|
65
|
+
it('does not throw when the engine rejects the selector', function () {
|
|
66
|
+
var _withField3 = withField(),
|
|
67
|
+
input = _withField3.input;
|
|
68
|
+
input.mathField.executeCommand = function () {
|
|
69
|
+
throw new Error('unknown command');
|
|
70
|
+
};
|
|
71
|
+
expect(function () {
|
|
72
|
+
return input.keystroke('Nonsense');
|
|
73
|
+
}).not.toThrow();
|
|
74
|
+
});
|
|
75
|
+
it('covers every keystroke the keypad emits', function () {
|
|
76
|
+
// navigation.js / edit.js only produce these three
|
|
77
|
+
['Left', 'Right', 'Backspace'].forEach(function (k) {
|
|
78
|
+
return expect(_latexBridge.KEYSTROKES[k]).toBeDefined();
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe('command', function () {
|
|
83
|
+
it('expands argument-taking commands into placeholders', function () {
|
|
84
|
+
var _withField4 = withField(),
|
|
85
|
+
input = _withField4.input,
|
|
86
|
+
f = _withField4.f;
|
|
87
|
+
input.command('\\frac');
|
|
88
|
+
|
|
89
|
+
// a bare \frac would give no editable slots
|
|
90
|
+
expect(f.calls.insert).toEqual(['\\frac{#?}{#?}']);
|
|
91
|
+
});
|
|
92
|
+
it('handles array commands', function () {
|
|
93
|
+
var _withField5 = withField(),
|
|
94
|
+
input = _withField5.input,
|
|
95
|
+
f = _withField5.f;
|
|
96
|
+
input.command(['\\log', '_']);
|
|
97
|
+
expect(f.calls.insert).toEqual(['\\log_{#?}']);
|
|
98
|
+
});
|
|
99
|
+
it('passes argument-less commands through', function () {
|
|
100
|
+
var _withField6 = withField(),
|
|
101
|
+
input = _withField6.input,
|
|
102
|
+
f = _withField6.f;
|
|
103
|
+
input.command('\\pi');
|
|
104
|
+
expect(f.calls.insert).toEqual(['\\pi']);
|
|
105
|
+
});
|
|
106
|
+
it('agrees with keyToAction', function () {
|
|
107
|
+
expect((0, _latexBridge.keyToAction)({
|
|
108
|
+
command: '\\sqrt'
|
|
109
|
+
}).value).toEqual('\\sqrt{#?}');
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
describe('safety before MathLive loads', function () {
|
|
113
|
+
it('every method is a no-op rather than a crash', function () {
|
|
114
|
+
var input = new _input["default"]({});
|
|
115
|
+
|
|
116
|
+
// mathField is undefined until loadMathLive() resolves
|
|
117
|
+
expect(input.latex()).toEqual('');
|
|
118
|
+
expect(input.clear()).toEqual('');
|
|
119
|
+
expect(input.command('\\frac')).toEqual('');
|
|
120
|
+
expect(input.keystroke('Left')).toEqual('');
|
|
121
|
+
expect(input.write('x')).toEqual('');
|
|
122
|
+
expect(function () {
|
|
123
|
+
return input.focus();
|
|
124
|
+
}).not.toThrow();
|
|
125
|
+
expect(function () {
|
|
126
|
+
return input.blur();
|
|
127
|
+
}).not.toThrow();
|
|
128
|
+
expect(function () {
|
|
129
|
+
return input.setLatex('x');
|
|
130
|
+
}).not.toThrow();
|
|
131
|
+
expect(input.element).toBeUndefined();
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe('mqCompat facade', function () {
|
|
135
|
+
// math-toolbar used to call this.input.mathField.latex(); external
|
|
136
|
+
// consumers may still do the same.
|
|
137
|
+
it('exposes latex() as a getter', function () {
|
|
138
|
+
var _withField7 = withField(),
|
|
139
|
+
input = _withField7.input;
|
|
140
|
+
input.mathField.getValue = function () {
|
|
141
|
+
return '\\frac{1}{2}';
|
|
142
|
+
};
|
|
143
|
+
expect(input.mqCompat.latex()).toEqual('\\frac{1}{2}');
|
|
144
|
+
});
|
|
145
|
+
it('exposes latex(v) as a setter and el()', function () {
|
|
146
|
+
var _withField8 = withField(),
|
|
147
|
+
input = _withField8.input,
|
|
148
|
+
f = _withField8.f;
|
|
149
|
+
input.mqCompat.latex('x+1');
|
|
150
|
+
expect(f.value).toEqual('x+1');
|
|
151
|
+
expect(input.mqCompat.el()).toBe(f);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
//# sourceMappingURL=input-imperative.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-imperative.test.js","names":["_latexBridge","require","_input","_interopRequireDefault","stubField","calls","insert","executeCommand","focus","value","getValue","v","push","blur","withField","input","Input","f","mathField","describe","it","_withField","keystroke","expect","toEqual","_withField2","_withField3","Error","not","toThrow","forEach","k","KEYSTROKES","toBeDefined","_withField4","command","_withField5","_withField6","keyToAction","latex","clear","write","setLatex","element","toBeUndefined","_withField7","mqCompat","_withField8","el","toBe"],"sources":["../../src/__tests__/input-imperative.test.jsx"],"sourcesContent":["import { KEYSTROKES, keyToAction } from '../latex-bridge';\nimport Input from '../mf/input';\n\n/**\n * The imperative surface that @pie-lib/math-toolbar drives\n * (editor-and-pad.jsx: clear/command/keystroke/write/latex).\n *\n * These call the methods against a stub mathfield, because a real\n * <math-field> needs a browser. What matters here is the *translation*:\n * MathQuill-era arguments must become valid MathLive operations.\n */\nconst stubField = () => {\n const calls = { insert: [], executeCommand: [], focus: 0 };\n\n return {\n calls,\n value: '',\n getValue: () => '',\n insert(v) {\n calls.insert.push(v);\n },\n executeCommand(v) {\n calls.executeCommand.push(v);\n },\n focus() {\n calls.focus++;\n },\n blur() {},\n };\n};\n\nconst withField = () => {\n const input = new Input({});\n const f = stubField();\n\n input.mathField = f;\n\n return { input, f };\n};\n\ndescribe('Input imperative API (drives math-toolbar)', () => {\n describe('keystroke', () => {\n it('maps MathQuill keystroke names to MathLive selectors', () => {\n const { input, f } = withField();\n\n input.keystroke('Left');\n input.keystroke('Right');\n input.keystroke('Backspace');\n\n expect(f.calls.executeCommand).toEqual(['moveToPreviousChar', 'moveToNextChar', 'deleteBackward']);\n });\n\n it('passes an unknown value through as a selector', () => {\n const { input, f } = withField();\n\n input.keystroke('deleteForward');\n\n expect(f.calls.executeCommand).toEqual(['deleteForward']);\n });\n\n it('does not throw when the engine rejects the selector', () => {\n const { input } = withField();\n\n input.mathField.executeCommand = () => {\n throw new Error('unknown command');\n };\n\n expect(() => input.keystroke('Nonsense')).not.toThrow();\n });\n\n it('covers every keystroke the keypad emits', () => {\n // navigation.js / edit.js only produce these three\n ['Left', 'Right', 'Backspace'].forEach((k) => expect(KEYSTROKES[k]).toBeDefined());\n });\n });\n\n describe('command', () => {\n it('expands argument-taking commands into placeholders', () => {\n const { input, f } = withField();\n\n input.command('\\\\frac');\n\n // a bare \\frac would give no editable slots\n expect(f.calls.insert).toEqual(['\\\\frac{#?}{#?}']);\n });\n\n it('handles array commands', () => {\n const { input, f } = withField();\n\n input.command(['\\\\log', '_']);\n\n expect(f.calls.insert).toEqual(['\\\\log_{#?}']);\n });\n\n it('passes argument-less commands through', () => {\n const { input, f } = withField();\n\n input.command('\\\\pi');\n\n expect(f.calls.insert).toEqual(['\\\\pi']);\n });\n\n it('agrees with keyToAction', () => {\n expect(keyToAction({ command: '\\\\sqrt' }).value).toEqual('\\\\sqrt{#?}');\n });\n });\n\n describe('safety before MathLive loads', () => {\n it('every method is a no-op rather than a crash', () => {\n const input = new Input({});\n\n // mathField is undefined until loadMathLive() resolves\n expect(input.latex()).toEqual('');\n expect(input.clear()).toEqual('');\n expect(input.command('\\\\frac')).toEqual('');\n expect(input.keystroke('Left')).toEqual('');\n expect(input.write('x')).toEqual('');\n expect(() => input.focus()).not.toThrow();\n expect(() => input.blur()).not.toThrow();\n expect(() => input.setLatex('x')).not.toThrow();\n expect(input.element).toBeUndefined();\n });\n });\n\n describe('mqCompat facade', () => {\n // math-toolbar used to call this.input.mathField.latex(); external\n // consumers may still do the same.\n it('exposes latex() as a getter', () => {\n const { input } = withField();\n\n input.mathField.getValue = () => '\\\\frac{1}{2}';\n\n expect(input.mqCompat.latex()).toEqual('\\\\frac{1}{2}');\n });\n\n it('exposes latex(v) as a setter and el()', () => {\n const { input, f } = withField();\n\n input.mqCompat.latex('x+1');\n expect(f.value).toEqual('x+1');\n expect(input.mqCompat.el()).toBe(f);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _latexBridge = require("../latex-bridge");
|
|
4
|
+
/**
|
|
5
|
+
* Keys use empty groups to show a command's shape (`\frac{}{}`, `x^{}`).
|
|
6
|
+
* MathLive renders `{}` as nothing, so labels need a visible stand-in - but the
|
|
7
|
+
* value that gets *inserted* must stay untouched.
|
|
8
|
+
*/
|
|
9
|
+
describe('keypad label display normalisation', function () {
|
|
10
|
+
it('gives empty groups a visible glyph', function () {
|
|
11
|
+
var out = (0, _latexBridge.withVisibleEmptySlots)('\\frac{}{}');
|
|
12
|
+
expect(out).not.toEqual('\\frac{}{}');
|
|
13
|
+
expect(out).toContain('25AB'); // white small square
|
|
14
|
+
expect(out).toContain('pie-empty');
|
|
15
|
+
});
|
|
16
|
+
it('handles every empty-group key shape', function () {
|
|
17
|
+
['\\frac{}{}', '\\overline{}', 'x^{}', 'x_{}', '\\sqrt{}', '\\sqrt[{}]{}', '\\abs{}', '\\log_{}', '\\longdiv{}'].forEach(function (latex) {
|
|
18
|
+
expect((0, _latexBridge.withVisibleEmptySlots)(latex)).not.toContain('{}');
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
it('treats a whitespace-only group as empty', function () {
|
|
22
|
+
// e.g. \frac{x}{ }
|
|
23
|
+
expect((0, _latexBridge.withVisibleEmptySlots)('\\frac{x}{ }')).toContain('pie-empty');
|
|
24
|
+
});
|
|
25
|
+
it('leaves latex without empty groups alone', function () {
|
|
26
|
+
['\\pi', '\\sin', 'x^2', '\\overline{AB}'].forEach(function (latex) {
|
|
27
|
+
expect((0, _latexBridge.withVisibleEmptySlots)(latex)).toEqual(latex);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
it('handles nullish input', function () {
|
|
31
|
+
expect((0, _latexBridge.withVisibleEmptySlots)(undefined)).toEqual('');
|
|
32
|
+
expect((0, _latexBridge.withVisibleEmptySlots)('')).toEqual('');
|
|
33
|
+
});
|
|
34
|
+
it('does NOT affect what gets inserted into the field', function () {
|
|
35
|
+
// the action must use the key's own latex, never the display form
|
|
36
|
+
var key = {
|
|
37
|
+
name: 'frac',
|
|
38
|
+
latex: '\\frac{}{}'
|
|
39
|
+
};
|
|
40
|
+
expect((0, _latexBridge.keyToAction)(key).value).toEqual('\\frac{}{}');
|
|
41
|
+
expect((0, _latexBridge.keyToAction)(key).value).not.toContain('pie-empty');
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=keypad-label.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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":[]}
|