Showing with 313 additions and 143 deletions.
  1. +1 −1 Gruntfile.js
  2. +85 −65 reporter/html.js
  3. +61 −43 src/core.js
  4. +8 −0 src/qunit.css
  5. +33 −17 src/test.js
  6. +125 −17 test/logs.js
@@ -117,7 +117,7 @@ grunt.initConfig({
".jshintrc",
"*.js",
"build/*.js",
"{src,test}/**/*.js"
"{src,test,external,reporter}/**/*.js"
],
tasks: "default"
}
@@ -76,7 +76,8 @@ var config = QUnit.config,
return false;
}
}())
};
},
modulesList = [];

/**
* Escape text for attribute or text content.
@@ -276,50 +277,37 @@ function toolbarUrlConfigContainer() {
return urlConfigContainer;
}

function getModuleNames() {
function toolbarModuleFilterHtml() {
var i,
moduleNames = [];
moduleFilterHtml = "";

for ( i in config.modules ) {
if ( config.modules.hasOwnProperty( i ) ) {
moduleNames.push( i );
}
if ( !modulesList.length ) {
return false;
}

moduleNames.sort(function( a, b ) {
modulesList.sort(function( a, b ) {
return a.localeCompare( b );
});

return moduleNames;
}

function toolbarModuleFilterHtml() {
var i,
moduleFilterHtml = "",
moduleNames = getModuleNames();

if ( moduleNames.length <= 1 ) {
return false;
}

moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label>" +
"<select id='qunit-modulefilter' name='modulefilter'><option value='' " +
( config.module === undefined ? "selected='selected'" : "" ) +
( QUnit.urlParams.module === undefined ? "selected='selected'" : "" ) +
">< All Modules ></option>";

for ( i = 0; i < moduleNames.length; i++ ) {
for ( i = 0; i < modulesList.length; i++ ) {
moduleFilterHtml += "<option value='" +
escapeText( encodeURIComponent( moduleNames[ i ] ) ) + "' " +
( config.module === moduleNames[ i ] ? "selected='selected'" : "" ) +
">" + escapeText( moduleNames[ i ] ) + "</option>";
escapeText( encodeURIComponent( modulesList[ i ] ) ) + "' " +
( QUnit.urlParams.module === modulesList[ i ] ? "selected='selected'" : "" ) +
">" + escapeText( modulesList[ i ] ) + "</option>";
}
moduleFilterHtml += "</select>";

return moduleFilterHtml;
}

function toolbarModuleFilter() {
var moduleFilter = document.createElement( "span" ),
var toolbar = id( "qunit-testrunner-toolbar" ),
moduleFilter = document.createElement( "span" ),
moduleFilterHtml = toolbarModuleFilterHtml();

if ( !moduleFilterHtml ) {
@@ -342,20 +330,14 @@ function toolbarModuleFilter() {
});
});

return moduleFilter;
toolbar.appendChild( moduleFilter );
}

function appendToolbar() {
var moduleFilter,
toolbar = id( "qunit-testrunner-toolbar" );
var toolbar = id( "qunit-testrunner-toolbar" );

if ( toolbar ) {
toolbar.appendChild( toolbarUrlConfigContainer() );

moduleFilter = toolbarModuleFilter();
if ( moduleFilter ) {
toolbar.appendChild( moduleFilter );
}
}
}

@@ -402,26 +384,78 @@ function appendUserAgent() {
}
}

function appendTestsList( modules ) {
var i, l, x, z, test, moduleObj;

for ( i = 0, l = modules.length; i < l; i++ ) {
moduleObj = modules[ i ];

if ( moduleObj.name ) {
modulesList.push( moduleObj.name );
}

for ( x = 0, z = moduleObj.tests.length; x < z; x++ ) {
test = moduleObj.tests[ x ];

appendTest( test.name, test.testId, moduleObj.name );
}
}
}

function appendTest( name, testId, moduleName ) {
var title, rerunTrigger, testBlock, assertList,
tests = id( "qunit-tests" );

if ( !tests ) {
return;
}

title = document.createElement( "strong" );
title.innerHTML = getNameHtml( name, moduleName );

rerunTrigger = document.createElement( "a" );
rerunTrigger.innerHTML = "Rerun";
rerunTrigger.href = QUnit.url({ testId: testId });

testBlock = document.createElement( "li" );
testBlock.appendChild( title );
testBlock.appendChild( rerunTrigger );
testBlock.id = "qunit-test-output-" + testId;

assertList = document.createElement( "ol" );
assertList.className = "qunit-assert-list";

testBlock.appendChild( assertList );

tests.appendChild( testBlock );
}

// HTML Reporter initialization and load
QUnit.begin(function() {
QUnit.begin(function( details ) {
var qunit = id( "qunit" );

if ( qunit ) {
qunit.innerHTML =
// Fixture is the only one necessary to run without the #qunit element
storeFixture();

if ( !qunit ) {
return;
}

qunit.innerHTML =
"<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
"<h2 id='qunit-banner'></h2>" +
"<div id='qunit-testrunner-toolbar'></div>" +
"<h2 id='qunit-userAgent'></h2>" +
"<ol id='qunit-tests'></ol>";
}

appendBanner();
appendTestResults();
appendUserAgent();
appendToolbar();
storeFixture();
appendTestsList( details.modules );
toolbarModuleFilter();

if ( qunit && config.hidepassed ) {
if ( config.hidepassed ) {
addClass( qunit.lastChild, "hidepass" );
}
});
@@ -490,43 +524,28 @@ function getNameHtml( name, module ) {
}

QUnit.testStart(function( details ) {
var a, b, li, running, assertList,
name = getNameHtml( details.name, details.module ),
tests = id( "qunit-tests" );
var running, testBlock;

if ( tests ) {
b = document.createElement( "strong" );
b.innerHTML = name;

a = document.createElement( "a" );
a.innerHTML = "Rerun";
a.href = QUnit.url({ testId: details.testId });

li = document.createElement( "li" );
li.appendChild( b );
li.appendChild( a );
li.className = "running";
li.id = "qunit-test-output" + details.testId;

assertList = document.createElement( "ol" );
assertList.className = "qunit-assert-list";

li.appendChild( assertList );
testBlock = id( "qunit-test-output-" + details.testId );
if ( testBlock ) {
testBlock.className = "running";
} else {

tests.appendChild( li );
// Report later registered tests
appendTest( details.name, details.testId, details.module );
}

running = id( "qunit-testresult" );
if ( running ) {
running.innerHTML = "Running: <br />" + name;
running.innerHTML = "Running: <br />" + getNameHtml( details.name, details.module );
}

});

QUnit.log(function( details ) {
var assertList, assertLi,
message, expected, actual,
testItem = id( "qunit-test-output" + details.testId );
testItem = id( "qunit-test-output-" + details.testId );

if ( !testItem ) {
return;
@@ -585,7 +604,8 @@ QUnit.testDone(function( details ) {
return;
}

testItem = id( "qunit-test-output" + details.testId );
testItem = id( "qunit-test-output-" + details.testId );

assertList = testItem.getElementsByTagName( "ol" )[ 0 ];

good = details.passed;