q5 2.9.22 → 2.9.24

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 (70) hide show
  1. package/.vscode/launch.json +26 -0
  2. package/bun.lockb +0 -0
  3. package/p5-tests/js/chai_helpers.js +20 -0
  4. package/p5-tests/js/mocha_setup.js +2 -0
  5. package/p5-tests/js/modernizr.js +5 -0
  6. package/p5-tests/js/p5_helpers.js +135 -0
  7. package/p5-tests/js/sinon.js +5949 -0
  8. package/p5-tests/mocha.css +289 -0
  9. package/p5-tests/test.html +71 -0
  10. package/p5-tests/unit/color/color_conversion.js +68 -0
  11. package/p5-tests/unit/color/creating_reading.js +217 -0
  12. package/p5-tests/unit/color/p5.Color.js +1000 -0
  13. package/p5-tests/unit/color/setting.js +289 -0
  14. package/p5-tests/unit/core/2d_primitives.js +490 -0
  15. package/p5-tests/unit/core/attributes.js +115 -0
  16. package/p5-tests/unit/core/curves.js +139 -0
  17. package/p5-tests/unit/core/environment.js +248 -0
  18. package/p5-tests/unit/core/error_helpers.js +1158 -0
  19. package/p5-tests/unit/core/main.js +340 -0
  20. package/p5-tests/unit/core/p5.Element.js +773 -0
  21. package/p5-tests/unit/core/p5.Graphics.js +179 -0
  22. package/p5-tests/unit/core/preload.js +285 -0
  23. package/p5-tests/unit/core/rendering.js +116 -0
  24. package/p5-tests/unit/core/structure.js +293 -0
  25. package/p5-tests/unit/core/transform.js +144 -0
  26. package/p5-tests/unit/core/version.js +28 -0
  27. package/p5-tests/unit/core/vertex.js +137 -0
  28. package/p5-tests/unit/dom/dom.js +2146 -0
  29. package/p5-tests/unit/events/acceleration.js +213 -0
  30. package/p5-tests/unit/events/keyboard.js +179 -0
  31. package/p5-tests/unit/events/mouse.js +487 -0
  32. package/p5-tests/unit/events/touch.js +180 -0
  33. package/p5-tests/unit/image/downloading.js +379 -0
  34. package/p5-tests/unit/image/filters.js +92 -0
  35. package/p5-tests/unit/image/loading.js +413 -0
  36. package/p5-tests/unit/image/p5.Image.js +201 -0
  37. package/p5-tests/unit/image/pixels.js +234 -0
  38. package/p5-tests/unit/io/files.js +378 -0
  39. package/p5-tests/unit/io/loadBytes.js +149 -0
  40. package/p5-tests/unit/io/loadImage.js +123 -0
  41. package/p5-tests/unit/io/loadJSON.js +185 -0
  42. package/p5-tests/unit/io/loadModel.js +215 -0
  43. package/p5-tests/unit/io/loadShader.js +176 -0
  44. package/p5-tests/unit/io/loadStrings.js +140 -0
  45. package/p5-tests/unit/io/loadTable.js +183 -0
  46. package/p5-tests/unit/io/loadXML.js +127 -0
  47. package/p5-tests/unit/io/saveModel.js +113 -0
  48. package/p5-tests/unit/io/saveTable.js +142 -0
  49. package/p5-tests/unit/math/calculation.js +452 -0
  50. package/p5-tests/unit/math/noise.js +66 -0
  51. package/p5-tests/unit/math/p5.Vector.js +1886 -0
  52. package/p5-tests/unit/math/random.js +177 -0
  53. package/p5-tests/unit/math/trigonometry.js +144 -0
  54. package/p5-tests/unit/spec.js +50 -0
  55. package/p5-tests/unit/typography/attributes.js +120 -0
  56. package/p5-tests/unit/typography/loadFont.js +162 -0
  57. package/p5-tests/unit/typography/p5.Font.js +63 -0
  58. package/p5-tests/unit/utilities/conversion.js +329 -0
  59. package/p5-tests/unit/utilities/time_date.js +133 -0
  60. package/package.json +1 -1
  61. package/q5.d.ts +172 -55
  62. package/q5.js +55 -40
  63. package/q5.min.js +1 -1
  64. package/src/q5-2d-image.js +7 -3
  65. package/src/q5-core.js +6 -2
  66. package/src/q5-math.js +1 -0
  67. package/src/q5-webgpu-canvas.js +8 -7
  68. package/src/q5-webgpu-drawing.js +15 -12
  69. package/src/q5-webgpu-image.js +1 -1
  70. package/src/q5-webgpu-text.js +17 -15
