@pie-element/hotspot 4.10.10 → 4.10.11-beta.1443

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 (91) hide show
  1. package/CHANGELOG.md +349 -0
  2. package/configure/CHANGELOG.md +311 -0
  3. package/configure/lib/button.js.map +1 -1
  4. package/configure/lib/defaults.js +23 -2
  5. package/configure/lib/defaults.js.map +1 -1
  6. package/configure/lib/hotspot-container.js +28 -19
  7. package/configure/lib/hotspot-container.js.map +1 -1
  8. package/configure/lib/hotspot-drawable.js +3 -3
  9. package/configure/lib/hotspot-drawable.js.map +1 -1
  10. package/configure/lib/hotspot-palette.js.map +1 -1
  11. package/configure/lib/hotspot-polygon.js.map +1 -1
  12. package/configure/lib/hotspot-rectangle.js.map +1 -1
  13. package/configure/lib/index.js +16 -2
  14. package/configure/lib/index.js.map +1 -1
  15. package/configure/lib/root.js +129 -38
  16. package/configure/lib/root.js.map +1 -1
  17. package/configure/lib/upload-control.js.map +1 -1
  18. package/configure/lib/utils.js +15 -3
  19. package/configure/lib/utils.js.map +1 -1
  20. package/configure/package.json +4 -4
  21. package/configure/src/__tests__/__snapshots__/hotspot-container.test.js.snap +1 -1
  22. package/configure/src/__tests__/__snapshots__/root.test.js.snap +56 -4
  23. package/configure/src/__tests__/hotspot-container.test.js +98 -71
  24. package/configure/src/__tests__/hotspot-drawable.test.js +48 -49
  25. package/configure/src/__tests__/index.test.js +28 -51
  26. package/configure/src/__tests__/root.test.js +162 -82
  27. package/configure/src/__tests__/utils.test.js +112 -98
  28. package/configure/src/button.jsx +4 -4
  29. package/configure/src/defaults.js +35 -18
  30. package/configure/src/hotspot-container.jsx +99 -98
  31. package/configure/src/hotspot-drawable.jsx +56 -56
  32. package/configure/src/hotspot-palette.jsx +12 -25
  33. package/configure/src/hotspot-polygon.jsx +20 -22
  34. package/configure/src/hotspot-rectangle.jsx +5 -15
  35. package/configure/src/index.js +32 -18
  36. package/configure/src/root.jsx +116 -60
  37. package/configure/src/upload-control.jsx +9 -20
  38. package/configure/src/utils.js +51 -22
  39. package/controller/CHANGELOG.md +23 -0
  40. package/controller/lib/defaults.js +2 -2
  41. package/controller/lib/defaults.js.map +1 -1
  42. package/controller/lib/index.js +39 -3
  43. package/controller/lib/index.js.map +1 -1
  44. package/controller/lib/utils.js.map +1 -1
  45. package/controller/package.json +2 -2
  46. package/controller/src/__tests__/index.test.js +29 -50
  47. package/controller/src/defaults.js +5 -9
  48. package/controller/src/index.js +47 -33
  49. package/controller/src/utils.js +9 -6
  50. package/docs/config-schema.json +217 -0
  51. package/docs/config-schema.json.md +169 -0
  52. package/docs/demo/config.js +2 -2
  53. package/docs/demo/generate.js +53 -35
  54. package/docs/demo/session.js +2 -2
  55. package/docs/pie-schema.json +49 -0
  56. package/docs/pie-schema.json.md +36 -0
  57. package/lib/hotspot/container.js +24 -6
  58. package/lib/hotspot/container.js.map +1 -1
  59. package/lib/hotspot/icons.js.map +1 -1
  60. package/lib/hotspot/image.js.map +1 -1
  61. package/lib/hotspot/index.js +65 -5
  62. package/lib/hotspot/index.js.map +1 -1
  63. package/lib/hotspot/polygon.js +45 -19
  64. package/lib/hotspot/polygon.js.map +1 -1
  65. package/lib/hotspot/rectangle.js +45 -19
  66. package/lib/hotspot/rectangle.js.map +1 -1
  67. package/lib/index.js +3 -0
  68. package/lib/index.js.map +1 -1
  69. package/lib/session-updater.js.map +1 -1
  70. package/package.json +6 -4
  71. package/src/__tests__/__snapshots__/{container-test.jsx.snap → container.test.jsx.snap} +8 -0
  72. package/src/__tests__/__snapshots__/image.test.jsx.snap +43 -0
  73. package/src/__tests__/__snapshots__/{polygon-test.jsx.snap → polygon.test.jsx.snap} +11 -0
  74. package/src/__tests__/__snapshots__/{rectangle-test.jsx.snap → rectangle.test.jsx.snap} +11 -0
  75. package/src/__tests__/container.test.jsx +214 -0
  76. package/src/__tests__/{image-test.jsx → image.test.jsx} +2 -2
  77. package/src/__tests__/polygon.test.jsx +235 -0
  78. package/src/__tests__/rectangle.test.jsx +237 -0
  79. package/src/__tests__/{session-updater-test.jsx → session-updater.test.jsx} +22 -31
  80. package/src/hotspot/container.jsx +40 -23
  81. package/src/hotspot/icons.js +4 -2
  82. package/src/hotspot/image.jsx +4 -8
  83. package/src/hotspot/index.jsx +73 -33
  84. package/src/hotspot/polygon.jsx +48 -30
  85. package/src/hotspot/rectangle.jsx +48 -30
  86. package/src/index.js +10 -18
  87. package/src/session-updater.js +1 -1
  88. package/src/__tests__/__snapshots__/image-test.jsx.snap +0 -21
  89. package/src/__tests__/container-test.jsx +0 -143
  90. package/src/__tests__/polygon-test.jsx +0 -77
  91. package/src/__tests__/rectangle-test.jsx +0 -78
