33const test = require ( 'ava' )
44const { readFile } = require ( 'fs/promises' )
55
6+ const { Jimp } = require ( 'jimp' )
7+
68const isWhite = require ( '../src/is-white-screenshot' )
79
10+ const createJimpSpy = ( ) => {
11+ const originalFromBuffer = Jimp . fromBuffer
12+ const spy = { callCount : 0 }
13+
14+ const wrappedFromBuffer = async function ( buffer , options ) {
15+ const image = await originalFromBuffer . call ( this , buffer , options )
16+ const originalGetPixelColor = image . getPixelColor . bind ( image )
17+
18+ image . getPixelColor = function ( x , y ) {
19+ spy . callCount ++
20+ return originalGetPixelColor ( x , y )
21+ }
22+
23+ return image
24+ }
25+
26+ Jimp . fromBuffer = wrappedFromBuffer
27+
28+ return {
29+ spy,
30+ restore : ( ) => {
31+ Jimp . fromBuffer = originalFromBuffer
32+ }
33+ }
34+ }
35+
836test ( 'true' , async t => {
937 t . true ( await isWhite ( await readFile ( './test/fixtures/white-5k.jpg' ) ) )
1038 t . true ( await isWhite ( await readFile ( './test/fixtures/white-5k.png' ) ) )
@@ -14,3 +42,38 @@ test('false', async t => {
1442 t . false ( await isWhite ( await readFile ( './test/fixtures/no-white-5k.jpg' ) ) )
1543 t . false ( await isWhite ( await readFile ( './test/fixtures/no-white-5k.png' ) ) )
1644} )
45+
46+ test ( 'sampling algorithm correctly samples ~25% of pixels' , async t => {
47+ const imageBuffer = await readFile ( './test/fixtures/white-5k.png' )
48+ const tempImage = await Jimp . fromBuffer ( imageBuffer )
49+ const totalPixels = tempImage . bitmap . width * tempImage . bitmap . height
50+ const { spy, restore } = createJimpSpy ( )
51+
52+ await isWhite ( imageBuffer )
53+ restore ( )
54+
55+ const percentageChecked = ( spy . callCount / totalPixels ) * 100
56+
57+ t . true (
58+ percentageChecked >= 20 && percentageChecked <= 30 ,
59+ `Expected to check ~25% of pixels, but checked ${ percentageChecked . toFixed ( 2 ) } % (${
60+ spy . callCount
61+ } /${ totalPixels } )`
62+ )
63+ } )
64+
65+ test ( 'handles memory errors gracefully on very large images' , async t => {
66+ const { createCanvas } = require ( 'canvas' )
67+
68+ const width = 10000
69+ const height = 10000
70+ const canvas = createCanvas ( width , height )
71+ const ctx = canvas . getContext ( '2d' )
72+
73+ ctx . fillStyle = '#ffffff'
74+ ctx . fillRect ( 0 , 0 , width , height )
75+
76+ const largeImageBuffer = canvas . toBuffer ( 'image/jpeg' , { quality : 0.9 } )
77+ const result = await isWhite ( largeImageBuffer )
78+ t . is ( typeof result , 'boolean' , 'Should return a boolean, not throw an error' )
79+ } )
0 commit comments