@pie-element/hotspot 11.1.2-next.5 → 11.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/CHANGELOG.json +997 -0
  2. package/CHANGELOG.md +2226 -0
  3. package/LICENSE.md +5 -0
  4. package/README.md +1 -0
  5. package/configure/CHANGELOG.json +682 -0
  6. package/configure/CHANGELOG.md +1963 -0
  7. package/configure/lib/DeleteWidget.js +64 -0
  8. package/configure/lib/DeleteWidget.js.map +1 -0
  9. package/configure/lib/button.js +42 -0
  10. package/configure/lib/button.js.map +1 -0
  11. package/configure/lib/buttons/circle.js +33 -0
  12. package/configure/lib/buttons/circle.js.map +1 -0
  13. package/configure/lib/buttons/polygon.js +39 -0
  14. package/configure/lib/buttons/polygon.js.map +1 -0
  15. package/configure/lib/buttons/rectangle.js +39 -0
  16. package/configure/lib/buttons/rectangle.js.map +1 -0
  17. package/configure/lib/defaults.js +155 -0
  18. package/configure/lib/defaults.js.map +1 -0
  19. package/configure/lib/hotspot-circle.js +192 -0
  20. package/configure/lib/hotspot-circle.js.map +1 -0
  21. package/configure/lib/hotspot-container.js +320 -0
  22. package/configure/lib/hotspot-container.js.map +1 -0
  23. package/configure/lib/hotspot-drawable.js +519 -0
  24. package/configure/lib/hotspot-drawable.js.map +1 -0
  25. package/configure/lib/hotspot-palette.js +107 -0
  26. package/configure/lib/hotspot-palette.js.map +1 -0
  27. package/configure/lib/hotspot-polygon.js +293 -0
  28. package/configure/lib/hotspot-polygon.js.map +1 -0
  29. package/configure/lib/hotspot-rectangle.js +190 -0
  30. package/configure/lib/hotspot-rectangle.js.map +1 -0
  31. package/configure/lib/icons.js +7 -0
  32. package/configure/lib/icons.js.map +1 -0
  33. package/configure/lib/image-konva.js +66 -0
  34. package/configure/lib/image-konva.js.map +1 -0
  35. package/configure/lib/index.js +194 -0
  36. package/configure/lib/index.js.map +1 -0
  37. package/configure/lib/root.js +330 -0
  38. package/configure/lib/root.js.map +1 -0
  39. package/configure/lib/shapes/circle.js +84 -0
  40. package/configure/lib/shapes/circle.js.map +1 -0
  41. package/configure/lib/shapes/index.js +50 -0
  42. package/configure/lib/shapes/index.js.map +1 -0
  43. package/configure/lib/shapes/polygon.js +82 -0
  44. package/configure/lib/shapes/polygon.js.map +1 -0
  45. package/configure/lib/shapes/rectagle.js +84 -0
  46. package/configure/lib/shapes/rectagle.js.map +1 -0
  47. package/configure/lib/shapes/utils.js +21 -0
  48. package/configure/lib/shapes/utils.js.map +1 -0
  49. package/configure/lib/upload-control.js +41 -0
  50. package/configure/lib/upload-control.js.map +1 -0
  51. package/configure/lib/utils.js +185 -0
  52. package/configure/lib/utils.js.map +1 -0
  53. package/configure/package.json +26 -0
  54. package/configure/src/DeleteWidget.jsx +51 -0
  55. package/configure/src/__tests__/DeleteWidget.test.jsx +366 -0
  56. package/configure/src/__tests__/button.test.jsx +198 -0
  57. package/configure/src/__tests__/hotspot-circle.test.jsx +259 -0
  58. package/configure/src/__tests__/hotspot-container.test.js +366 -0
  59. package/configure/src/__tests__/hotspot-drawable.test.js +271 -0
  60. package/configure/src/__tests__/hotspot-palette.test.jsx +71 -0
  61. package/configure/src/__tests__/image-konva.test.jsx +226 -0
  62. package/configure/src/__tests__/index.test.js +329 -0
  63. package/configure/src/__tests__/root.test.js +400 -0
  64. package/configure/src/__tests__/utils.test.js +241 -0
  65. package/configure/src/button.jsx +35 -0
  66. package/configure/src/buttons/circle.jsx +18 -0
  67. package/configure/src/buttons/polygon.jsx +29 -0
  68. package/configure/src/buttons/rectangle.jsx +29 -0
  69. package/configure/src/defaults.js +109 -0
  70. package/configure/src/hotspot-circle.jsx +183 -0
  71. package/configure/src/hotspot-container.jsx +330 -0
  72. package/configure/src/hotspot-drawable.jsx +527 -0
  73. package/configure/src/hotspot-palette.jsx +90 -0
  74. package/configure/src/hotspot-polygon.jsx +294 -0
  75. package/configure/src/hotspot-rectangle.jsx +169 -0
  76. package/configure/src/icons.js +5 -0
  77. package/configure/src/image-konva.jsx +63 -0
  78. package/configure/src/index.js +208 -0
  79. package/configure/src/root.jsx +346 -0
  80. package/configure/src/shapes/circle.js +81 -0
  81. package/configure/src/shapes/index.js +4 -0
  82. package/configure/src/shapes/polygon.js +81 -0
  83. package/configure/src/shapes/rectagle.js +82 -0
  84. package/configure/src/shapes/utils.js +16 -0
  85. package/configure/src/upload-control.jsx +33 -0
  86. package/configure/src/utils.js +210 -0
  87. package/controller/CHANGELOG.json +362 -0
  88. package/controller/CHANGELOG.md +1304 -0
  89. package/controller/lib/defaults.js +33 -0
  90. package/controller/lib/defaults.js.map +1 -0
  91. package/controller/lib/index.js +341 -0
  92. package/controller/lib/index.js.map +1 -0
  93. package/controller/lib/utils.js +32 -0
  94. package/controller/lib/utils.js.map +1 -0
  95. package/controller/package.json +18 -0
  96. package/controller/src/__tests__/index.test.js +419 -0
  97. package/controller/src/__tests__/utils.test.js +5 -0
  98. package/controller/src/defaults.js +19 -0
  99. package/controller/src/index.js +328 -0
  100. package/controller/src/utils.js +29 -0
  101. package/docs/config-schema.json +2023 -0
  102. package/docs/config-schema.json.md +1495 -0
  103. package/docs/demo/config.js +8 -0
  104. package/docs/demo/generate.js +118 -0
  105. package/docs/demo/index.html +1 -0
  106. package/docs/demo/session.js +11 -0
  107. package/docs/pie-schema.json +1204 -0
  108. package/docs/pie-schema.json.md +851 -0
  109. package/lib/hotspot/circle.js +156 -0
  110. package/lib/hotspot/circle.js.map +1 -0
  111. package/lib/hotspot/container.js +206 -0
  112. package/lib/hotspot/container.js.map +1 -0
  113. package/lib/hotspot/icons.js +8 -0
  114. package/lib/hotspot/icons.js.map +1 -0
  115. package/lib/hotspot/image-konva-tooltip.js +86 -0
  116. package/lib/hotspot/image-konva-tooltip.js.map +1 -0
  117. package/lib/hotspot/index.js +163 -0
  118. package/lib/hotspot/index.js.map +1 -0
  119. package/lib/hotspot/polygon.js +203 -0
  120. package/lib/hotspot/polygon.js.map +1 -0
  121. package/lib/hotspot/rectangle.js +175 -0
  122. package/lib/hotspot/rectangle.js.map +1 -0
  123. package/lib/index.js +213 -0
  124. package/lib/index.js.map +1 -0
  125. package/lib/session-updater.js +42 -0
  126. package/lib/session-updater.js.map +1 -0
  127. package/package.json +18 -83
  128. package/src/__tests__/container.test.jsx +58 -0
  129. package/src/__tests__/index.test.js +123 -0
  130. package/src/__tests__/session-updater.test.jsx +69 -0
  131. package/src/hotspot/__tests__/circle.test.jsx +464 -0
  132. package/src/hotspot/__tests__/container.test.jsx +546 -0
  133. package/src/hotspot/__tests__/image-konva-tooltip.test.jsx +510 -0
  134. package/src/hotspot/__tests__/polygon.test.jsx +502 -0
  135. package/src/hotspot/__tests__/rectangle.test.jsx +418 -0
  136. package/src/hotspot/circle.jsx +152 -0
  137. package/src/hotspot/container.jsx +217 -0
  138. package/src/hotspot/icons.js +7 -0
  139. package/src/hotspot/image-konva-tooltip.jsx +76 -0
  140. package/src/hotspot/index.jsx +165 -0
  141. package/src/hotspot/polygon.jsx +195 -0
  142. package/src/hotspot/rectangle.jsx +171 -0
  143. package/src/index.js +226 -0
  144. package/src/session-updater.js +29 -0
  145. package/configure.js +0 -2
  146. package/controller.js +0 -1
  147. package/dist/author/DeleteWidget.d.ts +0 -38
  148. package/dist/author/DeleteWidget.js +0 -46
  149. package/dist/author/button.d.ts +0 -31
  150. package/dist/author/button.js +0 -27
  151. package/dist/author/buttons/circle.d.ts +0 -18
  152. package/dist/author/buttons/circle.js +0 -25
  153. package/dist/author/buttons/polygon.d.ts +0 -18
  154. package/dist/author/buttons/polygon.js +0 -36
  155. package/dist/author/buttons/rectangle.d.ts +0 -18
  156. package/dist/author/buttons/rectangle.js +0 -36
  157. package/dist/author/defaults.d.ts +0 -157
  158. package/dist/author/defaults.js +0 -119
  159. package/dist/author/hotspot-circle.d.ts +0 -21
  160. package/dist/author/hotspot-circle.js +0 -124
  161. package/dist/author/hotspot-container.d.ts +0 -29
  162. package/dist/author/hotspot-container.js +0 -210
  163. package/dist/author/hotspot-drawable.d.ts +0 -31
  164. package/dist/author/hotspot-drawable.js +0 -312
  165. package/dist/author/hotspot-palette.d.ts +0 -14
  166. package/dist/author/hotspot-palette.js +0 -72
  167. package/dist/author/hotspot-polygon.d.ts +0 -38
  168. package/dist/author/hotspot-polygon.js +0 -200
  169. package/dist/author/hotspot-rectangle.d.ts +0 -20
  170. package/dist/author/hotspot-rectangle.js +0 -119
  171. package/dist/author/icons.d.ts +0 -9
  172. package/dist/author/icons.js +0 -4
  173. package/dist/author/image-konva.d.ts +0 -19
  174. package/dist/author/image-konva.js +0 -49
  175. package/dist/author/index.d.ts +0 -52
  176. package/dist/author/index.js +0 -143
  177. package/dist/author/root.d.ts +0 -15
  178. package/dist/author/root.js +0 -215
  179. package/dist/author/shapes/circle.d.ts +0 -18
  180. package/dist/author/shapes/circle.js +0 -47
  181. package/dist/author/shapes/index.d.ts +0 -12
  182. package/dist/author/shapes/polygon.d.ts +0 -19
  183. package/dist/author/shapes/polygon.js +0 -51
  184. package/dist/author/shapes/rectagle.d.ts +0 -18
  185. package/dist/author/shapes/rectagle.js +0 -57
  186. package/dist/author/shapes/utils.d.ts +0 -19
  187. package/dist/author/shapes/utils.js +0 -16
  188. package/dist/author/upload-control.d.ts +0 -29
  189. package/dist/author/upload-control.js +0 -28
  190. package/dist/author/utils.d.ts +0 -24
  191. package/dist/author/utils.js +0 -83
  192. package/dist/browser/ReactKonva-CFo7dxdy.js +0 -19336
  193. package/dist/browser/ReactKonva-CFo7dxdy.js.map +0 -1
  194. package/dist/browser/author/index.js +0 -47549
  195. package/dist/browser/author/index.js.map +0 -1
  196. package/dist/browser/browser-CfnAFove.js +0 -219
  197. package/dist/browser/browser-CfnAFove.js.map +0 -1
  198. package/dist/browser/controller/index.js +0 -198
  199. package/dist/browser/controller/index.js.map +0 -1
  200. package/dist/browser/delivery/index.js +0 -2460
  201. package/dist/browser/delivery/index.js.map +0 -1
  202. package/dist/browser/dist-CeB-1djc.js +0 -100
  203. package/dist/browser/dist-CeB-1djc.js.map +0 -1
  204. package/dist/browser/hotspot.css +0 -2
  205. package/dist/controller/defaults.d.ts +0 -35
  206. package/dist/controller/defaults.js +0 -29
  207. package/dist/controller/index.d.ts +0 -22
  208. package/dist/controller/index.js +0 -154
  209. package/dist/controller/utils.d.ts +0 -10
  210. package/dist/controller/utils.js +0 -12
  211. package/dist/delivery/hotspot/circle.d.ts +0 -19
  212. package/dist/delivery/hotspot/circle.js +0 -100
  213. package/dist/delivery/hotspot/container.d.ts +0 -16
  214. package/dist/delivery/hotspot/container.js +0 -150
  215. package/dist/delivery/hotspot/icons.d.ts +0 -10
  216. package/dist/delivery/hotspot/icons.js +0 -4
  217. package/dist/delivery/hotspot/image-konva-tooltip.d.ts +0 -19
  218. package/dist/delivery/hotspot/image-konva-tooltip.js +0 -66
  219. package/dist/delivery/hotspot/index.d.ts +0 -17
  220. package/dist/delivery/hotspot/index.js +0 -114
  221. package/dist/delivery/hotspot/polygon.d.ts +0 -21
  222. package/dist/delivery/hotspot/polygon.js +0 -108
  223. package/dist/delivery/hotspot/rectangle.d.ts +0 -19
  224. package/dist/delivery/hotspot/rectangle.js +0 -104
  225. package/dist/delivery/index.d.ts +0 -20
  226. package/dist/delivery/index.js +0 -107
  227. package/dist/delivery/session-updater.d.ts +0 -10
  228. package/dist/delivery/session-updater.js +0 -14
  229. package/dist/index.d.ts +0 -1
  230. package/dist/index.iife.d.ts +0 -8
  231. package/dist/index.iife.js +0 -169
  232. package/dist/index.js +0 -2
  233. package/dist/runtime-support.d.ts +0 -12
  234. package/dist/runtime-support.js +0 -12
