Wrap console

by Chris Watson

HTML

<pre id="console"></pre>

CSS

body {
    background: #000;
}
#console {
    margin: 0.5em;
    font-family: monospace;
    font-size: 150%;
}
.line {
    margin: 0.5em 0;
}
.err {
    color: #f00;
}
.log {
    color: #09f;
}
.warn {
    color: #ee0;
}

JavaScript

(function (w) {
    w.onerror = function(e) { console.error(e); };
debugger;
    var _c = w.console;
    var $console = $('#console');
    
    console.clear();
    
    function combine(fn, ctx, extraFn, extraCtx) {
        return function () {
            fn.apply(ctx, arguments);
            extraFn.apply(extraCtx, arguments);
        }
    }
    
    function write() {
        var args = Array.prototype.map.call(arguments, String);
        var className = args.shift();
        var text = args.join(' ');
        $('<div/>', { text: text, class: className + ' line'}).appendTo($console);
    }
    
    _c.log = combine(_c.log, _c, write.bind(null, 'log'));
    _c.warn = combine(_c.warn, _c, write.bind(null, 'warn'));
    _c.error = combine(_c.error, _c, write.bind(null, 'err'));
    
    
// Testing addon -----------------------------------
    
    w.test = function test(desc, fn) {
        try {
            fn();
            console.log('✓ ' + desc);
        } catch (e) {
            console.error('✗ ' + desc);
            console.error('  ' + e.message);
        }
        console.log(' ');
    }
    
    w.assert = function assert(cond) {
        if (!cond) {
            throw new Error('expected ' + cond + ' to be truthy');
        }
    }
    
})(this);


// Test --------------------------------------------

test('test fails', function () {
    assert(undefined);
});

test('test passes', function () {
    assert(true);
});

console.log('foo');
console.log('undefined:', undefined);
console.warn('bar');
throw 'baz';