240 lines
6.6 KiB
JavaScript
240 lines
6.6 KiB
JavaScript
|
/*
|
||
|
* This module is not a plain nodeunit test suite, but instead uses the
|
||
|
* assert module to ensure a basic level of functionality is present,
|
||
|
* allowing the rest of the tests to be written using nodeunit itself.
|
||
|
*
|
||
|
* THIS FILE SHOULD BE BROWSER-COMPATIBLE JS!
|
||
|
* You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build.
|
||
|
* Only code on that line will be removed, its mostly to avoid requiring code
|
||
|
* that is node specific
|
||
|
*/
|
||
|
|
||
|
var assert = require('assert'), // @REMOVE_LINE_FOR_BROWSER
|
||
|
async = require('../deps/async'), // @REMOVE_LINE_FOR_BROWSER
|
||
|
nodeunit = require('../lib/nodeunit'); // @REMOVE_LINE_FOR_BROWSER
|
||
|
|
||
|
|
||
|
// NOT A TEST - util function to make testing faster.
|
||
|
// retries the assertion until it passes or the timeout is reached,
|
||
|
// at which point it throws the assertion error
|
||
|
var waitFor = function (fn, timeout, callback, start) {
|
||
|
start = start || new Date().getTime();
|
||
|
callback = callback || function () {};
|
||
|
try {
|
||
|
fn();
|
||
|
callback();
|
||
|
}
|
||
|
catch (e) {
|
||
|
if (e instanceof assert.AssertionError) {
|
||
|
var now = new Date().getTime();
|
||
|
if (now - start >= timeout) {
|
||
|
throw e;
|
||
|
}
|
||
|
else {
|
||
|
async.nextTick(function () {
|
||
|
waitFor(fn, timeout, callback, start);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
throw e;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
// TESTS:
|
||
|
|
||
|
// Are exported tests actually run? - store completed tests in this variable
|
||
|
// for checking later
|
||
|
var tests_called = {};
|
||
|
|
||
|
// most basic test that should run, the tests_called object is tested
|
||
|
// at the end of this module to ensure the tests were actually run by nodeunit
|
||
|
exports.testCalled = function (test) {
|
||
|
tests_called.testCalled = true;
|
||
|
test.done();
|
||
|
};
|
||
|
|
||
|
// generates test functions for nodeunit assertions
|
||
|
var makeTest = function (method, args_pass, args_fail) {
|
||
|
return function (test) {
|
||
|
var test1_called = false;
|
||
|
var test2_called = false;
|
||
|
|
||
|
// test pass
|
||
|
nodeunit.runTest(
|
||
|
'testname',
|
||
|
function (test) {
|
||
|
test[method].apply(test, args_pass);
|
||
|
test.done();
|
||
|
},
|
||
|
{testDone: function (name, assertions) {
|
||
|
assert.equal(assertions.length, 1);
|
||
|
assert.equal(assertions.failures(), 0);
|
||
|
}},
|
||
|
function () {
|
||
|
test1_called = true;
|
||
|
}
|
||
|
);
|
||
|
|
||
|
// test failure
|
||
|
nodeunit.runTest(
|
||
|
'testname',
|
||
|
function (test) {
|
||
|
test[method].apply(test, args_fail);
|
||
|
test.done();
|
||
|
},
|
||
|
{testDone: function (name, assertions) {
|
||
|
assert.equal(assertions.length, 1);
|
||
|
assert.equal(assertions.failures(), 1);
|
||
|
}},
|
||
|
function () {
|
||
|
test2_called = true;
|
||
|
}
|
||
|
);
|
||
|
|
||
|
// ensure tests were run
|
||
|
waitFor(function () {
|
||
|
assert.ok(test1_called);
|
||
|
assert.ok(test2_called);
|
||
|
tests_called[method] = true;
|
||
|
}, 500, test.done);
|
||
|
};
|
||
|
};
|
||
|
|
||
|
// ensure basic assertions are working:
|
||
|
exports.testOk = makeTest('ok', [true], [false]);
|
||
|
exports.testEquals = makeTest('equals', [1, 1], [1, 2]);
|
||
|
exports.testSame = makeTest('same',
|
||
|
[{test: 'test'}, {test: 'test'}],
|
||
|
[{test: 'test'}, {monkey: 'penguin'}]
|
||
|
);
|
||
|
|
||
|
// from the assert module:
|
||
|
exports.testEqual = makeTest('equal', [1, 1], [1, 2]);
|
||
|
exports.testNotEqual = makeTest('notEqual', [1, 2], [1, 1]);
|
||
|
exports.testDeepEqual = makeTest('deepEqual',
|
||
|
[{one: 1}, {one: 1}], [{one: 1}, {two: 2}]
|
||
|
);
|
||
|
exports.testNotDeepEqual = makeTest('notDeepEqual',
|
||
|
[{one: 1}, {two: 2}], [{one: 1}, {one: 1}]
|
||
|
);
|
||
|
exports.testStrictEqual = makeTest('strictEqual', [1, 1], [1, true]);
|
||
|
exports.testNotStrictEqual = makeTest('notStrictEqual', [true, 1], [1, 1]);
|
||
|
exports.testThrows = makeTest('throws',
|
||
|
[function () {
|
||
|
throw new Error('test');
|
||
|
}],
|
||
|
[function () {
|
||
|
return;
|
||
|
}]
|
||
|
);
|
||
|
exports.testThrowsWithReGex = makeTest('throws',
|
||
|
[function () {
|
||
|
throw new Error('test');
|
||
|
}, /test/],
|
||
|
[function () {
|
||
|
throw new Error('test');
|
||
|
}, /fail/]
|
||
|
);
|
||
|
exports.testThrowsWithErrorValidation = makeTest('throws',
|
||
|
[function () {
|
||
|
throw new Error('test');
|
||
|
}, function(err) {
|
||
|
return true;
|
||
|
}],
|
||
|
[function () {
|
||
|
throw new Error('test');
|
||
|
}, function(err) {
|
||
|
return false;
|
||
|
}]
|
||
|
);
|
||
|
exports.testDoesNotThrows = makeTest('doesNotThrow',
|
||
|
[function () {
|
||
|
return;
|
||
|
}],
|
||
|
[function () {
|
||
|
throw new Error('test');
|
||
|
}]
|
||
|
);
|
||
|
exports.testIfError = makeTest('ifError', [false], [new Error('test')]);
|
||
|
|
||
|
|
||
|
exports.testExpect = function (test) {
|
||
|
var test1_called = false,
|
||
|
test2_called = false,
|
||
|
test3_called = false;
|
||
|
|
||
|
// correct number of tests run
|
||
|
nodeunit.runTest(
|
||
|
'testname',
|
||
|
function (test) {
|
||
|
test.expect(2);
|
||
|
test.ok(true);
|
||
|
test.ok(true);
|
||
|
test.done();
|
||
|
},
|
||
|
{testDone: function (name, assertions) {
|
||
|
test.equals(assertions.length, 2);
|
||
|
test.equals(assertions.failures(), 0);
|
||
|
}},
|
||
|
function () {
|
||
|
test1_called = true;
|
||
|
}
|
||
|
);
|
||
|
|
||
|
// no tests run
|
||
|
nodeunit.runTest(
|
||
|
'testname',
|
||
|
function (test) {
|
||
|
test.expect(2);
|
||
|
test.done();
|
||
|
},
|
||
|
{testDone: function (name, assertions) {
|
||
|
test.equals(assertions.length, 1);
|
||
|
test.equals(assertions.failures(), 1);
|
||
|
}},
|
||
|
function () {
|
||
|
test2_called = true;
|
||
|
}
|
||
|
);
|
||
|
|
||
|
// incorrect number of tests run
|
||
|
nodeunit.runTest(
|
||
|
'testname',
|
||
|
function (test) {
|
||
|
test.expect(2);
|
||
|
test.ok(true);
|
||
|
test.ok(true);
|
||
|
test.ok(true);
|
||
|
test.done();
|
||
|
},
|
||
|
{testDone: function (name, assertions) {
|
||
|
test.equals(assertions.length, 4);
|
||
|
test.equals(assertions.failures(), 1);
|
||
|
}},
|
||
|
function () {
|
||
|
test3_called = true;
|
||
|
}
|
||
|
);
|
||
|
|
||
|
// ensure callbacks fired
|
||
|
waitFor(function () {
|
||
|
assert.ok(test1_called);
|
||
|
assert.ok(test2_called);
|
||
|
assert.ok(test3_called);
|
||
|
tests_called.expect = true;
|
||
|
}, 1000, test.done);
|
||
|
};
|
||
|
|
||
|
|
||
|
// tests are async, so wait for them to be called
|
||
|
waitFor(function () {
|
||
|
assert.ok(tests_called.testCalled);
|
||
|
assert.ok(tests_called.ok);
|
||
|
assert.ok(tests_called.equals);
|
||
|
assert.ok(tests_called.same);
|
||
|
assert.ok(tests_called.expect);
|
||
|
}, 10000);
|