Skip to content

Commit

Permalink
Assert: Implement Assert constructor with test context
Browse files Browse the repository at this point in the history
For backwards compatibility, `QUnit.push` still works, though `assert.push`
should be used instead. Functions assigned to `QUnit.assert` are now added
to the `Assert` prototype and should use `this.push` instead of `QUnit.push`.

Fixes #374
Closes #588
  • Loading branch information
leobalter authored and jzaefferer committed Jun 24, 2014
1 parent e3a8757 commit f2066a2
Show file tree
Hide file tree
Showing 5 changed files with 163 additions and 184 deletions.
55 changes: 27 additions & 28 deletions src/assert.js
@@ -1,19 +1,24 @@
// `assert` initialized at top of scope
function Assert( testContext ) {
this.test = testContext;
}

// Assert helpers
// All of these must either call QUnit.push() or manually do:
// - runLoggingCallbacks( "log", .. );
// - config.current.assertions.push({ .. });
assert = QUnit.assert = {
QUnit.assert = Assert.prototype = {

// Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don't slip through.
expect: function( asserts ) {
if ( arguments.length === 1 ) {
config.current.expected = asserts;
this.test.expected = asserts;
} else {
return config.current.expected;
return this.test.expected;
}
},

// Exports test.push() to the user API
push: function() {
return this.test.push.apply( this.test, arguments );
},

/**
* Asserts rough true-ish result.
* @name ok
Expand All @@ -24,9 +29,9 @@ assert = QUnit.assert = {
message = message || ( result ? "okay" : "failed, expected argument to be truthy, was: " +
QUnit.dump.parse( result ) );
if ( !!result ) {
QUnit.push( true, result, true, message );
this.push( true, result, true, message );
} else {
QUnit.pushFailure( message, null, result );
this.test.pushFailure( message, null, result );
}
},

Expand All @@ -39,7 +44,7 @@ assert = QUnit.assert = {
*/
equal: function( actual, expected, message ) {
/*jshint eqeqeq:false */
QUnit.push( expected == actual, actual, expected, message );
this.push( expected == actual, actual, expected, message );
},

/**
Expand All @@ -48,7 +53,7 @@ assert = QUnit.assert = {
*/
notEqual: function( actual, expected, message ) {
/*jshint eqeqeq:false */
QUnit.push( expected != actual, actual, expected, message );
this.push( expected != actual, actual, expected, message );
},

/**
Expand All @@ -58,7 +63,7 @@ assert = QUnit.assert = {
propEqual: function( actual, expected, message ) {
actual = objectValues( actual );
expected = objectValues( expected );
QUnit.push( QUnit.equiv( actual, expected ), actual, expected, message );
this.push( QUnit.equiv( actual, expected ), actual, expected, message );
},

/**
Expand All @@ -68,39 +73,39 @@ assert = QUnit.assert = {
notPropEqual: function( actual, expected, message ) {
actual = objectValues( actual );
expected = objectValues( expected );
QUnit.push( !QUnit.equiv( actual, expected ), actual, expected, message );
this.push( !QUnit.equiv( actual, expected ), actual, expected, message );
},

/**
* @name deepEqual
* @function
*/
deepEqual: function( actual, expected, message ) {
QUnit.push( QUnit.equiv( actual, expected ), actual, expected, message );
this.push( QUnit.equiv( actual, expected ), actual, expected, message );
},

/**
* @name notDeepEqual
* @function
*/
notDeepEqual: function( actual, expected, message ) {
QUnit.push( !QUnit.equiv( actual, expected ), actual, expected, message );
this.push( !QUnit.equiv( actual, expected ), actual, expected, message );
},

/**
* @name strictEqual
* @function
*/
strictEqual: function( actual, expected, message ) {
QUnit.push( expected === actual, actual, expected, message );
this.push( expected === actual, actual, expected, message );
},

/**
* @name notStrictEqual
* @function
*/
notStrictEqual: function( actual, expected, message ) {
QUnit.push( expected !== actual, actual, expected, message );
this.push( expected !== actual, actual, expected, message );
},

"throws": function( block, expected, message ) {
Expand All @@ -114,13 +119,13 @@ assert = QUnit.assert = {
expected = null;
}

config.current.ignoreGlobalErrors = true;
this.test.ignoreGlobalErrors = true;
try {
block.call( config.current.testEnvironment );
block.call( this.test.testEnvironment );
} catch (e) {
actual = e;
}
config.current.ignoreGlobalErrors = false;
this.test.ignoreGlobalErrors = false;

if ( actual ) {

Expand Down Expand Up @@ -153,15 +158,9 @@ assert = QUnit.assert = {
ok = true;
}

QUnit.push( ok, actual, expectedOutput, message );
this.push( ok, actual, expectedOutput, message );
} else {
QUnit.pushFailure( message, null, "No exception was thrown." );
this.test.pushFailure( message, null, "No exception was thrown." );
}
}
};

/**
* @deprecated since 1.8.0
* Kept assertion helpers in root for backwards compatibility.
*/
extend( QUnit.constructor.prototype, assert );
86 changes: 0 additions & 86 deletions src/core.js
@@ -1,5 +1,4 @@
var QUnit,
assert,
config,
onErrorFnPrev,
testId = 0,
Expand Down Expand Up @@ -411,91 +410,6 @@ extend( QUnit, {
return undefined;
},

push: function( result, actual, expected, message ) {
if ( !config.current ) {
throw new Error( "assertion outside test context, was " + sourceFromStacktrace() );
}

var output, source,
details = {
module: config.current.module,
name: config.current.testName,
result: result,
message: message,
actual: actual,
expected: expected
};

message = escapeText( message ) || ( result ? "okay" : "failed" );
message = "<span class='test-message'>" + message + "</span>";
output = message;

if ( !result ) {
expected = escapeText( QUnit.dump.parse( expected ) );
actual = escapeText( QUnit.dump.parse( actual ) );
output += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" + expected + "</pre></td></tr>";

if ( actual !== expected ) {
output += "<tr class='test-actual'><th>Result: </th><td><pre>" + actual + "</pre></td></tr>";
output += "<tr class='test-diff'><th>Diff: </th><td><pre>" + QUnit.diff( expected, actual ) + "</pre></td></tr>";
}

source = sourceFromStacktrace();

if ( source ) {
details.source = source;
output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
}

output += "</table>";
}

runLoggingCallbacks( "log", QUnit, details );

config.current.assertions.push({
result: !!result,
message: output
});
},

pushFailure: function( message, source, actual ) {
if ( !config.current ) {
throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace( 2 ) );
}

var output,
details = {
module: config.current.module,
name: config.current.testName,
result: false,
message: message
};

message = escapeText( message ) || "error";
message = "<span class='test-message'>" + message + "</span>";
output = message;

output += "<table>";

if ( actual ) {
output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeText( actual ) + "</pre></td></tr>";
}

if ( source ) {
details.source = source;
output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
}

output += "</table>";

runLoggingCallbacks( "log", QUnit, details );

config.current.assertions.push({
result: false,
message: output
});
},

url: function( params ) {
params = extend( extend( {}, QUnit.urlParams ), params );
var key,
Expand Down

0 comments on commit f2066a2

Please sign in to comment.