(function(){

    //we want this at global scope so outside callers can find it. In a more realistic implementation we

    //should probably put it in a namespace.

    window.getCoverageByLine = function(silent) {

        var key = null;

        var lines = null;

        var source = null;

        //look for code coverage data

        if (typeof window._$jscoverage === 'object') {

            for (key in _$jscoverage) {}

            lines = _$jscoverage[key];

        }



        if (!lines && !silent) {

           console.log('code coverage data is NOT available');

        }



        return { 'key': key, 'lines': lines };

    };



    QUnit.done = function(t) {

        var cvgInfo = getCoverageByLine(true);

        if (!!cvgInfo.key) {

            var testableLines = 0;

            var testedLines = 0;

            var untestableLines = 0;

            for (lineIdx in cvgInfo.lines) {

                var cvg = cvgInfo.lines[lineIdx];

                if (typeof cvg === 'number') {

                    testableLines += 1;

                    if (cvg > 0) {

                        testedLines += 1;

                    }

                } else {

                    untestableLines += 1;

                }

            }

            var coverage = '' + Math.floor(100 * testedLines / testableLines) + '%';



            var result = document.getElementById('qunit-testresult');

            if (result != null) {

                result.innerHTML = result.innerHTML + ' ' + coverage + ' test coverage of ' + cvgInfo.key;

            } else {

                console.log('can\'t find test-result element to update');

            }

        }

    };

}());