Extracted warning handlers into their own prototypes
parent
de33a7c964
commit
4e3d609b01
|
@ -25,8 +25,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var util = require( './util' ),
|
var util = require( './util' ),
|
||||||
warn = require( './warn' ),
|
Warning = require( './warn' ).Warning,
|
||||||
Warning = warn.Warning,
|
|
||||||
|
|
||||||
hasOwn = Object.prototype.hasOwnProperty,
|
hasOwn = Object.prototype.hasOwnProperty,
|
||||||
|
|
||||||
|
@ -90,15 +89,23 @@ var util = require( './util' ),
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
module.exports = exports =
|
module.exports = exports =
|
||||||
function ClassBuilder( member_builder, visibility_factory )
|
function ClassBuilder( warn_handler, member_builder, visibility_factory )
|
||||||
{
|
{
|
||||||
// allow ommitting the 'new' keyword
|
// allow ommitting the 'new' keyword
|
||||||
if ( !( this instanceof exports ) )
|
if ( !( this instanceof exports ) )
|
||||||
{
|
{
|
||||||
// module.exports for Closure Compiler
|
// module.exports for Closure Compiler
|
||||||
return new module.exports( member_builder, visibility_factory );
|
return new module.exports(
|
||||||
|
warn_handler, member_builder, visibility_factory
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines how warnings should be handled
|
||||||
|
* @type {WarningHandler}
|
||||||
|
*/
|
||||||
|
this._warnHandler = warn_handler;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used for building class members
|
* Used for building class members
|
||||||
* @type {Object}
|
* @type {Object}
|
||||||
|
@ -396,7 +403,7 @@ exports.prototype.build = function extend( _, __ )
|
||||||
// intercept warnings /only/
|
// intercept warnings /only/
|
||||||
if ( e instanceof Warning )
|
if ( e instanceof Warning )
|
||||||
{
|
{
|
||||||
warn.handle( e );
|
this._warnHandler.handle( e );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var util = require( './util' ),
|
var util = require( './util' ),
|
||||||
Warning = require( './warn' ).Warning,
|
|
||||||
visibility = [ 'public', 'protected', 'private' ]
|
visibility = [ 'public', 'protected', 'private' ]
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
14
lib/class.js
14
lib/class.js
|
@ -19,6 +19,19 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Console to use for logging
|
||||||
|
*
|
||||||
|
* This reference allows an alternative console to be used. Must contain
|
||||||
|
* warn() or log() methods.
|
||||||
|
*
|
||||||
|
* TODO: This needs to be moved into a facade, once more refactoring can be
|
||||||
|
* done; it was moved out of warn during its refactoring.
|
||||||
|
*
|
||||||
|
* @type {Object}
|
||||||
|
*/
|
||||||
|
var _console = ( typeof console !== 'undefined' ) ? console : undefined;
|
||||||
|
|
||||||
var util = require( './util' ),
|
var util = require( './util' ),
|
||||||
ClassBuilder = require( './ClassBuilder' ),
|
ClassBuilder = require( './ClassBuilder' ),
|
||||||
|
|
||||||
|
@ -29,6 +42,7 @@ var util = require( './util' ),
|
||||||
wrappers = require( './MethodWrappers' ).standard,
|
wrappers = require( './MethodWrappers' ).standard,
|
||||||
|
|
||||||
class_builder = ClassBuilder(
|
class_builder = ClassBuilder(
|
||||||
|
warn.LogHandler( _console ),
|
||||||
require( './MemberBuilder' )(
|
require( './MemberBuilder' )(
|
||||||
MethodWrapperFactory( wrappers.wrapNew ),
|
MethodWrapperFactory( wrappers.wrapNew ),
|
||||||
MethodWrapperFactory( wrappers.wrapOverride ),
|
MethodWrapperFactory( wrappers.wrapOverride ),
|
||||||
|
|
131
lib/warn.js
131
lib/warn.js
|
@ -1,7 +1,7 @@
|
||||||
/**
|
/**
|
||||||
* ease.js warning system
|
* ease.js warning system
|
||||||
*
|
*
|
||||||
* Copyright (C) 2011, 2012, 2013 Free Software Foundation, Inc.
|
* Copyright (C) 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This file is part of GNU ease.js.
|
* This file is part of GNU ease.js.
|
||||||
*
|
*
|
||||||
|
@ -19,130 +19,11 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
module.exports = {
|
||||||
* Active warning handler
|
Warning: require( './warn/Warning' ),
|
||||||
* @type {?function( Warning )}
|
|
||||||
*/
|
|
||||||
var _handler = null;
|
|
||||||
|
|
||||||
/**
|
DismissiveHandler: require( './warn/DismissiveHandler' ),
|
||||||
* Console to use for logging
|
LogHandler: require( './warn/LogHandler' ),
|
||||||
*
|
ThrowHandler: require( './warn/ThrowHandler' ),
|
||||||
* This reference allows an alternative console to be used. Must contain warn()
|
|
||||||
* or log() methods.
|
|
||||||
*
|
|
||||||
* @type {Object}
|
|
||||||
*/
|
|
||||||
var _console = ( typeof console !== 'undefined' ) ? console : undefined;
|
|
||||||
|
|
||||||
|
|
||||||
exports.Warning = require( './warn/Warning' );
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Core warning handlers
|
|
||||||
* @type {Object}
|
|
||||||
*/
|
|
||||||
exports.handlers = {
|
|
||||||
/**
|
|
||||||
* Logs message to console
|
|
||||||
*
|
|
||||||
* Will attempt to log using console.warn(), falling back to console.log()
|
|
||||||
* if necessary and aborting entirely if neither is available.
|
|
||||||
*
|
|
||||||
* This is useful as a default option to bring problems to the developer's
|
|
||||||
* attention without affecting the control flow of the software.
|
|
||||||
*
|
|
||||||
* @param {Warning} warning to log
|
|
||||||
*
|
|
||||||
* @return {undefined}
|
|
||||||
*/
|
|
||||||
log: function( warning )
|
|
||||||
{
|
|
||||||
var dest;
|
|
||||||
|
|
||||||
_console && ( dest = _console.warn || _console.log ) &&
|
|
||||||
dest.call( _console, ( 'Warning: ' + warning.message ) );
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Throws the error associated with the warning
|
|
||||||
*
|
|
||||||
* This handler is useful for development and will ensure that problems are
|
|
||||||
* brought to the attention of the developer.
|
|
||||||
*
|
|
||||||
* @param {Warning} warning to log
|
|
||||||
*
|
|
||||||
* @return {undefined}
|
|
||||||
*/
|
|
||||||
throwError: function( warning )
|
|
||||||
{
|
|
||||||
throw warning.getError();
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ignores warnings
|
|
||||||
*
|
|
||||||
* This is useful in a production environment where (a) warnings will affect
|
|
||||||
* the reputation of the software or (b) warnings may provide too much
|
|
||||||
* insight into the software. If using this option, you should always
|
|
||||||
* develop in a separate environment so that the system may bring warnings
|
|
||||||
* to your attention.
|
|
||||||
*
|
|
||||||
* @param {Warning} warning to log
|
|
||||||
*
|
|
||||||
* @return {undefined}
|
|
||||||
*/
|
|
||||||
dismiss: function( warning )
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the active warning handler
|
|
||||||
*
|
|
||||||
* You may use any of the predefined warning handlers or pass your own function.
|
|
||||||
*
|
|
||||||
* @param {function( Warning )} handler warning handler
|
|
||||||
*
|
|
||||||
* @return {undefined}
|
|
||||||
*/
|
|
||||||
exports.setHandler = function( handler )
|
|
||||||
{
|
|
||||||
_handler = handler;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles a warning using the active warning handler
|
|
||||||
*
|
|
||||||
* @param {Warning} warning warning to handle
|
|
||||||
*
|
|
||||||
* @return {undefined}
|
|
||||||
*/
|
|
||||||
exports.handle = function( warning )
|
|
||||||
{
|
|
||||||
_handler( warning );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets active console
|
|
||||||
*
|
|
||||||
* @param {Object} console containing warn() or log() method
|
|
||||||
*
|
|
||||||
* @return {undefined}
|
|
||||||
*/
|
|
||||||
exports.setConsole = function( console )
|
|
||||||
{
|
|
||||||
_console = console;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// set the default handler
|
|
||||||
_handler = exports.handlers.log;
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
/**
|
||||||
|
* Dismissive warning handler
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU ease.js.
|
||||||
|
*
|
||||||
|
* ease.js is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Warning handler that dismisses (ignores) all warnings
|
||||||
|
*
|
||||||
|
* This is useful in a production environment.
|
||||||
|
*/
|
||||||
|
function DismissiveHandler()
|
||||||
|
{
|
||||||
|
if ( !( this instanceof DismissiveHandler ) )
|
||||||
|
{
|
||||||
|
return new DismissiveHandler();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DismissiveHandler.prototype = {
|
||||||
|
/**
|
||||||
|
* Handle a warning
|
||||||
|
*
|
||||||
|
* @param {Warning} warning warning to handle
|
||||||
|
* @return {undefined}
|
||||||
|
*/
|
||||||
|
handle: function( warning )
|
||||||
|
{
|
||||||
|
// intentionally do nothing
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = DismissiveHandler;
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
/**
|
||||||
|
* Logging warning handler
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU ease.js.
|
||||||
|
*
|
||||||
|
* ease.js is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Warning handler that logs all warnings to a console
|
||||||
|
*
|
||||||
|
* @param {Object} console console with a warn or log method
|
||||||
|
*/
|
||||||
|
function LogHandler( console )
|
||||||
|
{
|
||||||
|
if ( !( this instanceof LogHandler ) )
|
||||||
|
{
|
||||||
|
return new LogHandler( console );
|
||||||
|
}
|
||||||
|
|
||||||
|
this._console = console || {};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LogHandler.prototype = {
|
||||||
|
/**
|
||||||
|
* Handle a warning
|
||||||
|
*
|
||||||
|
* Will attempt to log using console.warn(), falling back to
|
||||||
|
* console.log() if necessary and aborting entirely if neither is
|
||||||
|
* available.
|
||||||
|
*
|
||||||
|
* This is useful as a default option to bring problems to the
|
||||||
|
* developer's attention without affecting the control flow of the
|
||||||
|
* software.
|
||||||
|
*
|
||||||
|
* @param {Warning} warning warning to handle
|
||||||
|
* @return {undefined}
|
||||||
|
*/
|
||||||
|
handle: function( warning )
|
||||||
|
{
|
||||||
|
var dest = this._console.warn || this._console.log;
|
||||||
|
dest && dest.call( this._console,
|
||||||
|
'Warning: ' + warning.message
|
||||||
|
);
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = LogHandler;
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
/**
|
||||||
|
* Throwing warning handler
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU ease.js.
|
||||||
|
*
|
||||||
|
* ease.js is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Warning handler that throws all warnings as exceptions
|
||||||
|
*/
|
||||||
|
function ThrowHandler()
|
||||||
|
{
|
||||||
|
if ( !( this instanceof ThrowHandler ) )
|
||||||
|
{
|
||||||
|
return new ThrowHandler();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ThrowHandler.prototype = {
|
||||||
|
/**
|
||||||
|
* Handle a warning
|
||||||
|
*
|
||||||
|
* Throws the error associated with the warning.
|
||||||
|
*
|
||||||
|
* This handler is useful for development and will ensure that problems
|
||||||
|
* are brought to the attention of the developer.
|
||||||
|
*
|
||||||
|
* @param {Warning} warning warning to handle
|
||||||
|
* @return {undefined}
|
||||||
|
*/
|
||||||
|
handle: function( warning )
|
||||||
|
{
|
||||||
|
throw warning.getError();
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = ThrowHandler;
|
||||||
|
|
|
@ -23,8 +23,6 @@ require( 'common' ).testCase(
|
||||||
{
|
{
|
||||||
caseSetUp: function()
|
caseSetUp: function()
|
||||||
{
|
{
|
||||||
// XXX: get rid of this disgusting mess; we're mid-refactor and all
|
|
||||||
// these dependencies should not be necessary for testing
|
|
||||||
this.Sut = this.require( 'ClassBuilder' );
|
this.Sut = this.require( 'ClassBuilder' );
|
||||||
this.MethodWrapperFactory = this.require( 'MethodWrapperFactory' );
|
this.MethodWrapperFactory = this.require( 'MethodWrapperFactory' );
|
||||||
|
|
||||||
|
@ -34,14 +32,17 @@ require( 'common' ).testCase(
|
||||||
|
|
||||||
setUp: function()
|
setUp: function()
|
||||||
{
|
{
|
||||||
|
// XXX: get rid of this disgusting mess; we're mid-refactor and all
|
||||||
|
// these dependencies should not be necessary for testing
|
||||||
this.builder = this.Sut(
|
this.builder = this.Sut(
|
||||||
this.require( '/MemberBuilder' )(
|
this.require( 'warn' ).DismissiveHandler(),
|
||||||
|
this.require( 'MemberBuilder' )(
|
||||||
this.MethodWrapperFactory( this.wrappers.wrapNew ),
|
this.MethodWrapperFactory( this.wrappers.wrapNew ),
|
||||||
this.MethodWrapperFactory( this.wrappers.wrapOverride ),
|
this.MethodWrapperFactory( this.wrappers.wrapOverride ),
|
||||||
this.MethodWrapperFactory( this.wrappers.wrapProxy ),
|
this.MethodWrapperFactory( this.wrappers.wrapProxy ),
|
||||||
this.getMock( 'MemberBuilderValidator' )
|
this.getMock( 'MemberBuilderValidator' )
|
||||||
),
|
),
|
||||||
this.require( '/VisibilityObjectFactoryFactory' )
|
this.require( 'VisibilityObjectFactoryFactory' )
|
||||||
.fromEnvironment()
|
.fromEnvironment()
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
|
|
@ -73,6 +73,7 @@ require( 'common' ).testCase(
|
||||||
{
|
{
|
||||||
// XXX: clean up this mess.
|
// XXX: clean up this mess.
|
||||||
var builder = this.require( 'ClassBuilder' )(
|
var builder = this.require( 'ClassBuilder' )(
|
||||||
|
this.require( 'warn' ).DismissiveHandler(),
|
||||||
this.require( 'MemberBuilder' )(),
|
this.require( 'MemberBuilder' )(),
|
||||||
this.require( 'VisibilityObjectFactoryFactory' )
|
this.require( 'VisibilityObjectFactoryFactory' )
|
||||||
.fromEnvironment()
|
.fromEnvironment()
|
||||||
|
|
|
@ -291,6 +291,7 @@ require( 'common' ).testCase(
|
||||||
build = this.require( 'MemberBuilder' )();
|
build = this.require( 'MemberBuilder' )();
|
||||||
|
|
||||||
var sut = this.Sut(
|
var sut = this.Sut(
|
||||||
|
this.require( 'warn' ).DismissiveHandler(),
|
||||||
build,
|
build,
|
||||||
this.require( 'VisibilityObjectFactoryFactory' )
|
this.require( 'VisibilityObjectFactoryFactory' )
|
||||||
.fromEnvironment()
|
.fromEnvironment()
|
||||||
|
|
|
@ -26,8 +26,6 @@ require( 'common' ).testCase(
|
||||||
{
|
{
|
||||||
this.fallback = this.require( 'util' ).definePropertyFallback();
|
this.fallback = this.require( 'util' ).definePropertyFallback();
|
||||||
|
|
||||||
// XXX: get rid of this disgusting mess; we're mid-refactor and all
|
|
||||||
// these dependencies should not be necessary for testing
|
|
||||||
this.ClassBuilder = this.require( 'ClassBuilder' );
|
this.ClassBuilder = this.require( 'ClassBuilder' );
|
||||||
this.MemberBuilder = this.require( 'MemberBuilder' );
|
this.MemberBuilder = this.require( 'MemberBuilder' );
|
||||||
this.MethodWrapperFactory = this.require( 'MethodWrapperFactory' );
|
this.MethodWrapperFactory = this.require( 'MethodWrapperFactory' );
|
||||||
|
@ -38,7 +36,10 @@ require( 'common' ).testCase(
|
||||||
|
|
||||||
setUp: function()
|
setUp: function()
|
||||||
{
|
{
|
||||||
|
// XXX: get rid of this disgusting mess; we're mid-refactor and all
|
||||||
|
// these dependencies should not be necessary for testing
|
||||||
this.builder = this.ClassBuilder(
|
this.builder = this.ClassBuilder(
|
||||||
|
this.require( 'warn' ).DismissiveHandler(),
|
||||||
this.MemberBuilder(
|
this.MemberBuilder(
|
||||||
this.MethodWrapperFactory( this.wrappers.wrapNew ),
|
this.MethodWrapperFactory( this.wrappers.wrapNew ),
|
||||||
this.MethodWrapperFactory( this.wrappers.wrapOverride ),
|
this.MethodWrapperFactory( this.wrappers.wrapOverride ),
|
||||||
|
|
|
@ -25,8 +25,6 @@ require( 'common' ).testCase(
|
||||||
{
|
{
|
||||||
caseSetUp: function()
|
caseSetUp: function()
|
||||||
{
|
{
|
||||||
// XXX: get rid of this disgusting mess; we're mid-refactor and all
|
|
||||||
// these dependencies should not be necessary for testing
|
|
||||||
this.Sut = this.require( 'ClassBuilder' );
|
this.Sut = this.require( 'ClassBuilder' );
|
||||||
this.MethodWrapperFactory = this.require( 'MethodWrapperFactory' );
|
this.MethodWrapperFactory = this.require( 'MethodWrapperFactory' );
|
||||||
|
|
||||||
|
@ -37,7 +35,10 @@ require( 'common' ).testCase(
|
||||||
|
|
||||||
setUp: function()
|
setUp: function()
|
||||||
{
|
{
|
||||||
|
// XXX: get rid of this disgusting mess; we're mid-refactor and all
|
||||||
|
// these dependencies should not be necessary for testing
|
||||||
this.builder = this.Sut(
|
this.builder = this.Sut(
|
||||||
|
this.require( 'warn' ).DismissiveHandler(),
|
||||||
this.require( '/MemberBuilder' )(
|
this.require( '/MemberBuilder' )(
|
||||||
this.MethodWrapperFactory( this.wrappers.wrapNew ),
|
this.MethodWrapperFactory( this.wrappers.wrapNew ),
|
||||||
this.MethodWrapperFactory( this.wrappers.wrapOverride ),
|
this.MethodWrapperFactory( this.wrappers.wrapOverride ),
|
||||||
|
|
|
@ -1,176 +0,0 @@
|
||||||
/**
|
|
||||||
* Tests core warning handlers
|
|
||||||
*
|
|
||||||
* Copyright (C) 2014 Free Software Foundation, Inc.
|
|
||||||
*
|
|
||||||
* This file is part of GNU ease.js.
|
|
||||||
*
|
|
||||||
* ease.js is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
try { void console } catch ( e ) { console = undefined; }
|
|
||||||
|
|
||||||
require( 'common' ).testCase(
|
|
||||||
{
|
|
||||||
caseSetUp: function()
|
|
||||||
{
|
|
||||||
// XXX: this has global state
|
|
||||||
this.Sut = this.require( 'warn' );
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
setUp: function()
|
|
||||||
{
|
|
||||||
this.stubwarn = this.Sut.Warning( Error( 'gninraw' ) );
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The log warning handler should log warnings to the console
|
|
||||||
*/
|
|
||||||
'`log\' warning handler logs messages to console': function()
|
|
||||||
{
|
|
||||||
var _self = this,
|
|
||||||
logged = false;
|
|
||||||
|
|
||||||
// mock console
|
|
||||||
this.Sut.setConsole( {
|
|
||||||
warn: function( message )
|
|
||||||
{
|
|
||||||
// should prefix with `Warning: '
|
|
||||||
_self.assertEqual(
|
|
||||||
( 'Warning: ' + _self.stubwarn.message ),
|
|
||||||
message
|
|
||||||
);
|
|
||||||
|
|
||||||
logged = true;
|
|
||||||
},
|
|
||||||
} );
|
|
||||||
|
|
||||||
// call handler with the warning
|
|
||||||
this.Sut.handlers.log( this.stubwarn );
|
|
||||||
|
|
||||||
this.assertOk( logged, true,
|
|
||||||
"Message should be logged to console"
|
|
||||||
);
|
|
||||||
|
|
||||||
// restore console (TODO: will not be necessary once global state is
|
|
||||||
// removed)
|
|
||||||
this.Sut.setConsole( console );
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Some environments may not have a console reference, or they may not
|
|
||||||
* have console.warn. In this case, we just want to make sure we don't
|
|
||||||
* throw an error when attempting to invoke undefined, or access a
|
|
||||||
* property of undefined.
|
|
||||||
*/
|
|
||||||
'`log\' warning handler handles missing console': function()
|
|
||||||
{
|
|
||||||
var Sut = this.Sut;
|
|
||||||
|
|
||||||
// destroy it
|
|
||||||
Sut.setConsole( undefined );
|
|
||||||
|
|
||||||
// attempt to log
|
|
||||||
var _self = this;
|
|
||||||
this.assertDoesNotThrow( function()
|
|
||||||
{
|
|
||||||
Sut.handlers.log( _self.warnstub );
|
|
||||||
} );
|
|
||||||
|
|
||||||
// restore console
|
|
||||||
Sut.setConsole( console );
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Furthermore, an environment may implement console.log(), but not
|
|
||||||
* console.warn(). By default, we use warn(), so let's ensure we can
|
|
||||||
* fall back to log() if warn() is unavailable.
|
|
||||||
*/
|
|
||||||
'`log\' warning handler falls back to log if warn is missing':
|
|
||||||
function()
|
|
||||||
{
|
|
||||||
var given = '';
|
|
||||||
|
|
||||||
this.Sut.setConsole( {
|
|
||||||
log: function( message )
|
|
||||||
{
|
|
||||||
given = message;
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
|
|
||||||
// attempt to log
|
|
||||||
this.Sut.handlers.log( this.stubwarn );
|
|
||||||
|
|
||||||
this.assertEqual( ( 'Warning: ' + this.stubwarn.message ), given,
|
|
||||||
"Should fall back to log() and log proper message"
|
|
||||||
);
|
|
||||||
|
|
||||||
// restore console
|
|
||||||
this.Sut.setConsole( console );
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The throwError warning handler should throw the wrapped error as an
|
|
||||||
* exception
|
|
||||||
*/
|
|
||||||
'`throwError\' warning handler throws wrapped error': function()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
this.Sut.handlers.throwError( this.stubwarn );
|
|
||||||
}
|
|
||||||
catch ( e )
|
|
||||||
{
|
|
||||||
this.assertStrictEqual( e, this.stubwarn.getError(),
|
|
||||||
"Wrapped exception should be thrown"
|
|
||||||
);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.assertFail( "Wrapped exception should be thrown" );
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The 'dismiss' error handler is a pretty basic concept: simply do
|
|
||||||
* nothing. We don't want to log, we don't want to throw anything, we
|
|
||||||
* just want to pretend nothing ever happened and move on our merry way.
|
|
||||||
* This is intended for use in production environments where such
|
|
||||||
* warnings are expected to already have been worked out and would only
|
|
||||||
* confuse/concern the user.
|
|
||||||
*/
|
|
||||||
'`dismiss\' warning handler does nothing': function()
|
|
||||||
{
|
|
||||||
var Sut = this.Sut;
|
|
||||||
|
|
||||||
// destroy the console to ensure nothing is logged
|
|
||||||
Sut.setConsole( undefined );
|
|
||||||
|
|
||||||
// no errors should occur because it should not do anything.
|
|
||||||
var _self = this;
|
|
||||||
this.assertDoesNotThrow( function()
|
|
||||||
{
|
|
||||||
Sut.handlers.dismiss( _self.warnstub );
|
|
||||||
} );
|
|
||||||
|
|
||||||
// restore console
|
|
||||||
Sut.setConsole( console );
|
|
||||||
},
|
|
||||||
} );
|
|
|
@ -1,79 +0,0 @@
|
||||||
/**
|
|
||||||
* Tests warning system implementation
|
|
||||||
*
|
|
||||||
* Copyright (C) 2014 Free Software Foundation, Inc.
|
|
||||||
*
|
|
||||||
* This file is part of GNU ease.js.
|
|
||||||
*
|
|
||||||
* ease.js is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
try { void console } catch ( e ) { console = undefined; }
|
|
||||||
|
|
||||||
require( 'common' ).testCase(
|
|
||||||
{
|
|
||||||
setUp: function()
|
|
||||||
{
|
|
||||||
// XXX: this uses global state; remove that requirement.
|
|
||||||
this.Sut = this.require( 'warn' );
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The default warning handler should be the 'log' handler; this is a
|
|
||||||
* friendly compromise that will allow the developer to be warned of
|
|
||||||
* potential issues without affecting program execution.
|
|
||||||
*/
|
|
||||||
'Default warning handler is `log\'': function()
|
|
||||||
{
|
|
||||||
var called = false;
|
|
||||||
|
|
||||||
// stub it
|
|
||||||
this.Sut.setConsole( {
|
|
||||||
warn: function()
|
|
||||||
{
|
|
||||||
called = true;
|
|
||||||
},
|
|
||||||
} );
|
|
||||||
|
|
||||||
this.Sut.handle( this.Sut.Warning( Error( 'foo' ) ) );
|
|
||||||
this.assertOk( called );
|
|
||||||
|
|
||||||
// restore console (TODO: this will not be necessary once reliance
|
|
||||||
// on global state is removed)
|
|
||||||
this.Sut.setConsole( console );
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The warning handler can be altered at runtime; ensure we can set it
|
|
||||||
* and call it appropriately. We do not need to use one of the
|
|
||||||
* pre-defined handlers.
|
|
||||||
*/
|
|
||||||
'Can set and call arbitrary warning handler': function()
|
|
||||||
{
|
|
||||||
var given,
|
|
||||||
warning = this.Sut.Warning( Error( 'foo' ) );
|
|
||||||
|
|
||||||
// set a stub warning handler
|
|
||||||
this.Sut.setHandler( function( warn )
|
|
||||||
{
|
|
||||||
given = warn;
|
|
||||||
} );
|
|
||||||
|
|
||||||
// trigger the handler
|
|
||||||
this.Sut.handle( warning );
|
|
||||||
this.assertDeepEqual( given, warning );
|
|
||||||
},
|
|
||||||
} );
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
/**
|
||||||
|
* Tests dismissive warning handler
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU ease.js.
|
||||||
|
*
|
||||||
|
* ease.js is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
require( 'common' ).testCase(
|
||||||
|
{
|
||||||
|
caseSetUp: function()
|
||||||
|
{
|
||||||
|
this.Sut = this.require( 'warn/DismissiveHandler' );
|
||||||
|
this.Warning = this.require( 'warn/Warning' );
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
'Can be instantiated without `new` keyword': function()
|
||||||
|
{
|
||||||
|
this.assertOk( this.Sut() instanceof this.Sut );
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simply do nothing. We don't want to log, we don't want to throw
|
||||||
|
* anything, we just want to pretend nothing ever happened and move on
|
||||||
|
* our merry way. This is intended for use in production environments
|
||||||
|
* where such warnings are expected to already have been worked out and
|
||||||
|
* would only confuse/concern the user.
|
||||||
|
*
|
||||||
|
* Now, testing whether it does anything or not is difficult, since it
|
||||||
|
* could do, well, anything; that said, we are not passing it anything
|
||||||
|
* via the ctor, so assuming that it does not rely on or manipulate
|
||||||
|
* global state, we need only ensure that no exceptions are thrown.
|
||||||
|
*/
|
||||||
|
'Does nothing': function()
|
||||||
|
{
|
||||||
|
var _self = this;
|
||||||
|
this.assertDoesNotThrow( function()
|
||||||
|
{
|
||||||
|
_self.Sut().handle( _self.Warning( Error( "Ignore me!" ) ) );
|
||||||
|
} );
|
||||||
|
},
|
||||||
|
} );
|
|
@ -0,0 +1,126 @@
|
||||||
|
/**
|
||||||
|
* Tests logging warning handler
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU ease.js.
|
||||||
|
*
|
||||||
|
* ease.js is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
require( 'common' ).testCase(
|
||||||
|
{
|
||||||
|
caseSetUp: function()
|
||||||
|
{
|
||||||
|
this.Sut = this.require( 'warn/LogHandler' );
|
||||||
|
this.Warning = this.require( 'warn/Warning' );
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
setUp: function()
|
||||||
|
{
|
||||||
|
this.stubwarn = this.Warning( Error( 'gninraw' ) );
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
'Can be instantiated without `new` keyword': function()
|
||||||
|
{
|
||||||
|
this.assertOk( this.Sut() instanceof this.Sut );
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Warnings should be logged to the provided console. By default, the
|
||||||
|
* `warn` method is used (see below tests for fallbacks).
|
||||||
|
*/
|
||||||
|
'Logs messages to console': function()
|
||||||
|
{
|
||||||
|
var _self = this,
|
||||||
|
logged = false;
|
||||||
|
|
||||||
|
// mock console
|
||||||
|
this.Sut( {
|
||||||
|
warn: function( message )
|
||||||
|
{
|
||||||
|
// should prefix with `Warning: '
|
||||||
|
_self.assertEqual(
|
||||||
|
( 'Warning: ' + _self.stubwarn.message ),
|
||||||
|
message
|
||||||
|
);
|
||||||
|
|
||||||
|
logged = true;
|
||||||
|
},
|
||||||
|
} ).handle( this.stubwarn );
|
||||||
|
|
||||||
|
this.assertOk( logged, true,
|
||||||
|
"Message should be logged to console"
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some environments may not have a console reference, or they may not
|
||||||
|
* have console.warn. In this case, we just want to make sure we don't
|
||||||
|
* throw an error when attempting to invoke undefined, or access a
|
||||||
|
* property of undefined.
|
||||||
|
*/
|
||||||
|
'Ignores missing console': function()
|
||||||
|
{
|
||||||
|
var _self = this;
|
||||||
|
this.assertDoesNotThrow( function()
|
||||||
|
{
|
||||||
|
_self.Sut( undefined ).handle( _self.warnstub );
|
||||||
|
} );
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Furthermore, an environment may implement `console.log`, but not
|
||||||
|
* `console.warn`. By default, we use `warn`, so let's ensure we can
|
||||||
|
* fall back to `log` if `warn` is unavailable.
|
||||||
|
*/
|
||||||
|
'Falls back to log if warn is missing': function()
|
||||||
|
{
|
||||||
|
var given = '';
|
||||||
|
|
||||||
|
this.Sut( {
|
||||||
|
log: function( message )
|
||||||
|
{
|
||||||
|
given = message;
|
||||||
|
}
|
||||||
|
} ).handle( this.stubwarn );
|
||||||
|
|
||||||
|
this.assertEqual( ( 'Warning: ' + this.stubwarn.message ), given,
|
||||||
|
"Should fall back to log() and log proper message"
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If both `console.warn` and `console.log` are defined (which is very
|
||||||
|
* likely to be the case), the former should take precedence.
|
||||||
|
*/
|
||||||
|
'`warn` takes precedence over `log`': function()
|
||||||
|
{
|
||||||
|
var log = warn = false;
|
||||||
|
|
||||||
|
this.Sut( {
|
||||||
|
warn: function() { warn = true },
|
||||||
|
log: function() { log = true },
|
||||||
|
} ).handle( this.stubwarn );
|
||||||
|
|
||||||
|
this.assertOk( warn );
|
||||||
|
this.assertOk( !log );
|
||||||
|
},
|
||||||
|
} );
|
|
@ -0,0 +1,60 @@
|
||||||
|
/**
|
||||||
|
* Tests throwing warning handler
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU ease.js.
|
||||||
|
*
|
||||||
|
* ease.js is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
require( 'common' ).testCase(
|
||||||
|
{
|
||||||
|
caseSetUp: function()
|
||||||
|
{
|
||||||
|
this.Sut = this.require( 'warn/ThrowHandler' );
|
||||||
|
this.Warning = this.require( 'warn/Warning' );
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
'Can be instantiated without `new` keyword': function()
|
||||||
|
{
|
||||||
|
this.assertOk( this.Sut() instanceof this.Sut );
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The wrapped error should be thrown as an exception; this effectively
|
||||||
|
* undoes the warning wrapper.
|
||||||
|
*/
|
||||||
|
'`throwError\' warning handler throws wrapped error': function()
|
||||||
|
{
|
||||||
|
var warn = this.Warning( Error( 'gninraw' ) );
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.Sut().handle( warn );
|
||||||
|
}
|
||||||
|
catch ( e )
|
||||||
|
{
|
||||||
|
this.assertStrictEqual( e, warn.getError(),
|
||||||
|
"Wrapped exception should be thrown"
|
||||||
|
);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.assertFail( "Wrapped exception should be thrown" );
|
||||||
|
},
|
||||||
|
} );
|
Loading…
Reference in New Issue