|
|
@@ -8,7 +8,7 @@
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
-( () => {
|
|
|
+( function() {
|
|
|
// This seems to be the only way to force Require.JS to load modules starting with '/' from a different path.
|
|
|
var load = requirejs.load;
|
|
|
requirejs.load = function( context, moduleId, url ) {
|
|
|
@@ -21,6 +21,39 @@
|
|
|
return load( context, moduleId, url );
|
|
|
};
|
|
|
|
|
|
+ // Extend ChaiJS with custom exception check `expect().to.throwCKEditorError( [ msg ] )`.
|
|
|
+ require( [ '/ckeditor5/utils/ckeditorerror.js', 'chai' ], function( CKEditorError, chai ) {
|
|
|
+ CKEditorError = CKEditorError.default;
|
|
|
+
|
|
|
+ // Load extension and bind class used to check for inheritance.
|
|
|
+ chai.use( addThrowsCKEditorError.bind( null, CKEditorError ) );
|
|
|
+
|
|
|
+ // Self-test of the extension. Function names will help find those tests in case of regression.
|
|
|
+ chai.expect( function throwCKEditorErrorSelfTest1() {
|
|
|
+ throw new CKEditorError();
|
|
|
+ } ).to.throwCKEditorError();
|
|
|
+
|
|
|
+ chai.expect( function throwCKEditorErrorSelfTest2() {
|
|
|
+ throw new Error();
|
|
|
+ } ).to.not.throwCKEditorError();
|
|
|
+
|
|
|
+ chai.expect( function throwCKEditorErrorSelfTest3() {
|
|
|
+ throw new CKEditorError( 'custom message' );
|
|
|
+ } ).to.throwCKEditorError( 'message' );
|
|
|
+
|
|
|
+ chai.expect( function throwCKEditorErrorSelfTest4() {
|
|
|
+ throw new CKEditorError( 'another msg' );
|
|
|
+ } ).to.throwCKEditorError( /msg/ );
|
|
|
+
|
|
|
+ chai.expect( function throwCKEditorErrorSelfTest5() {
|
|
|
+ throw new CKEditorError( 'another msg' );
|
|
|
+ } ).to.throwCKEditorError( /^another/ );
|
|
|
+
|
|
|
+ chai.expect( function throwCKEditorErrorSelfTest6() {
|
|
|
+ throw new CKEditorError( 'another msg' );
|
|
|
+ } ).to.throwCKEditorError( /msg$/ );
|
|
|
+ } );
|
|
|
+
|
|
|
// Reported: https://github.com/benderjs/benderjs/issues/248
|
|
|
// Ugh... make some paths cleanup, because we need to combine these fragments and we don't want to
|
|
|
// duplicate '/'. BTW. if you want to touch this make sure you haven't broken Bender jobs which
|
|
|
@@ -46,4 +79,98 @@
|
|
|
function nonEmpty( str ) {
|
|
|
return !!str.length;
|
|
|
}
|
|
|
+
|
|
|
+ // Add `throwCKEditorError` chainable method to ChaiJS.
|
|
|
+ //
|
|
|
+ // @param {Object} CKEditorError Constructor of class checking for CKEditorError membership.
|
|
|
+ // @param {Object} _chai Chai instance.
|
|
|
+ // @param {Object} utils Chai extension utils.
|
|
|
+ // @returns {Object} Assertion
|
|
|
+ function addThrowsCKEditorError( CKEditorError, _chai, utils ) {
|
|
|
+ var Assertion = _chai.Assertion;
|
|
|
+
|
|
|
+ Assertion.addMethod( 'throwCKEditorError', assertThrowCKEditorError );
|
|
|
+
|
|
|
+ function assertThrowCKEditorError( errMsg ) {
|
|
|
+ // jshint validthis: true
|
|
|
+ // jscs:disable disallowMultipleVarDecl
|
|
|
+
|
|
|
+ var obj = utils.flag( this, 'object' ),
|
|
|
+ actuallyGot = '',
|
|
|
+ thrown = false,
|
|
|
+ thrownError = null,
|
|
|
+ message;
|
|
|
+
|
|
|
+ if ( arguments.length === 0 ) {
|
|
|
+ errMsg = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ obj();
|
|
|
+ } catch ( err ) {
|
|
|
+ this.assert(
|
|
|
+ CKEditorError.isCKEditorError( err ),
|
|
|
+ 'expected #{this} to throw #{exp} but #{act} was thrown',
|
|
|
+ 'expected #{this} to not throw #{exp} but #{act} was thrown',
|
|
|
+ 'CKEditorError',
|
|
|
+ ( err instanceof Error ? err.toString() : err )
|
|
|
+ );
|
|
|
+
|
|
|
+ // Set subject of assertion.
|
|
|
+ if ( !errMsg ) {
|
|
|
+ utils.flag( this, 'object', err );
|
|
|
+
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check message of error.
|
|
|
+ message = utils.type( err ) === 'object' && 'message' in err ? err.message : err.toString();
|
|
|
+
|
|
|
+ if ( ( message !== null && message !== undefined ) && errMsg && errMsg instanceof RegExp ) {
|
|
|
+ this.assert(
|
|
|
+ errMsg.exec( message ),
|
|
|
+ 'expected #{this} to throw CKEditorError matching #{exp} but got #{act}',
|
|
|
+ 'expected #{this} to throw CKEditorError not matching #{exp}',
|
|
|
+ errMsg,
|
|
|
+ message
|
|
|
+ );
|
|
|
+
|
|
|
+ utils.flag( this, 'object', err );
|
|
|
+
|
|
|
+ return this;
|
|
|
+ } else if ( ( message !== null && message !== undefined ) && errMsg && typeof errMsg == 'string' ) {
|
|
|
+ this.assert(
|
|
|
+ message.indexOf( errMsg ) !== -1,
|
|
|
+ 'expected #{this} to throw CKEditorError including #{exp} but got #{act}',
|
|
|
+ 'expected #{this} to throw CKEditorError not including #{act}',
|
|
|
+ errMsg,
|
|
|
+ message
|
|
|
+ );
|
|
|
+
|
|
|
+ utils.flag( this, 'object', err );
|
|
|
+
|
|
|
+ return this;
|
|
|
+ } else {
|
|
|
+ thrown = true;
|
|
|
+ thrownError = err;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( thrown ) {
|
|
|
+ actuallyGot = ' but #{act} was thrown';
|
|
|
+ }
|
|
|
+
|
|
|
+ this.assert(
|
|
|
+ thrown === true,
|
|
|
+ 'expected #{this} to throw an CKEditorError' + actuallyGot,
|
|
|
+ 'expected #{this} to not throw an CKEditorError' + actuallyGot,
|
|
|
+ 'CKEditorError',
|
|
|
+ ( thrownError instanceof Error ? thrownError.toString() : thrownError )
|
|
|
+ );
|
|
|
+
|
|
|
+ utils.flag( this, 'object', thrownError );
|
|
|
+
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+ }
|
|
|
} )();
|