added test suite runner, removed tests from travis build
This commit is contained in:
parent
a8788c83f1
commit
caebce5ec8
17 changed files with 391 additions and 158 deletions
37
Gruntfile.js
37
Gruntfile.js
|
@ -20,22 +20,36 @@ module.exports = function(grunt) {
|
||||||
return "src/" + path;
|
return "src/" + path;
|
||||||
};
|
};
|
||||||
|
|
||||||
var piskelScripts = require('./src/piskel-script-list.js').scripts.map(mapToSrcFolder);
|
var piskelScripts = require('./src/piskel-script-list.js').scripts.map(mapToSrcFolder).filter(function (path) {
|
||||||
|
return path.indexOf('devtools') === -1;
|
||||||
|
});
|
||||||
var piskelStyles = require('./src/piskel-style-list.js').styles.map(mapToSrcFolder);
|
var piskelStyles = require('./src/piskel-style-list.js').styles.map(mapToSrcFolder);
|
||||||
|
|
||||||
var mapToCasperFolder = function (path) {
|
var mapToCasperFolder = function (path) {
|
||||||
return "test/integration/casperjs/" + path;
|
return "test/integration/casperjs/" + path;
|
||||||
};
|
};
|
||||||
var casperTests = require('./test/integration/casperjs/TestSuite.js').tests.map(mapToCasperFolder);
|
|
||||||
|
|
||||||
var getCasperConfig = function (delay) {
|
var casperEnvironments = {
|
||||||
|
'local' : {
|
||||||
|
suite : './test/integration/casperjs/TestSuite.js',
|
||||||
|
delay : 50
|
||||||
|
},
|
||||||
|
'travis' : {
|
||||||
|
suite : './test/integration/casperjs/TravisTestSuite.js',
|
||||||
|
delay : 5000
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var getCasperConfig = function (env) {
|
||||||
|
var conf = casperEnvironments[env];
|
||||||
|
var tests = require(conf.suite).tests.map(mapToCasperFolder);
|
||||||
return {
|
return {
|
||||||
filesSrc : casperTests,
|
filesSrc : tests,
|
||||||
options : {
|
options : {
|
||||||
args : {
|
args : {
|
||||||
baseUrl : 'http://localhost:' + '<%= express.test.options.port %>/',
|
baseUrl : 'http://localhost:' + '<%= express.test.options.port %>/',
|
||||||
mode : '?debug',
|
mode : '?debug',
|
||||||
delay : delay
|
delay : conf.delay
|
||||||
},
|
},
|
||||||
async : false,
|
async : false,
|
||||||
direct : false,
|
direct : false,
|
||||||
|
@ -110,8 +124,8 @@ module.exports = function(grunt) {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
ghost : {
|
ghost : {
|
||||||
'default' : getCasperConfig(5000),
|
'travis' : getCasperConfig('travis'),
|
||||||
'local' : getCasperConfig(50)
|
'local' : getCasperConfig('local')
|
||||||
},
|
},
|
||||||
concat : {
|
concat : {
|
||||||
js : {
|
js : {
|
||||||
|
@ -292,10 +306,13 @@ module.exports = function(grunt) {
|
||||||
grunt.registerTask('unit-test', ['karma']);
|
grunt.registerTask('unit-test', ['karma']);
|
||||||
|
|
||||||
// Validate & Test
|
// Validate & Test
|
||||||
grunt.registerTask('test', ['lint', 'compile', 'unit-test','express:test', 'ghost:default']);
|
grunt.registerTask('test-travis', ['lint', 'compile', 'unit-test', 'express:test', 'ghost:travis']);
|
||||||
|
|
||||||
// Validate & Test (faster version) will NOT work on travis !!
|
// Validate & Test (faster version) will NOT work on travis !!
|
||||||
grunt.registerTask('precommit', ['lint', 'compile', 'express:test', 'ghost:default']);
|
grunt.registerTask('test-local', ['lint', 'compile', 'unit-test', 'express:test', 'ghost:local']);
|
||||||
|
|
||||||
|
grunt.registerTask('test', ['test-travis']);
|
||||||
|
grunt.registerTask('precommit', ['test-local']);
|
||||||
|
|
||||||
|
|
||||||
// Compile JS code (eg verify JSDoc annotation and types, no actual minified code generated).
|
// Compile JS code (eg verify JSDoc annotation and types, no actual minified code generated).
|
||||||
grunt.registerTask('compile', ['closureCompiler:compile', 'clean:after']);
|
grunt.registerTask('compile', ['closureCompiler:compile', 'clean:after']);
|
||||||
|
|
|
@ -69,5 +69,8 @@ var Constants = {
|
||||||
MOUSEMOVE_THROTTLING : 10,
|
MOUSEMOVE_THROTTLING : 10,
|
||||||
|
|
||||||
ABSTRACT_FUNCTION : function () {throw 'abstract method should be implemented';},
|
ABSTRACT_FUNCTION : function () {throw 'abstract method should be implemented';},
|
||||||
EMPTY_FUNCTION : function () {}
|
EMPTY_FUNCTION : function () {},
|
||||||
|
|
||||||
|
// TESTS
|
||||||
|
BASE_TEST_FOLDER : 'integration/casperjs/drawing-records'
|
||||||
};
|
};
|
|
@ -54,6 +54,7 @@ var Events = {
|
||||||
MOUSE_EVENT : "MOUSE_EVENT",
|
MOUSE_EVENT : "MOUSE_EVENT",
|
||||||
|
|
||||||
// Tests
|
// Tests
|
||||||
|
TEST_RECORD_END : "TEST_RECORD_END",
|
||||||
TEST_RECORD_END : "TEST_RECORD_END"
|
TEST_CASE_END : "TEST_CASE_END",
|
||||||
|
TEST_SUITE_END : "TEST_SUITE_END"
|
||||||
};
|
};
|
|
@ -115,25 +115,6 @@
|
||||||
}
|
}
|
||||||
this.storageService.init();
|
this.storageService.init();
|
||||||
|
|
||||||
|
|
||||||
var href = document.location.href.toLowerCase();
|
|
||||||
// test tools
|
|
||||||
var testModeOn = href.indexOf('test=true') !== -1;
|
|
||||||
if (testModeOn) {
|
|
||||||
this.testRecorder = new pskl.devtools.TestRecorder(this.piskelController);
|
|
||||||
this.testRecorder.init();
|
|
||||||
|
|
||||||
this.testRecordController = new pskl.devtools.TestRecordController(this.testRecorder);
|
|
||||||
this.testRecordController.init();
|
|
||||||
}
|
|
||||||
|
|
||||||
// test tools
|
|
||||||
var runTestModeOn = href.indexOf('test-run=') !== -1;
|
|
||||||
if (runTestModeOn) {
|
|
||||||
var testName = href.split('test-run=')[1];
|
|
||||||
this.testRunner = new pskl.devtools.DrawingTestRunner(testName);
|
|
||||||
}
|
|
||||||
|
|
||||||
var drawingLoop = new pskl.rendering.DrawingLoop();
|
var drawingLoop = new pskl.rendering.DrawingLoop();
|
||||||
drawingLoop.addCallback(this.render, this);
|
drawingLoop.addCallback(this.render, this);
|
||||||
drawingLoop.start();
|
drawingLoop.start();
|
||||||
|
@ -145,8 +126,8 @@
|
||||||
this.loadPiskel_(piskelData.piskel, piskelData.descriptor, piskelData.fps);
|
this.loadPiskel_(piskelData.piskel, piskelData.descriptor, piskelData.fps);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.testRunner) {
|
if (pskl.devtools) {
|
||||||
this.testRunner.start();
|
pskl.devtools.init();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -1,42 +1,36 @@
|
||||||
(function () {
|
(function () {
|
||||||
var ns = $.namespace('pskl.devtools');
|
var ns = $.namespace('pskl.devtools');
|
||||||
|
|
||||||
ns.TestRecordPlayer = function (testRecord) {
|
ns.DrawingTestPlayer = function (testRecord, step) {
|
||||||
this.initialState = testRecord.initialState;
|
this.initialState = testRecord.initialState;
|
||||||
this.events = testRecord.events;
|
this.events = testRecord.events;
|
||||||
this.referencePng = testRecord.png;
|
this.referencePng = testRecord.png;
|
||||||
|
this.step = step || ns.DrawingTestPlayer.DEFAULT_STEP;
|
||||||
|
this.callbacks = [];
|
||||||
this.shim = null;
|
this.shim = null;
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecordPlayer.STEP = 40;
|
ns.DrawingTestPlayer.DEFAULT_STEP = 50;
|
||||||
|
|
||||||
ns.TestRecordPlayer.prototype.start = function () {
|
ns.DrawingTestPlayer.prototype.start = function () {
|
||||||
this.setupInitialState_();
|
this.setupInitialState_();
|
||||||
this.createMouseShim_();
|
this.createMouseShim_();
|
||||||
|
this.regenerateReferencePng().then(function () {
|
||||||
this.playEvent_(0);
|
this.playEvent_(0);
|
||||||
|
}.bind(this));
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecordPlayer.prototype.setupInitialState_ = function () {
|
ns.DrawingTestPlayer.prototype.setupInitialState_ = function () {
|
||||||
var size = this.initialState.size;
|
var size = this.initialState.size;
|
||||||
var piskel = this.createPiskel_(size.width, size.height);
|
var piskel = this.createPiskel_(size.width, size.height);
|
||||||
pskl.app.piskelController.setPiskel(piskel, true);
|
pskl.app.piskelController.setPiskel(piskel);
|
||||||
|
|
||||||
$.publish(Events.SELECT_PRIMARY_COLOR, [this.initialState.primaryColor]);
|
$.publish(Events.SELECT_PRIMARY_COLOR, [this.initialState.primaryColor]);
|
||||||
$.publish(Events.SELECT_SECONDARY_COLOR, [this.initialState.secondaryColor]);
|
$.publish(Events.SELECT_SECONDARY_COLOR, [this.initialState.secondaryColor]);
|
||||||
$.publish(Events.SELECT_TOOL, [this.initialState.selectedTool]);
|
$.publish(Events.SELECT_TOOL, [this.initialState.selectedTool]);
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecordPlayer.prototype.createMouseShim_ = function () {
|
ns.DrawingTestPlayer.prototype.createPiskel_ = function (width, height) {
|
||||||
this.shim = document.createElement('DIV');
|
|
||||||
this.shim.style.cssText = 'position:fixed;top:0;left:0;right:0;left:0;bottom:0;z-index:15000';
|
|
||||||
this.shim.addEventListener('mousemove', function (e) {
|
|
||||||
e.stopPropagation();
|
|
||||||
e.preventDefault();
|
|
||||||
});
|
|
||||||
document.body.appendChild(this.shim);
|
|
||||||
};
|
|
||||||
|
|
||||||
ns.TestRecordPlayer.prototype.createPiskel_ = function (width, height) {
|
|
||||||
var descriptor = new pskl.model.piskel.Descriptor('TestPiskel', '');
|
var descriptor = new pskl.model.piskel.Descriptor('TestPiskel', '');
|
||||||
var piskel = new pskl.model.Piskel(width, height, descriptor);
|
var piskel = new pskl.model.Piskel(width, height, descriptor);
|
||||||
var layer = new pskl.model.Layer("Layer 1");
|
var layer = new pskl.model.Layer("Layer 1");
|
||||||
|
@ -48,7 +42,39 @@
|
||||||
return piskel;
|
return piskel;
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecordPlayer.prototype.playEvent_ = function (index) {
|
ns.DrawingTestPlayer.prototype.regenerateReferencePng = function () {
|
||||||
|
var image = new Image();
|
||||||
|
var then = function () {};
|
||||||
|
|
||||||
|
image.onload = function () {
|
||||||
|
this.referencePng = pskl.CanvasUtils.createFromImage(image).toDataURL();
|
||||||
|
then();
|
||||||
|
}.bind(this);
|
||||||
|
image.src = this.referencePng;
|
||||||
|
|
||||||
|
return {
|
||||||
|
then : function (cb) {
|
||||||
|
then = cb;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestPlayer.prototype.createMouseShim_ = function () {
|
||||||
|
this.shim = document.createElement('DIV');
|
||||||
|
this.shim.style.cssText = 'position:fixed;top:0;left:0;right:0;left:0;bottom:0;z-index:15000';
|
||||||
|
this.shim.addEventListener('mousemove', function (e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
e.preventDefault();
|
||||||
|
}, true);
|
||||||
|
document.body.appendChild(this.shim);
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestPlayer.prototype.removeMouseShim_ = function () {
|
||||||
|
this.shim.parentNode.removeChild(this.shim);
|
||||||
|
this.shim = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestPlayer.prototype.playEvent_ = function (index) {
|
||||||
this.timer = window.setTimeout(function () {
|
this.timer = window.setTimeout(function () {
|
||||||
var recordEvent = this.events[index];
|
var recordEvent = this.events[index];
|
||||||
|
|
||||||
|
@ -67,29 +93,10 @@
|
||||||
} else {
|
} else {
|
||||||
this.onTestEnd_();
|
this.onTestEnd_();
|
||||||
}
|
}
|
||||||
}.bind(this), ns.TestRecordPlayer.STEP);
|
}.bind(this), this.step);
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecordPlayer.prototype.onTestEnd_ = function () {
|
ns.DrawingTestPlayer.prototype.playMouseEvent_ = function (recordEvent) {
|
||||||
var renderer = new pskl.rendering.PiskelRenderer(pskl.app.piskelController);
|
|
||||||
var png = renderer.renderAsCanvas().toDataURL();
|
|
||||||
|
|
||||||
var image = new Image();
|
|
||||||
image.onload = function () {
|
|
||||||
var canvas = pskl.CanvasUtils.createFromImage(image);
|
|
||||||
var referencePng = canvas.toDataURL();
|
|
||||||
var success = png === referencePng;
|
|
||||||
|
|
||||||
this.shim.parentNode.removeChild(this.shim);
|
|
||||||
this.shim = null;
|
|
||||||
|
|
||||||
$.publish(Events.TEST_RECORD_END, [success, png + ' vs ' + referencePng]);
|
|
||||||
}.bind(this);
|
|
||||||
image.src = this.referencePng;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
ns.TestRecordPlayer.prototype.playMouseEvent_ = function (recordEvent) {
|
|
||||||
var event = recordEvent.event;
|
var event = recordEvent.event;
|
||||||
var screenCoordinates = pskl.app.drawingController.getScreenCoordinates(recordEvent.coords.x, recordEvent.coords.y);
|
var screenCoordinates = pskl.app.drawingController.getScreenCoordinates(recordEvent.coords.x, recordEvent.coords.y);
|
||||||
event.clientX = screenCoordinates.x;
|
event.clientX = screenCoordinates.x;
|
||||||
|
@ -103,7 +110,7 @@
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecordPlayer.prototype.playColorEvent_ = function (recordEvent) {
|
ns.DrawingTestPlayer.prototype.playColorEvent_ = function (recordEvent) {
|
||||||
if (recordEvent.isPrimary) {
|
if (recordEvent.isPrimary) {
|
||||||
$.publish(Events.SELECT_PRIMARY_COLOR, [recordEvent.color]);
|
$.publish(Events.SELECT_PRIMARY_COLOR, [recordEvent.color]);
|
||||||
} else {
|
} else {
|
||||||
|
@ -111,13 +118,30 @@
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecordPlayer.prototype.playToolEvent_ = function (recordEvent) {
|
ns.DrawingTestPlayer.prototype.playToolEvent_ = function (recordEvent) {
|
||||||
$.publish(Events.SELECT_TOOL, [recordEvent.toolId]);
|
$.publish(Events.SELECT_TOOL, [recordEvent.toolId]);
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecordPlayer.prototype.playInstrumentedEvent_ = function (recordEvent) {
|
ns.DrawingTestPlayer.prototype.playInstrumentedEvent_ = function (recordEvent) {
|
||||||
pskl.app.piskelController[recordEvent.methodName].apply(pskl.app.piskelController, recordEvent.args);
|
pskl.app.piskelController[recordEvent.methodName].apply(pskl.app.piskelController, recordEvent.args);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestPlayer.prototype.onTestEnd_ = function () {
|
||||||
|
this.removeMouseShim_();
|
||||||
|
|
||||||
|
var renderer = new pskl.rendering.PiskelRenderer(pskl.app.piskelController);
|
||||||
|
var png = renderer.renderAsCanvas().toDataURL();
|
||||||
|
|
||||||
|
var success = png === this.referencePng;
|
||||||
|
|
||||||
|
$.publish(Events.TEST_RECORD_END, [success, png, this.referencePng]);
|
||||||
|
this.callbacks.forEach(function (callback) {
|
||||||
|
callback(success, png, this.referencePng);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestPlayer.prototype.addEndTestCallback = function (callback) {
|
||||||
|
this.callbacks.push(callback);
|
||||||
|
};
|
||||||
|
|
||||||
})();
|
})();
|
|
@ -1,13 +1,13 @@
|
||||||
(function () {
|
(function () {
|
||||||
var ns = $.namespace('pskl.devtools');
|
var ns = $.namespace('pskl.devtools');
|
||||||
|
|
||||||
ns.TestRecorder = function (piskelController) {
|
ns.DrawingTestRecorder = function (piskelController) {
|
||||||
this.piskelController = piskelController;
|
this.piskelController = piskelController;
|
||||||
this.isRecording = false;
|
this.isRecording = false;
|
||||||
this.reset();
|
this.reset();
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecorder.prototype.init = function () {
|
ns.DrawingTestRecorder.prototype.init = function () {
|
||||||
$.subscribe(Events.MOUSE_EVENT, this.onMouseEvent_.bind(this));
|
$.subscribe(Events.MOUSE_EVENT, this.onMouseEvent_.bind(this));
|
||||||
$.subscribe(Events.TOOL_SELECTED, this.onToolEvent_.bind(this));
|
$.subscribe(Events.TOOL_SELECTED, this.onToolEvent_.bind(this));
|
||||||
$.subscribe(Events.PRIMARY_COLOR_SELECTED, this.onColorEvent_.bind(this, true));
|
$.subscribe(Events.PRIMARY_COLOR_SELECTED, this.onColorEvent_.bind(this, true));
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecorder.prototype.instrumentMethod_ = function (object, methodName) {
|
ns.DrawingTestRecorder.prototype.instrumentMethod_ = function (object, methodName) {
|
||||||
var method = object[methodName];
|
var method = object[methodName];
|
||||||
var testRecorder = this;
|
var testRecorder = this;
|
||||||
return function () {
|
return function () {
|
||||||
|
@ -32,12 +32,12 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecorder.prototype.reset = function () {
|
ns.DrawingTestRecorder.prototype.reset = function () {
|
||||||
this.initialState = {};
|
this.initialState = {};
|
||||||
this.events = [];
|
this.events = [];
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecorder.prototype.startRecord = function () {
|
ns.DrawingTestRecorder.prototype.startRecord = function () {
|
||||||
this.isRecording = true;
|
this.isRecording = true;
|
||||||
this.initialState = {
|
this.initialState = {
|
||||||
size : {
|
size : {
|
||||||
|
@ -50,7 +50,7 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecorder.prototype.stopRecord = function () {
|
ns.DrawingTestRecorder.prototype.stopRecord = function () {
|
||||||
this.isRecording = false;
|
this.isRecording = false;
|
||||||
|
|
||||||
var renderer = new pskl.rendering.PiskelRenderer(this.piskelController);
|
var renderer = new pskl.rendering.PiskelRenderer(this.piskelController);
|
||||||
|
@ -67,13 +67,13 @@
|
||||||
return testRecord;
|
return testRecord;
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecorder.prototype.onMouseEvent_ = function (evt, mouseEvent, originator) {
|
ns.DrawingTestRecorder.prototype.onMouseEvent_ = function (evt, mouseEvent, originator) {
|
||||||
if (this.isRecording) {
|
if (this.isRecording) {
|
||||||
this.recordMouseEvent_(mouseEvent);
|
this.recordMouseEvent_(mouseEvent);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecorder.prototype.onColorEvent_ = function (isPrimary, evt, color) {
|
ns.DrawingTestRecorder.prototype.onColorEvent_ = function (isPrimary, evt, color) {
|
||||||
if (this.isRecording) {
|
if (this.isRecording) {
|
||||||
var recordEvent = {};
|
var recordEvent = {};
|
||||||
recordEvent.type = 'color-event';
|
recordEvent.type = 'color-event';
|
||||||
|
@ -83,7 +83,7 @@
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecorder.prototype.onToolEvent_ = function (evt, tool) {
|
ns.DrawingTestRecorder.prototype.onToolEvent_ = function (evt, tool) {
|
||||||
if (this.isRecording) {
|
if (this.isRecording) {
|
||||||
var recordEvent = {};
|
var recordEvent = {};
|
||||||
recordEvent.type = 'tool-event';
|
recordEvent.type = 'tool-event';
|
||||||
|
@ -92,7 +92,7 @@
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecorder.prototype.onInstrumentedMethod_ = function (callee, methodName, args) {
|
ns.DrawingTestRecorder.prototype.onInstrumentedMethod_ = function (callee, methodName, args) {
|
||||||
if (this.isRecording) {
|
if (this.isRecording) {
|
||||||
var recordEvent = {};
|
var recordEvent = {};
|
||||||
recordEvent.type = 'instrumented-event';
|
recordEvent.type = 'instrumented-event';
|
||||||
|
@ -102,7 +102,7 @@
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.TestRecorder.prototype.recordMouseEvent_ = function (mouseEvent) {
|
ns.DrawingTestRecorder.prototype.recordMouseEvent_ = function (mouseEvent) {
|
||||||
var coords = pskl.app.drawingController.getSpriteCoordinates(mouseEvent.clientX, mouseEvent.clientY);
|
var coords = pskl.app.drawingController.getSpriteCoordinates(mouseEvent.clientX, mouseEvent.clientY);
|
||||||
var recordEvent = new ns.MouseEvent(mouseEvent, coords);
|
var recordEvent = new ns.MouseEvent(mouseEvent, coords);
|
||||||
var lastEvent = this.events[this.events.length-1];
|
var lastEvent = this.events[this.events.length-1];
|
|
@ -7,29 +7,17 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.DrawingTestRunner.prototype.start = function () {
|
ns.DrawingTestRunner.prototype.start = function () {
|
||||||
var testName = this.testName;
|
pskl.utils.Xhr.get(this.testName, function (response) {
|
||||||
var xhr = new XMLHttpRequest();
|
var res = response.responseText;
|
||||||
xhr.open('GET', testName, true);
|
var recordPlayer = new ns.DrawingTestPlayer(JSON.parse(res));
|
||||||
|
|
||||||
xhr.onload = function(e) {
|
|
||||||
if (this.status == 200) {
|
|
||||||
var recordPlayer = new ns.TestRecordPlayer(JSON.parse(this.responseText));
|
|
||||||
recordPlayer.start();
|
recordPlayer.start();
|
||||||
} else {
|
}.bind(this));
|
||||||
this.onerror(e);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
xhr.onerror = function(e) {
|
|
||||||
console.error('Could not load file : ' + testName);
|
|
||||||
};
|
|
||||||
xhr.send();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ns.DrawingTestRunner.prototype.onTestRecordEnd_ = function (evt, success, png) {
|
ns.DrawingTestRunner.prototype.onTestRecordEnd_ = function (evt, success, png) {
|
||||||
var testResult = document.createElement('div');
|
var testResult = document.createElement('div');
|
||||||
testResult.id = 'drawing-test-result';
|
testResult.id = 'drawing-test-result';
|
||||||
testResult.setAttribute('data-test-name', this.testName);
|
testResult.setAttribute('data-test-name', this.testName);
|
||||||
// pskl.app.paletteController.setPrimaryColor('rgba(0,255,0,0)');
|
|
||||||
testResult.innerHTML = success ? 'OK' : ('KO:'+png);
|
testResult.innerHTML = success ? 'OK' : ('KO:'+png);
|
||||||
document.body.appendChild(testResult);
|
document.body.appendChild(testResult);
|
||||||
};
|
};
|
||||||
|
|
77
src/js/devtools/DrawingTestSuiteController.js
Normal file
77
src/js/devtools/DrawingTestSuiteController.js
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
(function () {
|
||||||
|
var ns = $.namespace('pskl.devtools');
|
||||||
|
|
||||||
|
ns.DrawingTestSuiteController = function (suitePath) {
|
||||||
|
if (suitePath.indexOf('/') === -1) {
|
||||||
|
suitePath = [Constants.BASE_TEST_FOLDER, suitePath].join('/');
|
||||||
|
}
|
||||||
|
this.suitePath = suitePath;
|
||||||
|
this.testSuiteRunner = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestSuiteController.prototype.init = function () {
|
||||||
|
$.subscribe(Events.TEST_CASE_END, this.onTestCaseEnd_.bind(this));
|
||||||
|
$.subscribe(Events.TEST_SUITE_END, this.onTestSuiteEnd_.bind(this));
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestSuiteController.prototype.start = function () {
|
||||||
|
this.reset();
|
||||||
|
this.startTime_ = Date.now();
|
||||||
|
pskl.utils.Xhr.get(this.suitePath, this.onTestSuiteLoaded_.bind(this));
|
||||||
|
|
||||||
|
var testSuiteStatus = document.createElement('li');
|
||||||
|
testSuiteStatus.innerHTML = pskl.utils.Template.replace(
|
||||||
|
'<b>Test Suite [{{path}}]</b>',
|
||||||
|
{path : this.shortenPath_(this.suitePath)}
|
||||||
|
);
|
||||||
|
this.testListElt.appendChild(testSuiteStatus);
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestSuiteController.prototype.reset = function () {
|
||||||
|
this.domElt = document.createElement('div');
|
||||||
|
this.domElt.style.cssText = 'position:absolute;z-index:10000;margin:5px;padding:10px;background:lightgrey';
|
||||||
|
|
||||||
|
this.testListElt = document.createElement('ul');
|
||||||
|
|
||||||
|
this.domElt.appendChild(this.testListElt);
|
||||||
|
|
||||||
|
document.body.appendChild(this.domElt);
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestSuiteController.prototype.onTestSuiteLoaded_ = function (response) {
|
||||||
|
var testPaths = JSON.parse(response.responseText).tests;
|
||||||
|
testPaths = testPaths.map(function (path) {
|
||||||
|
return this.suitePath.replace(/\/([^\/]+\.json)/i, '/' + path);
|
||||||
|
}.bind(this));
|
||||||
|
this.testSuiteRunner = new ns.DrawingTestSuiteRunner(testPaths);
|
||||||
|
this.testSuiteRunner.start();
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestSuiteController.prototype.onTestCaseEnd_ = function (evt, testPath, status) {
|
||||||
|
var testCaseStatus = document.createElement('li');
|
||||||
|
|
||||||
|
testCaseStatus.innerHTML = pskl.utils.Template.replace(
|
||||||
|
'[{{path}}] finished : <b style="color:{{color}}">{{status}}</b>',
|
||||||
|
{path : this.shortenPath_(testPath), status : status ? 'OK' : 'KO', color : status ? 'green' : 'red'}
|
||||||
|
);
|
||||||
|
this.testListElt.appendChild(testCaseStatus);
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestSuiteController.prototype.onTestSuiteEnd_ = function (evt, status) {
|
||||||
|
console.log('on test suite end');
|
||||||
|
var elapsed = Date.now() - this.startTime_;
|
||||||
|
elapsed = (elapsed/1000).toFixed(4);
|
||||||
|
|
||||||
|
var testSuiteStatus = document.createElement('li');
|
||||||
|
testSuiteStatus.innerHTML = pskl.utils.Template.replace(
|
||||||
|
'<b>Test finished : {{status}}</b> ({{elapsed}} seconds)',
|
||||||
|
{status : status, elapsed : elapsed}
|
||||||
|
);
|
||||||
|
this.testListElt.appendChild(testSuiteStatus);
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestSuiteController.prototype.shortenPath_ = function (path) {
|
||||||
|
// keep only the part after the last '/'
|
||||||
|
return path.replace(/^.*\/([^\/]+.json$)/, '$1');
|
||||||
|
};
|
||||||
|
})();
|
63
src/js/devtools/DrawingTestSuiteRunner.js
Normal file
63
src/js/devtools/DrawingTestSuiteRunner.js
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
(function () {
|
||||||
|
var ns = $.namespace('pskl.devtools');
|
||||||
|
|
||||||
|
ns.DrawingTestSuiteRunner = function (testPaths) {
|
||||||
|
if (Array.isArray(testPaths)) {
|
||||||
|
this.testStatus = {};
|
||||||
|
this.testPaths = testPaths;
|
||||||
|
this.status = ns.DrawingTestSuiteRunner.STATUS.NOT_STARTED;
|
||||||
|
this.currentIndex = -1;
|
||||||
|
} else {
|
||||||
|
throw new Error('testPaths should be an array of string (test paths)');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestSuiteRunner.STATUS = {
|
||||||
|
ERROR : 'ERROR',
|
||||||
|
FAILED : 'FAILED',
|
||||||
|
SUCCESS : 'SUCCESS',
|
||||||
|
ONGOING : 'ONGOING',
|
||||||
|
NOT_STARTED : 'NOT_STARTED'
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestSuiteRunner.prototype.start = function () {
|
||||||
|
this.status = ns.DrawingTestSuiteRunner.STATUS.ONGOING;
|
||||||
|
this.runTest(0);
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestSuiteRunner.prototype.runTest = function (testIndex) {
|
||||||
|
this.currentIndex = testIndex;
|
||||||
|
var path = this.testPaths[testIndex];
|
||||||
|
if (path) {
|
||||||
|
pskl.utils.Xhr.get(path, this.onTestLoaded_.bind(this));
|
||||||
|
} else {
|
||||||
|
this.onTestSuiteEnd_();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestSuiteRunner.prototype.onTestLoaded_ = function (response) {
|
||||||
|
var testRecord = JSON.parse(response.responseText);
|
||||||
|
|
||||||
|
var testPlayer = new ns.DrawingTestPlayer(testRecord, 10);
|
||||||
|
|
||||||
|
testPlayer.addEndTestCallback(this.onTestEnd_.bind(this));
|
||||||
|
testPlayer.start();
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestSuiteRunner.prototype.onTestEnd_ = function (success, png, referencePng) {
|
||||||
|
var path = this.testPaths[this.currentIndex];
|
||||||
|
this.testStatus[path] = success;
|
||||||
|
$.publish(Events.TEST_CASE_END, [path, success]);
|
||||||
|
|
||||||
|
this.runTest(this.currentIndex + 1);
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.DrawingTestSuiteRunner.prototype.onTestSuiteEnd_ = function () {
|
||||||
|
var success = this.testPaths.every(function (path) {
|
||||||
|
return this.testStatus[path];
|
||||||
|
}.bind(this));
|
||||||
|
|
||||||
|
this.status = success ? ns.DrawingTestSuiteRunner.STATUS.SUCCESS : ns.DrawingTestSuiteRunner.STATUS.ERROR;
|
||||||
|
$.publish(Events.TEST_SUITE_END, [this.status]);
|
||||||
|
};
|
||||||
|
})();
|
|
@ -46,8 +46,8 @@
|
||||||
var file =files[0];
|
var file =files[0];
|
||||||
pskl.utils.FileUtils.readFile(file, function (content) {
|
pskl.utils.FileUtils.readFile(file, function (content) {
|
||||||
var testRecord = JSON.parse(window.atob(content.replace(/data\:.*?\;base64\,/,'')));
|
var testRecord = JSON.parse(window.atob(content.replace(/data\:.*?\;base64\,/,'')));
|
||||||
var testRecordPlayer = new ns.TestRecordPlayer(testRecord);
|
var testPlayer = new ns.DrawingTestPlayer(testRecord);
|
||||||
testRecordPlayer.start();
|
testPlayer.start();
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
34
src/js/devtools/init.js
Normal file
34
src/js/devtools/init.js
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
(function () {
|
||||||
|
var ns = $.namespace('pskl.devtools');
|
||||||
|
|
||||||
|
ns.init = function () {
|
||||||
|
var href = document.location.href.toLowerCase();
|
||||||
|
// test tools
|
||||||
|
var testModeOn = href.indexOf('test=true') !== -1;
|
||||||
|
if (testModeOn) {
|
||||||
|
this.testRecorder = new pskl.devtools.DrawingTestRecorder(this.piskelController);
|
||||||
|
this.testRecorder.init();
|
||||||
|
|
||||||
|
this.testRecordController = new pskl.devtools.TestRecordController(this.testRecorder);
|
||||||
|
this.testRecordController.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
// test tools
|
||||||
|
var runTestModeOn = href.indexOf('test-run=') !== -1;
|
||||||
|
if (runTestModeOn) {
|
||||||
|
var testPath = href.split('test-run=')[1];
|
||||||
|
this.testRunner = new pskl.devtools.DrawingTestRunner(testPath);
|
||||||
|
this.testRunner.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
// test tools
|
||||||
|
var runSuiteModeOn = href.indexOf('test-suite=') !== -1;
|
||||||
|
if (runSuiteModeOn) {
|
||||||
|
var suitePath = href.split('test-suite=')[1];
|
||||||
|
this.testSuiteController = new pskl.devtools.DrawingTestSuiteController(suitePath);
|
||||||
|
this.testSuiteController.init();
|
||||||
|
this.testSuiteController.start();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
})();
|
|
@ -8,42 +8,33 @@
|
||||||
ns.AppEngineStorageService.prototype.init = function () {};
|
ns.AppEngineStorageService.prototype.init = function () {};
|
||||||
|
|
||||||
ns.AppEngineStorageService.prototype.store = function (callbacks) {
|
ns.AppEngineStorageService.prototype.store = function (callbacks) {
|
||||||
var formData = this.prepareFormData_();
|
|
||||||
|
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
xhr.open('POST', Constants.APPENGINE.URL.SAVE, true);
|
|
||||||
|
|
||||||
xhr.onload = function(e) {
|
|
||||||
if (this.status == 200) {
|
|
||||||
callbacks.success();
|
|
||||||
callbacks.after();
|
|
||||||
} else {
|
|
||||||
this.onerror(e);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
xhr.onerror = function(e) {
|
|
||||||
callbacks.error(this.status);
|
|
||||||
callbacks.after();
|
|
||||||
};
|
|
||||||
xhr.send(formData);
|
|
||||||
};
|
|
||||||
|
|
||||||
ns.AppEngineStorageService.prototype.prepareFormData_ = function () {
|
|
||||||
var piskel = this.piskelController.getPiskel();
|
var piskel = this.piskelController.getPiskel();
|
||||||
var descriptor = piskel.getDescriptor();
|
var descriptor = piskel.getDescriptor();
|
||||||
|
|
||||||
var formData = new FormData();
|
var data = {
|
||||||
formData.append('framesheet', this.piskelController.serialize());
|
framesheet : this.piskelController.serialize(),
|
||||||
formData.append('fps', this.piskelController.getFPS());
|
fps : this.piskelController.getFPS(),
|
||||||
formData.append('name', descriptor.name);
|
name : descriptor.name,
|
||||||
formData.append('description', descriptor.description);
|
description : descriptor.description,
|
||||||
if (descriptor.isPublic) {
|
frames : this.piskelController.getFrameCount(),
|
||||||
formData.append('public', true);
|
first_frame_as_png : pskl.app.getFirstFrameAsPng(),
|
||||||
}
|
framesheet_as_png : pskl.app.getFramesheetAsPng()
|
||||||
formData.append('frames', this.piskelController.getFrameCount());
|
};
|
||||||
formData.append('first_frame_as_png', pskl.app.getFirstFrameAsPng());
|
|
||||||
formData.append('framesheet_as_png', pskl.app.getFramesheetAsPng());
|
|
||||||
|
|
||||||
return formData;
|
if (descriptor.isPublic) {
|
||||||
|
data['public'] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var success = function () {
|
||||||
|
callbacks.success();
|
||||||
|
callbacks.after();
|
||||||
|
};
|
||||||
|
|
||||||
|
var error = function (response) {
|
||||||
|
callbacks.error(response.status);
|
||||||
|
callbacks.after();
|
||||||
|
};
|
||||||
|
|
||||||
|
pskl.utils.Xhr.post(Constants.APPENGINE.URL.SAVE, data, success, error);
|
||||||
};
|
};
|
||||||
})();
|
})();
|
|
@ -6,23 +6,18 @@
|
||||||
/**
|
/**
|
||||||
* Upload a base64 image data to distant service. If successful, will call provided callback with the image URL as first argument;
|
* Upload a base64 image data to distant service. If successful, will call provided callback with the image URL as first argument;
|
||||||
* @param {String} imageData base64 image data (such as the return value of canvas.toDataUrl())
|
* @param {String} imageData base64 image data (such as the return value of canvas.toDataUrl())
|
||||||
* @param {Function} cbSuccess success callback. 1st argument will be the uploaded image URL
|
* @param {Function} success success callback. 1st argument will be the uploaded image URL
|
||||||
* @param {Function} cbError error callback
|
* @param {Function} error error callback
|
||||||
*/
|
*/
|
||||||
ns.ImageUploadService.prototype.upload = function (imageData, cbSuccess, cbError) {
|
ns.ImageUploadService.prototype.upload = function (imageData, success, error) {
|
||||||
var xhr = new XMLHttpRequest();
|
var data = {
|
||||||
var formData = new FormData();
|
data : imageData
|
||||||
formData.append('data', imageData);
|
|
||||||
xhr.open('POST', Constants.IMAGE_SERVICE_UPLOAD_URL, true);
|
|
||||||
xhr.onload = function (e) {
|
|
||||||
if (this.status == 200) {
|
|
||||||
var imageUrl = Constants.IMAGE_SERVICE_GET_URL + this.responseText;
|
|
||||||
cbSuccess(imageUrl);
|
|
||||||
} else {
|
|
||||||
cbError();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
xhr.send(formData);
|
var wrappedSuccess = function (response) {
|
||||||
|
success(Constants.IMAGE_SERVICE_GET_URL + response.responseText);
|
||||||
|
};
|
||||||
|
|
||||||
|
pskl.utils.Xhr.post(Constants.IMAGE_SERVICE_UPLOAD_URL, data, wrappedSuccess, error);
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
|
46
src/js/utils/Xhr.js
Normal file
46
src/js/utils/Xhr.js
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
(function () {
|
||||||
|
var ns = $.namespace('pskl.utils');
|
||||||
|
ns.Xhr = {
|
||||||
|
get : function (url, success, error) {
|
||||||
|
var xhr = ns.Xhr.xhr_(url, 'GET', success, error);
|
||||||
|
xhr.send();
|
||||||
|
},
|
||||||
|
|
||||||
|
post : function (url, data, success, error) {
|
||||||
|
var xhr = ns.Xhr.xhr_(url, 'POST', success, error);
|
||||||
|
var formData = new FormData();
|
||||||
|
|
||||||
|
if (typeof data == 'object') {
|
||||||
|
for (var key in data) {
|
||||||
|
if (data.hasOwnProperty(key)) {
|
||||||
|
formData.append(key, data[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xhr.send(formData);
|
||||||
|
},
|
||||||
|
|
||||||
|
xhr_ : function (url, method, success, error) {
|
||||||
|
success = success || function (){};
|
||||||
|
error = error || function (){};
|
||||||
|
|
||||||
|
var xhr = new XMLHttpRequest();
|
||||||
|
xhr.open(method, url, true);
|
||||||
|
|
||||||
|
xhr.onload = function(e) {
|
||||||
|
if (this.status == 200) {
|
||||||
|
success(this);
|
||||||
|
} else {
|
||||||
|
this.onerror(this, e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
xhr.onerror = function(e) {
|
||||||
|
error(e);
|
||||||
|
};
|
||||||
|
|
||||||
|
return xhr;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})();
|
|
@ -25,6 +25,7 @@
|
||||||
"js/utils/PiskelFileUtils.js",
|
"js/utils/PiskelFileUtils.js",
|
||||||
"js/utils/Template.js",
|
"js/utils/Template.js",
|
||||||
"js/utils/UserSettings.js",
|
"js/utils/UserSettings.js",
|
||||||
|
"js/utils/Xhr.js",
|
||||||
"js/utils/serialization/Serializer.js",
|
"js/utils/serialization/Serializer.js",
|
||||||
"js/utils/serialization/Deserializer.js",
|
"js/utils/serialization/Deserializer.js",
|
||||||
"js/utils/serialization/backward/Deserializer_v0.js",
|
"js/utils/serialization/backward/Deserializer_v0.js",
|
||||||
|
@ -139,11 +140,14 @@
|
||||||
"js/drawingtools/ColorSwap.js",
|
"js/drawingtools/ColorSwap.js",
|
||||||
|
|
||||||
// Devtools
|
// Devtools
|
||||||
"js/devtools/MouseEvent.js",
|
"js/devtools/DrawingTestPlayer.js",
|
||||||
"js/devtools/TestRecorder.js",
|
"js/devtools/DrawingTestRecorder.js",
|
||||||
"js/devtools/TestRecordPlayer.js",
|
|
||||||
"js/devtools/TestRecordController.js",
|
|
||||||
"js/devtools/DrawingTestRunner.js",
|
"js/devtools/DrawingTestRunner.js",
|
||||||
|
"js/devtools/DrawingTestSuiteController.js",
|
||||||
|
"js/devtools/DrawingTestSuiteRunner.js",
|
||||||
|
"js/devtools/MouseEvent.js",
|
||||||
|
"js/devtools/TestRecordController.js",
|
||||||
|
"js/devtools/init.js",
|
||||||
|
|
||||||
// Application controller and initialization
|
// Application controller and initialization
|
||||||
"js/app.js",
|
"js/app.js",
|
||||||
|
|
4
test/integration/casperjs/TravisTestSuite.js
Normal file
4
test/integration/casperjs/TravisTestSuite.js
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
(typeof exports != "undefined" ? exports : pskl_exports).tests = [
|
||||||
|
// did not manage to successfully run drawing tests on travis yet ...
|
||||||
|
'SmokeTest.js'
|
||||||
|
];
|
5
test/integration/casperjs/drawing-records/TestSuite.json
Normal file
5
test/integration/casperjs/drawing-records/TestSuite.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{ "tests" : [
|
||||||
|
"SimplePenDrawing1.json",
|
||||||
|
"ComplexDrawing1.json",
|
||||||
|
"ComplexDrawing2.json"
|
||||||
|
]}
|
Loading…
Reference in a new issue