Files
openlayers/test/mocha-phantomjs/core_extensions.js
2013-03-13 04:32:43 +01:00

87 lines
2.9 KiB
JavaScript

(function(){
// A shim for non ES5 supporting browsers, like PhantomJS. Lovingly inspired by:
// http://www.angrycoding.com/2011/09/to-bind-or-not-to-bind-that-is-in.html
if (!('bind' in Function.prototype)) {
Function.prototype.bind = function() {
var funcObj = this;
var extraArgs = Array.prototype.slice.call(arguments);
var thisObj = extraArgs.shift();
return function() {
return funcObj.apply(thisObj, extraArgs.concat(Array.prototype.slice.call(arguments)));
};
};
}
// Mocha needs process.stdout.write in order to change the cursor position. However,
// PhantomJS console.log always puts a new line character when logging and no STDOUT or
// stream access is available, outside writing to /dev/stdout, etc. To work around
// this, runner classes typically override `process.stdout.write` as needed to simulate
// write to standard out using cursor commands.
process.cursor = {
count: 0,
margin: 0,
buffer: '',
CRCleanup: false,
CRMatcher: undefined,
CRCleaner: undefined,
hide: '\u001b[?25l',
show: '\u001b[?25h',
deleteLine: '\u001b[2K',
beginningOfLine: '\u001b[0G',
up: '\u001b[A',
down: '\u001b[B',
forward: '\u001b[C',
forwardN: function(n){ return '\u001b[' + n + 'C'; },
backward: '\u001b[D',
nextLine: '\u001b[E',
previousLine: '\u001b[F'
}
process.stdout.columns = 0;
process.stdout.write = function(string) { console.log(string); }
// Mocha needs the formating feature of console.log so copy node's format function and
// monkey-patch it into place. This code is copied from node's, links copyright applies.
// https://github.com/joyent/node/blob/master/lib/util.js
console.format = function(f) {
if (typeof f !== 'string') {
var objects = [];
for (var i = 0; i < arguments.length; i++) {
objects.push(JSON.stringify(arguments[i]));
}
return objects.join(' ');
}
var i = 1;
var args = arguments;
var len = args.length;
var str = String(f).replace(/%[sdj%]/g, function(x) {
if (x === '%%') return '%';
if (i >= len) return x;
switch (x) {
case '%s': return String(args[i++]);
case '%d': return Number(args[i++]);
case '%j': return JSON.stringify(args[i++]);
default:
return x;
}
});
for (var x = args[i]; i < len; x = args[++i]) {
if (x === null || typeof x !== 'object') {
str += ' ' + x;
} else {
str += ' ' + JSON.stringify(x);
}
}
return str;
};
var origError = console.error;
console.error = function(){ origError.call(console, console.format.apply(console, arguments)); };
var origLog = console.log;
console.log = function(){ origLog.call(console, console.format.apply(console, arguments)); };
})();