@@ -0,0 +1,329 @@
1
+ import React from 'react';
2
+ import { createRoot } from 'react-dom/client';
3
+
4
+ jest.mock('react-konva', () => {
5
+ const React = require('react');
6
+ return {
7
+ Stage: ({ children, ...props }) => React.createElement('div', { 'data-testid': 'stage', ...props }, children),
8
+ Layer: ({ children, ...props }) => React.createElement('div', { 'data-testid': 'layer', ...props }, children),
9
+ Rect: (props) => React.createElement('div', { 'data-testid': 'rect', ...props }),
10
+ Circle: (props) => React.createElement('div', { 'data-testid': 'circle', ...props }),
11
+ Line: (props) => React.createElement('div', { 'data-testid': 'line', ...props }),
12
+ Group: ({ children, ...props }) => React.createElement('div', { 'data-testid': 'group', ...props }, children),
13
+ Image: (props) => React.createElement('div', { 'data-testid': 'image', ...props }),
14
+ };
15
+ });
16
+
17
+ jest.mock('@pie-lib/config-ui', () => ({
18
+ InputContainer: (props) => <div {...props}>{props.children}</div>,
19
+ InputCheckbox: (props) => <div {...props}>{props.children}</div>,
20
+ FeedbackConfig: (props) => <div {...props}>{props.children}</div>,
21
+ choiceUtils: {
22
+ firstAvailableIndex: jest.fn(),
23
+ },
24
+ layout: {
25
+ ConfigLayout: (props) => <div {...props}>{props.children}</div>,
26
+ },
27
+ settings: {
28
+ Panel: (props) => <div {...props} />,
29
+ toggle: jest.fn(),
30
+ radio: jest.fn(),
31
+ },
32
+ }));
33
+
34
+ const mockRender = jest.fn();
35
+ const mockUnmount = jest.fn();
36
+ const mockCreateRoot = jest.fn(() => ({
37
+ render: mockRender,
38
+ unmount: mockUnmount,
39
+ }));
40
+
41
+ jest.mock('react-dom/client', () => ({
42
+ createRoot: jest.fn(() => ({
43
+ render: jest.fn(),
44
+ unmount: jest.fn(),
45
+ })),
46
+ }));
47
+
48
+ jest.mock('../index', () => {
49
+ const sensibleDefaults = require('../defaults').default;
50
+ const { ModelUpdatedEvent } = require('@pie-framework/pie-configure-events');
51
+ const { createRoot } = require('react-dom/client');
52
+
53
+ class MockHTMLElement {
54
+ constructor() {
55
+ this._root = null;
56
+ this._model = null;
57
+ this._configuration = sensibleDefaults.configuration;
58
+ this.dispatchEvent = jest.fn();
59
+ this.onModelChanged = this.onModelChanged.bind(this);
60
+ }
61
+ }
62
+
63
+ return {
64
+ __esModule: true,
65
+ default: class HotspotConfigure extends MockHTMLElement {
66
+ static createDefaultModel = (model = {}) => ({
67
+ ...sensibleDefaults.model,
68
+ ...model,
69
+ hotspotList: model.hotspotList || [model.hotspotColor] || sensibleDefaults.model.hotspotList,
70
+ outlineList: model.outlineList || [model.outlineColor] || sensibleDefaults.model.outlineList,
71
+ shapes: model.shapes || sensibleDefaults.model.shapes || {},
72
+ });
73
+
74
+ constructor() {
75
+ super();
76
+ this._model = HotspotConfigure.createDefaultModel();
77
+ }
78
+
79
+ set model(s) {
80
+ this._model = HotspotConfigure.createDefaultModel(s);
81
+ this._render();
82
+ }
83
+
84
+ set configuration(c) {
85
+ this._configuration = {
86
+ ...sensibleDefaults.configuration,
87
+ ...c,
88
+ };
89
+ this._render();
90
+ }
91
+
92
+ _render() {
93
+ if (!this._root) {
94
+ this._root = createRoot(global.document.createElement('div'));
95
+ }
96
+ this._root.render(null);
97
+ }
98
+
99
+ dispatchModelUpdated(reset) {
100
+ const resetValue = !!reset;
101
+ this.dispatchEvent(new ModelUpdatedEvent(this._model, resetValue));
102
+ }
103
+
104
+ onModelChanged(m, reset) {
105
+ this._model = m;
106
+ this.dispatchModelUpdated(reset);
107
+ this._render();
108
+ }
109
+
110
+ onModelChangedByConfig = (m, propertyType) => {
111
+ const _model = m;
112
+
113
+ if (propertyType === 'multipleCorrect') {
114
+ const { rectangles = [], polygons = [], circles = [] } = _model.shapes || {};
115
+
116
+ _model.shapes.rectangles = rectangles.map((shape) => ({ ...shape, correct: false }));
117
+ _model.shapes.polygons = polygons.map((shape) => ({ ...shape, correct: false }));
118
+ _model.shapes.circles = circles.map((shape) => ({ ...shape, correct: false }));
119
+ }
120
+
121
+ this.onModelChanged(_model);
122
+ };
123
+
124
+ onColorChanged = (colorType, color) => {
125
+ this.onModelChanged({
126
+ ...this._model,
127
+ [colorType]: color,
128
+ });
129
+ };
130
+
131
+ onPromptChanged = (prompt) => {
132
+ this.onModelChanged({
133
+ ...this._model,
134
+ prompt,
135
+ });
136
+ };
137
+
138
+ onRationaleChanged = (rationale) => {
139
+ this.onModelChanged({
140
+ ...this._model,
141
+ rationale,
142
+ });
143
+ };
144
+
145
+ onTeacherInstructionsChanged = (teacherInstructions) => {
146
+ this.onModelChanged({
147
+ ...this._model,
148
+ teacherInstructions,
149
+ });
150
+ };
151
+
152
+ onUpdateImageDimension = (dimensions) => {
153
+ this.onModelChanged({
154
+ ...this._model,
155
+ dimensions,
156
+ });
157
+ };
158
+
159
+ onUpdateShapes = (shapes) => {
160
+ this.onModelChanged({
161
+ ...this._model,
162
+ shapes,
163
+ });
164
+ };
165
+
166
+ onImageUpload = (imageUrl) => {
167
+ this.onModelChanged({
168
+ ...this._model,
169
+ imageUrl,
170
+ });
171
+ };
172
+ },
173
+ };
174
+ });
175
+
176
+ const model = () => ({
177
+ prompt: 'This is the question prompt',
178
+ imageUrl: '',
179
+ shapes: {
180
+ rectangles: [{ id: '1', correct: true }, { id: '2' }, { id: '3' }],
181
+ polygons: [
182
+ {
183
+ points: [
184
+ { x: 1, y: 2 },
185
+ { y: 139, x: 1 },
186
+ { y: 139, x: 130 },
187
+ { x: 130, y: 2 },
188
+ ],
189
+ correct: false,
190
+ id: '0',
191
+ },
192
+ ],
193
+ },
194
+ dimensions: { height: 0, width: 0 },
195
+ hotspotColor: 'rgba(137, 183, 244, 0.65)',
196
+ hotspotList: ['rgba(137, 183, 244, 0.65)', 'rgba(217, 30, 24, 0.65)', 'rgba(254, 241, 96, 0.65)'],
197
+ outlineColor: 'blue',
198
+ outlineList: ['blue', 'red', 'yellow'],
199
+ configure: {},
200
+ multipleCorrect: true,
201
+ partialScoring: false,
202
+ });
203
+
204
+ describe('index', () => {
205
+ let Def;
206
+ let el;
207
+ let onModelChanged = jest.fn();
208
+ let initialModel = model();
209
+ let createRoot;
210
+
211
+ beforeAll(() => {
212
+ Def = require('../index').default;
213
+ createRoot = require('react-dom/client').createRoot;
214
+ });
215
+
216
+ beforeEach(() => {
217
+ el = new Def();
218
+ el.model = initialModel;
219
+ el.onModelChanged = onModelChanged;
220
+ });
221
+
222
+ describe('set model', () => {
223
+ it('calls createRoot and render', () => {
224
+ expect(createRoot).toHaveBeenCalled();
225
+ // The render method is called on the root instance
226
+ const rootInstance = createRoot.mock.results[0].value;
227
+ expect(rootInstance.render).toHaveBeenCalled();
228
+ });
229
+ });
230
+
231
+ describe('logic', () => {
232
+ describe('onModelChangedByConfig', () => {
233
+ it('changes partial scoring value', () => {
234
+ el.onModelChangedByConfig({ ...initialModel, partialScoring: true });
235
+
236
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({ partialScoring: true }));
237
+ });
238
+ it('changes multiple correct value', () => {
239
+ el.onModelChangedByConfig({ ...initialModel, multipleCorrect: false });
240
+
241
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({ multipleCorrect: false }));
242
+ });
243
+ });
244
+
245
+ describe('onColorChanged', () => {
246
+ it('changes hotspot color', () => {
247
+ el.onColorChanged('hotspotColor', 'red');
248
+
249
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({ hotspotColor: 'red' }));
250
+ });
251
+
252
+ it('changes outline color', () => {
253
+ el.onColorChanged('outlineColor', 'lightred');
254
+
255
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({ outlineColor: 'lightred' }));
256
+ });
257
+ });
258
+
259
+ describe('onPromptChanged', () => {
260
+ it('changes the prompt', () => {
261
+ const newPrompt = 'This is the second question prompt';
262
+ el.onPromptChanged(newPrompt);
263
+
264
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({ prompt: newPrompt }));
265
+ });
266
+ });
267
+
268
+ describe('onRationaleChanged', () => {
269
+ it('changes the rationale', () => {
270
+ const newRationale = 'New Rationale';
271
+ el.onRationaleChanged(newRationale);
272
+
273
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({ rationale: newRationale }));
274
+ });
275
+ });
276
+
277
+ describe('onTeacherInstructionsChanged', () => {
278
+ it('changes the teacherInstructions', () => {
279
+ const newTeacherInstructions = 'New Teacher Instructions';
280
+ el.onTeacherInstructionsChanged(newTeacherInstructions);
281
+
282
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({ teacherInstructions: newTeacherInstructions }));
283
+ });
284
+ });
285
+
286
+ describe('onUpdateImageDimensions', () => {
287
+ it('changes the image dimensions', () => {
288
+ el.onUpdateImageDimension({ height: 400, width: 400 });
289
+
290
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({ dimensions: { height: 400, width: 400 } }));
291
+ });
292
+ });
293
+
294
+ describe('onUpdateShapes', () => {
295
+ it('changes the shapes', () => {
296
+ const shapes = { polygons: [], rectangles: [...initialModel.shapes.rectangles, { id: '2' }] };
297
+ el.onUpdateShapes(shapes);
298
+
299
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({ shapes }));
300
+ });
301
+
302
+ it('removes the latest shape', () => {
303
+ const shapes = initialModel.shapes.rectangles;
304
+ const newShapes = shapes ? shapes.slice(0, shapes.length - 1) : [];
305
+ el.onUpdateShapes({ polygons: initialModel.shapes.polygons, rectangles: newShapes });
306
+
307
+ expect(onModelChanged).toBeCalledWith(
308
+ expect.objectContaining({ shapes: { polygons: initialModel.shapes.polygons, rectangles: newShapes } }),
309
+ );
310
+ });
311
+
312
+ it('removes all shapes', () => {
313
+ el.onUpdateShapes({ polygons: [], rectangles: [] });
314
+
315
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({ shapes: { polygons: [], rectangles: [] } }));
316
+ });
317
+ });
318
+
319
+ describe('onImageUpload', () => {
320
+ it('uploads an image', () => {
321
+ el.onImageUpload('https://picsum.photos/id/102/200/300');
322
+
323
+ expect(onModelChanged).toBeCalledWith(
324
+ expect.objectContaining({ imageUrl: 'https://picsum.photos/id/102/200/300' }),
325
+ );
326
+ });
327
+ });
328
+ });
329
+ });