Skip to content

Commit 1fb18bc

Browse files
committed
test: Fixed setImmediate and added test cases
1 parent 5030bc4 commit 1fb18bc

File tree

2 files changed

+106
-46
lines changed

2 files changed

+106
-46
lines changed

lib/image.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,14 @@ Image.prototype[util.inspect.custom || 'inspect'] = function(){
8484
};
8585

8686
function getSource(img){
87-
return img._originalSource || GetSource.call(img);
87+
return img._originalSource || img._src || GetSource.call(img);
8888
}
8989

9090
function setSource(img, src, origSrc){
91-
process.nextTick(function(){
91+
clearImmediate(img._setSourceTimer);
92+
img._setSourceTimer = setImmediate(() => {
9293
SetSource.call(img, src);
9394
});
95+
img._src = src;
9496
img._originalSource = origSrc;
9597
}

test/image.test.js

+102-44
Original file line numberDiff line numberDiff line change
@@ -127,25 +127,37 @@ describe('Image', function () {
127127

128128
img.onload = () => { onloadCalled += 1 }
129129

130+
// it's should be png_clock, because when you change the img.src, it doesn't load the image immediately.
130131
img.src = png_checkers
131132
assert.strictEqual(img.src, png_checkers)
132133
assert.strictEqual(img.complete, true)
133-
assert.strictEqual(img.width, 2)
134-
assert.strictEqual(img.height, 2)
134+
135+
// it's still png_clock
136+
assert.strictEqual(img.width, 320)
137+
assert.strictEqual(img.height, 320)
135138

136139
img.src = png_clock
137140
assert.strictEqual(img.src, png_clock)
138141
assert.strictEqual(true, img.complete)
139142
assert.strictEqual(320, img.width)
140143
assert.strictEqual(320, img.height)
141144

142-
assert.strictEqual(onloadCalled, 2)
145+
// called in nextTick
146+
assert.strictEqual(onloadCalled, 0)
143147

144148
onloadCalled = 0
145149
img.onload = () => { onloadCalled += 1 }
146150

151+
// reset src will clear the old src changes.
147152
img.src = png_clock
148-
assert.strictEqual(onloadCalled, 1)
153+
assert.strictEqual(onloadCalled, 0)
154+
155+
return new Promise(resolve => {
156+
setTimeout(() => {
157+
assert.strictEqual(onloadCalled, 1)
158+
resolve();
159+
}, 0)
160+
});
149161
})
150162
})
151163

@@ -189,28 +201,47 @@ describe('Image', function () {
189201
img.src = `${png_clock}s2`
190202
assert.strictEqual(img.src, `${png_clock}s2`)
191203

192-
assert.strictEqual(onerrorCalled, 2)
204+
// it's not synchronized call, onerror will be invoked in async steps.
205+
assert.strictEqual(onerrorCalled, 0)
193206

194207
onerrorCalled = 0
195208
img.onerror = () => { onerrorCalled += 1 }
196209

197210
img.src = `${png_clock}s3`
198211
assert.strictEqual(img.src, `${png_clock}s3`)
199212

200-
assert.strictEqual(onerrorCalled, 1)
213+
assert.strictEqual(onerrorCalled, 0)
201214
assert.strictEqual(onloadCalled, 0)
215+
216+
return new Promise(resolve => {
217+
setTimeout(() => {
218+
assert.strictEqual(onerrorCalled, 1)
219+
assert.strictEqual(onloadCalled, 0)
220+
resolve();
221+
});
222+
});
202223
})
203224
})
204225

205226
it('Image#{width,height}', function () {
206227
return loadImage(png_clock).then((img) => {
207228
img.src = ''
208-
assert.strictEqual(img.width, 0)
209-
assert.strictEqual(img.height, 0)
210-
211-
img.src = png_clock
212-
assert.strictEqual(img.width, 320)
213-
assert.strictEqual(img.height, 320)
229+
return new Promise((resolve) => {
230+
setTimeout(() => {
231+
assert.strictEqual(img.width, 0)
232+
assert.strictEqual(img.height, 0)
233+
resolve();
234+
})
235+
}).then(() => {
236+
img.src = png_clock
237+
return new Promise((resolve) => {
238+
setTimeout(() => {
239+
assert.strictEqual(img.width, 320)
240+
assert.strictEqual(img.height, 320)
241+
resolve()
242+
})
243+
})
244+
})
214245
})
215246
})
216247