@@ -14,10 +14,10 @@ class PolygonComponent extends React.Component {
14
14
  getPolygonCenter = (points) => {
15
15
  const x = points.map(({ x }) => x);
16
16
  const y = points.map(({ y }) => y);
17
- const minX = Math.min.apply (null, x);
18
- const maxX = Math.max.apply (null, x);
19
- const minY = Math.min.apply (null, y);
20
- const maxY = Math.max.apply (null, y);
17
+ const minX = Math.min.apply(null, x);
18
+ const maxX = Math.max.apply(null, x);
19
+ const minY = Math.min.apply(null, y);
20
+ const maxY = Math.max.apply(null, y);
21
21
  return [(minX + maxX) / 2, (minY + maxY) / 2];
22
22
  };
23
23
 
@@ -51,9 +51,11 @@ class PolygonComponent extends React.Component {
51
51
  document.body.style.cursor = 'default';
52
52
  };
53
53
 
54
- getEvaluateOutlineColor = (isCorrect, outlineColor) => isCorrect ? outlineColor : 'red';
54
+ getEvaluateOutlineColor = (isCorrect, markAsCorrect, outlineColor) =>
55
+ markAsCorrect ? 'green' : isCorrect ? outlineColor : 'red';
55
56
 
56
- getOutlineWidth = (selected, strokeWidth) => selected ? strokeWidth : 0;
57
+ getOutlineWidth = (showCorrectEnabled, selected, markAsCorrect, strokeWidth) =>
58
+ markAsCorrect || (!markAsCorrect && !showCorrectEnabled && selected) ? strokeWidth : 0;
57
59
 
58
60
  render() {
59
61
  const {
@@ -65,37 +67,56 @@ class PolygonComponent extends React.Component {
65
67
  selected,
66
68
  points,
67
69
  evaluateText,
68
- strokeWidth
70
+ strokeWidth,
71
+ scale,
72
+ markAsCorrect,
73
+ showCorrectEnabled,
69
74
  } = this.props;
70
75
 
71
76
  const outlineColorParsed = isEvaluateMode
72
- ? this.getEvaluateOutlineColor(isCorrect, outlineColor)
77
+ ? this.getEvaluateOutlineColor(isCorrect, markAsCorrect, outlineColor)
73
78
  : outlineColor;
74
- const outlineWidth = this.getOutlineWidth(selected, strokeWidth);
79
+ const outlineWidth = this.getOutlineWidth(showCorrectEnabled, selected, markAsCorrect, strokeWidth);
75
80
 
76
81
  const pointsParsed = this.parsePointsForKonva(points);
77
82
  const center = this.getPolygonCenter(points);
78
83
  const iconX = center[0];
79
84
  const iconY = center[1];
80
85
 
81
- // Correctly selected hotspot: white checkmark in green circle (plus the selected hotspot will have a heavy outline, as on “Gather”)
82
- // Correctly not selected hotspot: none
83
- // Incorrectly selected hostpot: white “X” in red circle, plus the heavy outline around the selection should appear in red
84
- // Incorrectly not selected hotspot: white “X” in red circle
86
+ // "Show Correct Answer" Enabled:
87
+ // - Correctly Selected: white checkmark in green circle
88
+ // - Correctly Not Selected: none
89
+ // - Incorrectly Selected: none
90
+ // - Incorrectly Not Selected: white checkmark in green circle
91
+ // "Show Correct Answer" Disabled:
92
+ // - Correctly Selected:
93
+ // - white checkmark in green circle
94
+ // - heavy outline, as on “Gather”
95
+ // - Correctly Not Selected: none
96
+ // - Incorrectly Selected:
97
+ // - white "X" in red circle
98
+ // - heavy outline around the selection should appear in red
99
+ // - Incorrectly Not Selected: white "X" in red circle
85
100
  let iconSrc;
86
101
 
87
- if (selected) {
88
- if (isCorrect) {
102
+ if (showCorrectEnabled) {
103
+ if ((selected && isCorrect) || (!selected && !isCorrect)) {
89
104
  iconSrc = faCorrect;
90
- } else {
105
+ }
106
+ } else {
107
+ if (selected) {
108
+ if (isCorrect) {
109
+ iconSrc = faCorrect;
110
+ } else {
111
+ iconSrc = faWrong;
112
+ }
113
+ } else if (!isCorrect) {
91
114
  iconSrc = faWrong;
92
115
  }
93
- } else if (!isCorrect) {
94
- iconSrc = faWrong;
95
116
  }
96
117
 
97
118
  return (
98
- <Group>
119
+ <Group scaleX={scale} scaleY={scale}>
99
120
  <Line
100
121
  points={pointsParsed}
101
122
  closed={true}
@@ -109,14 +130,7 @@ class PolygonComponent extends React.Component {
109
130
  onMouseLeave={this.handleMouseLeave}
110
131
  onMouseEnter={this.handleMouseEnter}
111
132
  />
112
- {(isEvaluateMode && iconSrc) ? (
113
- <Image
114
- src={iconSrc}
115
- x={iconX}
116
- y={iconY}
117
- tooltip={evaluateText}
118
- />
119
- ): null}
133
+ {isEvaluateMode && iconSrc ? <Image src={iconSrc} x={iconX} y={iconY} tooltip={evaluateText} /> : null}
120
134
  </Group>
121
135
  );
122
136
  }
@@ -126,7 +140,7 @@ const styles = () => ({
126
140
  base: {
127
141
  cursor: 'pointer',
128
142
  opacity: 0.5,
129
- position: 'relative'
143
+ position: 'relative',
130
144
  },
131
145
  });
132
146
 
@@ -142,12 +156,16 @@ PolygonComponent.propTypes = {
142
156
  points: PropTypes.array.isRequired,
143
157
  selected: PropTypes.bool.isRequired,
144
158
  evaluateText: PropTypes.string,
145
- strokeWidth: PropTypes.number
159
+ strokeWidth: PropTypes.number,
160
+ scale: PropTypes.number,
161
+ markAsCorrect: PropTypes.bool.isRequired,
162
+ showCorrectEnabled: PropTypes.bool.isRequired,
146
163
  };
147
164
 
148
165
  PolygonComponent.defaultProps = {
149
166
  evaluateText: null,
150
- strokeWidth: 5
167
+ strokeWidth: 5,
168
+ scale: 1,
151
169
  };
152
170
 
153
171
  export default withStyles(styles)(PolygonComponent);
@@ -32,9 +32,11 @@ class RectComponent extends React.Component {
32
32
  document.body.style.cursor = 'default';
33
33
  };
34
34
 
35
- getEvaluateOutlineColor = (isCorrect, outlineColor) => isCorrect ? outlineColor : 'red';
35
+ getEvaluateOutlineColor = (isCorrect, markAsCorrect, outlineColor) =>
36
+ markAsCorrect ? 'green' : isCorrect ? outlineColor : 'red';
36
37
 
37
- getOutlineWidth = (selected, strokeWidth) => selected ? strokeWidth : 0;
38
+ getOutlineWidth = (showCorrectEnabled, selected, markAsCorrect, strokeWidth) =>
39
+ markAsCorrect || (!markAsCorrect && !showCorrectEnabled && selected) ? strokeWidth : 0;
38
40
 
39
41
  render() {
40
42
  const {
@@ -49,36 +51,55 @@ class RectComponent extends React.Component {
49
51
  x,
50
52
  y,
51
53
  evaluateText,
52
- strokeWidth
54
+ strokeWidth,
55
+ scale,
56
+ markAsCorrect,
57
+ showCorrectEnabled,
53
58
  } = this.props;
54
59
 
55
60
  const outlineColorParsed = isEvaluateMode
56
- ? this.getEvaluateOutlineColor(isCorrect, outlineColor)
61
+ ? this.getEvaluateOutlineColor(isCorrect, markAsCorrect, outlineColor)
57
62
  : outlineColor;
58
63
 
59
- const outlineWidth = this.getOutlineWidth(selected, strokeWidth);
60
-
61
- const iconX = (x + (width / 2)) - 10;
62
- const iconY = (y + (height / 2)) - 10;
63
-
64
- // Correctly selected hotspot: white checkmark in green circle (plus the selected hotspot will have a heavy outline, as on “Gather”)
65
- // Correctly not selected hotspot: none
66
- // Incorrectly selected hostpot: white “X” in red circle, plus the heavy outline around the selection should appear in red
67
- // Incorrectly not selected hotspot: white “X” in red circle
64
+ const outlineWidth = this.getOutlineWidth(showCorrectEnabled, selected, markAsCorrect, strokeWidth);
65
+
66
+ const iconX = x + width / 2 - 10;
67
+ const iconY = y + height / 2 - 10;
68
+
69
+ // "Show Correct Answer" Enabled:
70
+ // - Correctly Selected: white checkmark in green circle
71
+ // - Correctly Not Selected: none
72
+ // - Incorrectly Selected: none
73
+ // - Incorrectly Not Selected: white checkmark in green circle
74
+ // "Show Correct Answer" Disabled:
75
+ // - Correctly Selected:
76
+ // - white checkmark in green circle
77
+ // - heavy outline, as on “Gather”
78
+ // - Correctly Not Selected: none
79
+ // - Incorrectly Selected:
80
+ // - white "X" in red circle
81
+ // - heavy outline around the selection should appear in red
82
+ // - Incorrectly Not Selected: white "X" in red circle
68
83
  let iconSrc;
69
84
 
70
- if (selected) {
71
- if (isCorrect) {
85
+ if (showCorrectEnabled) {
86
+ if ((selected && isCorrect) || (!selected && !isCorrect)) {
72
87
  iconSrc = faCorrect;
73
- } else {
88
+ }
89
+ } else {
90
+ if (selected) {
91
+ if (isCorrect) {
92
+ iconSrc = faCorrect;
93
+ } else {
94
+ iconSrc = faWrong;
95
+ }
96
+ } else if (!isCorrect) {
74
97
  iconSrc = faWrong;
75
98
  }
76
- } else if (!isCorrect) {
77
- iconSrc = faWrong;
78
99
  }
79
100
 
80
101
  return (
81
- <Group>
102
+ <Group scaleX={scale} scaleY={scale}>
82
103
  <Rect
83
104
  classes={classes.base}
84
105
  width={width}
@@ -94,14 +115,7 @@ class RectComponent extends React.Component {
94
115
  x={x}
95
116
  y={y}
96
117
  />
97
- {(isEvaluateMode && iconSrc) ? (
98
- <Image
99
- src={iconSrc}
100
- x={iconX}
101
- y={iconY}
102
- tooltip={evaluateText}
103
- />
104
- ): null}
118
+ {isEvaluateMode && iconSrc ? <Image src={iconSrc} x={iconX} y={iconY} tooltip={evaluateText} /> : null}
105
119
  </Group>
106
120
  );
107
121
  }
@@ -111,7 +125,7 @@ const styles = () => ({
111
125
  base: {
112
126
  cursor: 'pointer',
113
127
  opacity: 0.5,
114
- position: 'relative'
128
+ position: 'relative',
115
129
  },
116
130
  });
117
131
 
@@ -130,13 +144,17 @@ RectComponent.propTypes = {
130
144
  x: PropTypes.number.isRequired,
131
145
  y: PropTypes.number.isRequired,
132
146
  evaluateText: PropTypes.string,
133
- strokeWidth: PropTypes.number
147
+ strokeWidth: PropTypes.number,
148
+ scale: PropTypes.number,
149
+ markAsCorrect: PropTypes.bool.isRequired,
150
+ showCorrectEnabled: PropTypes.bool.isRequired,
134
151
  };
135
152
 
136
153
  RectComponent.defaultProps = {
137
154
  isCorrect: false,
138
155
  evaluateText: null,
139
- strokeWidth: 5
156
+ strokeWidth: 5,
157
+ scale: 1,
140
158
  };
141
159
 
142
160
  export default withStyles(styles)(RectComponent);
package/src/index.js CHANGED
@@ -1,10 +1,7 @@
1
1
  import React from 'react';
2
2
  import ReactDOM from 'react-dom';
3
3
  import { renderMath } from '@pie-lib/math-rendering';
4
- import {
5
- SessionChangedEvent,
6
- ModelSetEvent
7
- } from '@pie-framework/pie-player-events';
4
+ import { SessionChangedEvent, ModelSetEvent } from '@pie-framework/pie-player-events';
8
5
 
9
6
  import HotspotComponent from './hotspot';
10
7
  import { updateSessionValue } from './session-updater';
@@ -13,13 +10,7 @@ export default class Hotspot extends HTMLElement {
13
10
  set model(m) {
14
11
  this._model = m;
15
12
 
16
- this.dispatchEvent(
17
- new ModelSetEvent(
18
- this.tagName.toLowerCase(),
19
- this.isComplete(),
20
- !!this._model
21
- )
22
- );
13
+ this.dispatchEvent(new ModelSetEvent(this.tagName.toLowerCase(), this.isComplete(), !!this._model));
23
14
  this._render();
24
15
  }
25
16
 
@@ -28,9 +19,7 @@ export default class Hotspot extends HTMLElement {
28
19
  return false;
29
20
  }
30
21
 
31
- return (
32
- Array.isArray(this._session.answers) && this._session.answers.length > 0
33
- );
22
+ return Array.isArray(this._session.answers) && this._session.answers.length > 0;
34
23
  }
35
24
 
36
25
  set session(s) {
@@ -42,12 +31,14 @@ export default class Hotspot extends HTMLElement {
42
31
  this._render();
43
32
  }
44
33
 
34
+ get session() {
35
+ return this._session;
36
+ }
37
+
45
38
  onSelectChoice(data) {
46
39
  updateSessionValue(this._session, this._model, data);
47
40
 
48
- this.dispatchEvent(
49
- new SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete())
50
- );
41
+ this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete()));
51
42
 
52
43
  this._render();
53
44
  }
@@ -61,8 +52,9 @@ export default class Hotspot extends HTMLElement {
61
52
  const el = React.createElement(HotspotComponent, {
62
53
  model: this._model,
63
54
  session: this._session,
64
- onSelectChoice: this.onSelectChoice.bind(this)
55
+ onSelectChoice: this.onSelectChoice.bind(this),
65
56
  });
57
+
66
58
  ReactDOM.render(el, this, () => {
67
59
  renderMath(this);
68
60
  });
@@ -4,7 +4,7 @@ export function updateSessionValue(session, model, data) {
4
4
  session.answers = session.answers || [];
5
5
 
6
6
  if (!selected) {
7
- session.answers = session.answers.filter(answer => answer.id !== id);
7
+ session.answers = session.answers.filter((answer) => answer.id !== id);
8
8
  } else {
9
9
  const item = { id };
10
10
  if (multipleCorrect) {
@@ -1,21 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`Image snapshots image renders 1`] = `
4
- <Image
5
- height={20}
6
- image={null}
7
- width={20}
8
- x={5}
9
- y={5}
10
- />
11
- `;
12
-
13
- exports[`Image snapshots x y position renders 1`] = `
14
- <Image
15
- height={20}
16
- image={null}
17
- width={20}
18
- x={10}
19
- y={10}
20
- />
21
- `;
@@ -1,143 +0,0 @@
1
- import React from 'react';
2
- import _ from 'lodash';
3
- import { shallow } from 'enzyme';
4
- import toJson from 'enzyme-to-json';
5
- import Konva from 'konva';
6
-
7
- import Container, { Container as ContainerComp } from '../hotspot/container';
8
- import HotspotComponent from '../hotspot/index';
9
-
10
- Konva.isBrowser = false;
11
-
12
- describe('HotspotComponent', () => {
13
- describe('renders', () => {
14
- let wrapper;
15
-
16
- beforeEach(() => {
17
- wrapper = props => shallow(<HotspotComponent {...props} />);
18
- });
19
-
20
- it('snapshot', () => {
21
- let w = wrapper();
22
-
23
- expect(w).toMatchSnapshot();
24
- });
25
-
26
- it('snapshot with rationale', () => {
27
- let w = wrapper({ rationale: 'This is rationale' });
28
-
29
- expect(w).toMatchSnapshot();
30
- });
31
-
32
- it('snapshot with padding having a size accordingly to strokeWidth', () => {
33
- let w = shallow(<ContainerComp
34
- strokeWidth={50}
35
- classes={{}}
36
- dimensions={{ width: 100, height: 100 }}
37
- onSelectChoice={jest.fn()}
38
- disabled={false}
39
- hotspotColor='#000'
40
- outlineColor='#FAFAFA'
41
- imageUrl='data:image/jpeg;base64,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'
42
- isEvaluateMode={false}
43
- session={{ answers: [{ id: '1' }, { id: '2' }] }}
44
- shapes={{
45
- rectangles: [
46
- {
47
- id: '1',
48
- correct: true,
49
- x: 0,
50
- y: 0,
51
- width: 80,
52
- height: 80
53
- },
54
- ],
55
- polygons: []
56
- }}
57
- />);
58
-
59
- expect(w).toMatchSnapshot();
60
- });
61
- });
62
- });
63
-
64
- describe('Container', () => {
65
- let onSelectChoice, wrapper;
66
-
67
- const mkWrapper = (opts = {}) => {
68
- opts = _.extend(
69
- {
70
- classes: {
71
- base: 'base'
72
- },
73
- dimensions: {
74
- height: 0,
75
- width: 0
76
- },
77
- disabled: false,
78
- hotspotColor: 'rgba(137, 183, 244, 0.65)',
79
- imageUrl: '',
80
- isEvaluateMode: false,
81
- outlineColor: 'blue',
82
- session: { answers: [] },
83
- shapes: {
84
- rectangles: [],
85
- polygons: []
86
- }
87
- },
88
- opts
89
- );
90
-
91
- return shallow(<Container {...opts} onSelectChoice={onSelectChoice}/>);
92
- };
93
-
94
- beforeEach(() => {
95
- onSelectChoice = jest.fn();
96
- wrapper = mkWrapper();
97
- });
98
-
99
- describe('snapshots', () => {
100
- describe('outline color', () => {
101
- it('renders', () => {
102
- const wrapper = mkWrapper({ outlineColor: 'red' });
103
- expect(toJson(wrapper)).toMatchSnapshot();
104
- });
105
- });
106
-
107
- describe('hotspot color', () => {
108
- it('renders', () => {
109
- const wrapper = mkWrapper({ hotspotColor: 'rgba(217, 30, 24, 0.65)' });
110
- expect(toJson(wrapper)).toMatchSnapshot();
111
- });
112
- });
113
-
114
- describe('image', () => {
115
- it('renders', () => {
116
- const wrapper = mkWrapper({ imageUrl: 'https://picsum.photos/id/102/200/300' });
117
- expect(toJson(wrapper)).toMatchSnapshot();
118
- });
119
- });
120
-
121
- describe('shapes', () => {
122
- it('renders', () => {
123
- const wrapper = mkWrapper({
124
- shapes: {
125
- rectangles: [
126
- { id: '1', x: 5, y: 5, width: 5, height: 5 },
127
- { id: '2', x: 25, y: 25, width: 5, height: 5 }
128
- ],
129
- polygons: [
130
- { id: '3', points: [{ x: 94, y: 4 }, { x: 89, y: 4 }, { x: 36, y: 40 }] }
131
- ]
132
- },
133
- imageUrl: 'https://picsum.photos/id/102/200/300',
134
- dimensions: {
135
- width: 200,
136
- height: 300
137
- }
138
- });
139
- expect(toJson(wrapper)).toMatchSnapshot();
140
- });
141
- });
142
- });
143
- });
@@ -1,77 +0,0 @@
1
- import React from 'react';
2
- import _ from 'lodash';
3
- import { shallow } from 'enzyme';
4
- import toJson from 'enzyme-to-json';
5
- import Konva from 'konva';
6
-
7
- import Polygon from '../hotspot/polygon';
8
-
9
- Konva.isBrowser = false;
10
-
11
- describe('Polygon', () => {
12
- let onClick, wrapper;
13
-
14
- const mkWrapper = (opts = {}) => {
15
- opts = _.extend(
16
- {
17
- classes: {
18
- base: 'base'
19
- },
20
- height: 200,
21
- hotspotColor: 'rgba(137, 183, 244, 0.65)',
22
- id: '1',
23
- isCorrect: false,
24
- isEvaluateMode: false,
25
- evaluateText: null,
26
- disabled: false,
27
- outlineColor: 'blue',
28
- selected: false,
29
- points: [{ x: 94, y: 4 }, { x: 89, y: 4 }, { x: 36, y: 40 }]
30
- },
31
- opts
32
- );
33
-
34
- return shallow(<Polygon {...opts} onClick={onClick} />);
35
- };
36
-
37
- beforeEach(() => {
38
- onClick = jest.fn();
39
- wrapper = mkWrapper();
40
- });
41
-
42
- describe('snapshots', () => {
43
- describe('outline color', () => {
44
- it('renders', () => {
45
- const wrapper = mkWrapper({ outlineColor: 'red' });
46
- expect(toJson(wrapper)).toMatchSnapshot();
47
- });
48
- });
49
-
50
- describe('outline width', () => {
51
- it('renders with default border width', () => {
52
- const wrapper = mkWrapper();
53
- expect(toJson(wrapper)).toMatchSnapshot();
54
- });
55
-
56
- it('renders with given border width', () => {
57
- const wrapper = mkWrapper({ strokeWidth: 10 });
58
- expect(toJson(wrapper)).toMatchSnapshot();
59
- });
60
- });
61
-
62
-
63
- describe('hotspot color', () => {
64
- it('renders', () => {
65
- const wrapper = mkWrapper({ hotspotColor: 'rgba(217, 30, 24, 0.65)' });
66
- expect(toJson(wrapper)).toMatchSnapshot();
67
- });
68
- });
69
-
70
- describe('evaluate with correct answer', () => {
71
- it('renders', () => {
72
- const wrapper = mkWrapper({ isEvaluateMode: true, isCorrect: true, evaluateText: 'Correctly\nselected' });
73
- expect(toJson(wrapper)).toMatchSnapshot();
74
- });
75
- });
76
- });
77
- });
@@ -1,78 +0,0 @@
1
- import React from 'react';
2
- import _ from 'lodash';
3
- import { shallow } from 'enzyme';
4
- import toJson from 'enzyme-to-json';
5
- import Konva from 'konva';
6
-
7
- import Rectangle from '../hotspot/rectangle';
8
-
9
- Konva.isBrowser = false;
10
-
11
- describe('Rectangle', () => {
12
- let onClick, wrapper;
13
-
14
- const mkWrapper = (opts = {}) => {
15
- opts = _.extend(
16
- {
17
- classes: {
18
- base: 'base'
19
- },
20
- height: 200,
21
- hotspotColor: 'rgba(137, 183, 244, 0.65)',
22
- id: '1',
23
- isCorrect: false,
24
- isEvaluateMode: false,
25
- evaluateText: null,
26
- disabled: false,
27
- outlineColor: 'blue',
28
- selected: false,
29
- width: 300,
30
- x: 5,
31
- y: 5
32
- },
33
- opts
34
- );
35
-
36
- return shallow(<Rectangle {...opts} onClick={onClick} />);
37
- };
38
-
39
- beforeEach(() => {
40
- onClick = jest.fn();
41
- wrapper = mkWrapper();
42
- });
43
-
44
- describe('snapshots', () => {
45
- describe('outline color', () => {
46
- it('renders', () => {
47
- const wrapper = mkWrapper({ outlineColor: 'red' });
48
- expect(toJson(wrapper)).toMatchSnapshot();
49
- });
50
- });
51
-
52
- describe('outline width', () => {
53
- it('renders with default border width', () => {
54
- const wrapper = mkWrapper();
55
- expect(toJson(wrapper)).toMatchSnapshot();
56
- });
57
-
58
- it('renders with given border width', () => {
59
- const wrapper = mkWrapper({ strokeWidth: 10 });
60
- expect(toJson(wrapper)).toMatchSnapshot();
61
- });
62
- });
63
-
64
- describe('hotspot color', () => {
65
- it('renders', () => {
66
- const wrapper = mkWrapper({ hotspotColor: 'rgba(217, 30, 24, 0.65)' });
67
- expect(toJson(wrapper)).toMatchSnapshot();
68
- });
69
- });
70
-
71
- describe('evaluate with correct answer', () => {
72
- it('renders', () => {
73
- const wrapper = mkWrapper({ isEvaluateMode: true, isCorrect: true, evaluateText: 'Correctly\nselected' });
74
- expect(toJson(wrapper)).toMatchSnapshot();
75
- });
76
- });
77
- });
78
- });