@pie-lib/math-input-mathlive 1.1.5-beta.6 → 1.1.5-beta.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.
- package/lib/__tests__/composites.test.js +255 -0
- package/lib/__tests__/drop-in-compat.test.js +133 -0
- package/lib/__tests__/embedded-fonts.test.js +121 -0
- package/lib/__tests__/index.test.js +118 -0
- package/lib/__tests__/input-imperative.test.js +155 -0
- package/lib/__tests__/input-selection.test.js +103 -0
- package/lib/__tests__/keypad-label.test.js +231 -0
- package/lib/__tests__/keypad-render.test.js +206 -0
- package/lib/__tests__/latex-bridge.test.js +386 -0
- package/lib/__tests__/mathlive-instance.test.js +419 -0
- package/lib/__tests__/mount-race.test.js +218 -0
- package/lib/__tests__/selection.test.js +195 -0
- package/lib/__tests__/static-prompts.test.js +405 -0
- package/lib/__tests__/tmp-markup.test.js +26 -0
- package/lib/latex-bridge.js +17 -3
- package/lib/latex-bridge.js.map +1 -1
- package/lib/mf/input.js +9 -1
- package/lib/mf/input.js.map +1 -1
- package/lib/selection.js +148 -0
- package/lib/selection.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/composites.test.jsx +220 -0
- package/src/__tests__/drop-in-compat.test.jsx +112 -0
- package/src/__tests__/index.test.jsx +109 -0
- package/src/__tests__/input-imperative.test.jsx +144 -0
- package/src/__tests__/input-selection.test.jsx +64 -0
- package/src/__tests__/keypad-label.test.jsx +283 -0
- package/src/__tests__/keypad-render.test.jsx +123 -0
- package/src/__tests__/latex-bridge.test.js +359 -0
- package/src/__tests__/mathlive-instance.test.js +418 -0
- package/src/__tests__/mount-race.test.jsx +142 -0
- package/src/__tests__/selection.test.js +212 -0
- package/src/__tests__/static-prompts.test.jsx +364 -0
- package/src/latex-bridge.js +17 -2
- package/src/mf/input.jsx +10 -1
- package/src/selection.js +146 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
5
|
+
var _react = _interopRequireDefault(require("react"));
|
|
6
|
+
var _react2 = require("@testing-library/react");
|
|
7
|
+
var _index = require("../index");
|
|
8
|
+
describe('math-input-mathlive public API', function () {
|
|
9
|
+
it('mirrors the @pie-lib/math-input export surface', function () {
|
|
10
|
+
expect((0, _typeof2["default"])(_index.keysForGrade)).toBe('function');
|
|
11
|
+
expect((0, _typeof2["default"])(_index.addBrackets)).toBe('function');
|
|
12
|
+
expect((0, _typeof2["default"])(_index.removeBrackets)).toBe('function');
|
|
13
|
+
expect((0, _typeof2["default"])(_index.registerEmbed)).toBe('function');
|
|
14
|
+
expect((0, _typeof2["default"])(_index.applyStaticMath)).toBe('function');
|
|
15
|
+
expect((0, _typeof2["default"])(_index.updateSpans)).toBe('function');
|
|
16
|
+
expect(_index.keys).toBeDefined();
|
|
17
|
+
expect(_index.keys.baseSet).toBeDefined();
|
|
18
|
+
});
|
|
19
|
+
it('exports the field wrappers under both mf and mq', function () {
|
|
20
|
+
expect(_index.mf.Input).toBeDefined();
|
|
21
|
+
expect(_index.mf.Static).toBeDefined();
|
|
22
|
+
// `mq` alias lets a consumer swap packages by changing only the import.
|
|
23
|
+
expect(_index.mq).toBe(_index.mf);
|
|
24
|
+
});
|
|
25
|
+
it('updateSpans is a safe no-op', function () {
|
|
26
|
+
expect(function () {
|
|
27
|
+
return (0, _index.updateSpans)();
|
|
28
|
+
}).not.toThrow();
|
|
29
|
+
});
|
|
30
|
+
it('CommonMqStyles keeps the shape consumers destructure', function () {
|
|
31
|
+
// math-toolbar does:
|
|
32
|
+
// const { commonMqFontStyles, commonMqKeyboardStyles, longdivStyles, supsubStyles }
|
|
33
|
+
// = mq.CommonMqStyles;
|
|
34
|
+
var _mf$CommonMqStyles = _index.mf.CommonMqStyles,
|
|
35
|
+
commonMqFontStyles = _mf$CommonMqStyles.commonMqFontStyles,
|
|
36
|
+
commonMqKeyboardStyles = _mf$CommonMqStyles.commonMqKeyboardStyles,
|
|
37
|
+
longdivStyles = _mf$CommonMqStyles.longdivStyles,
|
|
38
|
+
supsubStyles = _mf$CommonMqStyles.supsubStyles;
|
|
39
|
+
[commonMqFontStyles, commonMqKeyboardStyles, longdivStyles, supsubStyles].forEach(function (s) {
|
|
40
|
+
expect(s).toBeDefined();
|
|
41
|
+
expect((0, _typeof2["default"])(s)).toBe('object');
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
it('bracket helpers round-trip', function () {
|
|
45
|
+
expect((0, _index.addBrackets)('x')).toEqual('\\(x\\)');
|
|
46
|
+
expect((0, _index.removeBrackets)('\\(x\\)')).toEqual('x');
|
|
47
|
+
expect((0, _index.removeBrackets)((0, _index.addBrackets)('\\frac{1}{2}'))).toEqual('\\frac{1}{2}');
|
|
48
|
+
});
|
|
49
|
+
it('keysForGrade returns a 5-row keyset', function () {
|
|
50
|
+
var set = (0, _index.keysForGrade)('geometry');
|
|
51
|
+
expect(Array.isArray(set)).toBe(true);
|
|
52
|
+
expect(set.length).toBe(5);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('rendering', function () {
|
|
56
|
+
// MathLive is a browser-only custom element; loadMathLive() resolves async and
|
|
57
|
+
// is a no-op-ish under jsdom. These assert the components mount without
|
|
58
|
+
// throwing, which is what regressed most often in the MathQuill version.
|
|
59
|
+
it('KeyPad renders without a live MathLive instance', function () {
|
|
60
|
+
var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.KeyPad, {
|
|
61
|
+
onPress: function onPress() {}
|
|
62
|
+
})),
|
|
63
|
+
container = _render.container;
|
|
64
|
+
expect(container.querySelectorAll('button').length).toBeGreaterThan(0);
|
|
65
|
+
});
|
|
66
|
+
it('KeyPad falls back to raw latex for labels before MathLive loads', function () {
|
|
67
|
+
var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.KeyPad, {
|
|
68
|
+
onPress: function onPress() {},
|
|
69
|
+
baseSet: [[{
|
|
70
|
+
name: 'pi',
|
|
71
|
+
latex: '\\pi',
|
|
72
|
+
category: 'constants'
|
|
73
|
+
}]]
|
|
74
|
+
})),
|
|
75
|
+
container = _render2.container;
|
|
76
|
+
expect(container.textContent).toContain('\\pi');
|
|
77
|
+
});
|
|
78
|
+
it('KeyPad fires onPress with the key definition', function () {
|
|
79
|
+
var onPress = jest.fn();
|
|
80
|
+
var key = {
|
|
81
|
+
name: 'x',
|
|
82
|
+
label: 'x',
|
|
83
|
+
write: 'x',
|
|
84
|
+
category: 'vars'
|
|
85
|
+
};
|
|
86
|
+
var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.KeyPad, {
|
|
87
|
+
onPress: onPress,
|
|
88
|
+
baseSet: [[key]]
|
|
89
|
+
})),
|
|
90
|
+
container = _render3.container;
|
|
91
|
+
container.querySelector('button').click();
|
|
92
|
+
expect(onPress).toHaveBeenCalledWith(key);
|
|
93
|
+
});
|
|
94
|
+
it('MathInput mounts', function () {
|
|
95
|
+
expect(function () {
|
|
96
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.MathInput, {
|
|
97
|
+
latex: "\\\\frac{1}{2}",
|
|
98
|
+
onChange: function onChange() {}
|
|
99
|
+
}));
|
|
100
|
+
}).not.toThrow();
|
|
101
|
+
});
|
|
102
|
+
it('HorizontalKeypad mounts and reports the legacy {value,type} model', function () {
|
|
103
|
+
var onClick = jest.fn();
|
|
104
|
+
expect(function () {
|
|
105
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.HorizontalKeypad, {
|
|
106
|
+
onClick: onClick
|
|
107
|
+
}));
|
|
108
|
+
}).not.toThrow();
|
|
109
|
+
});
|
|
110
|
+
it('Static renders display-mode latex without a mathfield', function () {
|
|
111
|
+
expect(function () {
|
|
112
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.mf.Static, {
|
|
113
|
+
latex: "\\\\frac{1}{2}"
|
|
114
|
+
}));
|
|
115
|
+
}).not.toThrow();
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfaW5kZXgiLCJkZXNjcmliZSIsIml0IiwiZXhwZWN0IiwiX3R5cGVvZjIiLCJrZXlzRm9yR3JhZGUiLCJ0b0JlIiwiYWRkQnJhY2tldHMiLCJyZW1vdmVCcmFja2V0cyIsInJlZ2lzdGVyRW1iZWQiLCJhcHBseVN0YXRpY01hdGgiLCJ1cGRhdGVTcGFucyIsImtleXMiLCJ0b0JlRGVmaW5lZCIsImJhc2VTZXQiLCJtZiIsIklucHV0IiwiU3RhdGljIiwibXEiLCJub3QiLCJ0b1Rocm93IiwiX21mJENvbW1vbk1xU3R5bGVzIiwiQ29tbW9uTXFTdHlsZXMiLCJjb21tb25NcUZvbnRTdHlsZXMiLCJjb21tb25NcUtleWJvYXJkU3R5bGVzIiwibG9uZ2RpdlN0eWxlcyIsInN1cHN1YlN0eWxlcyIsImZvckVhY2giLCJzIiwidG9FcXVhbCIsInNldCIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsIl9yZW5kZXIiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiS2V5UGFkIiwib25QcmVzcyIsImNvbnRhaW5lciIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJ0b0JlR3JlYXRlclRoYW4iLCJfcmVuZGVyMiIsIm5hbWUiLCJsYXRleCIsImNhdGVnb3J5IiwidGV4dENvbnRlbnQiLCJ0b0NvbnRhaW4iLCJqZXN0IiwiZm4iLCJrZXkiLCJsYWJlbCIsIndyaXRlIiwiX3JlbmRlcjMiLCJxdWVyeVNlbGVjdG9yIiwiY2xpY2siLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsIk1hdGhJbnB1dCIsIm9uQ2hhbmdlIiwib25DbGljayIsIkhvcml6b250YWxLZXlwYWQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2luZGV4LnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcblxuaW1wb3J0IHtcbiAga2V5cyxcbiAga2V5c0ZvckdyYWRlLFxuICBhZGRCcmFja2V0cyxcbiAgcmVtb3ZlQnJhY2tldHMsXG4gIHJlZ2lzdGVyRW1iZWQsXG4gIGFwcGx5U3RhdGljTWF0aCxcbiAgdXBkYXRlU3BhbnMsXG4gIG1mLFxuICBtcSxcbiAgTWF0aElucHV0LFxuICBIb3Jpem9udGFsS2V5cGFkLFxuICBLZXlQYWQsXG59IGZyb20gJy4uL2luZGV4JztcblxuZGVzY3JpYmUoJ21hdGgtaW5wdXQtbWF0aGxpdmUgcHVibGljIEFQSScsICgpID0+IHtcbiAgaXQoJ21pcnJvcnMgdGhlIEBwaWUtbGliL21hdGgtaW5wdXQgZXhwb3J0IHN1cmZhY2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHR5cGVvZiBrZXlzRm9yR3JhZGUpLnRvQmUoJ2Z1bmN0aW9uJyk7XG4gICAgZXhwZWN0KHR5cGVvZiBhZGRCcmFja2V0cykudG9CZSgnZnVuY3Rpb24nKTtcbiAgICBleHBlY3QodHlwZW9mIHJlbW92ZUJyYWNrZXRzKS50b0JlKCdmdW5jdGlvbicpO1xuICAgIGV4cGVjdCh0eXBlb2YgcmVnaXN0ZXJFbWJlZCkudG9CZSgnZnVuY3Rpb24nKTtcbiAgICBleHBlY3QodHlwZW9mIGFwcGx5U3RhdGljTWF0aCkudG9CZSgnZnVuY3Rpb24nKTtcbiAgICBleHBlY3QodHlwZW9mIHVwZGF0ZVNwYW5zKS50b0JlKCdmdW5jdGlvbicpO1xuICAgIGV4cGVjdChrZXlzKS50b0JlRGVmaW5lZCgpO1xuICAgIGV4cGVjdChrZXlzLmJhc2VTZXQpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGl0KCdleHBvcnRzIHRoZSBmaWVsZCB3cmFwcGVycyB1bmRlciBib3RoIG1mIGFuZCBtcScsICgpID0+IHtcbiAgICBleHBlY3QobWYuSW5wdXQpLnRvQmVEZWZpbmVkKCk7XG4gICAgZXhwZWN0KG1mLlN0YXRpYykudG9CZURlZmluZWQoKTtcbiAgICAvLyBgbXFgIGFsaWFzIGxldHMgYSBjb25zdW1lciBzd2FwIHBhY2thZ2VzIGJ5IGNoYW5naW5nIG9ubHkgdGhlIGltcG9ydC5cbiAgICBleHBlY3QobXEpLnRvQmUobWYpO1xuICB9KTtcblxuICBpdCgndXBkYXRlU3BhbnMgaXMgYSBzYWZlIG5vLW9wJywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiB1cGRhdGVTcGFucygpKS5ub3QudG9UaHJvdygpO1xuICB9KTtcblxuICBpdCgnQ29tbW9uTXFTdHlsZXMga2VlcHMgdGhlIHNoYXBlIGNvbnN1bWVycyBkZXN0cnVjdHVyZScsICgpID0+IHtcbiAgICAvLyBtYXRoLXRvb2xiYXIgZG9lczpcbiAgICAvLyAgIGNvbnN0IHsgY29tbW9uTXFGb250U3R5bGVzLCBjb21tb25NcUtleWJvYXJkU3R5bGVzLCBsb25nZGl2U3R5bGVzLCBzdXBzdWJTdHlsZXMgfVxuICAgIC8vICAgICA9IG1xLkNvbW1vbk1xU3R5bGVzO1xuICAgIGNvbnN0IHsgY29tbW9uTXFGb250U3R5bGVzLCBjb21tb25NcUtleWJvYXJkU3R5bGVzLCBsb25nZGl2U3R5bGVzLCBzdXBzdWJTdHlsZXMgfSA9IG1mLkNvbW1vbk1xU3R5bGVzO1xuXG4gICAgW2NvbW1vbk1xRm9udFN0eWxlcywgY29tbW9uTXFLZXlib2FyZFN0eWxlcywgbG9uZ2RpdlN0eWxlcywgc3Vwc3ViU3R5bGVzXS5mb3JFYWNoKChzKSA9PiB7XG4gICAgICBleHBlY3QocykudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdCh0eXBlb2YgcykudG9CZSgnb2JqZWN0Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdicmFja2V0IGhlbHBlcnMgcm91bmQtdHJpcCcsICgpID0+IHtcbiAgICBleHBlY3QoYWRkQnJhY2tldHMoJ3gnKSkudG9FcXVhbCgnXFxcXCh4XFxcXCknKTtcbiAgICBleHBlY3QocmVtb3ZlQnJhY2tldHMoJ1xcXFwoeFxcXFwpJykpLnRvRXF1YWwoJ3gnKTtcbiAgICBleHBlY3QocmVtb3ZlQnJhY2tldHMoYWRkQnJhY2tldHMoJ1xcXFxmcmFjezF9ezJ9JykpKS50b0VxdWFsKCdcXFxcZnJhY3sxfXsyfScpO1xuICB9KTtcblxuICBpdCgna2V5c0ZvckdyYWRlIHJldHVybnMgYSA1LXJvdyBrZXlzZXQnLCAoKSA9PiB7XG4gICAgY29uc3Qgc2V0ID0ga2V5c0ZvckdyYWRlKCdnZW9tZXRyeScpO1xuXG4gICAgZXhwZWN0KEFycmF5LmlzQXJyYXkoc2V0KSkudG9CZSh0cnVlKTtcbiAgICBleHBlY3Qoc2V0Lmxlbmd0aCkudG9CZSg1KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3JlbmRlcmluZycsICgpID0+IHtcbiAgLy8gTWF0aExpdmUgaXMgYSBicm93c2VyLW9ubHkgY3VzdG9tIGVsZW1lbnQ7IGxvYWRNYXRoTGl2ZSgpIHJlc29sdmVzIGFzeW5jIGFuZFxuICAvLyBpcyBhIG5vLW9wLWlzaCB1bmRlciBqc2RvbS4gVGhlc2UgYXNzZXJ0IHRoZSBjb21wb25lbnRzIG1vdW50IHdpdGhvdXRcbiAgLy8gdGhyb3dpbmcsIHdoaWNoIGlzIHdoYXQgcmVncmVzc2VkIG1vc3Qgb2Z0ZW4gaW4gdGhlIE1hdGhRdWlsbCB2ZXJzaW9uLlxuICBpdCgnS2V5UGFkIHJlbmRlcnMgd2l0aG91dCBhIGxpdmUgTWF0aExpdmUgaW5zdGFuY2UnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8S2V5UGFkIG9uUHJlc3M9eygpID0+IHt9fSAvPik7XG5cbiAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICB9KTtcblxuICBpdCgnS2V5UGFkIGZhbGxzIGJhY2sgdG8gcmF3IGxhdGV4IGZvciBsYWJlbHMgYmVmb3JlIE1hdGhMaXZlIGxvYWRzJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoXG4gICAgICA8S2V5UGFkIG9uUHJlc3M9eygpID0+IHt9fSBiYXNlU2V0PXtbW3sgbmFtZTogJ3BpJywgbGF0ZXg6ICdcXFxccGknLCBjYXRlZ29yeTogJ2NvbnN0YW50cycgfV1dfSAvPixcbiAgICApO1xuXG4gICAgZXhwZWN0KGNvbnRhaW5lci50ZXh0Q29udGVudCkudG9Db250YWluKCdcXFxccGknKTtcbiAgfSk7XG5cbiAgaXQoJ0tleVBhZCBmaXJlcyBvblByZXNzIHdpdGggdGhlIGtleSBkZWZpbml0aW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uUHJlc3MgPSBqZXN0LmZuKCk7XG4gICAgY29uc3Qga2V5ID0geyBuYW1lOiAneCcsIGxhYmVsOiAneCcsIHdyaXRlOiAneCcsIGNhdGVnb3J5OiAndmFycycgfTtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxLZXlQYWQgb25QcmVzcz17b25QcmVzc30gYmFzZVNldD17W1trZXldXX0gLz4pO1xuXG4gICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpLmNsaWNrKCk7XG5cbiAgICBleHBlY3Qob25QcmVzcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoa2V5KTtcbiAgfSk7XG5cbiAgaXQoJ01hdGhJbnB1dCBtb3VudHMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IHJlbmRlcig8TWF0aElucHV0IGxhdGV4PVwiXFxcXGZyYWN7MX17Mn1cIiBvbkNoYW5nZT17KCkgPT4ge319IC8+KSkubm90LnRvVGhyb3coKTtcbiAgfSk7XG5cbiAgaXQoJ0hvcml6b250YWxLZXlwYWQgbW91bnRzIGFuZCByZXBvcnRzIHRoZSBsZWdhY3kge3ZhbHVlLHR5cGV9IG1vZGVsJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uQ2xpY2sgPSBqZXN0LmZuKCk7XG5cbiAgICBleHBlY3QoKCkgPT4gcmVuZGVyKDxIb3Jpem9udGFsS2V5cGFkIG9uQ2xpY2s9e29uQ2xpY2t9IC8+KSkubm90LnRvVGhyb3coKTtcbiAgfSk7XG5cbiAgaXQoJ1N0YXRpYyByZW5kZXJzIGRpc3BsYXktbW9kZSBsYXRleCB3aXRob3V0IGEgbWF0aGZpZWxkJywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiByZW5kZXIoPG1mLlN0YXRpYyBsYXRleD1cIlxcXFxmcmFjezF9ezJ9XCIgLz4pKS5ub3QudG9UaHJvdygpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsTUFBQSxHQUFBRixPQUFBO0FBZUFHLFFBQVEsQ0FBQyxnQ0FBZ0MsRUFBRSxZQUFNO0VBQy9DQyxFQUFFLENBQUMsZ0RBQWdELEVBQUUsWUFBTTtJQUN6REMsTUFBTSxLQUFBQyxRQUFBLGFBQVFDLG1CQUFZLEVBQUMsQ0FBQ0MsSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUM1Q0gsTUFBTSxLQUFBQyxRQUFBLGFBQVFHLGtCQUFXLEVBQUMsQ0FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMzQ0gsTUFBTSxLQUFBQyxRQUFBLGFBQVFJLHFCQUFjLEVBQUMsQ0FBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUM5Q0gsTUFBTSxLQUFBQyxRQUFBLGFBQVFLLG9CQUFhLEVBQUMsQ0FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUM3Q0gsTUFBTSxLQUFBQyxRQUFBLGFBQVFNLHNCQUFlLEVBQUMsQ0FBQ0osSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMvQ0gsTUFBTSxLQUFBQyxRQUFBLGFBQVFPLGtCQUFXLEVBQUMsQ0FBQ0wsSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMzQ0gsTUFBTSxDQUFDUyxXQUFJLENBQUMsQ0FBQ0MsV0FBVyxDQUFDLENBQUM7SUFDMUJWLE1BQU0sQ0FBQ1MsV0FBSSxDQUFDRSxPQUFPLENBQUMsQ0FBQ0QsV0FBVyxDQUFDLENBQUM7RUFDcEMsQ0FBQyxDQUFDO0VBRUZYLEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxZQUFNO0lBQzFEQyxNQUFNLENBQUNZLFNBQUUsQ0FBQ0MsS0FBSyxDQUFDLENBQUNILFdBQVcsQ0FB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
|
|
@@ -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=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGF0ZXhCcmlkZ2UiLCJyZXF1aXJlIiwiX2lucHV0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInN0dWJGaWVsZCIsImNhbGxzIiwiaW5zZXJ0IiwiZXhlY3V0ZUNvbW1hbmQiLCJmb2N1cyIsInZhbHVlIiwiZ2V0VmFsdWUiLCJ2IiwicHVzaCIsImJsdXIiLCJ3aXRoRmllbGQiLCJpbnB1dCIsIklucHV0IiwiZiIsIm1hdGhGaWVsZCIsImRlc2NyaWJlIiwiaXQiLCJfd2l0aEZpZWxkIiwia2V5c3Ryb2tlIiwiZXhwZWN0IiwidG9FcXVhbCIsIl93aXRoRmllbGQyIiwiX3dpdGhGaWVsZDMiLCJFcnJvciIsIm5vdCIsInRvVGhyb3ciLCJmb3JFYWNoIiwiayIsIktFWVNUUk9LRVMiLCJ0b0JlRGVmaW5lZCIsIl93aXRoRmllbGQ0IiwiY29tbWFuZCIsIl93aXRoRmllbGQ1IiwiX3dpdGhGaWVsZDYiLCJrZXlUb0FjdGlvbiIsImxhdGV4IiwiY2xlYXIiLCJ3cml0ZSIsInNldExhdGV4IiwiZWxlbWVudCIsInRvQmVVbmRlZmluZWQiLCJfd2l0aEZpZWxkNyIsIm1xQ29tcGF0IiwiX3dpdGhGaWVsZDgiLCJlbCIsInRvQmUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2lucHV0LWltcGVyYXRpdmUudGVzdC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS0VZU1RST0tFUywga2V5VG9BY3Rpb24gfSBmcm9tICcuLi9sYXRleC1icmlkZ2UnO1xuaW1wb3J0IElucHV0IGZyb20gJy4uL21mL2lucHV0JztcblxuLyoqXG4gKiBUaGUgaW1wZXJhdGl2ZSBzdXJmYWNlIHRoYXQgQHBpZS1saWIvbWF0aC10b29sYmFyIGRyaXZlc1xuICogKGVkaXRvci1hbmQtcGFkLmpzeDogY2xlYXIvY29tbWFuZC9rZXlzdHJva2Uvd3JpdGUvbGF0ZXgpLlxuICpcbiAqIFRoZXNlIGNhbGwgdGhlIG1ldGhvZHMgYWdhaW5zdCBhIHN0dWIgbWF0aGZpZWxkLCBiZWNhdXNlIGEgcmVhbFxuICogPG1hdGgtZmllbGQ+IG5lZWRzIGEgYnJvd3Nlci4gV2hhdCBtYXR0ZXJzIGhlcmUgaXMgdGhlICp0cmFuc2xhdGlvbio6XG4gKiBNYXRoUXVpbGwtZXJhIGFyZ3VtZW50cyBtdXN0IGJlY29tZSB2YWxpZCBNYXRoTGl2ZSBvcGVyYXRpb25zLlxuICovXG5jb25zdCBzdHViRmllbGQgPSAoKSA9PiB7XG4gIGNvbnN0IGNhbGxzID0geyBpbnNlcnQ6IFtdLCBleGVjdXRlQ29tbWFuZDogW10sIGZvY3VzOiAwIH07XG5cbiAgcmV0dXJuIHtcbiAgICBjYWxscyxcbiAgICB2YWx1ZTogJycsXG4gICAgZ2V0VmFsdWU6ICgpID0+ICcnLFxuICAgIGluc2VydCh2KSB7XG4gICAgICBjYWxscy5pbnNlcnQucHVzaCh2KTtcbiAgICB9LFxuICAgIGV4ZWN1dGVDb21tYW5kKHYpIHtcbiAgICAgIGNhbGxzLmV4ZWN1dGVDb21tYW5kLnB1c2godik7XG4gICAgfSxcbiAgICBmb2N1cygpIHtcbiAgICAgIGNhbGxzLmZvY3VzKys7XG4gICAgfSxcbiAgICBibHVyKCkge30sXG4gIH07XG59O1xuXG5jb25zdCB3aXRoRmllbGQgPSAoKSA9PiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IElucHV0KHt9KTtcbiAgY29uc3QgZiA9IHN0dWJGaWVsZCgpO1xuXG4gIGlucHV0Lm1hdGhGaWVsZCA9IGY7XG5cbiAgcmV0dXJuIHsgaW5wdXQsIGYgfTtcbn07XG5cbmRlc2NyaWJlKCdJbnB1dCBpbXBlcmF0aXZlIEFQSSAoZHJpdmVzIG1hdGgtdG9vbGJhciknLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdrZXlzdHJva2UnLCAoKSA9PiB7XG4gICAgaXQoJ21hcHMgTWF0aFF1aWxsIGtleXN0cm9rZSBuYW1lcyB0byBNYXRoTGl2ZSBzZWxlY3RvcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGlucHV0LCBmIH0gPSB3aXRoRmllbGQoKTtcblxuICAgICAgaW5wdXQua2V5c3Ryb2tlKCdMZWZ0Jyk7XG4gICAgICBpbnB1dC5rZXlzdHJva2UoJ1JpZ2h0Jyk7XG4gICAgICBpbnB1dC5rZXlzdHJva2UoJ0JhY2tzcGFjZScpO1xuXG4gICAgICBleHBlY3QoZi5jYWxscy5leGVjdXRlQ29tbWFuZCkudG9FcXVhbChbJ21vdmVUb1ByZXZpb3VzQ2hhcicsICdtb3ZlVG9OZXh0Q2hhcicsICdkZWxldGVCYWNrd2FyZCddKTtcbiAgICB9KTtcblxuICAgIGl0KCdwYXNzZXMgYW4gdW5rbm93biB2YWx1ZSB0aHJvdWdoIGFzIGEgc2VsZWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGlucHV0LCBmIH0gPSB3aXRoRmllbGQoKTtcblxuICAgICAgaW5wdXQua2V5c3Ryb2tlKCdkZWxldGVGb3J3YXJkJyk7XG5cbiAgICAgIGV4cGVjdChmLmNhbGxzLmV4ZWN1dGVDb21tYW5kKS50b0VxdWFsKFsnZGVsZXRlRm9yd2FyZCddKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCB0aHJvdyB3aGVuIHRoZSBlbmdpbmUgcmVqZWN0cyB0aGUgc2VsZWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSB3aXRoRmllbGQoKTtcblxuICAgICAgaW5wdXQubWF0aEZpZWxkLmV4ZWN1dGVDb21tYW5kID0gKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY29tbWFuZCcpO1xuICAgICAgfTtcblxuICAgICAgZXhwZWN0KCgpID0+IGlucHV0LmtleXN0cm9rZSgnTm9uc2Vuc2UnKSkubm90LnRvVGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KCdjb3ZlcnMgZXZlcnkga2V5c3Ryb2tlIHRoZSBrZXlwYWQgZW1pdHMnLCAoKSA9PiB7XG4gICAgICAvLyBuYXZpZ2F0aW9uLmpzIC8gZWRpdC5qcyBvbmx5IHByb2R1Y2UgdGhlc2UgdGhyZWVcbiAgICAgIFsnTGVmdCcsICdSaWdodCcsICdCYWNrc3BhY2UnXS5mb3JFYWNoKChrKSA9PiBleHBlY3QoS0VZU1RST0tFU1trXSkudG9CZURlZmluZWQoKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb21tYW5kJywgKCkgPT4ge1xuICAgIGl0KCdleHBhbmRzIGFyZ3VtZW50LXRha2luZyBjb21tYW5kcyBpbnRvIHBsYWNlaG9sZGVycycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQsIGYgfSA9IHdpdGhGaWVsZCgpO1xuXG4gICAgICBpbnB1dC5jb21tYW5kKCdcXFxcZnJhYycpO1xuXG4gICAgICAvLyBhIGJhcmUgXFxmcmFjIHdvdWxkIGdpdmUgbm8gZWRpdGFibGUgc2xvdHNcbiAgICAgIGV4cGVjdChmLmNhbGxzLmluc2VydCkudG9FcXVhbChbJ1xcXFxmcmFjeyM/fXsjP30nXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBhcnJheSBjb21tYW5kcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQsIGYgfSA9IHdpdGhGaWVsZCgpO1xuXG4gICAgICBpbnB1dC5jb21tYW5kKFsnXFxcXGxvZycsICdfJ10pO1xuXG4gICAgICBleHBlY3QoZi5jYWxscy5pbnNlcnQpLnRvRXF1YWwoWydcXFxcbG9nX3sjP30nXSk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFzc2VzIGFyZ3VtZW50LWxlc3MgY29tbWFuZHMgdGhyb3VnaCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQsIGYgfSA9IHdpdGhGaWVsZCgpO1xuXG4gICAgICBpbnB1dC5jb21tYW5kKCdcXFxccGknKTtcblxuICAgICAgZXhwZWN0KGYuY2FsbHMuaW5zZXJ0KS50b0VxdWFsKFsnXFxcXHBpJ10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FncmVlcyB3aXRoIGtleVRvQWN0aW9uJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHsgY29tbWFuZDogJ1xcXFxzcXJ0JyB9KS52YWx1ZSkudG9FcXVhbCgnXFxcXHNxcnR7Iz99Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzYWZldHkgYmVmb3JlIE1hdGhMaXZlIGxvYWRzJywgKCkgPT4ge1xuICAgIGl0KCdldmVyeSBtZXRob2QgaXMgYSBuby1vcCByYXRoZXIgdGhhbiBhIGNyYXNoJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBuZXcgSW5wdXQoe30pO1xuXG4gICAgICAvLyBtYXRoRmllbGQgaXMgdW5kZWZpbmVkIHVudGlsIGxvYWRNYXRoTGl2ZSgpIHJlc29sdmVzXG4gICAgICBleHBlY3QoaW5wdXQubGF0ZXgoKSkudG9FcXVhbCgnJyk7XG4gICAgICBleHBlY3QoaW5wdXQuY2xlYXIoKSkudG9FcXVhbCgnJyk7XG4gICAgICBleHBlY3QoaW5wdXQuY29tbWFuZCgnXFxcXGZyYWMnKSkudG9FcXVhbCgnJyk7XG4gICAgICBleHBlY3QoaW5wdXQua2V5c3Ryb2tlKCdMZWZ0JykpLnRvRXF1YWwoJycpO1xuICAgICAgZXhwZWN0KGlucHV0LndyaXRlKCd4JykpLnRvRXF1YWwoJycpO1xuICAgICAgZXhwZWN0KCgpID0+IGlucHV0LmZvY3VzKCkpLm5vdC50b1Rocm93KCk7XG4gICAgICBleHBlY3QoKCkgPT4gaW5wdXQuYmx1cigpKS5ub3QudG9UaHJvdygpO1xuICAgICAgZXhwZWN0KCgpID0+IGlucHV0LnNldExhdGV4KCd4JykpLm5vdC50b1Rocm93KCk7XG4gICAgICBleHBlY3QoaW5wdXQuZWxlbWVudCkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbXFDb21wYXQgZmFjYWRlJywgKCkgPT4ge1xuICAgIC8vIG1hdGgtdG9vbGJhciB1c2VkIHRvIGNhbGwgdGhpcy5pbnB1dC5tYXRoRmllbGQubGF0ZXgoKTsgZXh0ZXJuYWxcbiAgICAvLyBjb25zdW1lcnMgbWF5IHN0aWxsIGRvIHRoZSBzYW1lLlxuICAgIGl0KCdleHBvc2VzIGxhdGV4KCkgYXMgYSBnZXR0ZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSB3aXRoRmllbGQoKTtcblxuICAgICAgaW5wdXQubWF0aEZpZWxkLmdldFZhbHVlID0gKCkgPT4gJ1xcXFxmcmFjezF9ezJ9JztcblxuICAgICAgZXhwZWN0KGlucHV0Lm1xQ29tcGF0LmxhdGV4KCkpLnRvRXF1YWwoJ1xcXFxmcmFjezF9ezJ9Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZXhwb3NlcyBsYXRleCh2KSBhcyBhIHNldHRlciBhbmQgZWwoKScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQsIGYgfSA9IHdpdGhGaWVsZCgpO1xuXG4gICAgICBpbnB1dC5tcUNvbXBhdC5sYXRleCgneCsxJyk7XG4gICAgICBleHBlY3QoZi52YWx1ZSkudG9FcXVhbCgneCsxJyk7XG4gICAgICBleHBlY3QoaW5wdXQubXFDb21wYXQuZWwoKSkudG9CZShmKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBQUEsWUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU1HLFNBQVMsR0FBRyxTQUFaQSxTQUFTQSxDQUFBLEVBQVM7RUFDdEIsSUFBTUMsS0FBSyxHQUFHO0lBQUVDLE1BQU0sRUFBRSxFQUFFO0lBQUVDLGNBQWMsRUFBRSxFQUFFO0lBQUVDLEtBQUssRUFBRTtFQUFFLENBQUM7RUFFMUQsT0FBTztJQUNMSCxLQUFLLEVBQUxBLEtBQUs7SUFDTEksS0FBSyxFQUFFLEVBQUU7SUFDVEMsUUFBUSxFQUFFLFNBQVZBLFFBQVFBLENBQUE7TUFBQSxPQUFRLEVBQUU7SUFBQTtJQUNsQkosTUFBTSxXQUFOQSxNQUFNQSxDQUFDSyxDQUFDLEVBQUU7TUFDUk4sS0FBSyxDQUFDQyxNQUFNLENBQUNNLElBQUksQ0FBQ0QsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFDREosY0FBYyxXQUFkQSxjQUFjQSxDQUFDSSxDQUFDLEVBQUU7TUFDaEJOLEtBQUssQ0FBQ0UsY0FBYyxD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
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
5
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
6
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
7
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
8
|
+
var _input = _interopRequireDefault(require("../mf/input"));
|
|
9
|
+
var _selection = require("../selection");
|
|
10
|
+
/**
|
|
11
|
+
* The editable Input keeps its selection snapped to whole atoms (see
|
|
12
|
+
* selection.js). This checks the wiring: attached on mount, removed on unmount.
|
|
13
|
+
*/
|
|
14
|
+
jest.mock('../mathlive-instance', function () {
|
|
15
|
+
var FakeMathfieldElement = /*#__PURE__*/(0, _createClass2["default"])(function FakeMathfieldElement() {
|
|
16
|
+
(0, _classCallCheck2["default"])(this, FakeMathfieldElement);
|
|
17
|
+
var el = global.document.createElement('math-field');
|
|
18
|
+
el.value = '';
|
|
19
|
+
el.getValue = function () {
|
|
20
|
+
return el.value;
|
|
21
|
+
};
|
|
22
|
+
return el;
|
|
23
|
+
});
|
|
24
|
+
return {
|
|
25
|
+
loadMathLive: function loadMathLive() {
|
|
26
|
+
return Promise.resolve({
|
|
27
|
+
MathfieldElement: FakeMathfieldElement
|
|
28
|
+
});
|
|
29
|
+
},
|
|
30
|
+
getMacros: function getMacros() {
|
|
31
|
+
return {};
|
|
32
|
+
},
|
|
33
|
+
MATH_MODE_SPACE: '\\ ',
|
|
34
|
+
applyShadowStyles: function applyShadowStyles() {},
|
|
35
|
+
trackPlaceholderCaret: function trackPlaceholderCaret() {
|
|
36
|
+
return function () {};
|
|
37
|
+
},
|
|
38
|
+
latexToMarkup: function latexToMarkup(l) {
|
|
39
|
+
return "<span>".concat(l, "</span>");
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
var mockUntrack = jest.fn();
|
|
44
|
+
jest.mock('../selection', function () {
|
|
45
|
+
return {
|
|
46
|
+
trackWholeAtomSelection: jest.fn(function () {
|
|
47
|
+
return mockUntrack;
|
|
48
|
+
})
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// eslint-disable-next-line import/first
|
|
53
|
+
|
|
54
|
+
// eslint-disable-next-line import/first
|
|
55
|
+
|
|
56
|
+
describe('Input: whole-atom selection', function () {
|
|
57
|
+
beforeEach(function () {
|
|
58
|
+
_selection.trackWholeAtomSelection.mockClear();
|
|
59
|
+
mockUntrack.mockClear();
|
|
60
|
+
});
|
|
61
|
+
it('attaches the tracker to the mathfield on mount', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
62
|
+
var input;
|
|
63
|
+
return _regenerator["default"].wrap(function (_context) {
|
|
64
|
+
while (1) switch (_context.prev = _context.next) {
|
|
65
|
+
case 0:
|
|
66
|
+
input = new _input["default"]({});
|
|
67
|
+
input.holderRef = {
|
|
68
|
+
current: document.createElement('span')
|
|
69
|
+
};
|
|
70
|
+
_context.next = 1;
|
|
71
|
+
return input.componentDidMount();
|
|
72
|
+
case 1:
|
|
73
|
+
expect(_selection.trackWholeAtomSelection).toHaveBeenCalledTimes(1);
|
|
74
|
+
expect(_selection.trackWholeAtomSelection).toHaveBeenCalledWith(input.mathField);
|
|
75
|
+
case 2:
|
|
76
|
+
case "end":
|
|
77
|
+
return _context.stop();
|
|
78
|
+
}
|
|
79
|
+
}, _callee);
|
|
80
|
+
})));
|
|
81
|
+
it('removes it on unmount', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
82
|
+
var input;
|
|
83
|
+
return _regenerator["default"].wrap(function (_context2) {
|
|
84
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
85
|
+
case 0:
|
|
86
|
+
input = new _input["default"]({});
|
|
87
|
+
input.holderRef = {
|
|
88
|
+
current: document.createElement('span')
|
|
89
|
+
};
|
|
90
|
+
_context2.next = 1;
|
|
91
|
+
return input.componentDidMount();
|
|
92
|
+
case 1:
|
|
93
|
+
input.componentWillUnmount();
|
|
94
|
+
expect(mockUntrack).toHaveBeenCalledTimes(1);
|
|
95
|
+
expect(input.untrackSelection).toBeUndefined();
|
|
96
|
+
case 2:
|
|
97
|
+
case "end":
|
|
98
|
+
return _context2.stop();
|
|
99
|
+
}
|
|
100
|
+
}, _callee2);
|
|
101
|
+
})));
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaW5wdXQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zZWxlY3Rpb24iLCJqZXN0IiwibW9jayIsIkZha2VNYXRoZmllbGRFbGVtZW50IiwiX2NyZWF0ZUNsYXNzMiIsIl9jbGFzc0NhbGxDaGVjazIiLCJlbCIsImdsb2JhbCIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInZhbHVlIiwiZ2V0VmFsdWUiLCJsb2FkTWF0aExpdmUiLCJQcm9taXNlIiwicmVzb2x2ZSIsIk1hdGhmaWVsZEVsZW1lbnQiLCJnZXRNYWNyb3MiLCJNQVRIX01PREVfU1BBQ0UiLCJhcHBseVNoYWRvd1N0eWxlcyIsInRyYWNrUGxhY2Vob2xkZXJDYXJldCIsImxhdGV4VG9NYXJrdXAiLCJsIiwiY29uY2F0IiwibW9ja1VudHJhY2siLCJmbiIsInRyYWNrV2hvbGVBdG9tU2VsZWN0aW9uIiwiZGVzY3JpYmUiLCJiZWZvcmVFYWNoIiwibW9ja0NsZWFyIiwiaXQiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsImlucHV0Iiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJJbnB1dCIsImhvbGRlclJlZiIsImN1cnJlbnQiLCJjb21wb25lbnREaWRNb3VudCIsImV4cGVjdCIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwibWF0aEZpZWxkIiwic3RvcCIsIl9jYWxsZWUyIiwiX2NvbnRleHQyIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJ1bnRyYWNrU2VsZWN0aW9uIiwidG9CZVVuZGVmaW5lZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5wdXQtc2VsZWN0aW9uLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGVkaXRhYmxlIElucHV0IGtlZXBzIGl0cyBzZWxlY3Rpb24gc25hcHBlZCB0byB3aG9sZSBhdG9tcyAoc2VlXG4gKiBzZWxlY3Rpb24uanMpLiBUaGlzIGNoZWNrcyB0aGUgd2lyaW5nOiBhdHRhY2hlZCBvbiBtb3VudCwgcmVtb3ZlZCBvbiB1bm1vdW50LlxuICovXG5qZXN0Lm1vY2soJy4uL21hdGhsaXZlLWluc3RhbmNlJywgKCkgPT4ge1xuICBjbGFzcyBGYWtlTWF0aGZpZWxkRWxlbWVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBjb25zdCBlbCA9IGdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtYXRoLWZpZWxkJyk7XG5cbiAgICAgIGVsLnZhbHVlID0gJyc7XG4gICAgICBlbC5nZXRWYWx1ZSA9ICgpID0+IGVsLnZhbHVlO1xuXG4gICAgICByZXR1cm4gZWw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBsb2FkTWF0aExpdmU6ICgpID0+IFByb21pc2UucmVzb2x2ZSh7IE1hdGhmaWVsZEVsZW1lbnQ6IEZha2VNYXRoZmllbGRFbGVtZW50IH0pLFxuICAgIGdldE1hY3JvczogKCkgPT4gKHt9KSxcbiAgICBNQVRIX01PREVfU1BBQ0U6ICdcXFxcICcsXG4gICAgYXBwbHlTaGFkb3dTdHlsZXM6ICgpID0+IHt9LFxuICAgIHRyYWNrUGxhY2Vob2xkZXJDYXJldDogKCkgPT4gKCkgPT4ge30sXG4gICAgbGF0ZXhUb01hcmt1cDogKGwpID0+IGA8c3Bhbj4ke2x9PC9zcGFuPmAsXG4gIH07XG59KTtcblxuY29uc3QgbW9ja1VudHJhY2sgPSBqZXN0LmZuKCk7XG5cbmplc3QubW9jaygnLi4vc2VsZWN0aW9uJywgKCkgPT4gKHtcbiAgdHJhY2tXaG9sZUF0b21TZWxlY3Rpb246IGplc3QuZm4oKCkgPT4gbW9ja1VudHJhY2spLFxufSkpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L2ZpcnN0XG5pbXBvcnQgSW5wdXQgZnJvbSAnLi4vbWYvaW5wdXQnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9maXJzdFxuaW1wb3J0IHsgdHJhY2tXaG9sZUF0b21TZWxlY3Rpb24gfSBmcm9tICcuLi9zZWxlY3Rpb24nO1xuXG5kZXNjcmliZSgnSW5wdXQ6IHdob2xlLWF0b20gc2VsZWN0aW9uJywgKCkgPT4ge1xuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0cmFja1dob2xlQXRvbVNlbGVjdGlvbi5tb2NrQ2xlYXIoKTtcbiAgICBtb2NrVW50cmFjay5tb2NrQ2xlYXIoKTtcbiAgfSk7XG5cbiAgaXQoJ2F0dGFjaGVzIHRoZSB0cmFja2VyIHRvIHRoZSBtYXRoZmllbGQgb24gbW91bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSBuZXcgSW5wdXQoe30pO1xuXG4gICAgaW5wdXQuaG9sZGVyUmVmID0geyBjdXJyZW50OiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJykgfTtcbiAgICBhd2FpdCBpbnB1dC5jb21wb25lbnREaWRNb3VudCgpO1xuXG4gICAgZXhwZWN0KHRyYWNrV2hvbGVBdG9tU2VsZWN0aW9uKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgZXhwZWN0KHRyYWNrV2hvbGVBdG9tU2VsZWN0aW9uKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChpbnB1dC5tYXRoRmllbGQpO1xuICB9KTtcblxuICBpdCgncmVtb3ZlcyBpdCBvbiB1bm1vdW50JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gbmV3IElucHV0KHt9KTtcblxuICAgIGlucHV0LmhvbGRlclJlZiA9IHsgY3VycmVudDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpIH07XG4gICAgYXdhaXQgaW5wdXQuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICBpbnB1dC5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuXG4gICAgZXhwZWN0KG1vY2tVbnRyYWNrKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgZXhwZWN0KGlucHV0LnVudHJhY2tTZWxlY3Rpb24pLnRvQmVVbmRlZmluZWQoKTtcbiAg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
|