@pie-lib/editable-html-tip-tap 2.1.20-beta.1 → 2.1.20-beta.11
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__/EditableHtml.test.js +831 -0
- package/lib/__tests__/constants.test.js +21 -0
- package/lib/__tests__/div-to-paragraph-conversion.test.js +213 -0
- package/lib/__tests__/extensions.test.js +209 -0
- package/lib/__tests__/index.test.js +250 -0
- package/lib/__tests__/size-utils.test.js +57 -0
- package/lib/__tests__/spellcheck.test.js +142 -0
- package/lib/__tests__/theme.test.js +17 -0
- package/lib/components/__tests__/AltDialog.test.js +201 -0
- package/lib/components/__tests__/CharacterPicker.test.js +455 -0
- package/lib/components/__tests__/CssIcon.test.js +58 -0
- package/lib/components/__tests__/DragInTheBlank.test.js +295 -0
- package/lib/components/__tests__/ExplicitConstructedResponse.test.js +345 -0
- package/lib/components/__tests__/ImageToolbar.test.js +185 -0
- package/lib/components/__tests__/InlineDropdown.test.js +839 -0
- package/lib/components/__tests__/InsertImageHandler.test.js +171 -0
- package/lib/components/__tests__/MediaDialog.test.js +433 -0
- package/lib/components/__tests__/MediaToolbar.test.js +126 -0
- package/lib/components/__tests__/MediaWrapper.test.js +96 -0
- package/lib/components/__tests__/MenuBar.test.js +502 -0
- package/lib/components/__tests__/RespArea.test.js +171 -0
- package/lib/components/__tests__/TableIcons.test.js +153 -0
- package/lib/components/__tests__/TextAlign.test.js +209 -0
- package/lib/components/__tests__/TiptapContainer.test.js +196 -0
- package/lib/components/__tests__/characterUtils.test.js +178 -0
- package/lib/components/__tests__/choice.test.js +213 -0
- package/lib/components/__tests__/custom-popper.test.js +108 -0
- package/lib/components/__tests__/done-button.test.js +72 -0
- package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
- package/lib/components/respArea/DragInTheBlank/__tests__/choice.test.js +90 -0
- package/lib/components/respArea/__tests__/MathTemplated.test.js +217 -0
- package/lib/extensions/__tests__/css.test.js +214 -0
- package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +175 -0
- package/lib/extensions/__tests__/divNode.test.js +108 -0
- package/lib/extensions/__tests__/ensure-empty-root-div.test.js +50 -0
- package/lib/extensions/__tests__/ensure-list-item-content-is-div.test.js +60 -0
- package/lib/extensions/__tests__/extended-list-item.test.js +13 -0
- package/lib/extensions/__tests__/extended-table-cell.test.js +15 -0
- package/lib/extensions/__tests__/extended-table.test.js +200 -0
- package/lib/extensions/__tests__/image-component.test.js +432 -0
- package/lib/extensions/__tests__/image.test.js +313 -0
- package/lib/extensions/__tests__/math.test.js +1411 -0
- package/lib/extensions/__tests__/media-node-view.test.js +307 -0
- package/lib/extensions/__tests__/media.test.js +292 -0
- package/lib/extensions/__tests__/responseArea.test.js +736 -0
- package/lib/utils/__tests__/helper.test.js +107 -0
- package/lib/utils/__tests__/toolbar.test.js +38 -0
- package/package.json +3 -3
- package/src/__tests__/EditableHtml.test.jsx +588 -0
- package/src/__tests__/constants.test.js +19 -0
- package/src/__tests__/div-to-paragraph-conversion.test.jsx +125 -0
- package/src/__tests__/extensions.test.js +208 -0
- package/src/__tests__/index.test.jsx +154 -0
- package/src/__tests__/size-utils.test.js +64 -0
- package/src/__tests__/theme.test.js +17 -0
- package/src/components/__tests__/AltDialog.test.jsx +147 -0
- package/src/components/__tests__/CharacterPicker.test.jsx +270 -0
- package/src/components/__tests__/CssIcon.test.jsx +46 -0
- package/src/components/__tests__/DragInTheBlank.test.jsx +255 -0
- package/src/components/__tests__/ExplicitConstructedResponse.test.jsx +209 -0
- package/src/components/__tests__/ImageToolbar.test.jsx +128 -0
- package/src/components/__tests__/InlineDropdown.test.jsx +557 -0
- package/src/components/__tests__/InsertImageHandler.test.js +161 -0
- package/src/components/__tests__/MediaDialog.test.jsx +293 -0
- package/src/components/__tests__/MediaToolbar.test.jsx +74 -0
- package/src/components/__tests__/MediaWrapper.test.jsx +81 -0
- package/src/components/__tests__/MenuBar.test.jsx +250 -0
- package/src/components/__tests__/RespArea.test.jsx +122 -0
- package/src/components/__tests__/TableIcons.test.jsx +149 -0
- package/src/components/__tests__/TextAlign.test.jsx +167 -0
- package/src/components/__tests__/TiptapContainer.test.jsx +138 -0
- package/src/components/__tests__/characterUtils.test.js +166 -0
- package/src/components/__tests__/choice.test.jsx +171 -0
- package/src/components/__tests__/custom-popper.test.jsx +82 -0
- package/src/components/__tests__/done-button.test.jsx +54 -0
- package/src/components/__tests__/toolbar-buttons.test.jsx +234 -0
- package/src/components/respArea/DragInTheBlank/__tests__/choice.test.jsx +72 -0
- package/src/components/respArea/__tests__/MathTemplated.test.jsx +210 -0
- package/src/extensions/__tests__/css.test.js +196 -0
- package/src/extensions/__tests__/custom-toolbar-wrapper.test.jsx +180 -0
- package/src/extensions/__tests__/divNode.test.js +87 -0
- package/src/extensions/__tests__/ensure-empty-root-div.test.js +57 -0
- package/src/extensions/__tests__/ensure-list-item-content-is-div.test.js +44 -0
- package/src/extensions/__tests__/extended-list-item.test.js +13 -0
- package/src/extensions/__tests__/extended-table-cell.test.js +22 -0
- package/src/extensions/__tests__/extended-table.test.js +183 -0
- package/src/extensions/__tests__/image-component.test.jsx +346 -0
- package/src/extensions/__tests__/image.test.js +237 -0
- package/src/extensions/__tests__/math.test.js +900 -0
- package/src/extensions/__tests__/media-node-view.test.jsx +298 -0
- package/src/extensions/__tests__/media.test.js +271 -0
- package/src/extensions/__tests__/responseArea.test.js +655 -0
- package/src/utils/__tests__/helper.test.js +126 -0
- package/src/utils/__tests__/toolbar.test.js +43 -0
|
@@ -0,0 +1,277 @@
|
|
|
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 _toolbarButtons = require("../common/toolbar-buttons");
|
|
7
|
+
describe('RawButton', function () {
|
|
8
|
+
it('renders without crashing', function () {
|
|
9
|
+
var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
|
|
10
|
+
onClick: jest.fn()
|
|
11
|
+
}, "Click me")),
|
|
12
|
+
container = _render.container;
|
|
13
|
+
expect(container).toBeInTheDocument();
|
|
14
|
+
});
|
|
15
|
+
it('renders children', function () {
|
|
16
|
+
var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
|
|
17
|
+
onClick: jest.fn()
|
|
18
|
+
}, "Test Button")),
|
|
19
|
+
getByText = _render2.getByText;
|
|
20
|
+
expect(getByText('Test Button')).toBeInTheDocument();
|
|
21
|
+
});
|
|
22
|
+
it('calls onClick on mouse down', function () {
|
|
23
|
+
var onClick = jest.fn();
|
|
24
|
+
var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
|
|
25
|
+
onClick: onClick
|
|
26
|
+
}, "Click")),
|
|
27
|
+
getByText = _render3.getByText;
|
|
28
|
+
_react2.fireEvent.mouseDown(getByText('Click'));
|
|
29
|
+
expect(onClick).toHaveBeenCalled();
|
|
30
|
+
});
|
|
31
|
+
it('prevents default on mouse down', function () {
|
|
32
|
+
var onClick = jest.fn();
|
|
33
|
+
var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
|
|
34
|
+
onClick: onClick
|
|
35
|
+
}, "Click")),
|
|
36
|
+
getByText = _render4.getByText;
|
|
37
|
+
var button = getByText('Click');
|
|
38
|
+
var event = new MouseEvent('mousedown', {
|
|
39
|
+
bubbles: true,
|
|
40
|
+
cancelable: true
|
|
41
|
+
});
|
|
42
|
+
var preventDefaultSpy = jest.spyOn(event, 'preventDefault');
|
|
43
|
+
button.dispatchEvent(event);
|
|
44
|
+
expect(preventDefaultSpy).toHaveBeenCalled();
|
|
45
|
+
});
|
|
46
|
+
it('calls onClick on Enter key press', function () {
|
|
47
|
+
var onClick = jest.fn();
|
|
48
|
+
var _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
|
|
49
|
+
onClick: onClick
|
|
50
|
+
}, "Click")),
|
|
51
|
+
getByText = _render5.getByText;
|
|
52
|
+
_react2.fireEvent.keyDown(getByText('Click'), {
|
|
53
|
+
key: 'Enter'
|
|
54
|
+
});
|
|
55
|
+
expect(onClick).toHaveBeenCalled();
|
|
56
|
+
});
|
|
57
|
+
it('calls onClick on Space key press', function () {
|
|
58
|
+
var onClick = jest.fn();
|
|
59
|
+
var _render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
|
|
60
|
+
onClick: onClick
|
|
61
|
+
}, "Click")),
|
|
62
|
+
getByText = _render6.getByText;
|
|
63
|
+
_react2.fireEvent.keyDown(getByText('Click'), {
|
|
64
|
+
key: ' '
|
|
65
|
+
});
|
|
66
|
+
expect(onClick).toHaveBeenCalled();
|
|
67
|
+
});
|
|
68
|
+
it('does not call onClick on other key press', function () {
|
|
69
|
+
var onClick = jest.fn();
|
|
70
|
+
var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
|
|
71
|
+
onClick: onClick
|
|
72
|
+
}, "Click")),
|
|
73
|
+
getByText = _render7.getByText;
|
|
74
|
+
_react2.fireEvent.keyDown(getByText('Click'), {
|
|
75
|
+
key: 'a'
|
|
76
|
+
});
|
|
77
|
+
expect(onClick).not.toHaveBeenCalled();
|
|
78
|
+
});
|
|
79
|
+
it('applies active style when active is true', function () {
|
|
80
|
+
var _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
|
|
81
|
+
onClick: jest.fn(),
|
|
82
|
+
active: true
|
|
83
|
+
}, "Active")),
|
|
84
|
+
getByText = _render8.getByText;
|
|
85
|
+
var button = getByText('Active');
|
|
86
|
+
expect(button).toHaveStyle({
|
|
87
|
+
color: 'black'
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
it('applies disabled style when disabled is true', function () {
|
|
91
|
+
var _render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
|
|
92
|
+
onClick: jest.fn(),
|
|
93
|
+
disabled: true
|
|
94
|
+
}, "Disabled")),
|
|
95
|
+
getByText = _render9.getByText;
|
|
96
|
+
var button = getByText('Disabled');
|
|
97
|
+
expect(button).toHaveStyle({
|
|
98
|
+
cursor: 'not-allowed'
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
it('applies extraStyles when provided', function () {
|
|
102
|
+
var extraStyles = {
|
|
103
|
+
backgroundColor: 'red'
|
|
104
|
+
};
|
|
105
|
+
var _render0 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
|
|
106
|
+
onClick: jest.fn(),
|
|
107
|
+
extraStyles: extraStyles
|
|
108
|
+
}, "Styled")),
|
|
109
|
+
getByText = _render0.getByText;
|
|
110
|
+
var button = getByText('Styled');
|
|
111
|
+
expect(button).toHaveStyle({
|
|
112
|
+
backgroundColor: 'red'
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
it('has aria-label when provided', function () {
|
|
116
|
+
var _render1 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
|
|
117
|
+
onClick: jest.fn(),
|
|
118
|
+
ariaLabel: "Test Button"
|
|
119
|
+
}, "Button")),
|
|
120
|
+
getByLabelText = _render1.getByLabelText;
|
|
121
|
+
expect(getByLabelText('Test Button')).toBeInTheDocument();
|
|
122
|
+
});
|
|
123
|
+
it('has aria-pressed attribute', function () {
|
|
124
|
+
var _render10 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
|
|
125
|
+
onClick: jest.fn(),
|
|
126
|
+
active: true
|
|
127
|
+
}, "Button")),
|
|
128
|
+
getByText = _render10.getByText;
|
|
129
|
+
expect(getByText('Button')).toHaveAttribute('aria-pressed', 'true');
|
|
130
|
+
});
|
|
131
|
+
it('is focusable with tabIndex', function () {
|
|
132
|
+
var _render11 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
|
|
133
|
+
onClick: jest.fn()
|
|
134
|
+
}, "Button")),
|
|
135
|
+
getByText = _render11.getByText;
|
|
136
|
+
expect(getByText('Button')).toHaveAttribute('tabIndex', '0');
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
describe('Button', function () {
|
|
140
|
+
it('is the same as RawButton', function () {
|
|
141
|
+
expect(_toolbarButtons.Button).toBe(_toolbarButtons.RawButton);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe('RawMarkButton', function () {
|
|
145
|
+
it('renders without crashing', function () {
|
|
146
|
+
var _render12 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
|
|
147
|
+
onToggle: jest.fn(),
|
|
148
|
+
mark: "bold",
|
|
149
|
+
label: "Bold"
|
|
150
|
+
}, "B")),
|
|
151
|
+
container = _render12.container;
|
|
152
|
+
expect(container).toBeInTheDocument();
|
|
153
|
+
});
|
|
154
|
+
it('renders children', function () {
|
|
155
|
+
var _render13 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
|
|
156
|
+
onToggle: jest.fn(),
|
|
157
|
+
mark: "bold",
|
|
158
|
+
label: "Bold"
|
|
159
|
+
}, "Bold")),
|
|
160
|
+
getByText = _render13.getByText;
|
|
161
|
+
expect(getByText('Bold')).toBeInTheDocument();
|
|
162
|
+
});
|
|
163
|
+
it('calls onToggle with mark on mouse down', function () {
|
|
164
|
+
var onToggle = jest.fn();
|
|
165
|
+
var _render14 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
|
|
166
|
+
onToggle: onToggle,
|
|
167
|
+
mark: "italic",
|
|
168
|
+
label: "Italic"
|
|
169
|
+
}, "I")),
|
|
170
|
+
getByText = _render14.getByText;
|
|
171
|
+
_react2.fireEvent.mouseDown(getByText('I'));
|
|
172
|
+
expect(onToggle).toHaveBeenCalledWith('italic');
|
|
173
|
+
});
|
|
174
|
+
it('prevents default on mouse down', function () {
|
|
175
|
+
var onToggle = jest.fn();
|
|
176
|
+
var _render15 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
|
|
177
|
+
onToggle: onToggle,
|
|
178
|
+
mark: "bold",
|
|
179
|
+
label: "Bold"
|
|
180
|
+
}, "B")),
|
|
181
|
+
getByText = _render15.getByText;
|
|
182
|
+
var button = getByText('B');
|
|
183
|
+
var event = new MouseEvent('mousedown', {
|
|
184
|
+
bubbles: true,
|
|
185
|
+
cancelable: true
|
|
186
|
+
});
|
|
187
|
+
var preventDefaultSpy = jest.spyOn(event, 'preventDefault');
|
|
188
|
+
button.dispatchEvent(event);
|
|
189
|
+
expect(preventDefaultSpy).toHaveBeenCalled();
|
|
190
|
+
});
|
|
191
|
+
it('calls onToggle on Enter key press', function () {
|
|
192
|
+
var onToggle = jest.fn();
|
|
193
|
+
var _render16 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
|
|
194
|
+
onToggle: onToggle,
|
|
195
|
+
mark: "underline",
|
|
196
|
+
label: "Underline"
|
|
197
|
+
}, "U")),
|
|
198
|
+
getByText = _render16.getByText;
|
|
199
|
+
_react2.fireEvent.keyDown(getByText('U'), {
|
|
200
|
+
key: 'Enter'
|
|
201
|
+
});
|
|
202
|
+
expect(onToggle).toHaveBeenCalledWith('underline');
|
|
203
|
+
});
|
|
204
|
+
it('calls onToggle on Space key press', function () {
|
|
205
|
+
var onToggle = jest.fn();
|
|
206
|
+
var _render17 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
|
|
207
|
+
onToggle: onToggle,
|
|
208
|
+
mark: "strike",
|
|
209
|
+
label: "Strike"
|
|
210
|
+
}, "S")),
|
|
211
|
+
getByText = _render17.getByText;
|
|
212
|
+
_react2.fireEvent.keyDown(getByText('S'), {
|
|
213
|
+
key: ' '
|
|
214
|
+
});
|
|
215
|
+
expect(onToggle).toHaveBeenCalledWith('strike');
|
|
216
|
+
});
|
|
217
|
+
it('does not call onToggle on other key press', function () {
|
|
218
|
+
var onToggle = jest.fn();
|
|
219
|
+
var _render18 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
|
|
220
|
+
onToggle: onToggle,
|
|
221
|
+
mark: "bold",
|
|
222
|
+
label: "Bold"
|
|
223
|
+
}, "B")),
|
|
224
|
+
getByText = _render18.getByText;
|
|
225
|
+
_react2.fireEvent.keyDown(getByText('B'), {
|
|
226
|
+
key: 'a'
|
|
227
|
+
});
|
|
228
|
+
expect(onToggle).not.toHaveBeenCalled();
|
|
229
|
+
});
|
|
230
|
+
it('applies active style when active is true', function () {
|
|
231
|
+
var _render19 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
|
|
232
|
+
onToggle: jest.fn(),
|
|
233
|
+
mark: "bold",
|
|
234
|
+
label: "Bold",
|
|
235
|
+
active: true
|
|
236
|
+
}, "B")),
|
|
237
|
+
getByText = _render19.getByText;
|
|
238
|
+
var button = getByText('B');
|
|
239
|
+
expect(button).toHaveStyle({
|
|
240
|
+
color: 'black'
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
it('has aria-label from label prop', function () {
|
|
244
|
+
var _render20 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
|
|
245
|
+
onToggle: jest.fn(),
|
|
246
|
+
mark: "bold",
|
|
247
|
+
label: "Toggle Bold"
|
|
248
|
+
}, "B")),
|
|
249
|
+
getByLabelText = _render20.getByLabelText;
|
|
250
|
+
expect(getByLabelText('Toggle Bold')).toBeInTheDocument();
|
|
251
|
+
});
|
|
252
|
+
it('has aria-pressed attribute', function () {
|
|
253
|
+
var _render21 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
|
|
254
|
+
onToggle: jest.fn(),
|
|
255
|
+
mark: "bold",
|
|
256
|
+
label: "Bold",
|
|
257
|
+
active: true
|
|
258
|
+
}, "B")),
|
|
259
|
+
getByText = _render21.getByText;
|
|
260
|
+
expect(getByText('B')).toHaveAttribute('aria-pressed', 'true');
|
|
261
|
+
});
|
|
262
|
+
it('is focusable with tabIndex', function () {
|
|
263
|
+
var _render22 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
|
|
264
|
+
onToggle: jest.fn(),
|
|
265
|
+
mark: "bold",
|
|
266
|
+
label: "Bold"
|
|
267
|
+
}, "B")),
|
|
268
|
+
getByText = _render22.getByText;
|
|
269
|
+
expect(getByText('B')).toHaveAttribute('tabIndex', '0');
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
describe('MarkButton', function () {
|
|
273
|
+
it('is the same as RawMarkButton', function () {
|
|
274
|
+
expect(_toolbarButtons.MarkButton).toBe(_toolbarButtons.RawMarkButton);
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfdG9vbGJhckJ1dHRvbnMiLCJkZXNjcmliZSIsIml0IiwiX3JlbmRlciIsInJlbmRlciIsImNyZWF0ZUVsZW1lbnQiLCJSYXdCdXR0b24iLCJvbkNsaWNrIiwiamVzdCIsImZuIiwiY29udGFpbmVyIiwiZXhwZWN0IiwidG9CZUluVGhlRG9jdW1lbnQiLCJfcmVuZGVyMiIsImdldEJ5VGV4dCIsIl9yZW5kZXIzIiwiZmlyZUV2ZW50IiwibW91c2VEb3duIiwidG9IYXZlQmVlbkNhbGxlZCIsIl9yZW5kZXI0IiwiYnV0dG9uIiwiZXZlbnQiLCJNb3VzZUV2ZW50IiwiYnViYmxlcyIsImNhbmNlbGFibGUiLCJwcmV2ZW50RGVmYXVsdFNweSIsInNweU9uIiwiZGlzcGF0Y2hFdmVudCIsIl9yZW5kZXI1Iiwia2V5RG93biIsImtleSIsIl9yZW5kZXI2IiwiX3JlbmRlcjciLCJub3QiLCJfcmVuZGVyOCIsImFjdGl2ZSIsInRvSGF2ZVN0eWxlIiwiY29sb3IiLCJfcmVuZGVyOSIsImRpc2FibGVkIiwiY3Vyc29yIiwiZXh0cmFTdHlsZXMiLCJiYWNrZ3JvdW5kQ29sb3IiLCJfcmVuZGVyMCIsIl9yZW5kZXIxIiwiYXJpYUxhYmVsIiwiZ2V0QnlMYWJlbFRleHQiLCJfcmVuZGVyMTAiLCJ0b0hhdmVBdHRyaWJ1dGUiLCJfcmVuZGVyMTEiLCJCdXR0b24iLCJ0b0JlIiwiX3JlbmRlcjEyIiwiUmF3TWFya0J1dHRvbiIsIm9uVG9nZ2xlIiwibWFyayIsImxhYmVsIiwiX3JlbmRlcjEzIiwiX3JlbmRlcjE0IiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJfcmVuZGVyMTUiLCJfcmVuZGVyMTYiLCJfcmVuZGVyMTciLCJfcmVuZGVyMTgiLCJfcmVuZGVyMTkiLCJfcmVuZGVyMjAiLCJfcmVuZGVyMjEiLCJfcmVuZGVyMjIiLCJNYXJrQnV0dG9uIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvX190ZXN0c19fL3Rvb2xiYXItYnV0dG9ucy50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZmlyZUV2ZW50LCByZW5kZXIgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCB7IEJ1dHRvbiwgTWFya0J1dHRvbiwgUmF3QnV0dG9uLCBSYXdNYXJrQnV0dG9uIH0gZnJvbSAnLi4vY29tbW9uL3Rvb2xiYXItYnV0dG9ucyc7XG5cbmRlc2NyaWJlKCdSYXdCdXR0b24nLCAoKSA9PiB7XG4gIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8UmF3QnV0dG9uIG9uQ2xpY2s9e2plc3QuZm4oKX0+Q2xpY2sgbWU8L1Jhd0J1dHRvbj4pO1xuICAgIGV4cGVjdChjb250YWluZXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIGNoaWxkcmVuJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoPFJhd0J1dHRvbiBvbkNsaWNrPXtqZXN0LmZuKCl9PlRlc3QgQnV0dG9uPC9SYXdCdXR0b24+KTtcbiAgICBleHBlY3QoZ2V0QnlUZXh0KCdUZXN0IEJ1dHRvbicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgnY2FsbHMgb25DbGljayBvbiBtb3VzZSBkb3duJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uQ2xpY2sgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcig8UmF3QnV0dG9uIG9uQ2xpY2s9e29uQ2xpY2t9PkNsaWNrPC9SYXdCdXR0b24+KTtcbiAgICBmaXJlRXZlbnQubW91c2VEb3duKGdldEJ5VGV4dCgnQ2xpY2snKSk7XG4gICAgZXhwZWN0KG9uQ2xpY2spLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ3ByZXZlbnRzIGRlZmF1bHQgb24gbW91c2UgZG93bicsICgpID0+IHtcbiAgICBjb25zdCBvbkNsaWNrID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoPFJhd0J1dHRvbiBvbkNsaWNrPXtvbkNsaWNrfT5DbGljazwvUmF3QnV0dG9uPik7XG4gICAgY29uc3QgYnV0dG9uID0gZ2V0QnlUZXh0KCdDbGljaycpO1xuICAgIGNvbnN0IGV2ZW50ID0gbmV3IE1vdXNlRXZlbnQoJ21vdXNlZG93bicsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICBjb25zdCBwcmV2ZW50RGVmYXVsdFNweSA9IGplc3Quc3B5T24oZXZlbnQsICdwcmV2ZW50RGVmYXVsdCcpO1xuICAgIGJ1dHRvbi5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICBleHBlY3QocHJldmVudERlZmF1bHRTcHkpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ2NhbGxzIG9uQ2xpY2sgb24gRW50ZXIga2V5IHByZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uQ2xpY2sgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcig8UmF3QnV0dG9uIG9uQ2xpY2s9e29uQ2xpY2t9PkNsaWNrPC9SYXdCdXR0b24+KTtcbiAgICBmaXJlRXZlbnQua2V5RG93bihnZXRCeVRleHQoJ0NsaWNrJyksIHsga2V5OiAnRW50ZXInIH0pO1xuICAgIGV4cGVjdChvbkNsaWNrKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBvbkNsaWNrIG9uIFNwYWNlIGtleSBwcmVzcycsICgpID0+IHtcbiAgICBjb25zdCBvbkNsaWNrID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoPFJhd0J1dHRvbiBvbkNsaWNrPXtvbkNsaWNrfT5DbGljazwvUmF3QnV0dG9uPik7XG4gICAgZmlyZUV2ZW50LmtleURvd24oZ2V0QnlUZXh0KCdDbGljaycpLCB7IGtleTogJyAnIH0pO1xuICAgIGV4cGVjdChvbkNsaWNrKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCBjYWxsIG9uQ2xpY2sgb24gb3RoZXIga2V5IHByZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uQ2xpY2sgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcig8UmF3QnV0dG9uIG9uQ2xpY2s9e29uQ2xpY2t9PkNsaWNrPC9SYXdCdXR0b24+KTtcbiAgICBmaXJlRXZlbnQua2V5RG93bihnZXRCeVRleHQoJ0NsaWNrJyksIHsga2V5OiAnYScgfSk7XG4gICAgZXhwZWN0KG9uQ2xpY2spLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdhcHBsaWVzIGFjdGl2ZSBzdHlsZSB3aGVuIGFjdGl2ZSBpcyB0cnVlJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoXG4gICAgICA8UmF3QnV0dG9uIG9uQ2xpY2s9e2plc3QuZm4oKX0gYWN0aXZlPXt0cnVlfT5cbiAgICAgICAgQWN0aXZlXG4gICAgICA8L1Jhd0J1dHRvbj4sXG4gICAgKTtcbiAgICBjb25zdCBidXR0b24gPSBnZXRCeVRleHQoJ0FjdGl2ZScpO1xuICAgIGV4cGVjdChidXR0b24pLnRvSGF2ZVN0eWxlKHsgY29sb3I6ICdibGFjaycgfSk7XG4gIH0pO1xuXG4gIGl0KCdhcHBsaWVzIGRpc2FibGVkIHN0eWxlIHdoZW4gZGlzYWJsZWQgaXMgdHJ1ZScsICgpID0+IHtcbiAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKFxuICAgICAgPFJhd0J1dHRvbiBvbkNsaWNrPXtqZXN0LmZuKCl9IGRpc2FibGVkPXt0cnVlfT5cbiAgICAgICAgRGlzYWJsZWRcbiAgICAgIDwvUmF3QnV0dG9uPixcbiAgICApO1xuICAgIGNvbnN0IGJ1dHRvbiA9IGdldEJ5VGV4dCgnRGlzYWJsZWQnKTtcbiAgICBleHBlY3QoYnV0dG9uKS50b0hhdmVTdHlsZSh7IGN1cnNvcjogJ25vdC1hbGxvd2VkJyB9KTtcbiAgfSk7XG5cbiAgaXQoJ2FwcGxpZXMgZXh0cmFTdHlsZXMgd2hlbiBwcm92aWRlZCcsICgpID0+IHtcbiAgICBjb25zdCBleHRyYVN0eWxlcyA9IHsgYmFja2dyb3VuZENvbG9yOiAncmVkJyB9O1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoXG4gICAgICA8UmF3QnV0dG9uIG9uQ2xpY2s9e2plc3QuZm4oKX0gZXh0cmFTdHlsZXM9e2V4dHJhU3R5bGVzfT5cbiAgICAgICAgU3R5bGVkXG4gICAgICA8L1Jhd0J1dHRvbj4sXG4gICAgKTtcbiAgICBjb25zdCBidXR0b24gPSBnZXRCeVRleHQoJ1N0eWxlZCcpO1xuICAgIGV4cGVjdChidXR0b24pLnRvSGF2ZVN0eWxlKHsgYmFja2dyb3VuZENvbG9yOiAncmVkJyB9KTtcbiAgfSk7XG5cbiAgaXQoJ2hhcyBhcmlhLWxhYmVsIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKFxuICAgICAgPFJhd0J1dHRvbiBvbkNsaWNrPXtqZXN0LmZuKCl9IGFyaWFMYWJlbD1cIlRlc3QgQnV0dG9uXCI+XG4gICAgICAgIEJ1dHRvblxuICAgICAgPC9SYXdCdXR0b24+LFxuICAgICk7XG4gICAgZXhwZWN0KGdldEJ5TGFiZWxUZXh0KCdUZXN0IEJ1dHRvbicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgnaGFzIGFyaWEtcHJlc3NlZCBhdHRyaWJ1dGUnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdCdXR0b24gb25DbGljaz17amVzdC5mbigpfSBhY3RpdmU9e3RydWV9PlxuICAgICAgICBCdXR0b25cbiAgICAgIDwvUmF3QnV0dG9uPixcbiAgICApO1xuICAgIGV4cGVjdChnZXRCeVRleHQoJ0J1dHRvbicpKS50b0hhdmVBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICd0cnVlJyk7XG4gIH0pO1xuXG4gIGl0KCdpcyBmb2N1c2FibGUgd2l0aCB0YWJJbmRleCcsICgpID0+IHtcbiAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKDxSYXdCdXR0b24gb25DbGljaz17amVzdC5mbigpfT5CdXR0b248L1Jhd0J1dHRvbj4pO1xuICAgIGV4cGVjdChnZXRCeVRleHQoJ0J1dHRvbicpKS50b0hhdmVBdHRyaWJ1dGUoJ3RhYkluZGV4JywgJzAnKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ0J1dHRvbicsICgpID0+IHtcbiAgaXQoJ2lzIHRoZSBzYW1lIGFzIFJhd0J1dHRvbicsICgpID0+IHtcbiAgICBleHBlY3QoQnV0dG9uKS50b0JlKFJhd0J1dHRvbik7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdSYXdNYXJrQnV0dG9uJywgKCkgPT4ge1xuICBpdCgncmVuZGVycyB3aXRob3V0IGNyYXNoaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoXG4gICAgICA8UmF3TWFya0J1dHRvbiBvblRvZ2dsZT17amVzdC5mbigpfSBtYXJrPVwiYm9sZFwiIGxhYmVsPVwiQm9sZFwiPlxuICAgICAgICBCXG4gICAgICA8L1Jhd01hcmtCdXR0b24+LFxuICAgICk7XG4gICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgY2hpbGRyZW4nLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtqZXN0LmZuKCl9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJCb2xkXCI+XG4gICAgICAgIEJvbGRcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBleHBlY3QoZ2V0QnlUZXh0KCdCb2xkJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBvblRvZ2dsZSB3aXRoIG1hcmsgb24gbW91c2UgZG93bicsICgpID0+IHtcbiAgICBjb25zdCBvblRvZ2dsZSA9IGplc3QuZm4oKTtcbiAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKFxuICAgICAgPFJhd01hcmtCdXR0b24gb25Ub2dnbGU9e29uVG9nZ2xlfSBtYXJrPVwiaXRhbGljXCIgbGFiZWw9XCJJdGFsaWNcIj5cbiAgICAgICAgSVxuICAgICAgPC9SYXdNYXJrQnV0dG9uPixcbiAgICApO1xuICAgIGZpcmVFdmVudC5tb3VzZURvd24oZ2V0QnlUZXh0KCdJJykpO1xuICAgIGV4cGVjdChvblRvZ2dsZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2l0YWxpYycpO1xuICB9KTtcblxuICBpdCgncHJldmVudHMgZGVmYXVsdCBvbiBtb3VzZSBkb3duJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uVG9nZ2xlID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoXG4gICAgICA8UmF3TWFya0J1dHRvbiBvblRvZ2dsZT17b25Ub2dnbGV9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJCb2xkXCI+XG4gICAgICAgIEJcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBjb25zdCBidXR0b24gPSBnZXRCeVRleHQoJ0InKTtcbiAgICBjb25zdCBldmVudCA9IG5ldyBNb3VzZUV2ZW50KCdtb3VzZWRvd24nLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgY29uc3QgcHJldmVudERlZmF1bHRTcHkgPSBqZXN0LnNweU9uKGV2ZW50LCAncHJldmVudERlZmF1bHQnKTtcbiAgICBidXR0b24uZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgZXhwZWN0KHByZXZlbnREZWZhdWx0U3B5KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBvblRvZ2dsZSBvbiBFbnRlciBrZXkgcHJlc3MnLCAoKSA9PiB7XG4gICAgY29uc3Qgb25Ub2dnbGUgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtvblRvZ2dsZX0gbWFyaz1cInVuZGVybGluZVwiIGxhYmVsPVwiVW5kZXJsaW5lXCI+XG4gICAgICAgIFVcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBmaXJlRXZlbnQua2V5RG93bihnZXRCeVRleHQoJ1UnKSwgeyBrZXk6ICdFbnRlcicgfSk7XG4gICAgZXhwZWN0KG9uVG9nZ2xlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgndW5kZXJsaW5lJyk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBvblRvZ2dsZSBvbiBTcGFjZSBrZXkgcHJlc3MnLCAoKSA9PiB7XG4gICAgY29uc3Qgb25Ub2dnbGUgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtvblRvZ2dsZX0gbWFyaz1cInN0cmlrZVwiIGxhYmVsPVwiU3RyaWtlXCI+XG4gICAgICAgIFNcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBmaXJlRXZlbnQua2V5RG93bihnZXRCeVRleHQoJ1MnKSwgeyBrZXk6ICcgJyB9KTtcbiAgICBleHBlY3Qob25Ub2dnbGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdzdHJpa2UnKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IGNhbGwgb25Ub2dnbGUgb24gb3RoZXIga2V5IHByZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uVG9nZ2xlID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoXG4gICAgICA8UmF3TWFya0J1dHRvbiBvblRvZ2dsZT17b25Ub2dnbGV9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJCb2xkXCI+XG4gICAgICAgIEJcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBmaXJlRXZlbnQua2V5RG93bihnZXRCeVRleHQoJ0InKSwgeyBrZXk6ICdhJyB9KTtcbiAgICBleHBlY3Qob25Ub2dnbGUpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdhcHBsaWVzIGFjdGl2ZSBzdHlsZSB3aGVuIGFjdGl2ZSBpcyB0cnVlJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoXG4gICAgICA8UmF3TWFya0J1dHRvbiBvblRvZ2dsZT17amVzdC5mbigpfSBtYXJrPVwiYm9sZFwiIGxhYmVsPVwiQm9sZFwiIGFjdGl2ZT17dHJ1ZX0+XG4gICAgICAgIEJcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBjb25zdCBidXR0b24gPSBnZXRCeVRleHQoJ0InKTtcbiAgICBleHBlY3QoYnV0dG9uKS50b0hhdmVTdHlsZSh7IGNvbG9yOiAnYmxhY2snIH0pO1xuICB9KTtcblxuICBpdCgnaGFzIGFyaWEtbGFiZWwgZnJvbSBsYWJlbCBwcm9wJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0QnlMYWJlbFRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtqZXN0LmZuKCl9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJUb2dnbGUgQm9sZFwiPlxuICAgICAgICBCXG4gICAgICA8L1Jhd01hcmtCdXR0b24+LFxuICAgICk7XG4gICAgZXhwZWN0KGdldEJ5TGFiZWxUZXh0KCdUb2dnbGUgQm9sZCcpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgnaGFzIGFyaWEtcHJlc3NlZCBhdHRyaWJ1dGUnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtqZXN0LmZuKCl9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJCb2xkXCIgYWN0aXZlPXt0cnVlfT5cbiAgICAgICAgQlxuICAgICAgPC9SYXdNYXJrQnV0dG9uPixcbiAgICApO1xuICAgIGV4cGVjdChnZXRCeVRleHQoJ0InKSkudG9IYXZlQXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuICB9KTtcblxuICBpdCgnaXMgZm9jdXNhYmxlIHdpdGggdGFiSW5kZXgnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtqZXN0LmZuKCl9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJCb2xkXCI+XG4gICAgICAgIEJcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBleHBlY3QoZ2V0QnlUZXh0KCdCJykpLnRvSGF2ZUF0dHJpYnV0ZSgndGFiSW5kZXgnLCAnMCcpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnTWFya0J1dHRvbicsICgpID0+IHtcbiAgaXQoJ2lzIHRoZSBzYW1lIGFzIFJhd01hcmtCdXR0b24nLCAoKSA9PiB7XG4gICAgZXhwZWN0KE1hcmtCdXR0b24pLnRvQmUoUmF3TWFya0J1dHRvbik7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGVBQUEsR0FBQUYsT0FBQTtBQUVBRyxRQUFRLENBQUMsV0FBVyxFQUFFLFlBQU07RUFDMUJDLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxZQUFNO0lBQ25DLElBQUFDLE9BQUEsR0FBc0IsSUFBQUMsY0FBTSxlQUFDUixNQUFBLFlBQUFTLGFBQUEsQ0FBQ0wsZUFBQSxDQUFBTSxTQUFTO1FBQUNDLE9BQU8sRUFBRUMsSUFBSSxDQUFDQyxFQUFFLENBQUM7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
|
|
@@ -0,0 +1,90 @@
|
|
|
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 _choice = _interopRequireDefault(require("../choice"));
|
|
7
|
+
// Mock @dnd-kit hooks to avoid DndContext requirement
|
|
8
|
+
jest.mock('@dnd-kit/core', function () {
|
|
9
|
+
return {
|
|
10
|
+
useDraggable: jest.fn(function () {
|
|
11
|
+
return {
|
|
12
|
+
attributes: {},
|
|
13
|
+
listeners: {},
|
|
14
|
+
setNodeRef: jest.fn(),
|
|
15
|
+
isDragging: false
|
|
16
|
+
};
|
|
17
|
+
}),
|
|
18
|
+
useDroppable: jest.fn(function () {
|
|
19
|
+
return {
|
|
20
|
+
setNodeRef: jest.fn(),
|
|
21
|
+
isOver: false,
|
|
22
|
+
active: null
|
|
23
|
+
};
|
|
24
|
+
})
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
jest.mock('@pie-lib/math-rendering', function () {
|
|
28
|
+
return {
|
|
29
|
+
renderMath: jest.fn()
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Collect the CSS rules emotion/MUI injected into the document (jsdom uses insertRule).
|
|
34
|
+
var collectEmotionRules = function collectEmotionRules() {
|
|
35
|
+
var rules = [];
|
|
36
|
+
for (var _i = 0, _Array$from = Array.from(document.styleSheets); _i < _Array$from.length; _i++) {
|
|
37
|
+
var sheet = _Array$from[_i];
|
|
38
|
+
try {
|
|
39
|
+
for (var _i2 = 0, _Array$from2 = Array.from(sheet.cssRules); _i2 < _Array$from2.length; _i2++) {
|
|
40
|
+
var rule = _Array$from2[_i2];
|
|
41
|
+
rules.push(rule.cssText);
|
|
42
|
+
}
|
|
43
|
+
} catch (e) {
|
|
44
|
+
/* inaccessible stylesheet */
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return rules;
|
|
48
|
+
};
|
|
49
|
+
describe('DragInTheBlank choice', function () {
|
|
50
|
+
var defaultProps = {
|
|
51
|
+
value: {
|
|
52
|
+
id: '1',
|
|
53
|
+
value: '<math>1/2</math>'
|
|
54
|
+
},
|
|
55
|
+
disabled: false,
|
|
56
|
+
instanceId: 'test-instance',
|
|
57
|
+
n: {
|
|
58
|
+
index: 0
|
|
59
|
+
},
|
|
60
|
+
onChange: jest.fn(),
|
|
61
|
+
removeResponse: jest.fn(),
|
|
62
|
+
duplicates: false
|
|
63
|
+
};
|
|
64
|
+
it('renders without crashing', function () {
|
|
65
|
+
var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_choice["default"], defaultProps)),
|
|
66
|
+
container = _render.container;
|
|
67
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
68
|
+
});
|
|
69
|
+
describe('fraction math styling', function () {
|
|
70
|
+
it('enlarges numerator/denominator digits adjacent to a fraction to 120%', function () {
|
|
71
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_choice["default"], defaultProps));
|
|
72
|
+
var rule = collectEmotionRules().find(function (r) {
|
|
73
|
+
return r.includes('mjx-mn') && r.includes('mjx-mfrac');
|
|
74
|
+
});
|
|
75
|
+
expect(rule).toBeDefined();
|
|
76
|
+
expect(rule).toMatch(/mjx-mn:has\(~\s*mjx-mfrac\)/);
|
|
77
|
+
expect(rule).toMatch(/mjx-mfrac\s*~\s*mjx-mn/);
|
|
78
|
+
expect(rule).toMatch(/font-size:\s*120%\s*!important/i);
|
|
79
|
+
});
|
|
80
|
+
it('keeps the existing mjx-frac 120% rule', function () {
|
|
81
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_choice["default"], defaultProps));
|
|
82
|
+
var rule = collectEmotionRules().find(function (r) {
|
|
83
|
+
return /(^|[^-])mjx-frac/.test(r) && !r.includes('mjx-mfrac');
|
|
84
|
+
});
|
|
85
|
+
expect(rule).toBeDefined();
|
|
86
|
+
expect(rule).toMatch(/font-size:\s*120%\s*!important/i);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfY2hvaWNlIiwiamVzdCIsIm1vY2siLCJ1c2VEcmFnZ2FibGUiLCJmbiIsImF0dHJpYnV0ZXMiLCJsaXN0ZW5lcnMiLCJzZXROb2RlUmVmIiwiaXNEcmFnZ2luZyIsInVzZURyb3BwYWJsZSIsImlzT3ZlciIsImFjdGl2ZSIsInJlbmRlck1hdGgiLCJjb2xsZWN0RW1vdGlvblJ1bGVzIiwicnVsZXMiLCJfaSIsIl9BcnJheSRmcm9tIiwiQXJyYXkiLCJmcm9tIiwiZG9jdW1lbnQiLCJzdHlsZVNoZWV0cyIsImxlbmd0aCIsInNoZWV0IiwiX2kyIiwiX0FycmF5JGZyb20yIiwiY3NzUnVsZXMiLCJydWxlIiwicHVzaCIsImNzc1RleHQiLCJlIiwiZGVzY3JpYmUiLCJkZWZhdWx0UHJvcHMiLCJ2YWx1ZSIsImlkIiwiZGlzYWJsZWQiLCJpbnN0YW5jZUlkIiwibiIsImluZGV4Iiwib25DaGFuZ2UiLCJyZW1vdmVSZXNwb25zZSIsImR1cGxpY2F0ZXMiLCJpdCIsIl9yZW5kZXIiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiY29udGFpbmVyIiwiZXhwZWN0IiwiZmlyc3RDaGlsZCIsInRvQmVJblRoZURvY3VtZW50IiwiZmluZCIsInIiLCJpbmNsdWRlcyIsInRvQmVEZWZpbmVkIiwidG9NYXRjaCIsInRlc3QiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9yZXNwQXJlYS9EcmFnSW5UaGVCbGFuay9fX3Rlc3RzX18vY2hvaWNlLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCBEcmFnRHJvcENob2ljZSBmcm9tICcuLi9jaG9pY2UnO1xuXG4vLyBNb2NrIEBkbmQta2l0IGhvb2tzIHRvIGF2b2lkIERuZENvbnRleHQgcmVxdWlyZW1lbnRcbmplc3QubW9jaygnQGRuZC1raXQvY29yZScsICgpID0+ICh7XG4gIHVzZURyYWdnYWJsZTogamVzdC5mbigoKSA9PiAoe1xuICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgIGxpc3RlbmVyczoge30sXG4gICAgc2V0Tm9kZVJlZjogamVzdC5mbigpLFxuICAgIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICB9KSksXG4gIHVzZURyb3BwYWJsZTogamVzdC5mbigoKSA9PiAoe1xuICAgIHNldE5vZGVSZWY6IGplc3QuZm4oKSxcbiAgICBpc092ZXI6IGZhbHNlLFxuICAgIGFjdGl2ZTogbnVsbCxcbiAgfSkpLFxufSkpO1xuXG5qZXN0Lm1vY2soJ0BwaWUtbGliL21hdGgtcmVuZGVyaW5nJywgKCkgPT4gKHtcbiAgcmVuZGVyTWF0aDogamVzdC5mbigpLFxufSkpO1xuXG4vLyBDb2xsZWN0IHRoZSBDU1MgcnVsZXMgZW1vdGlvbi9NVUkgaW5qZWN0ZWQgaW50byB0aGUgZG9jdW1lbnQgKGpzZG9tIHVzZXMgaW5zZXJ0UnVsZSkuXG5jb25zdCBjb2xsZWN0RW1vdGlvblJ1bGVzID0gKCkgPT4ge1xuICBjb25zdCBydWxlcyA9IFtdO1xuICBmb3IgKGNvbnN0IHNoZWV0IG9mIEFycmF5LmZyb20oZG9jdW1lbnQuc3R5bGVTaGVldHMpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBBcnJheS5mcm9tKHNoZWV0LmNzc1J1bGVzKSkge1xuICAgICAgICBydWxlcy5wdXNoKHJ1bGUuY3NzVGV4dCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLyogaW5hY2Nlc3NpYmxlIHN0eWxlc2hlZXQgKi9cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJ1bGVzO1xufTtcblxuZGVzY3JpYmUoJ0RyYWdJblRoZUJsYW5rIGNob2ljZScsICgpID0+IHtcbiAgY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICAgIHZhbHVlOiB7IGlkOiAnMScsIHZhbHVlOiAnPG1hdGg+MS8yPC9tYXRoPicgfSxcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgaW5zdGFuY2VJZDogJ3Rlc3QtaW5zdGFuY2UnLFxuICAgIG46IHsgaW5kZXg6IDAgfSxcbiAgICBvbkNoYW5nZTogamVzdC5mbigpLFxuICAgIHJlbW92ZVJlc3BvbnNlOiBqZXN0LmZuKCksXG4gICAgZHVwbGljYXRlczogZmFsc2UsXG4gIH07XG5cbiAgaXQoJ3JlbmRlcnMgd2l0aG91dCBjcmFzaGluZycsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxEcmFnRHJvcENob2ljZSB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnZnJhY3Rpb24gbWF0aCBzdHlsaW5nJywgKCkgPT4ge1xuICAgIGl0KCdlbmxhcmdlcyBudW1lcmF0b3IvZGVub21pbmF0b3IgZGlnaXRzIGFkamFjZW50IHRvIGEgZnJhY3Rpb24gdG8gMTIwJScsICgpID0+IHtcbiAgICAgIHJlbmRlcig8RHJhZ0Ryb3BDaG9pY2Ugey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgcnVsZSA9IGNvbGxlY3RFbW90aW9uUnVsZXMoKS5maW5kKChyKSA9PiByLmluY2x1ZGVzKCdtangtbW4nKSAmJiByLmluY2x1ZGVzKCdtangtbWZyYWMnKSk7XG4gICAgICBleHBlY3QocnVsZSkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChydWxlKS50b01hdGNoKC9tangtbW46aGFzXFwoflxccyptangtbWZyYWNcXCkvKTtcbiAgICAgIGV4cGVjdChydWxlKS50b01hdGNoKC9tangtbWZyYWNcXHMqflxccyptangtbW4vKTtcbiAgICAgIGV4cGVjdChydWxlKS50b01hdGNoKC9mb250LXNpemU6XFxzKjEyMCVcXHMqIWltcG9ydGFudC9pKTtcbiAgICB9KTtcblxuICAgIGl0KCdrZWVwcyB0aGUgZXhpc3RpbmcgbWp4LWZyYWMgMTIwJSBydWxlJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxEcmFnRHJvcENob2ljZSB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCBydWxlID0gY29sbGVjdEVtb3Rpb25SdWxlcygpLmZpbmQoKHIpID0+IC8oXnxbXi1dKW1qeC1mcmFjLy50ZXN0KHIpICYmICFyLmluY2x1ZGVzKCdtangtbWZyYWMnKSk7XG4gICAgICBleHBlY3QocnVsZSkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChydWxlKS50b01hdGNoKC9mb250LXNpemU6XFxzKjEyMCVcXHMqIWltcG9ydGFudC9pKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBRUE7QUFDQUcsSUFBSSxDQUFDQyxJQUFJLENBQUMsZUFBZSxFQUFFO0VBQUEsT0FBTztJQUNoQ0MsWUFBWSxFQUFFRixJQUFJLENBQUNHLEVBQUUsQ0FBQztNQUFBLE9BQU87UUFDM0JDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDZEMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNiQyxVQUFVLEVBQUVOLElBQUksQ0FBQ0csRUFBRSxDQUFDLENBQUM7UUFDckJJLFVBQVUsRUFBRTtNQUNkLENBQUM7SUFBQSxDQUFDLENBQUM7SUFDSEMsWUFBWSxFQUFFUixJQUFJLENBQUNHLEVBQUUsQ0FBQztNQUFBLE9BQU87UUFDM0JHLFVBQVUsRUFBRU4sSUFBSSxDQUFDRyxFQUFFLENBQUMsQ0FBQztRQUNyQk0sTUFBTSxFQUFFLEtBQUs7UUFDYkMsTUFBTSxFQUFFO01BQ1YsQ0FBQztJQUFBLENBQUM7RUFDSixDQUFDO0FBQUEsQ0FBQyxDQUFDO0FBRUhWLElBQUksQ0FB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
|