@@ -221,11 +252,17 @@ describe('Image', function () {
221252
img.onerror = () => { onerrorCalled += 1 }
222253

223254
img.src = Buffer.alloc(0)
224-
assert.strictEqual(img.width, 0)
225-
assert.strictEqual(img.height, 0)
226-
assert.strictEqual(img.complete, true)
227255

228-
assert.strictEqual(onerrorCalled, 1)
256+
return new Promise((resolve) => {
257+
setTimeout(() => {
258+
assert.strictEqual(img.width, 0)
259+
assert.strictEqual(img.height, 0)
260+
assert.strictEqual(img.complete, true)
261+
262+
assert.strictEqual(onerrorCalled, 1)
263+
resolve()
264+
})
265+
})
229266
})
230267
})
231268

@@ -236,23 +273,34 @@ describe('Image', function () {
236273
img.onload = () => { onloadCalled += 1 }
237274

238275
img.src = png_checkers
239-
assert.strictEqual(img.src, png_checkers)
240-
assert.strictEqual(img.complete, true)
241-
assert.strictEqual(img.width, 2)
242-
assert.strictEqual(img.height, 2)
243-
244-
assert.strictEqual(onloadCalled, 1)
245-
246-
onloadCalled = 0
247-
img.onload = null
248-
249-
img.src = png_clock
250-
assert.strictEqual(img.src, png_clock)
251-
assert.strictEqual(img.complete, true)
252-
assert.strictEqual(img.width, 320)
253-
assert.strictEqual(img.height, 320)
254276

255-
assert.strictEqual(onloadCalled, 0)
277+
return new Promise((resolve) => {
278+
setTimeout(() => {
279+
assert.strictEqual(img.src, png_checkers)
280+
assert.strictEqual(img.complete, true)
281+
assert.strictEqual(img.width, 2)
282+
assert.strictEqual(img.height, 2)
283+
284+
assert.strictEqual(onloadCalled, 1)
285+
286+
onloadCalled = 0
287+
img.onload = null
288+
img.src = png_clock
289+
resolve()
290+
})
291+
}).then(() => {
292+
return new Promise((resolve) => {
293+
setTimeout(() => {
294+
assert.strictEqual(img.src, png_clock)
295+
assert.strictEqual(img.complete, true)
296+
assert.strictEqual(img.width, 320)
297+
assert.strictEqual(img.height, 320)
298+
299+
assert.strictEqual(onloadCalled, 0)
300+
resolve()
301+
})
302+
})
303+
})
256304
})
257305
})
258306

@@ -265,21 +313,31 @@ describe('Image', function () {
265313
img.onerror = () => { onerrorCalled += 1 }
266314

267315
img.src = `${png_clock}s1`
316+
268317
assert.strictEqual(img.src, `${png_clock}s1`)
269318

270319
img.src = `${png_clock}s2`
271320
assert.strictEqual(img.src, `${png_clock}s2`)
272321

273-
assert.strictEqual(onerrorCalled, 2)
274322

275-
onerrorCalled = 0
276-
img.onerror = null
277-
278-
img.src = `${png_clock}s3`
279-
assert.strictEqual(img.src, `${png_clock}s3`)
280-
281-
assert.strictEqual(onloadCalled, 0)
282-
assert.strictEqual(onerrorCalled, 0)
323+
return new Promise((resolve) => {
324+
setTimeout(() => {
325+
assert.strictEqual(onerrorCalled, 1)
326+
resolve()
327+
})
328+
}).then(() => new Promise(resolve => {
329+
onerrorCalled = 0
330+
img.onerror = null
331+
332+
img.src = `${png_clock}s3`
333+
assert.strictEqual(img.src, `${png_clock}s3`)
334+
335+
setTimeout(() => {
336+
assert.strictEqual(onloadCalled, 0)
337+
assert.strictEqual(onerrorCalled, 0)
338+
resolve()
339+
})
340+
}))
283341
})
284342
})
285343

@@ -386,7 +444,7 @@ describe('Image', function () {
386444
255, 0, 0, 127,
387445
255, 255, 255, 127,
388446
]);
389-
447+
390448
done();
391449
};
392450

@@ -404,7 +462,7 @@ describe('Image', function () {
404462
testImgd(img, [
405463
255, 0, 0, 255,
406464
]);
407-
465+
408466
done();
409467
};
410468

@@ -423,7 +481,7 @@ describe('Image', function () {
423481
255, 0, 0, 255,
424482
0, 255, 0, 255,
425483
]);
426-
484+
427485
done();
428486
};
429487

0 commit comments

Comments
 (0)