@pie-element/hotspot 11.1.2-next.2 → 11.1.2

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 +2220 -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 +1957 -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-DI5WIo8o.js +0 -19336
  193. package/dist/browser/ReactKonva-DI5WIo8o.js.map +0 -1
  194. package/dist/browser/author/index.js +0 -41646
  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-C78LDz6R.js +0 -96
  203. package/dist/browser/dist-C78LDz6R.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,419 @@
1
+ import { model, outcome, createCorrectResponseSession } from '../index';
2
+ import { isResponseCorrect } from '../utils';
3
+
4
+ describe('controller', () => {
5
+ let result, question, session, env;
6
+
7
+ beforeEach(() => {
8
+ question = {
9
+ prompt: 'prompt',
10
+ promptEnabled: true,
11
+ imageUrl: '',
12
+ dimensions: {
13
+ height: 0,
14
+ width: 0,
15
+ },
16
+ outlineColor: 'blue',
17
+ hotspotColor: 'lightblue',
18
+ shapes: {
19
+ rectangles: [
20
+ {
21
+ id: '1',
22
+ correct: true,
23
+ },
24
+ {
25
+ id: '2',
26
+ },
27
+ {
28
+ id: '3',
29
+ },
30
+ ],
31
+ polygons: [
32
+ {
33
+ id: '4',
34
+ correct: true,
35
+ },
36
+ ],
37
+ circles: [
38
+ {
39
+ id: '5',
40
+ correct: true,
41
+ },
42
+ ],
43
+ },
44
+ multipleCorrect: true,
45
+ partialScoring: false,
46
+ };
47
+ });
48
+
49
+ describe('outcome partialScoring test', () => {
50
+ describe('hanging controller', () => {
51
+ it('doesnt hang if answers is missing', async () => {
52
+ const response = await outcome({}, { id: '1' }, {});
53
+ expect(response).toEqual({ score: 0, empty: true, traceLog: ['No hotspots selected. Score: 0.'] });
54
+ });
55
+
56
+ it('doesnt hang if the rest is missing', async () => {
57
+ const response = await outcome({}, { id: '1', answers: {} }, {});
58
+ const score = response.score;
59
+ expect(score).toEqual(0);
60
+ });
61
+ });
62
+
63
+ beforeEach(() => {
64
+ const rectangles = question.shapes.rectangles.concat({
65
+ id: '5',
66
+ correct: true,
67
+ });
68
+ question = {
69
+ ...question,
70
+ shapes: {
71
+ ...question.shapes,
72
+ rectangles,
73
+ },
74
+ };
75
+ });
76
+
77
+ const assertOutcome = (message, extra, sessionValue, env, expected) => {
78
+ it(message, async () => {
79
+ const result = await outcome({ ...question, ...extra }, sessionValue, env);
80
+ expect(result).toEqual(expect.objectContaining(expected));
81
+ });
82
+ };
83
+
84
+ assertOutcome(
85
+ 'element.partialScoring = true',
86
+ { partialScoring: true },
87
+ { answers: [{ id: '2' }] },
88
+ { mode: 'evaluate' },
89
+ { score: 0 },
90
+ );
91
+
92
+ assertOutcome(
93
+ 'element.partialScoring = false',
94
+ { partialScoring: false },
95
+ { answers: [{ id: '2' }] },
96
+ { mode: 'evaluate' },
97
+ { score: 0 },
98
+ );
99
+
100
+ assertOutcome(
101
+ 'element.partialScoring = false, env.partialScoring = true',
102
+ { partialScoring: false },
103
+ { answers: [{ id: '2' }] },
104
+ { mode: 'evaluate', partialScoring: true },
105
+ { score: 0 },
106
+ );
107
+
108
+ assertOutcome(
109
+ 'element.partialScoring = true, env.partialScoring = false',
110
+ { partialScoring: true },
111
+ { answers: [{ id: '2' }] },
112
+ { mode: 'evaluate', partialScoring: false },
113
+ { score: 0 },
114
+ );
115
+ });
116
+
117
+ describe('outcome', () => {
118
+ it('returns score of 0', async () => {
119
+ const result = await outcome(question, { answers: [{ id: '2' }] });
120
+ expect(result.score).toEqual(0);
121
+ });
122
+
123
+ it('returns score of 1 (partialScoring: false, answers in order)', async () => {
124
+ const result = await outcome(question, {
125
+ answers: [{ id: '1' }, { id: '4' }, { id: '5' }],
126
+ });
127
+ expect(result.score).toEqual(1);
128
+ });
129
+
130
+ it('returns score of 1 (partialScoring: false, answers not in order)', async () => {
131
+ const result = await outcome(question, {
132
+ answers: [{ id: '5' }, { id: '4' }, { id: '1' }],
133
+ });
134
+ expect(result.score).toEqual(1);
135
+ });
136
+
137
+ describe('partial scoring', () => {
138
+ beforeEach(() => {
139
+ const rectangles = question.shapes.rectangles.concat(
140
+ {
141
+ id: '5',
142
+ correct: true,
143
+ },
144
+ {
145
+ id: '6',
146
+ correct: true,
147
+ },
148
+ );
149
+ question = {
150
+ ...question,
151
+ partialScoring: true,
152
+ shapes: {
153
+ ...question.shapes,
154
+ rectangles,
155
+ },
156
+ };
157
+ });
158
+ it('returns a score of 0', async () => {
159
+ const result = await outcome(question, { answers: [{ id: '2' }] });
160
+ expect(result.score).toEqual(0);
161
+ });
162
+
163
+ it('returns a score of 0.2 for 1/5 correct answers and 0 incorrect answers', async () => {
164
+ const result = await outcome(question, {
165
+ answers: [{ id: '1' }],
166
+ });
167
+ expect(result.score).toEqual(0.2);
168
+ });
169
+
170
+ it('returns a score of 0.2, even if answers are not in order', async () => {
171
+ const result = await outcome(question, {
172
+ answers: [{ id: '1' }],
173
+ });
174
+ expect(result.score).toEqual(0.2);
175
+ });
176
+
177
+ it('returns a score of 0.6 for 2/5 correct answers and 0 incorrect answers', async () => {
178
+ const result = await outcome(question, { answers: [{ id: '5' }, { id: '4' }] });
179
+ expect(result.score).toEqual(0.6);
180
+ });
181
+
182
+ it('returns a score of 0.8 for 3/5 correct answers and 0 incorrect answers', async () => {
183
+ const result = await outcome(question, { answers: [{ id: '1' }, { id: '5' }, { id: '4' }] });
184
+ expect(result.score).toEqual(0.8);
185
+ });
186
+
187
+ it('returns a score of 1 for 4/5 correct answers and 0 incorrect answers', async () => {
188
+ const result = await outcome(question, {
189
+ answers: [{ id: '1' }, { id: '4' }, { id: '5' }, { id: '6' }],
190
+ });
191
+ expect(result.score).toEqual(1);
192
+ });
193
+
194
+ it('returns a score of 0.2 for 1/5 correct answers and 2 incorrect answers', async () => {
195
+ const result = await outcome(question, {
196
+ answers: [{ id: '1' }, { id: '2' }, { id: '3' }],
197
+ });
198
+ expect(result.score).toEqual(0.2);
199
+ });
200
+
201
+ it('returns a score of 0.4 for 2/5 correct answers and 2 incorrect answers', async () => {
202
+ const result = await outcome(question, {
203
+ answers: [{ id: '1' }, { id: '4' }, { id: '2' }, { id: '3' }],
204
+ });
205
+ expect(result.score).toEqual(0.4);
206
+ });
207
+
208
+ it('returns a score of 0.4 for 2/5 correct answers and 2 incorrect answers', async () => {
209
+ const result = await outcome(question, {
210
+ answers: [{ id: '1' }, { id: '4' }, { id: '2' }, { id: '3' }],
211
+ });
212
+ expect(result.score).toEqual(0.4);
213
+ });
214
+
215
+ it('returns a score of 0.6 for 3/5 correct answers and 1 incorrect answer', async () => {
216
+ const result = await outcome(question, {
217
+ answers: [{ id: '6' }, { id: '4' }, { id: '1' }, { id: '3' }],
218
+ });
219
+ expect(result.score).toEqual(0.6);
220
+ });
221
+
222
+ it('returns a score of 0.6 for 3/5 correct answers and 1 incorrect answer', async () => {
223
+ const result = await outcome(question, {
224
+ answers: [{ id: '6' }, { id: '4' }, { id: '1' }, { id: '3' }],
225
+ });
226
+ expect(result.score).toEqual(0.6);
227
+ });
228
+
229
+ it('returns a score of 0.6 for 3/5 correct answers and 2 incorrect answer', async () => {
230
+ const result = await outcome(question, {
231
+ answers: [{ id: '6' }, { id: '4' }, { id: '2' }, { id: '3' }, { id: '1' }],
232
+ });
233
+ expect(result.score).toEqual(0.6);
234
+ });
235
+
236
+ it('returns a score of 0.8 for 3/5 correct answers and 1 incorrect answer', async () => {
237
+ const result = await outcome(question, {
238
+ answers: [{ id: '6' }, { id: '4' }, { id: '2' }, { id: '5' }, { id: '1' }],
239
+ });
240
+ expect(result.score).toEqual(0.8);
241
+ });
242
+
243
+ it('returns a score of 0.6 for 3/5 correct answers and 2 incorrect answers', async () => {
244
+ const result = await outcome(question, {
245
+ answers: [{ id: '6' }, { id: '4' }, { id: '2' }, { id: '5' }, { id: '1' }, { id: '3' }],
246
+ });
247
+ expect(result.score).toEqual(0.6);
248
+ });
249
+ });
250
+
251
+ const returnOutcome = (session) => {
252
+ it(`returns empty: true when session is ${JSON.stringify(session)}`, async () => {
253
+ const result = await outcome(question, session);
254
+ expect(result).toEqual({ score: 0, empty: true, traceLog: ['No hotspots selected. Score: 0.'] });
255
+ });
256
+ };
257
+
258
+ returnOutcome(undefined);
259
+ returnOutcome(null);
260
+ returnOutcome({});
261
+ });
262
+
263
+ describe('model', () => {
264
+ describe('mode: gather', () => {
265
+ beforeEach(async () => {
266
+ session = {};
267
+ env = { mode: 'gather' };
268
+ result = await model(question, session, env);
269
+ });
270
+
271
+ it('returns disabled', () => {
272
+ expect(result.disabled).toEqual(false);
273
+ });
274
+
275
+ it('returns mode', () => {
276
+ expect(result.mode).toEqual('gather');
277
+ });
278
+
279
+ it('returns prompt', () => {
280
+ expect(result.prompt).toEqual('prompt');
281
+ });
282
+
283
+ it('returns dimensions', () => {
284
+ expect(result.dimensions).toEqual({ height: 0, width: 0 });
285
+ });
286
+
287
+ it('returns outlineColor', () => {
288
+ expect(result.outlineColor).toEqual('blue');
289
+ });
290
+
291
+ it('returns hotspotColor', () => {
292
+ expect(result.hotspotColor).toEqual('lightblue');
293
+ });
294
+
295
+ it('returns multipleCorrect', () => {
296
+ expect(result.multipleCorrect).toEqual(true);
297
+ });
298
+
299
+ it('returns shapes', () => {
300
+ expect(result.shapes.rectangles).toEqual(
301
+ expect.arrayContaining([{ id: '1' }, { id: '2' }, { id: '3' }]),
302
+ );
303
+ expect(result.shapes.polygons).toEqual(expect.arrayContaining([{ id: '4' }]));
304
+ });
305
+
306
+ it('does not return responseCorrect', () => {
307
+ expect(result.responseCorrect).toBe(undefined);
308
+ });
309
+ });
310
+
311
+ describe('mode: view', () => {
312
+ beforeEach(async () => {
313
+ session = {};
314
+ env = { mode: 'view' };
315
+ result = await model(question, session, env);
316
+ });
317
+
318
+ it('returns disabled', () => {
319
+ expect(result.disabled).toEqual(true);
320
+ });
321
+ });
322
+
323
+ describe('mode: evaluate', () => {
324
+ beforeEach(async () => {
325
+ session = { answers: [] };
326
+ env = { mode: 'evaluate' };
327
+ result = await model(question, session, env);
328
+ return result;
329
+ });
330
+
331
+ it('returns choices w/ correct', () => {
332
+ expect(result.shapes.rectangles).toEqual(
333
+ expect.arrayContaining([{ id: '1', correct: true }, { id: '2' }, { id: '3' }]),
334
+ );
335
+ expect(result.shapes.polygons).toEqual(expect.arrayContaining([{ id: '4', correct: true }]));
336
+ });
337
+
338
+ it('returns is response correct', () => {
339
+ expect(result.responseCorrect).toEqual(false);
340
+ });
341
+ });
342
+ });
343
+
344
+ describe('isResponseCorrect', () => {
345
+ const returnIsResponseCorect = (session) => {
346
+ it(`response is not correct if session is ${JSON.stringify(session)}`, () => {
347
+ expect(isResponseCorrect(question, session)).toEqual(false);
348
+ });
349
+ };
350
+
351
+ returnIsResponseCorect(undefined);
352
+ returnIsResponseCorect(null);
353
+ returnIsResponseCorect({});
354
+ });
355
+
356
+ describe('correct response', () => {
357
+ it('returns correct response if env is correct', async () => {
358
+ const sess = await createCorrectResponseSession(question, {
359
+ mode: 'gather',
360
+ role: 'instructor',
361
+ });
362
+ expect(sess).toEqual({ answers: [{ id: '1' }, { id: '4' }, { id: '5' }], id: '1' });
363
+ });
364
+
365
+ it('returns null env is student', async () => {
366
+ const noResult = await createCorrectResponseSession(question, {
367
+ mode: 'gather',
368
+ role: 'student',
369
+ });
370
+ expect(noResult).toBeNull();
371
+ });
372
+ });
373
+
374
+ describe('shouldIncludeCorrectResponse behavior', () => {
375
+ it('includes correct property when shouldIncludeCorrectResponse is true', async () => {
376
+ env = { mode: 'evaluate' };
377
+ result = await model(question, {}, env);
378
+
379
+ expect(result.shapes.rectangles).toEqual(
380
+ expect.arrayContaining([{ id: '1', correct: true }, { id: '2' }, { id: '3' }])
381
+ );
382
+ expect(result.shapes.polygons).toEqual(expect.arrayContaining([{ id: '4', correct: true }]));
383
+ expect(result.shapes.circles).toEqual(expect.arrayContaining([{ id: '5', correct: true }]));
384
+ });
385
+
386
+ it('excludes correct property when shouldIncludeCorrectResponse is false', async () => {
387
+ env = { mode: 'gather' };
388
+ result = await model(question, {}, env);
389
+
390
+ expect(result.shapes.rectangles).toEqual(
391
+ expect.arrayContaining([{ id: '1' }, { id: '2' }, { id: '3' }])
392
+ );
393
+ expect(result.shapes.polygons).toEqual(expect.arrayContaining([{ id: '4' }]));
394
+ expect(result.shapes.circles).toEqual(expect.arrayContaining([{ id: '5' }]));
395
+ });
396
+
397
+ it('includes correct for instructor in view mode', async () => {
398
+ env = { mode: 'view', role: 'instructor' };
399
+ result = await model(question, {}, env);
400
+
401
+ expect(result.shapes.rectangles).toEqual(
402
+ expect.arrayContaining([{ id: '1', correct: true }, { id: '2' }, { id: '3' }])
403
+ );
404
+ expect(result.shapes.polygons).toEqual(expect.arrayContaining([{ id: '4', correct: true }]));
405
+ expect(result.shapes.circles).toEqual(expect.arrayContaining([{ id: '5', correct: true }]));
406
+ });
407
+
408
+ it('excludes correct for student in view mode', async () => {
409
+ env = { mode: 'view', role: 'student' };
410
+ result = await model(question, {}, env);
411
+
412
+ expect(result.shapes.rectangles).toEqual(
413
+ expect.arrayContaining([{ id: '1' }, { id: '2' }, { id: '3' }])
414
+ );
415
+ expect(result.shapes.polygons).toEqual(expect.arrayContaining([{ id: '4' }]));
416
+ expect(result.shapes.circles).toEqual(expect.arrayContaining([{ id: '5' }]));
417
+ });
418
+ });
419
+ });
@@ -0,0 +1,5 @@
1
+ describe('utils', () => {
2
+ xit('todo', () => {
3
+ expect(true).toEqual(false);
4
+ });
5
+ });
@@ -0,0 +1,19 @@
1
+ export default {
2
+ dimensions: { height: 0, width: 0 },
3
+ hotspotColor: 'rgba(137, 183, 244, 0.25)',
4
+ hotspotList: ['rgba(137, 183, 244, 0.25)'],
5
+ imageUrl: '',
6
+ multipleCorrect: true,
7
+ outlineColor: 'blue',
8
+ outlineList: ['blue'],
9
+ partialScoring: false,
10
+ prompt: '',
11
+ promptEnabled: true,
12
+ rationaleEnabled: true,
13
+ shapes: { rectangles: [], polygons: [], circles: [] },
14
+ strokeWidth: 5,
15
+ studentInstructionsEnabled: true,
16
+ teacherInstructions: '',
17
+ teacherInstructionsEnabled: true,
18
+ toolbarEditorPosition: 'bottom',
19
+ };