Skip to content

Commit 71c1ae8

Browse files
committed
added node demo tests
1 parent 06eea3e commit 71c1ae8

5 files changed

Lines changed: 216 additions & 10 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ matter-doc-theme
66
build/matter-dev.js
77
build/matter-dev.min.js
88
demo/js/lib/matter-dev.js
9-
test/browser/diffs
9+
test/browser/diffs
10+
test/node/diffs

.jshintrc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@
3131
"undef": true,
3232
"-W079": true, // Silence redefinition errors (they are false positives).
3333
"predef": [
34-
"Matter", "window", "document", "Element", "MatterTools", "PIXI", "phantom",
35-
"$", "Image", "navigator", "setTimeout", "decomp", "HTMLElement", "require",
34+
"Matter", "window", "document", "Element", "MatterTools",
35+
"phantom", "process", "HTMLElement", "require", "PIXI",
36+
"$", "Image", "navigator", "setTimeout", "decomp", "module",
3637
"Body", "Composite", "World", "Contact", "Detector", "Grid",
3738
"Pairs", "Pair", "Resolver", "SAT", "Constraint", "MouseConstraint",
3839
"Common", "Engine", "Mouse", "Sleeping", "Bodies", "Composites",

Gruntfile.js

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ module.exports = function(grunt) {
5757
options: {
5858
jshintrc: '.jshintrc'
5959
},
60-
all: ['src/**/*.js', 'demo/js/*.js', 'test/browser/TestDemo.js', '!src/module/*']
60+
all: ['src/**/*.js', 'demo/js/*.js', 'test/browser/TestDemo.js', 'test/node/TestDemo.js', '!src/module/*']
6161
},
6262
connect: {
6363
watch: {
@@ -114,7 +114,7 @@ module.exports = function(grunt) {
114114
}
115115
},
116116
shell: {
117-
testDemo: {
117+
testDemoBrowser: {
118118
command: function(arg) {
119119
arg = arg ? ' --' + arg : '';
120120
return 'phantomjs test/browser/TestDemo.js' + arg;
@@ -124,6 +124,17 @@ module.exports = function(grunt) {
124124
timeout: 1000 * 60
125125
}
126126
}
127+
},
128+
testDemoNode: {
129+
command: function(arg) {
130+
arg = arg ? ' --' + arg : '';
131+
return 'node test/node/TestDemo.js' + arg;
132+
},
133+
options: {
134+
execOptions: {
135+
timeout: 1000 * 60
136+
}
137+
}
127138
}
128139
}
129140
});
@@ -139,19 +150,32 @@ module.exports = function(grunt) {
139150
grunt.loadNpmTasks('grunt-shell');
140151

141152
grunt.registerTask('default', ['test', 'build']);
142-
grunt.registerTask('test', ['build:dev', 'connect:serve', 'jshint', 'test:demo']);
153+
grunt.registerTask('test', ['build:dev', 'connect:serve', 'jshint', 'test:demo', 'test:demoNode']);
143154
grunt.registerTask('dev', ['build:dev', 'connect:watch', 'watch']);
144155

145156
grunt.registerTask('test:demo', function() {
146157
var updateAll = grunt.option('updateAll'),
147158
diff = grunt.option('diff');
148159

149160
if (updateAll) {
150-
grunt.task.run('shell:testDemo:updateAll');
161+
grunt.task.run('shell:testDemoBrowser:updateAll');
162+
} else if (diff) {
163+
grunt.task.run('shell:testDemoBrowser:diff');
164+
} else {
165+
grunt.task.run('shell:testDemoBrowser');
166+
}
167+
});
168+
169+
grunt.registerTask('test:demoNode', function() {
170+
var updateAll = grunt.option('updateAll'),
171+
diff = grunt.option('diff');
172+
173+
if (updateAll) {
174+
grunt.task.run('shell:testDemoNode:updateAll');
151175
} else if (diff) {
152-
grunt.task.run('shell:testDemo:diff');
176+
grunt.task.run('shell:testDemoNode:diff');
153177
} else {
154-
grunt.task.run('shell:testDemo');
178+
grunt.task.run('shell:testDemoNode');
155179
}
156180
});
157181

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"rigid body physics"
2121
],
2222
"devDependencies": {
23+
"cheerio": "^0.19.0",
2324
"fast-json-patch": "^0.5.4",
2425
"grunt": "~0.4.2",
2526
"grunt-contrib-concat": "~0.3.0",
@@ -30,7 +31,9 @@
3031
"grunt-contrib-watch": "~0.5.3",
3132
"grunt-contrib-yuidoc": "~0.5.1",
3233
"grunt-preprocess": "^4.1.0",
33-
"grunt-shell": "^1.1.2"
34+
"grunt-shell": "^1.1.2",
35+
"mkdirp": "^0.5.1",
36+
"rimraf": "^2.4.2"
3437
},
3538
"scripts": {
3639
"dev": "npm install && grunt dev",

test/node/TestDemo.js

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
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

Comments
 (0)