302 lines
8.9 KiB
JavaScript
Executable File
302 lines
8.9 KiB
JavaScript
Executable File
var createElement = function(tag, attrs) {
|
|
var element = document.createElement(tag);
|
|
for (var attr in attrs) {
|
|
element[attr] = attrs[attr];
|
|
}
|
|
return element;
|
|
};
|
|
|
|
// Bootstrap Test Reporter function
|
|
var Reporter = function () {
|
|
this.total = 0;
|
|
this.passes = 0;
|
|
this.fails = 0;
|
|
this.start = new Date();
|
|
};
|
|
|
|
Reporter.prototype.toJSON = function(object) {
|
|
return JSON.stringify(object);
|
|
};
|
|
|
|
Reporter.prototype.test = function (result, message) {
|
|
this.total++;
|
|
|
|
if (result) {
|
|
this.passes++;
|
|
iconElement = document.getElementById('icons');
|
|
iconElement.appendChild(createElement('img', {src: '../images/go-16.png'}));
|
|
}
|
|
else {
|
|
this.fails++;
|
|
var fails_report = document.getElementById('fails');
|
|
fails_report.style.display = "";
|
|
|
|
var iconElement = document.getElementById('icons');
|
|
iconElement.appendChild(createElement('img', {src: '../images/fail-16.png'}));
|
|
|
|
var failMessages = document.getElementById('fail_messages');
|
|
var newFail = createElement('p', {'class': 'fail'});
|
|
newFail.innerHTML = message;
|
|
failMessages.appendChild(newFail);
|
|
}
|
|
};
|
|
|
|
Reporter.prototype.summary = function () {
|
|
var el = createElement('p', {'class': ((this.fails > 0) ? 'fail_in_summary' : '') });
|
|
el.innerHTML = this.total + ' expectations, ' + this.passes + ' passing, ' + this.fails + ' failed in ' + (new Date().getTime() - this.start.getTime()) + "ms.";
|
|
|
|
var summaryElement = document.getElementById('results_summary');
|
|
summaryElement.appendChild(el);
|
|
summaryElement.style.display = "";
|
|
};
|
|
|
|
|
|
var reporter = new Reporter();
|
|
|
|
function runSuite(filename) {
|
|
var suite = jasmine.include(filename);
|
|
suite.execute();
|
|
emitSuiteResults(filename, suite);
|
|
}
|
|
|
|
function emitSpecResults(testName, spec) {
|
|
var results = spec.results.getItems();
|
|
reporter.test(results.length > 0, testName + ": should have results, got " + results.length);
|
|
|
|
for (var i = 0; i < results.length; i++) {
|
|
reporter.test(results[i].passed === true, testName + ':' + spec.getFullName() + ": expectation number " + i + " failed: " + results[i].message);
|
|
}
|
|
}
|
|
|
|
function emitSuiteResults(testName, suite) {
|
|
for (var j = 0; j < suite.specs.length; j++) {
|
|
var specOrSuite = suite.specs[j];
|
|
|
|
if (specOrSuite instanceof jasmine.Suite) {
|
|
emitSuiteResults(testName, specOrSuite);
|
|
} else {
|
|
emitSpecResults(testName, specOrSuite);
|
|
}
|
|
}
|
|
}
|
|
|
|
var testExplodes = function () {
|
|
var suite = describe('exploding', function () {
|
|
it('should throw an exception when this.explodes is called inside a spec', function() {
|
|
var exceptionMessage = false;
|
|
|
|
try {
|
|
this.explodes();
|
|
}
|
|
catch (e) {
|
|
exceptionMessage = e;
|
|
}
|
|
expect(exceptionMessage).toEqual('explodes function should not have been called');
|
|
});
|
|
|
|
});
|
|
suite.execute();
|
|
|
|
emitSuiteResults('testExplodes', suite);
|
|
};
|
|
|
|
function newJasmineEnv() {
|
|
return new jasmine.Env();
|
|
}
|
|
|
|
var testRunner = function() {
|
|
};
|
|
|
|
var testRunnerFinishCallback = function () {
|
|
var env = newJasmineEnv();
|
|
var foo = 0;
|
|
|
|
env.currentRunner.finish();
|
|
|
|
reporter.test((env.currentRunner.finished === true),
|
|
"Runner finished flag was not set.");
|
|
|
|
env.currentRunner.finishCallback = function () {
|
|
foo++;
|
|
};
|
|
|
|
env.currentRunner.finish();
|
|
|
|
reporter.test((env.currentRunner.finished === true),
|
|
"Runner finished flag was not set.");
|
|
reporter.test((foo === 1),
|
|
"Runner finish callback was not called");
|
|
};
|
|
|
|
var testHandlesBlankSpecs = function () {
|
|
var env = newJasmineEnv();
|
|
env.describe('Suite for handles blank specs', function () {
|
|
env.it('should be a test with a blank runs block', function() {
|
|
this.runs(function () {
|
|
});
|
|
});
|
|
env.it('should be a blank (empty function) test', function() {
|
|
});
|
|
|
|
});
|
|
var runner = env.currentRunner;
|
|
runner.execute();
|
|
|
|
reporter.test((runner.suites[0].results.getItems().length === 2),
|
|
'Should have found 2 spec results, got ' + runner.suites[0].results.getItems().length);
|
|
reporter.test((runner.suites[0].results.passedCount === 2),
|
|
'Should have found 2 passing specs, got ' + runner.suites[0].results.passedCount);
|
|
};
|
|
|
|
var testFormatsExceptionMessages = function () {
|
|
|
|
var sampleFirefoxException = {
|
|
fileName: 'foo.js',
|
|
line: '1978',
|
|
message: 'you got your foo in my bar',
|
|
name: 'A Classic Mistake'
|
|
};
|
|
|
|
var sampleWebkitException = {
|
|
sourceURL: 'foo.js',
|
|
lineNumber: '1978',
|
|
message: 'you got your foo in my bar',
|
|
name: 'A Classic Mistake'
|
|
};
|
|
|
|
var expected = 'A Classic Mistake: you got your foo in my bar in foo.js (line 1978)';
|
|
|
|
reporter.test((jasmine.util.formatException(sampleFirefoxException) === expected),
|
|
'Should have got ' + expected + ' but got: ' + jasmine.util.formatException(sampleFirefoxException));
|
|
|
|
reporter.test((jasmine.util.formatException(sampleWebkitException) === expected),
|
|
'Should have got ' + expected + ' but got: ' + jasmine.util.formatException(sampleWebkitException));
|
|
};
|
|
|
|
var testHandlesExceptions = function () {
|
|
var env = newJasmineEnv();
|
|
|
|
//we run two exception tests to make sure we continue after throwing an exception
|
|
var suite = env.describe('Suite for handles exceptions', function () {
|
|
env.it('should be a test that fails because it throws an exception', function() {
|
|
this.runs(function () {
|
|
throw new Error('fake error 1');
|
|
});
|
|
});
|
|
|
|
env.it('should be another test that fails because it throws an exception', function() {
|
|
this.runs(function () {
|
|
throw new Error('fake error 2');
|
|
});
|
|
this.runs(function () {
|
|
this.expect(true).toEqual(true);
|
|
});
|
|
});
|
|
|
|
|
|
env.it('should be a passing test that runs after exceptions are thrown', function() {
|
|
this.runs(function () {
|
|
this.expect(true).toEqual(true);
|
|
});
|
|
});
|
|
|
|
env.it('should be another test that fails because it throws an exception after a wait', function() {
|
|
this.runs(function () {
|
|
var foo = 'foo';
|
|
});
|
|
this.waits(250);
|
|
this.runs(function () {
|
|
throw new Error('fake error 3');
|
|
});
|
|
});
|
|
|
|
env.it('should be a passing test that runs after exceptions are thrown from a async test', function() {
|
|
this.runs(function () {
|
|
this.expect(true).toEqual(true);
|
|
});
|
|
});
|
|
});
|
|
|
|
|
|
var runner = env.currentRunner;
|
|
runner.execute();
|
|
Clock.tick(400); //TODO: setting this to a large number causes failures, but shouldn't
|
|
|
|
var resultsForSpec0 = suite.specs[0].getResults();
|
|
var resultsForSpec1 = suite.specs[1].getResults();
|
|
var resultsForSpec2 = suite.specs[2].getResults();
|
|
var resultsForSpec3 = suite.specs[3].getResults();
|
|
|
|
reporter.test((suite.getResults().totalCount == 6),
|
|
'Should have found 5 spec results, got ' + suite.getResults().totalCount);
|
|
|
|
reporter.test((resultsForSpec0.getItems()[0].passed === false),
|
|
'Spec1 test, expectation 0 should have failed, got passed');
|
|
|
|
reporter.test((resultsForSpec0.getItems()[0].message.match(/fake error 1/)),
|
|
'Spec1 test, expectation 0 should have a message that contained /fake error 1/, got ' + resultsForSpec0.getItems()[0].message);
|
|
|
|
reporter.test((resultsForSpec1.getItems()[0].passed === false),
|
|
'Spec2 test, expectation 0 should have failed, got passed');
|
|
|
|
reporter.test((resultsForSpec1.getItems()[0].message.match(/fake error 2/)),
|
|
'Spec2 test, expectation 0 should have a message that contained /fake error 2/, got ' + resultsForSpec1.getItems()[0].message);
|
|
|
|
reporter.test((resultsForSpec1.getItems()[1].passed === true),
|
|
'Spec2 test should have had a passing 2nd expectation');
|
|
|
|
reporter.test((resultsForSpec2.getItems()[0].passed === true),
|
|
'Spec3 test should have passed, got failed');
|
|
|
|
reporter.test((resultsForSpec3.getItems()[0].passed === false),
|
|
'Spec3 test should have a failing first expectation, got passed');
|
|
|
|
reporter.test((resultsForSpec3.getItems()[0].message.match(/fake error 3/)),
|
|
'Spec3 test should have an error message that contained /fake error 3/, got ' + resultsForSpec3.getItems()[0].message);
|
|
};
|
|
|
|
|
|
var testResultsAliasing = function () {
|
|
var env = newJasmineEnv();
|
|
|
|
env.describe('Suite for result aliasing test', function () {
|
|
|
|
env.it('should be a test', function() {
|
|
this.runs(function () {
|
|
this.expect(true).toEqual(true);
|
|
});
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
var runTests = function () {
|
|
document.getElementById('spinner').style.display = "";
|
|
|
|
runSuite('PrettyPrintTest.js');
|
|
runSuite('MatchersTest.js');
|
|
runSuite('SpecRunningTest.js');
|
|
testRunnerFinishCallback();
|
|
runSuite('NestedResultsTest.js');
|
|
testFormatsExceptionMessages();
|
|
testHandlesExceptions();
|
|
testResultsAliasing();
|
|
runSuite('ReporterTest.js');
|
|
runSuite('RunnerTest.js');
|
|
runSuite('JsonReporterTest.js');
|
|
runSuite('SpyTest.js');
|
|
testExplodes();
|
|
|
|
|
|
// handle blank specs will work later.
|
|
// testHandlesBlankSpecs();
|
|
|
|
|
|
reporter.summary();
|
|
document.getElementById('spinner').style.display = "none";
|
|
|
|
};
|
|
|