@@ -0,0 +1,139 @@
1
+ suite('Curves', function() {
2
+ var myp5;
3
+
4
+ setup(function(done) {
5
+ new p5(function(p) {
6
+ p.setup = function() {
7
+ myp5 = p;
8
+ done();
9
+ };
10
+ });
11
+ });
12
+
13
+ teardown(function() {
14
+ myp5.remove();
15
+ });
16
+
17
+ suite('p5.prototype.bezier', function() {
18
+ test('should be a function', function() {
19
+ assert.ok(myp5.bezier);
20
+ assert.typeOf(myp5.bezier, 'function');
21
+ });
22
+ test('no friendly-err-msg', function() {
23
+ assert.doesNotThrow(
24
+ function() {
25
+ myp5.bezier(85, 20, 10, 10, 90, 90, 15, 80);
26
+ },
27
+ Error,
28
+ 'got unwanted exception'
29
+ );
30
+ });
31
+ test('no friendly-err-msg. missing param #6, #7', function() {
32
+ assert.validationError(function() {
33
+ myp5.bezier(85, 20, 10, 10, 90, 90);
34
+ });
35
+ });
36
+ test('wrong param type at #0', function() {
37
+ assert.validationError(function() {
38
+ myp5.bezier('a', 20, 10, 10, 90, 90, 15, 80);
39
+ });
40
+ });
41
+ });
42
+
43
+ suite('p5.prototype.bezierPoint', function() {
44
+ var result;
45
+ test('should be a function', function() {
46
+ assert.ok(myp5.bezierPoint);
47
+ assert.typeOf(myp5.bezierPoint, 'function');
48
+ });
49
+ test('should return a number: missing param #0~4', function() {
50
+ assert.validationError(function() {
51
+ result = myp5.bezierPoint();
52
+ });
53
+ });
54
+ test('should return the correct point on a Bezier Curve', function() {
55
+ result = myp5.bezierPoint(85, 10, 90, 15, 0.5);
56
+ assert.equal(result, 50);
57
+ assert.notEqual(result, -1);
58
+ });
59
+ });
60
+
61
+ suite('p5.prototype.bezierTangent', function() {
62
+ var result;
63
+ test('should be a function', function() {
64
+ assert.ok(myp5.bezierTangent);
65
+ assert.typeOf(myp5.bezierTangent, 'function');
66
+ });
67
+ test('should return a number: missing param #0~4', function() {
68
+ assert.validationError(function() {
69
+ result = myp5.bezierTangent();
70
+ });
71
+ });
72
+ test('should return the correct point on a Bezier Curve', function() {
73
+ result = myp5.bezierTangent(95, 73, 73, 15, 0.5);
74
+ assert.equal(result, -60);
75
+ });
76
+ });
77
+
78
+ suite('p5.prototype.curve', function() {
79
+ test('should be a function', function() {
80
+ assert.ok(myp5.curve);
81
+ assert.typeOf(myp5.curve, 'function');
82
+ });
83
+ test('no friendly-err-msg', function() {
84
+ assert.doesNotThrow(
85
+ function() {
86
+ myp5.curve(5, 26, 5, 26, 73, 24, 73, 61);
87
+ },
88
+ Error,
89
+ 'got unwanted exception'
90
+ );
91
+ });
92
+ test('no friendly-err-msg. missing param #6, #7', function() {
93
+ assert.validationError(function() {
94
+ myp5.curve(5, 26, 5, 26, 73, 24);
95
+ });
96
+ });
97
+ test('wrong param type at #0', function() {
98
+ assert.validationError(function() {
99
+ myp5.curve('a', 26, 5, 26, 73, 24, 73, 61);
100
+ });
101
+ });
102
+ });
103
+
104
+ suite('p5.prototype.curvePoint', function() {
105
+ var result;
106
+ test('should be a function', function() {
107
+ assert.ok(myp5.curvePoint);
108
+ assert.typeOf(myp5.curvePoint, 'function');
109
+ });
110
+ test('should return a number: missing param #0~4', function() {
111
+ assert.validationError(function() {
112
+ result = myp5.curvePoint();
113
+ });
114
+ });
115
+ test('should return the correct point on a Catmull-Rom Curve', function() {
116
+ result = myp5.curvePoint(5, 5, 73, 73, 0.5);
117
+ assert.equal(result, 39);
118
+ assert.notEqual(result, -1);
119
+ });
120
+ });
121
+
122
+ suite('p5.prototype.curveTangent', function() {
123
+ var result;
124
+ test('should be a function', function() {
125
+ assert.ok(myp5.curveTangent);
126
+ assert.typeOf(myp5.curveTangent, 'function');
127
+ });
128
+ test('should return a number: missing param #0~4', function() {
129
+ assert.validationError(function() {
130
+ result = myp5.curveTangent();
131
+ });
132
+ });
133
+ test('should return the correct point on a Catmull-Rom Curve', function() {
134
+ result = myp5.curveTangent(95, 73, 73, 15, 0.5);
135
+ assert.equal(result, 10);
136
+ assert.notEqual(result, -1);
137
+ });
138
+ });
139
+ });
@@ -0,0 +1,248 @@
1
+ suite('Environment', function() {
2
+ var myp5;
3
+
4
+ setup(function(done) {
5
+ new p5(function(p) {
6
+ p.setup = function() {
7
+ myp5 = p;
8
+ done();
9
+ };
10
+ });
11
+ });
12
+
13
+ teardown(function() {
14
+ myp5.remove();
15
+ });
16
+
17
+ suite('p5.frameCount', function() {
18
+ test('starts at zero', function() {
19
+ return new Promise(function(resolve, reject) {
20
+ // Has to use a custom p5 to hook setup correctly
21
+ new p5(function(p) {
22
+ p.setup = function() {
23
+ if (p.frameCount !== 0) {
24
+ reject('frameCount is not 0 in setup');
25
+ }
26
+ };
27
+ p.draw = function() {
28
+ if (p.frameCount === 1) {
29
+ resolve();
30
+ }
31
+ };
32
+ });
33
+ });
34
+ });
35
+ test('matches draw calls', function() {
36
+ return new Promise(function(resolve, reject) {
37
+ var frames = myp5.frameCount;
38
+ var start = myp5.frameCount;
39
+ myp5.draw = function() {
40
+ try {
41
+ frames += 1;
42
+ assert.equal(myp5.frameCount, frames);
43
+ if (frames === start + 5) {
44
+ // Test 5 seperate redraws
45
+ myp5.noLoop();
46
+ setTimeout(myp5.redraw.bind(myp5), 10);
47
+ setTimeout(myp5.redraw.bind(myp5), 20);
48
+ setTimeout(myp5.redraw.bind(myp5), 30);
49
+ setTimeout(myp5.redraw.bind(myp5), 40);
50
+ setTimeout(myp5.redraw.bind(myp5), 50);
51
+ } else if (frames === start + 10) {
52
+ // Test loop resuming
53
+ myp5.loop();
54
+ } else if (frames === start + 15) {
55
+ // Test queuing multiple redraws
56
+ myp5.noLoop();
57
+ setTimeout(myp5.redraw.bind(myp5, 5), 10);
58
+ } else if (frames === start + 20) {
59
+ resolve();
60
+ }
61
+ assert.equal(myp5.frameCount, frames);
62
+ } catch (err) {
63
+ reject(err);
64
+ }
65
+ };
66
+ });
67
+ });
68
+ });
69
+
70
+ suite('p5.prototype.focused', function() {
71
+ test('it should return true on focus', function() {
72
+ window.dispatchEvent(new Event('focus'));
73
+ assert.strictEqual(myp5.focused, true);
74
+ });
75
+
76
+ test('it should return true on blur', function() {
77
+ window.dispatchEvent(new Event('blur'));
78
+ assert.strictEqual(myp5.focused, false);
79
+ });
80
+ });
81
+
82
+ suite('p5.prototype.cursor', function() {
83
+ test('should change cursor to cross', function() {
84
+ myp5.cursor(myp5.CROSS);
85
+ assert.strictEqual(myp5._curElement.elt.style.cursor, 'crosshair');
86
+ });
87
+ });
88
+
89
+ suite('p5.prototype.noCursor', function() {
90
+ test('should change cursor to none', function() {
91
+ myp5.noCursor();
92
+ assert.strictEqual(myp5._curElement.elt.style.cursor, 'none');
93
+ });
94
+ });
95
+
96
+ suite('p5.prototype.frameRate', function() {
97
+ test('returns 0 on first draw call', function() {
98
+ assert.strictEqual(myp5.frameRate(), 0);
99
+ });
100
+
101
+ test('returns current frame rate after first draw call', function() {
102
+ return new Promise(function(resolve, reject) {
103
+ new p5(function(p) {
104
+ p.draw = function() {
105
+ if (p.frameCount === 2 && p.frameRate() > 0) {
106
+ resolve();
107
+ p.remove();
108
+ }
109
+ };
110
+ });
111
+ });
112
+ });
113
+
114
+ test('wrong param type. throws error.', function() {
115
+ assert.validationError(function() {
116
+ myp5.frameRate('a');
117
+ });
118
+ });
119
+
120
+ test('p5.prototype.getFrameRate', function() {
121
+ assert.strictEqual(myp5.getFrameRate(), 0);
122
+ });
123
+
124
+ suite('drawing with target frame rates', function() {
125
+ let clock;
126
+ let prevRequestAnimationFrame;
127
+ let nextFrameCallback = () => {};
128
+ let controlledP5;
129
+
130
+ setup(function() {
131
+ clock = sinon.useFakeTimers(0);
132
+ sinon.stub(window.performance, 'now', Date.now);
133
+
134
+ // Save the real requestAnimationFrame so we can restore it later
135
+ prevRequestAnimationFrame = window.requestAnimationFrame;
136
+ // Use a fake requestAnimationFrame that just stores a ref to the callback
137
+ // so that we can call it manually
138
+ window.requestAnimationFrame = function(cb) {
139
+ nextFrameCallback = cb;
140
+ };
141
+
142
+ return new Promise(function(resolve) {
143
+ controlledP5 = new p5(function(p) {
144
+ p.setup = function() {
145
+ p.createCanvas(10, 10);
146
+ p.frameRate(60);
147
+ p.loop();
148
+ resolve(p);
149
+ };
150
+
151
+ p.draw = function() {};
152
+ });
153
+ });
154
+ });
155
+
156
+ teardown(function() {
157
+ clock.restore();
158
+ window.performance.now.restore();
159
+ window.requestAnimationFrame = prevRequestAnimationFrame;
160
+ nextFrameCallback = function() {};
161
+ controlledP5.remove();
162
+ });
163
+
164
+ test('draw() is called at the correct frame rate given a faster display', function() {
165
+ sinon.spy(controlledP5, 'draw');
166
+
167
+ clock.tick(1000 / 200); // Simulate a 200Hz refresh rate
168
+ nextFrameCallback(); // trigger the next requestAnimationFrame
169
+ assert(controlledP5.draw.notCalled, 'draw() should not be called before 1s/60');
170
+
171
+ // Advance until 5ms before the next frame should render.
172
+ // This should be within p5's threshold for rendering the frame.
173
+ clock.tick(1000 / 60 - 1000 / 200 - 5);
174
+ nextFrameCallback(); // trigger the next requestAnimationFrame
175
+ assert(controlledP5.draw.calledOnce, 'one frame should have been drawn');
176
+ // deltaTime should reflect real elapsed time
177
+ assert.equal(controlledP5.deltaTime, 1000 / 60 - 5);
178
+
179
+ // Advance enough time forward to be 1s/60 - 5ms from the last draw
180
+ clock.tick(1000 / 60 - 5);
181
+ nextFrameCallback(); // trigger the next requestAnimationFrame
182
+ // Even though this is 1s/60 - 5ms from the last draw, the last frame came
183
+ // in early, so we still shouldn't draw
184
+ assert(controlledP5.draw.calledOnce, 'draw() should not be called before 1s/60 past the last target draw time');
185
+
186
+ // Advance enough time forward to be 1s/60 from the last draw
187
+ clock.tick(5);
188
+ nextFrameCallback();
189
+ assert(controlledP5.draw.calledTwice); // Now it should draw again!
190
+ // deltaTime should reflect real elapsed time
191
+ assert.equal(controlledP5.deltaTime, 1000 / 60);
192
+ });
193
+ });
194
+ });
195
+
196
+ suite('p5.prototype.getTargetFrameRate', function() {
197
+ test('returns 60 on the first call', function() {
198
+ assert.strictEqual(myp5.getTargetFrameRate(), 60);
199
+ });
200
+
201
+ test('returns set value of randomize integer', function() {
202
+ let randVal = Math.floor(Math.random()*120);
203
+ myp5.frameRate(randVal);
204
+ assert.strictEqual(myp5.getTargetFrameRate(), randVal);
205
+ });
206
+ });
207
+
208
+ suite('Canvas dimensions', function() {
209
+ test('p5.prototype.width', function() {
210
+ myp5.createCanvas(20, 30);
211
+ assert.strictEqual(myp5.width, 20);
212
+ });
213
+
214
+ test('p5.prototype.height', function() {
215
+ myp5.createCanvas(20, 30);
216
+ assert.strictEqual(myp5.height, 30);
217
+ });
218
+ });
219
+
220
+ suite('p5.prototype.pixelDensity', function() {
221
+ test('returns the pixel density', function() {
222
+ assert.isNumber(myp5.pixelDensity());
223
+ });
224
+
225
+ test('sets the pixel density', function() {
226
+ myp5.pixelDensity(2);
227
+ assert.strictEqual(myp5.pixelDensity(), 2);
228
+ });
229
+
230
+ test('wrong param type. throws validationError.', function() {
231
+ assert.validationError(function() {
232
+ myp5.pixelDensity('a');
233
+ });
234
+ });
235
+ });
236
+
237
+ suite('p5.prototype.displayDensity', function() {
238
+ test('returns the pixel density of the display', function() {
239
+ assert.isNumber(myp5.displayDensity());
240
+ });
241
+
242
+ test('pixelDensity does not change display density', function() {
243
+ let pd = myp5.displayDensity();
244
+ myp5.pixelDensity(pd + 1);
245
+ assert.isNumber(myp5.displayDensity(), pd);
246
+ });
247
+ });
248
+ });