1- var minimist = require ( 'minimist' ) ;
2- var pixelmatch = require ( 'pixelmatch' ) ;
3- var PNG = require ( 'pngjs' ) . PNG ;
4- var fs = require ( 'fs' ) ;
5-
6- var constants = require ( '../../tasks/util/constants' ) ;
7- var common = require ( '../../tasks/util/common' ) ;
8- var getMockList = require ( './assets/get_mock_list' ) ;
9- var getImagePaths = require ( './assets/get_image_paths' ) ;
1+ const common = require ( '../../tasks/util/common' ) ;
2+ const constants = require ( '../../tasks/util/constants' ) ;
3+ const getImagePaths = require ( './assets/get_image_paths' ) ;
4+ const getMockList = require ( './assets/get_mock_list' ) ;
5+ const fs = require ( 'fs' ) ;
6+ const minimist = require ( 'minimist' ) ;
7+ const pixelmatch = require ( 'pixelmatch' ) ;
8+ const { PNG } = require ( 'pngjs' ) ;
109
1110fs . mkdirSync ( constants . pathToTestImagesDiff , { recursive : true } ) ;
1211
@@ -35,47 +34,59 @@ fs.mkdirSync(constants.pathToTestImagesDiff, { recursive: true });
3534 *
3635 */
3736
38- var argv = minimist ( process . argv . slice ( 2 ) , { } ) ;
37+ const argv = minimist ( process . argv . slice ( 2 ) , { } ) ;
3938
4039// If no pattern is provided, all mocks are compared
41- if ( argv . _ . length === 0 ) {
42- argv . _ . push ( '' ) ;
43- }
40+ if ( argv . _ . length === 0 ) argv . _ . push ( '' ) ;
4441
4542// Build list of mocks to compare
46- var allMockList = [ ] ;
47- var mathjax3 ;
48- var virtualWebgl = false ;
49- argv . _ . forEach ( function ( pattern ) {
43+ let allMockList = [ ] ;
44+ let mathjax3 = false ;
45+ let virtualWebgl = false ;
46+ argv . _ . forEach ( ( pattern ) => {
5047 if ( pattern === 'mathjax3' ) {
5148 mathjax3 = true ;
5249 } else if ( pattern === 'virtual-webgl' ) {
5350 virtualWebgl = true ;
5451 allMockList = getMockList ( '' ) ;
5552 } else {
56- var mockList = getMockList ( pattern ) ;
57-
58- if ( mockList . length === 0 ) {
59- throw 'No mocks found with pattern ' + pattern ;
60- }
53+ const mockList = getMockList ( pattern ) ;
54+ if ( mockList . length === 0 ) throw 'No mocks found with pattern ' + pattern ;
6155
6256 allMockList = allMockList . concat ( mockList ) ;
6357 }
6458} ) ;
6559
66- var blacklist = [
60+ const skipped = new Set ( ) ;
61+ const failed = new Set ( ) ;
62+ const disallowList = new Set ( [
6763 'map_angles' ,
6864 'map_stamen-style' ,
6965 'map_predefined-styles2' ,
7066 'map_scattercluster' ,
7167 'map_fonts-supported-open-sans' ,
7268 'map_fonts-supported-open-sans-weight'
73- ] ;
69+ ] ) ;
70+ const flakyList = new Set ( [ 'gl3d_bunny-hull' ] ) ;
71+ const flakyListMaps = new Set ( [
72+ // more flaky
73+ 'map_density0-legend' ,
74+ 'map_osm-style' ,
75+ 'map_predefined-styles1' ,
76+ 'map_predefined-styles2'
77+ ] ) ;
78+ const flakyListVirtualWebgl = new Set ( [
79+ 'gl3d_ibm-plot' ,
80+ 'gl3d_isosurface_2surfaces-checker_spaceframe' ,
81+ 'gl3d_opacity-scaling-spikes' ,
82+ 'gl3d_cone-wind' ,
83+ 'gl3d_isosurface_math' ,
84+ 'gl3d_scatter3d-blank-text' ,
85+ 'gl3d_mesh3d_surface3d_scatter3d_line3d_error3d_log_reversed_ranges'
86+ ] ) ;
7487
7588if ( virtualWebgl ) {
76- allMockList = allMockList . filter ( function ( a ) {
77- return a . slice ( 0 , 2 ) === 'gl' ;
78- } ) ;
89+ allMockList = allMockList . filter ( ( a ) => a . startsWith ( 'gl' ) ) ;
7990}
8091
8192if ( mathjax3 ) {
@@ -90,121 +101,62 @@ if (mathjax3) {
90101 'ternary-mathjax-title-place-subtitle'
91102 ] ;
92103}
104+ allMockList = new Set ( allMockList ) ;
93105
94- // To get rid of duplicates
95- function unique ( value , index , self ) {
96- return self . indexOf ( value ) === index ;
97- }
98- allMockList = allMockList . filter ( unique ) ;
99-
100- var skipped = [ ] ;
101- var failed = [ ] ;
102- var fail = function ( mockName ) {
103- if ( failed . indexOf ( mockName ) === - 1 ) {
104- failed . push ( mockName ) ;
105- }
106- } ;
107-
108- for ( var i = 0 ; i < allMockList . length ; i ++ ) {
109- var mockName = allMockList [ i ] ;
110-
111- // skip blacklist
112- if ( blacklist . indexOf ( mockName ) !== - 1 ) continue ;
106+ for ( let mockName of allMockList ) {
107+ if ( disallowList . has ( mockName ) ) continue ;
113108
114- var flakyMap =
115- [
116- // more flaky
117- 'map_density0-legend' ,
118- 'map_osm-style' ,
119- 'map_predefined-styles1' ,
120- 'map_predefined-styles2'
121- ] . indexOf ( mockName ) !== - 1 ;
122-
123- var otherFlaky =
124- [
125- // list flaky mocks other than maps:
126- 'gl3d_bunny-hull'
127- ] . indexOf ( mockName ) !== - 1 ;
128-
129- var threshold = flakyMap ? 1 : otherFlaky ? 0.15 : 0 ;
109+ let threshold ;
110+ if ( flakyListMaps . has ( mockName ) ) threshold = 1 ;
111+ else if ( flakyList . has ( mockName ) ) threshold = 0.15 ;
112+ else threshold = 0 ;
130113
131114 if ( mathjax3 ) mockName = 'mathjax3___' + mockName ;
132115
133- var imagePaths = getImagePaths ( mockName ) ;
134- var base = imagePaths . baseline ;
135- var test = imagePaths . test ;
116+ const { baseline : base , test, diff } = getImagePaths ( mockName ) ;
136117
137118 if ( ! common . doesFileExist ( test ) && ! mathjax3 ) {
138119 console . log ( '- skip:' , mockName ) ;
139- skipped . push ( mockName ) ;
120+ skipped . add ( mockName ) ;
140121 continue ;
141122 }
142123 console . log ( '+ test:' , mockName ) ;
143124
144- var img0 = PNG . sync . read ( fs . readFileSync ( base ) ) ;
145- var img1 = PNG . sync . read ( fs . readFileSync ( test ) ) ;
146- var s0 , s1 , key ;
147-
148- key = 'width' ;
149- s0 = img0 [ key ] ;
150- s1 = img0 [ key ] ;
151- if ( s0 !== s1 ) {
152- console . error ( key + 's do not match: ' + s0 + ' vs ' + s1 ) ;
153- fail ( mockName ) ;
154- }
155-
156- key = 'height' ;
157- s0 = img0 [ key ] ;
158- s1 = img0 [ key ] ;
159- if ( s0 !== s1 ) {
160- console . error ( key + 's do not match: ' + s0 + ' vs ' + s1 ) ;
161- fail ( mockName ) ;
125+ const img0 = PNG . sync . read ( fs . readFileSync ( base ) ) ;
126+ const img1 = PNG . sync . read ( fs . readFileSync ( test ) ) ;
127+ for ( const key of [ 'height' , 'width' ] ) {
128+ const length0 = img0 [ key ] ;
129+ const length1 = img1 [ key ] ;
130+ if ( length0 !== length1 ) {
131+ console . error ( key + 's do not match: ' + length0 + ' vs ' + length1 ) ;
132+ failed . add ( mockName ) ;
133+ }
162134 }
163135
164- var width = img0 . width ;
165- var height = img0 . height ;
166-
167- var diff = new PNG ( {
168- width : width ,
169- height : height
170- } ) ;
171-
172136 if ( virtualWebgl ) {
173- threshold = Math . max ( 0.4 , threshold ) ;
174- if (
175- [
176- 'gl3d_ibm-plot' ,
177- 'gl3d_isosurface_2surfaces-checker_spaceframe' ,
178- 'gl3d_opacity-scaling-spikes' ,
179- 'gl3d_cone-wind' ,
180- 'gl3d_isosurface_math' ,
181- 'gl3d_scatter3d-blank-text' ,
182- 'gl3d_mesh3d_surface3d_scatter3d_line3d_error3d_log_reversed_ranges'
183- ] . indexOf ( mockName ) !== - 1
184- )
185- threshold = 0.7 ;
137+ if ( flakyListVirtualWebgl . has ( mockName ) ) threshold = 0.7 ;
138+ else threshold = Math . max ( 0.4 , threshold ) ;
186139 }
187140
188- var numDiffPixels = pixelmatch ( img0 . data , img1 . data , diff . data , width , height , {
189- threshold : threshold
190- } ) ;
141+ const { height , width } = img0 ;
142+ const imageDiff = new PNG ( { width , height } ) ;
143+ const numDiffPixels = pixelmatch ( img0 . data , img1 . data , imageDiff . data , width , height , { threshold } ) ;
191144
192145 if ( numDiffPixels ) {
193- fs . writeFileSync ( imagePaths . diff , PNG . sync . write ( diff ) ) ;
194-
146+ fs . writeFileSync ( diff , PNG . sync . write ( imageDiff ) ) ;
195147 console . error ( 'pixels do not match: ' + numDiffPixels ) ;
196- fail ( mockName ) ;
148+ failed . add ( mockName ) ;
197149 } else {
198150 // remove when identical
199- fs . unlinkSync ( imagePaths . test ) ;
151+ fs . unlinkSync ( test ) ;
200152 }
201153}
202154
203- if ( failed . length || skipped . length ) {
155+ if ( failed . size || skipped . size ) {
204156 throw JSON . stringify (
205157 {
206- failed : failed ,
207- skipped : skipped
158+ failed : Array . from ( failed ) ,
159+ skipped : Array . from ( skipped )
208160 } ,
209161 null ,
210162 2
0 commit comments