1+ var fs = require ( 'fs' ) ;
2+ var mkdirp = require ( 'mkdirp' ) . sync ;
3+ var removeDir = require ( 'rimraf' ) . sync ;
4+ var Resurrect = require ( '../lib/resurrect' ) ;
5+ var compare = require ( 'fast-json-patch' ) . compare ;
6+ var path = require ( 'path' ) ;
7+ var $ = require ( 'cheerio' ) ;
8+ var Matter = require ( '../../build/matter-dev.js' ) ;
9+ Matter . Demo = require ( '../../demo/js/Demo.js' ) ;
10+
11+ var demo ,
12+ frames = 10 ,
13+ refsPath = 'test/node/refs' ,
14+ diffsPath = 'test/node/diffs' ;
15+
16+ var update = arg ( '--update' ) ,
17+ updateAll = typeof arg ( '--updateAll' ) !== 'undefined' ,
18+ diff = arg ( '--diff' ) ;
19+
20+ var resurrect = new Resurrect ( { cleanup : true , revive : false } ) ,
21+ created = [ ] ,
22+ changed = [ ] ;
23+
24+ var test = function ( status ) {
25+ var demos = getDemoNames ( ) ;
26+
27+ removeDir ( diffsPath ) ;
28+
29+ if ( diff ) {
30+ mkdirp ( diffsPath ) ;
31+ }
32+
33+ for ( var i = 0 ; i < demos . length ; i += 1 ) {
34+ demo = demos [ i ] ;
35+
36+ var hasChanged = false ,
37+ hasCreated = false ,
38+ forceUpdate = update === demo || updateAll ,
39+ worldStartPath = refsPath + '/' + demo + '/' + demo + '-0.json' ,
40+ worldEndPath = refsPath + '/' + demo + '/' + demo + '-' + frames + '.json' ,
41+ worldStartDiffPath = diffsPath + '/' + demo + '/' + demo + '-0.json' ,
42+ worldEndDiffPath = diffsPath + '/' + demo + '/' + demo + '-' + frames + '.json' ;
43+
44+ Matter . Demo . init ( ) ;
45+
46+ var engine = Matter . Demo . _engine ,
47+ runner = Matter . Runner . create ( ) ;
48+
49+ if ( ! ( demo in Matter . Demo ) ) {
50+ throw '\'' + demo + '\' is not defined in Matter.Demo' ;
51+ }
52+
53+ Matter . Demo [ demo ] ( ) ;
54+
55+ var worldStart = JSON . parse ( resurrect . stringify ( engine . world , precisionLimiter ) ) ;
56+
57+ for ( var j = 0 ; j <= frames ; j += 1 ) {
58+ Matter . Runner . tick ( runner , engine , j * runner . delta ) ;
59+ }
60+
61+ var worldEnd = JSON . parse ( resurrect . stringify ( engine . world , precisionLimiter ) ) ;
62+
63+ if ( fs . existsSync ( worldStartPath ) ) {
64+ var worldStartRef = JSON . parse ( fs . readFileSync ( worldStartPath ) ) ;
65+ var worldStartDiff = compare ( worldStartRef , worldStart ) ;
66+
67+ if ( worldStartDiff . length !== 0 ) {
68+ if ( diff ) {
69+ writeFile ( worldStartDiffPath , JSON . stringify ( worldStartDiff , precisionLimiter , 2 ) ) ;
70+ }
71+
72+ if ( forceUpdate ) {
73+ hasCreated = true ;
74+ writeFile ( worldStartPath , JSON . stringify ( worldStart , precisionLimiter , 2 ) ) ;
75+ } else {
76+ hasChanged = true ;
77+ }
78+ }
79+ } else {
80+ hasCreated = true ;
81+ writeFile ( worldStartPath , JSON . stringify ( worldStart , precisionLimiter , 2 ) ) ;
82+ }
83+
84+ if ( fs . existsSync ( worldEndPath ) ) {
85+ var worldEndRef = JSON . parse ( fs . readFileSync ( worldEndPath ) ) ;
86+ var worldEndDiff = compare ( worldEndRef , worldEnd ) ;
87+
88+ if ( worldEndDiff . length !== 0 ) {
89+ if ( diff ) {
90+ writeFile ( worldEndDiffPath , JSON . stringify ( worldEndDiff , precisionLimiter , 2 ) ) ;
91+ }
92+
93+ if ( forceUpdate ) {
94+ hasCreated = true ;
95+ writeFile ( worldEndPath , JSON . stringify ( worldEnd , precisionLimiter , 2 ) ) ;
96+ } else {
97+ hasChanged = true ;
98+ }
99+ }
100+ } else {
101+ hasCreated = true ;
102+ writeFile ( worldEndPath , JSON . stringify ( worldEnd , precisionLimiter , 2 ) ) ;
103+ }
104+
105+ if ( hasChanged ) {
106+ changed . push ( "'" + demo + "'" ) ;
107+ process . stdout . write ( 'x' ) ;
108+ } else if ( hasCreated ) {
109+ created . push ( "'" + demo + "'" ) ;
110+ process . stdout . write ( '+' ) ;
111+ } else {
112+ process . stdout . write ( '.' ) ;
113+ }
114+ }
115+
116+ if ( created . length > 0 ) {
117+ console . log ( '\nupdated' , created . join ( ', ' ) ) ;
118+ }
119+
120+ var isOk = changed . length === 0 ? 1 : 0 ;
121+
122+ console . log ( '' ) ;
123+
124+ if ( isOk ) {
125+ console . log ( 'ok' ) ;
126+ } else {
127+ console . log ( '\nchanges detected on:' ) ;
128+ console . log ( changed . join ( ', ' ) ) ;
129+ console . log ( '\nreview, then --update [name] or --updateAll' ) ;
130+ console . log ( 'use --diff for diff log' ) ;
131+ }
132+
133+ setTimeout ( function ( ) {
134+ process . exit ( ! isOk ) ;
135+ } , 100 ) ;
136+ } ;
137+
138+ var precisionLimiter = function ( key , value ) {
139+ if ( typeof value === 'number' ) {
140+ return parseFloat ( value . toFixed ( 5 ) ) ;
141+ }
142+ return value ;
143+ } ;
144+
145+ function arg ( name ) {
146+ var index = process . argv . indexOf ( name ) ;
147+ if ( index >= 0 ) {
148+ return process . argv [ index + 1 ] || true ;
149+ }
150+ return undefined ;
151+ }
152+
153+ var getDemoNames = function ( ) {
154+ var demos = [ ] ,
155+ skip = [
156+ 'terrain' , 'svg' , 'concave' ,
157+ 'slingshot' , 'views' , 'raycasting' ,
158+ 'events' , 'collisionFiltering' , 'sleeping'
159+ ] ;
160+
161+ $ ( '#demo-select option' , fs . readFileSync ( 'demo/dev.html' ) . toString ( ) )
162+ . each ( function ( ) {
163+ var name = $ ( this ) . val ( ) ;
164+ if ( skip . indexOf ( name ) === - 1 ) {
165+ demos . push ( name ) ;
166+ }
167+ } ) ;
168+
169+ return demos ;
170+ } ;
171+
172+ var writeFile = function ( filePath , string ) {
173+ mkdirp ( path . dirname ( filePath ) ) ;
174+ fs . writeFileSync ( filePath , string ) ;
175+ } ;
176+
177+ test ( ) ;
0 commit comments