diff --git a/.jshintrc b/.jshintrc
index 3ba65dd5..54894bf5 100644
--- a/.jshintrc
+++ b/.jshintrc
@@ -4,6 +4,7 @@
"strict": true,
"unused": "vars",
"maxlen": 120,
+ "expr": true,
"globals": {
"describe": false,
"it": false,
diff --git a/package.json b/package.json
index 9d3fef7b..f97857d1 100644
--- a/package.json
+++ b/package.json
@@ -33,25 +33,30 @@
"browserify": "^8.1.0",
"browserify-derequire": "^0.9.1",
"bundle-collapser": "^1.1.1",
+ "chai": "~2.2.0",
"grunt": "^0.4.4",
"grunt-contrib-copy": "^0.7.0",
"grunt-contrib-jshint": "^0.7.2",
"grunt-jsdoc": "^0.5.1",
"grunt-karma": "^0.8.0",
"grunt-release": "^0.7.0",
- "jasmine-test-container-support": "^0.1.2",
"jsondiffpatch": "^0.1.26",
"karma": "^0.12.12",
"karma-browserify": "^4.0.0",
+ "karma-chai": "^0.1.0",
"karma-chrome-launcher": "^0.1.2",
"karma-firefox-launcher": "^0.1.3",
"karma-ie-launcher": "^0.1.4",
- "karma-jasmine": "https://github.com/Nikku/karma-jasmine/archive/jasmine-v2.0.0-latest-1.tar.gz",
+ "karma-mocha": "~0.1.10",
"karma-phantomjs-launcher": "^0.1.2",
"karma-safari-launcher": "^0.1.1",
+ "karma-sinon-chai": "~0.3.0",
"load-grunt-tasks": "^0.3.0",
+ "mocha-test-container-support": "~0.1.0",
"source-map-concat": "^0.4.0",
"stringify": "^3.1.0",
+ "sinon": "~1.14.1",
+ "sinon-chai": "~2.7.0",
"time-grunt": "^0.3.2",
"uglify-js": "^2.4.16"
},
diff --git a/test/Matchers.js b/test/Matchers.js
deleted file mode 100644
index 639d180b..00000000
--- a/test/Matchers.js
+++ /dev/null
@@ -1,85 +0,0 @@
-'use strict';
-
-/* global jasmine */
-
-var cloneDeep = require('lodash/lang/cloneDeep'),
- isEqual = require('lodash/lang/isEqual'),
- pick = require('lodash/object/pick');
-
-
-module.exports.addDeepEquals = function() {
- var jsondiffpatch = require('jsondiffpatch');
-
- var compare = jsondiffpatch.create({
- objectHash: function (obj) {
- return JSON.stringify(obj);
- }
- });
-
- function deepEquals(actual, expected) {
- var actualClone = cloneDeep(actual);
- var expectedClone = cloneDeep(expected);
-
- var result = {
- pass: isEqual(actualClone, expectedClone)
- };
-
- var message;
-
- if (!result.pass) {
- message =
- 'Expected elements to equal but got diff\n' +
- JSON.stringify(compare.diff(actualClone, expectedClone), null, ' ');
- } else {
- message = 'Expected elements not to equal';
- }
-
- result.message = message;
-
- return result;
- }
-
- jasmine.addMatchers({
- toDeepEqual: function(util) {
- return {
- compare: deepEquals
- };
- }
- });
-};
-
-module.exports.addBBoxMatchers = function() {
-
- jasmine.addMatchers({
-
- toFitBBox: function(util) {
-
- return {
- compare: function(actual, expected) {
-
- var actualBBox = actual.getBBox();
-
- var pass = actualBBox.x >= expected.x &&
- actualBBox.y >= expected.y &&
- actualBBox.width <= expected.width &&
- actualBBox.x + actualBBox.width <= expected.x + expected.width &&
- (expected.height ? actualBBox.height <= expected.height : true) &&
- (expected.height ? actualBBox.y + actualBBox.height <= expected.y + expected.height : true);
-
- var message = '';
-
- if (!pass) {
- message = 'Expected element#' + actual.id + ' with bbox ' +
- jasmine.pp(pick(actualBBox, ['x', 'y', 'width', 'height'])) + ' to fit ' +
- jasmine.pp(expected);
- }
-
- return {
- pass: pass,
- message: message
- };
- }
- };
- }
- });
-};
\ No newline at end of file
diff --git a/test/TestHelper.js b/test/TestHelper.js
index 46008ca4..55f2f3f9 100644
--- a/test/TestHelper.js
+++ b/test/TestHelper.js
@@ -3,8 +3,9 @@
var TestHelper = module.exports = require('./helper');
TestHelper.insertCSS('diagram-js.css', require('diagram-js/assets/diagram-js.css'));
+
TestHelper.insertCSS('bpmn-embedded.css', require('../assets/bpmn-font/css/bpmn-embedded.css'));
TestHelper.insertCSS('diagram-js-testing.css',
'.test-container .result { height: 500px; }' + '.test-container > div'
-);
\ No newline at end of file
+);
diff --git a/test/config/karma.unit.js b/test/config/karma.unit.js
index 068e7430..8cf80922 100644
--- a/test/config/karma.unit.js
+++ b/test/config/karma.unit.js
@@ -5,7 +5,10 @@ module.exports = function(karma) {
basePath: '../../',
- frameworks: [ 'browserify', 'jasmine' ],
+ frameworks: [ 'browserify',
+ 'mocha',
+ 'chai',
+ 'sinon-chai'],
files: [
'test/spec/**/*Spec.js',
diff --git a/test/helper/index.js b/test/helper/index.js
index a12a84f0..3e70f119 100644
--- a/test/helper/index.js
+++ b/test/helper/index.js
@@ -33,69 +33,71 @@ var unique = require('lodash/array/unique'),
assign = require('lodash/object/assign'),
forEach = require('lodash/collection/forEach');
+var TestContainer = require('mocha-test-container-support');
+
var Modeler = require('../../lib/Modeler'),
Viewer = require('../../lib/Viewer');
-try {
- // enhance jasmine with test container API
- require('jasmine-test-container-support').extend(jasmine);
-} catch (e) {
- // no test container :-(
-}
-
var OPTIONS, BPMN_JS;
+function bootstrapBpmnJS(BpmnJS, diagram, options, locals) {
-function bootstrapBpmnJS(BpmnJS, options, locals) {
+ return function(done) {
+ var testContainer;
- var testContainer;
+ // Make sure the test container is an optional dependency and we fall back
+ // to an empty
if it does not exist.
+ //
+ // This is needed if other libraries rely on this helper for testing
+ // while not adding the mocha-test-container-support as a dependency.
+ try {
+ // 'this' is the current test context
+ testContainer = TestContainer.get(this);
+ } catch (e) {
+ testContainer = document.createElement('div');
+ document.body.appendChild(testContainer);
+ }
- try {
- testContainer = jasmine.getEnv().getTestContainer();
- } catch (e) {
- testContainer = document.createElement('div');
- document.body.appendChild(testContainer);
- }
+ testContainer.classList.add('test-container');
- testContainer.classList.add('test-container');
+ var _options = options,
+ _locals = locals;
- var _options = options,
- _locals = locals;
+ if (_locals === undefined && isFunction(_options)) {
+ _locals = _options;
+ _options = null;
+ }
- if (_locals === undefined && isFunction(_options)) {
- _locals = _options;
- _options = null;
- }
+ if (isFunction(_options)) {
+ _options = _options();
+ }
- if (isFunction(_options)) {
- _options = _options();
- }
+ if (isFunction(_locals)) {
+ _locals = _locals();
+ }
- if (isFunction(_locals)) {
- _locals = _locals();
- }
+ _options = assign({ container: testContainer }, OPTIONS || {}, _options || {});
- _options = assign({ container: testContainer, width: '100%', height: '100%' }, OPTIONS || {}, _options || {});
+ if (_locals) {
+ var mockModule = {};
- if (_locals) {
- var mockModule = {};
+ forEach(_locals, function(v, k) {
+ mockModule[k] = ['value', v];
+ });
- forEach(_locals, function(v, k) {
- mockModule[k] = ['value', v];
- });
+ _options.modules = [].concat(_options.modules || [], [ mockModule ]);
+ }
- _options.modules = [].concat(_options.modules || [], [ mockModule ]);
- }
+ _options.modules = unique(_options.modules);
- _options.modules = unique(_options.modules);
+ if (!_options.modules.length) {
+ _options.modules = undefined;
+ }
- if (!_options.modules.length) {
- _options.modules = undefined;
- }
+ BPMN_JS = new BpmnJS(_options);
- BPMN_JS = new BpmnJS(_options);
-
- return BPMN_JS;
+ BPMN_JS.importXML(diagram, done);
+ };
}
@@ -124,14 +126,7 @@ function bootstrapBpmnJS(BpmnJS, options, locals) {
* @return {Function} a function to be passed to beforeEach
*/
function bootstrapModeler(diagram, options, locals) {
-
- return function(done) {
- // bootstrap
- var modeler = bootstrapBpmnJS(Modeler, options, locals);
-
- // import diagram
- modeler.importXML(diagram, done);
- };
+ return bootstrapBpmnJS(Modeler, diagram, options, locals);
}
/**
@@ -159,14 +154,7 @@ function bootstrapModeler(diagram, options, locals) {
* @return {Function} a function to be passed to beforeEach
*/
function bootstrapViewer(diagram, options, locals) {
-
- return function(done) {
- // bootstrap
- var viewer = bootstrapBpmnJS(Viewer, options, locals);
-
- // import diagram
- viewer.importXML(diagram, done);
- };
+ return bootstrapBpmnJS(Viewer, diagram, options, locals);
}
@@ -184,7 +172,7 @@ function bootstrapViewer(diagram, options, locals) {
* beforeEach(bootstrapViewer(...));
*
* it('should provide mocked events', inject(function(events) {
- * expect(events).toBe(mockEvents);
+ * expect(events).to.eql(mockEvents);
* }));
*
* });
@@ -238,4 +226,4 @@ function insertCSS(name, css) {
head.appendChild(style);
}
-module.exports.insertCSS = insertCSS;
\ No newline at end of file
+module.exports.insertCSS = insertCSS;
diff --git a/test/integration/SimpleModelingSpec.js b/test/integration/SimpleModelingSpec.js
index 8cb54428..05dfafac 100644
--- a/test/integration/SimpleModelingSpec.js
+++ b/test/integration/SimpleModelingSpec.js
@@ -1,9 +1,8 @@
'use strict';
-var TestHelper = require('../TestHelper');
-
var Modeler = require('../../lib/Modeler');
+var TestContainer = require('mocha-test-container-support');
describe('scenario - simple modeling', function() {
@@ -11,7 +10,7 @@ describe('scenario - simple modeling', function() {
var container;
beforeEach(function() {
- container = jasmine.getEnv().getTestContainer();
+ container = TestContainer.get(this);
});
@@ -27,4 +26,4 @@ describe('scenario - simple modeling', function() {
});
});
-});
\ No newline at end of file
+});
diff --git a/test/integration/model/BpmnModdleSpec.js b/test/integration/model/BpmnModdleSpec.js
index f20f9c22..1a714d41 100644
--- a/test/integration/model/BpmnModdleSpec.js
+++ b/test/integration/model/BpmnModdleSpec.js
@@ -31,11 +31,11 @@ describe('bpmn-moddle', function() {
}
// then
- expect(definitions.id).toBe('simple');
- expect(definitions.targetNamespace).toBe('http://bpmn.io/schema/bpmn');
+ expect(definitions.id).to.equal('simple');
+ expect(definitions.targetNamespace).to.equal('http://bpmn.io/schema/bpmn');
- expect(definitions.rootElements.length).toBe(1);
- expect(definitions.rootElements[0].id).toBe('Process_1');
+ expect(definitions.rootElements.length).to.equal(1);
+ expect(definitions.rootElements[0].id).to.equal('Process_1');
done();
});
diff --git a/test/spec/ModelerSpec.js b/test/spec/ModelerSpec.js
index 20de89e8..25147a74 100644
--- a/test/spec/ModelerSpec.js
+++ b/test/spec/ModelerSpec.js
@@ -1,16 +1,15 @@
'use strict';
-var TestHelper = require('../TestHelper');
-
var Modeler = require('../../lib/Modeler');
+var TestContainer = require('mocha-test-container-support');
describe('Modeler', function() {
var container;
beforeEach(function() {
- container = jasmine.getEnv().getTestContainer();
+ container = TestContainer.get(this);
});
@@ -61,7 +60,7 @@ describe('Modeler', function() {
}
// then
- expect(warnings.length).toBe(0);
+ expect(warnings.length).to.equal(0);
done();
});
@@ -80,7 +79,7 @@ describe('Modeler', function() {
modeler.importXML(xml, function(err, warnings) {
- expect(modeler.container.parentNode).toBe(document.body);
+ expect(modeler.container.parentNode).to.equal(document.body);
done(err, warnings);
});
@@ -102,8 +101,8 @@ describe('Modeler', function() {
elementRegistry = viewer.get('elementRegistry');
// assume
- expect(overlays).toBeDefined();
- expect(elementRegistry).toBeDefined();
+ expect(overlays).to.be.defined;
+ expect(elementRegistry).to.be.defined;
// when
@@ -124,8 +123,8 @@ describe('Modeler', function() {
});
// then
- expect(overlays.get({ element: 'SubProcess_1', type: 'badge' }).length).toBe(1);
- expect(overlays.get({ element: 'StartEvent_1', type: 'badge' }).length).toBe(1);
+ expect(overlays.get({ element: 'SubProcess_1', type: 'badge' }).length).to.equal(1);
+ expect(overlays.get({ element: 'StartEvent_1', type: 'badge' }).length).to.equal(1);
done(err);
});
@@ -152,7 +151,7 @@ describe('Modeler', function() {
createEvent = Events.scopedCreate(viewer.get('canvas'));
// assume
- expect(bendpointMove).toBeDefined();
+ expect(bendpointMove).to.be.defined;
// when
bendpointMove.start(createEvent({ x: 0, y: 0 }), elementRegistry.get('SequenceFlow_1'), 1);
@@ -174,7 +173,7 @@ describe('Modeler', function() {
modeler.importXML(xml, function(err) {
- expect(err).toBeDefined();
+ expect(err).to.be.defined;
done();
});
@@ -195,7 +194,7 @@ describe('Modeler', function() {
createModeler(xml, function(err, warnings, modeler) {
- expect(modeler.get('bpmnjs')).toBe(modeler);
+ expect(modeler.get('bpmnjs')).to.equal(modeler);
done(err);
});
diff --git a/test/spec/NavigatedViewerSpec.js b/test/spec/NavigatedViewerSpec.js
index 3bd23c71..e4106125 100644
--- a/test/spec/NavigatedViewerSpec.js
+++ b/test/spec/NavigatedViewerSpec.js
@@ -10,10 +10,12 @@ describe('NavigatedViewer', function() {
var container;
beforeEach(function() {
- container = jasmine.getEnv().getTestContainer();
+ container = document.createElement('div');
+ document.body.appendChild(container);
});
+
function createViewer(xml, done) {
var viewer = new NavigatedViewer({ container: container });
@@ -36,7 +38,7 @@ describe('NavigatedViewer', function() {
it('should include zoomScroll', function(done) {
createViewer(xml, function(err, warnings, viewer) {
- expect(viewer.get('zoomScroll')).toBeDefined();
+ expect(viewer.get('zoomScroll')).to.be.defined;
done(err);
});
@@ -45,7 +47,7 @@ describe('NavigatedViewer', function() {
it('should include moveCanvas', function(done) {
createViewer(xml, function(err, warnings, viewer) {
- expect(viewer.get('moveCanvas')).toBeDefined();
+ expect(viewer.get('moveCanvas')).to.be.defined;
done(err);
});
@@ -53,4 +55,4 @@ describe('NavigatedViewer', function() {
});
-});
\ No newline at end of file
+});
diff --git a/test/spec/ViewerSpec.js b/test/spec/ViewerSpec.js
index 3be58b59..300c78f6 100644
--- a/test/spec/ViewerSpec.js
+++ b/test/spec/ViewerSpec.js
@@ -1,7 +1,6 @@
'use strict';
-var TestHelper = require('../TestHelper');
-
+var TestContainer = require('mocha-test-container-support');
var Viewer = require('../../lib/Viewer');
@@ -11,7 +10,7 @@ describe('Viewer', function() {
var container;
beforeEach(function() {
- container = jasmine.getEnv().getTestContainer();
+ container = TestContainer.get(this);
});
@@ -52,8 +51,8 @@ describe('Viewer', function() {
viewer.importXML(xml, function(err, warnings) {
// then
- expect(err).toBeFalsy();
- expect(warnings.length).toBe(0);
+ expect(err).to.not.be.ok;
+ expect(warnings.length).to.equal(0);
done();
});
@@ -72,7 +71,7 @@ describe('Viewer', function() {
viewer.importXML(xml, function(err, warnings) {
- expect(viewer.container.parentNode).toBe(document.body);
+ expect(viewer.container.parentNode).to.equal(document.body);
done(err, warnings);
});
@@ -108,7 +107,7 @@ describe('Viewer', function() {
viewer.importXML(xml, function(err) {
// then
- expect(events).toEqual([
+ expect(events).to.eql([
'import.start',
'import.success'
]);
@@ -133,8 +132,8 @@ describe('Viewer', function() {
elementRegistry = viewer.get('elementRegistry');
// then
- expect(overlays).toBeDefined();
- expect(elementRegistry).toBeDefined();
+ expect(overlays).to.be.defined;
+ expect(elementRegistry).to.be.defined;
// when
overlays.add('SubProcess_1', {
@@ -146,7 +145,7 @@ describe('Viewer', function() {
});
// then
- expect(overlays.get({ element: 'SubProcess_1' }).length).toBe(1);
+ expect(overlays.get({ element: 'SubProcess_1' }).length).to.equal(1);
done(err);
});
@@ -161,18 +160,18 @@ describe('Viewer', function() {
function expectMessage(e, expectedMessage) {
- expect(e).toBeDefined();
+ expect(e).to.be.defined;
if (expectedMessage instanceof RegExp) {
- expect(e.message).toMatch(expectedMessage);
+ expect(e.message).to.match(expectedMessage);
} else {
- expect(e.message).toEqual(expectedMessage);
+ expect(e.message).to.equal(expectedMessage);
}
}
function expectWarnings(warnings, expected) {
- expect(warnings.length).toBe(expected.length);
+ expect(warnings.length).to.equal(expected.length);
warnings.forEach(function(w, idx) {
expectMessage(w, expected[idx]);
@@ -186,7 +185,7 @@ describe('Viewer', function() {
createViewer(xml, function(err) {
- expect(err).toBeTruthy();
+ expect(err).to.be.ok;
expectMessage(err, /Text data outside of root node./);
@@ -203,7 +202,7 @@ describe('Viewer', function() {
createViewer(xml, function(err, warnings) {
// then
- expect(err).toBeFalsy();
+ expect(err).to.not.be.ok;
expectWarnings(warnings, [
'unresolved reference ',
@@ -218,7 +217,8 @@ describe('Viewer', function() {
});
- it('should handle invalid namespaced element', function(done) {
+ it
+ ('should handle invalid namespaced element', function(done) {
var xml = require('../fixtures/bpmn/error/categoryValue.bpmn');
@@ -226,7 +226,7 @@ describe('Viewer', function() {
createViewer(xml, function(err, warnings) {
// then
- expect(err).toBeFalsy();
+ expect(err).to.not.be.ok;
expectWarnings(warnings, [
/unparsable content detected/,
@@ -246,7 +246,7 @@ describe('Viewer', function() {
createViewer(xml, function(err, warnings) {
// then
- expect(err).toBeFalsy();
+ expect(err).to.not.be.ok;
expectWarnings(warnings, [
/unparsable content detected/,
@@ -271,7 +271,7 @@ describe('Viewer', function() {
createViewer(xml, function(err, warnings, viewer) {
- expect(viewer.get('bpmnjs')).toBe(viewer);
+ expect(viewer.get('bpmnjs')).to.equal(viewer);
done(err);
});
@@ -290,15 +290,15 @@ describe('Viewer', function() {
var expectedStart = '';
var expectedEnd = '';
- expect(svg.indexOf(expectedStart)).toEqual(0);
- expect(svg.indexOf(expectedEnd)).toEqual(svg.length - expectedEnd.length);
+ expect(svg.indexOf(expectedStart)).to.equal(0);
+ expect(svg.indexOf(expectedEnd)).to.equal(svg.length - expectedEnd.length);
// ensure correct rendering of SVG contents
- expect(svg.indexOf('undefined')).toBe(-1);
+ expect(svg.indexOf('undefined')).to.equal(-1);
// expect header to be written only once
- expect(svg.indexOf('