Skip to content

Commit f8f58f0

Browse files
(Gsoc'21)➕Added tests for soundLoop.js
1 parent 68014bd commit f8f58f0

File tree

3 files changed

+167
-1
lines changed

3 files changed

+167
-1
lines changed

src/soundLoop.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,11 @@ class SoundLoop {
165165
*
166166
* The callback should only be called until maxIterations is reached
167167
*/
168-
if (timeFromNow > 0 && self.iterations <= self.maxIterations) {
168+
if (
169+
timeFromNow > 0 &&
170+
self.iterations <= self.maxIterations &&
171+
self.callback
172+
) {
169173
self.callback(timeFromNow);
170174
}
171175
},

test/tests.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import('./tests/p5.Effect.js');
1010
import('./tests/p5.Filter.js');
1111
import('./tests/p5.Gain.js');
1212
import('./tests/p5.FFT.js');
13+
import('./tests/p5.SoundLoop.js');
1314
import('./tests/p5.Compressor.js');
1415
import('./tests/p5.EQ.js');
1516
import('./tests/p5.AudioIn.js');

test/tests/p5.SoundLoop.js

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
const expect = chai.expect;
2+
3+
describe('p5.SoundLoop', function () {
4+
it('can be initialized without any arguments', function () {
5+
let sloop = new p5.SoundLoop();
6+
expect(sloop._bpm).to.equal(60);
7+
expect(sloop.musicalTimeMode).to.be.false;
8+
expect(sloop._interval).to.equal(1);
9+
expect(sloop._timeSignature).to.equal(4);
10+
expect(sloop.isPlaying).to.be.false;
11+
});
12+
it('can be initialized with all arguments', function () {
13+
let sloop = new p5.SoundLoop(() => {}, '8n');
14+
15+
//bpm
16+
sloop.bpm = 85;
17+
expect(sloop.bpm).to.equal(85);
18+
expect(sloop._bpm).to.equal(85);
19+
20+
//timeSignature
21+
sloop.timeSignature = 6;
22+
expect(sloop.timeSignature).to.equal(6);
23+
expect(sloop._timeSignature).to.equal(6);
24+
25+
//interval
26+
sloop.interval = 0.1;
27+
expect(sloop.interval).to.equal(0.1);
28+
expect(sloop._interval).to.equal(0.1);
29+
expect(sloop.musicalTimeMode).to.be.false;
30+
31+
//iterations
32+
expect(sloop.iterations).to.equal(0); // cannot set iterations
33+
});
34+
describe('methods', function () {
35+
it('can be started and stopped', function (done) {
36+
let count = 0;
37+
let sloop = new p5.SoundLoop(() => count++, '2n');
38+
let ticks;
39+
sloop.bpm = 600;
40+
sloop.start();
41+
expect(sloop.isPlaying).to.be.true;
42+
setTimeout(() => {
43+
ticks = sloop.iterations;
44+
sloop.stop();
45+
expect(sloop.isPlaying).to.be.false;
46+
expect(ticks).to.not.equal(0);
47+
expect(count).to.be.approximately(ticks, 2);
48+
done();
49+
}, 1000);
50+
});
51+
it('can be started and stopped with dealy', function (done) {
52+
let count = 0;
53+
let ticks;
54+
let sloop = new p5.SoundLoop(() => count++, '6n');
55+
sloop.bpm = 600;
56+
sloop.start(0.1);
57+
setTimeout(() => {
58+
ticks = sloop.iterations;
59+
sloop.stop(0.2);
60+
expect(ticks).to.not.equal(0);
61+
setTimeout(() => {
62+
expect(sloop.iterations).to.not.equal(ticks);
63+
}, 100);
64+
setTimeout(() => {
65+
expect(count).to.be.approximately(ticks, 2);
66+
done();
67+
}, 200);
68+
}, 1000);
69+
});
70+
it('can be paused and be started again', function (done) {
71+
let ticks;
72+
let sloop = new p5.SoundLoop(() => {}, '1m');
73+
sloop.bpm = 600;
74+
sloop.start();
75+
setTimeout(() => {
76+
ticks = sloop.iterations;
77+
sloop.pause();
78+
expect(ticks).to.not.equal(0);
79+
setTimeout(() => {
80+
expect(sloop.iterations).to.equal(ticks);
81+
sloop.start();
82+
setTimeout(() => {
83+
expect(sloop.iterations).to.be.at.least(ticks);
84+
done();
85+
}, 100);
86+
}, 100);
87+
}, 1000);
88+
});
89+
it('can be synced with a new loop', function (done) {
90+
let sloop1 = new p5.SoundLoop(() => {}, '4n');
91+
let sloop2 = new p5.SoundLoop(() => {}, '4n');
92+
let count1 = 0;
93+
sloop1.bpm = 600;
94+
sloop2.bpm = 600;
95+
sloop1.start();
96+
setTimeout(() => {
97+
sloop1.pause();
98+
count1 = sloop1.iterations;
99+
sloop2.syncedStart(sloop1, 0.3);
100+
setTimeout(() => {
101+
expect(sloop1.iterations).to.equal(count1 + sloop2.iterations);
102+
done();
103+
}, 1000);
104+
}, 100);
105+
});
106+
it('can be synced with a playing loop', function (done) {
107+
let sloop1 = new p5.SoundLoop(() => {}, '6n');
108+
let sloop2 = new p5.SoundLoop(() => {}, '6n');
109+
let count1 = 0;
110+
sloop1.bpm = 600;
111+
sloop2.bpm = 600;
112+
sloop1.start();
113+
setTimeout(() => {
114+
count1 = sloop1.iterations;
115+
sloop2.syncedStart(sloop1, 0.3);
116+
setTimeout(() => {
117+
expect(sloop1.iterations).to.equal(count1 + sloop2.iterations);
118+
done();
119+
}, 1000);
120+
}, 100);
121+
});
122+
it('can convert notation from musical time format to seconds', function () {
123+
let sloop = new p5.SoundLoop(() => {}, '1n');
124+
sloop.timeSignature = 8;
125+
expect(sloop._convertNotation('2m')).to.equal(16);
126+
expect(sloop._convertNotation('4n')).to.equal(2);
127+
});
128+
it('can calculate frequency for numerical interval', function () {
129+
let sloop = new p5.SoundLoop(() => {}, '1n');
130+
sloop.interval = 4;
131+
expect(sloop._calcFreq()).to.equal(0.25);
132+
expect(sloop.musicalTimeMode).to.be.false;
133+
});
134+
it('can calculate frequency for non-numerical interval', function () {
135+
let sloop = new p5.SoundLoop(() => {}, '1n');
136+
sloop.interval = '8m';
137+
expect(sloop._calcFreq()).to.be.approximately(0.03125, 0.00001);
138+
expect(sloop.musicalTimeMode).to.be.true;
139+
sloop.interval = '9n';
140+
expect(sloop._calcFreq()).to.be.approximately(2.25, 0.01);
141+
expect(sloop.musicalTimeMode).to.be.true;
142+
});
143+
it("can update the clock's frequency", function (done) {
144+
let sloop = new p5.SoundLoop(() => {}, '2m');
145+
expect(sloop.clock.frequency.value).to.equal(0.125);
146+
147+
sloop.interval = 2; //updates via setter
148+
expect(sloop.clock.frequency.value).to.equal(0.5);
149+
150+
sloop.interval = '4n'; //updates via setter
151+
expect(sloop.clock.frequency.value).to.equal(1);
152+
153+
sloop.timeSignature = 8; //updates via setter
154+
expect(sloop.clock.frequency.value).to.equal(1);
155+
156+
sloop.bpm = 300; //updates via setter
157+
expect(sloop.clock.frequency.value).to.equal(5);
158+
done();
159+
});
160+
});
161+
});

0 commit comments

Comments
 (0)