From c94496c9fedfba1d486b3eac6cf874fc0b0c81c0 Mon Sep 17 00:00:00 2001 From: pivotal Date: Thu, 15 Jan 2009 12:40:00 -0800 Subject: [PATCH] dwf/rva: added better exception handling for Webkit --- jasmine.iws | 104 +++++++++++++++++++++++----------------------- lib/jasmine.js | 40 +++++++++++++++++- test/bootstrap.js | 89 +++++++++++++++++++++++++++++++-------- 3 files changed, 161 insertions(+), 72 deletions(-) diff --git a/jasmine.iws b/jasmine.iws index c4af551..eed4a4e 100644 --- a/jasmine.iws +++ b/jasmine.iws @@ -80,7 +80,7 @@ - + @@ -89,19 +89,19 @@ - + - + - + - + @@ -122,7 +122,7 @@ - + @@ -131,7 +131,7 @@ - + @@ -296,6 +296,13 @@ + + @@ -310,6 +317,31 @@ + + + + + - - - - - - - localhost @@ -412,13 +412,13 @@ - + - + @@ -514,7 +514,7 @@ - + @@ -534,28 +534,28 @@ - + - - - - - - - - + - + + + + + + + + diff --git a/lib/jasmine.js b/lib/jasmine.js index 6990392..32621b3 100755 --- a/lib/jasmine.js +++ b/lib/jasmine.js @@ -210,6 +210,11 @@ Jasmine.Matchers.method('should_be_defined', function () { 'Expected ' + this.actual + ' to be defined.'); }); +Jasmine.Matchers.method('innerHTML_should_match', function (reg_exp) { + return this.report((reg_exp.match(this.actual.innerHTML)), + 'Expected ' + this.actual.innerHTML + ' to match ' + reg_exp + '.'); +}); + /* * Jasmine spec constructor */ @@ -254,8 +259,7 @@ var it = function (description, func) { catch (e) { that.results.push({ passed: false, - message: e.name + ': '+ e.message + ' in ' + e.fileName + - ' (line ' + e.lineNumber +')' + message: Jasmine.Util.formatException(e) }); queuedFunc.next(); } @@ -387,4 +391,36 @@ Jasmine.Reporters.reporter = function (callbacks) { } return that; +} + +Jasmine.Util = { + formatException: function(e) { + // if (typeof e === 'String') { + // return e; + // } + var lineNumber; + if (e.line) { + lineNumber = e.line; + } + else if (e.lineNumber) { + lineNumber = e.lineNumber; + } + + var file; + + if (e.sourceURL) { + file = e.sourceURL; + } + else if (e.fileName) { + file = e.fileName; + } + + var message = e.name + ': ' + e.message; + if (file && lineNumber) { + message += ' in ' + file +' (line ' + lineNumber + ')'; + } + + return message; + } + } \ No newline at end of file diff --git a/test/bootstrap.js b/test/bootstrap.js index c20ac47..73b1124 100755 --- a/test/bootstrap.js +++ b/test/bootstrap.js @@ -667,7 +667,7 @@ var testResults = function () { var testReporterWithCallbacks = function () { jasmine = Jasmine.init(); var runner = Runner(); - + describe('Suite for JSON Reporter with Callbacks', function () { it('should be a test', function() { runs(function () { @@ -693,9 +693,15 @@ var testReporterWithCallbacks = function () { var bar = 0; var baz = 0; - var specCallback = function (results) { foo++; } - var suiteCallback = function (results) { bar++; } - var runnerCallback = function (results) { baz++; } + var specCallback = function (results) { + foo++; + } + var suiteCallback = function (results) { + bar++; + } + var runnerCallback = function (results) { + baz++; + } jasmine.reporter = Jasmine.Reporters.reporter({ specCallback: specCallback, @@ -732,8 +738,8 @@ var testJSONReporter = function () { runner.execute(); setTimeout(function() { - var expectedSpecJSON = '{"totalCount": 1, "passedCount": 1, "failedCount": 0, "results": [{"passed": true, "message": "Passed."}], "description": "should be a test"}'; - var expectedSuiteJSON = '{"totalCount": 1, "passedCount": 1, "failedCount": 0, "results": [{"totalCount": 1, "passedCount": 1, "failedCount": 0, "results": [{"passed": true, "message": "Passed."}], "description": "should be a test"}], "description": "Suite for JSON Reporter, NO DOM"}'; + var expectedSpecJSON = '{"totalCount": 1, "passedCount": 1, "failedCount": 0, "results": [{"passed": true, "message": "Passed."}], "description": "should be a test"}'; + var expectedSuiteJSON = '{"totalCount": 1, "passedCount": 1, "failedCount": 0, "results": [{"totalCount": 1, "passedCount": 1, "failedCount": 0, "results": [{"passed": true, "message": "Passed."}], "description": "should be a test"}], "description": "Suite for JSON Reporter, NO DOM"}'; var expectedRunnerJSON = '{"totalCount": 1, "passedCount": 1, "failedCount": 0, "results": [{"totalCount": 1, "passedCount": 1, "failedCount": 0, "results": [{"totalCount": 1, "passedCount": 1, "failedCount": 0, "results": [{"passed": true, "message": "Passed."}], "description": "should be a test"}], "description": "Suite for JSON Reporter, NO DOM"}], "description": "All Jasmine Suites"}'; specJSON = jasmine.reporter.specJSON; @@ -782,10 +788,12 @@ var testHandlesBlankSpecs = function () { describe('Suite for handles blank specs', function () { it('should be a test with a blank runs block', function() { - runs(function () {}); + runs(function () { + }); }); - it('should be a blank (empty function) test', function() {}); - + it('should be a blank (empty function) test', function() { + }); + }); runner.execute(); @@ -797,10 +805,36 @@ var testHandlesBlankSpecs = function () { }, 250); } +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 () { jasmine = Jasmine.init(); var runner = Runner(); - + + //we run two exception tests to make sure we continue after throwing an exception describe('Suite for handles exceptions', function () { it('should be a test that fails because it throws an exception', function() { runs(function () { @@ -812,7 +846,7 @@ var testHandlesExceptions = function () { runs(function () { fakeObject2.fakeMethod2(); }); - runs(function () { + runs(function () { this.expects_that(true).should_equal(true); }); }); @@ -824,6 +858,23 @@ var testHandlesExceptions = function () { }); }); +// it('should be another test that fails because it throws an exception after a wait', function() { + // runs(function () { + // var foo = 'foo'; + // }); + // waits(250); + // runs(function () { + // fakeObject2.fakeMethod2(); + // }); + // }); + // + // it('should be a passing test that runs after exceptions are thrown from a async test', function() { + // runs(function () { + // this.expects_that(true).should_equal(true); + // }); + // }); + + }); runner.execute(); @@ -834,23 +885,24 @@ var testHandlesExceptions = function () { reporter.test((runner.suites[0].specs[0].expectationResults[0].passed === false), 'First test should have failed, got passed'); - reporter.test((runner.suites[0].specs[0].expectationResults[0].message === 'ReferenceError: fakeObject is not defined in file:///Users/pivotal/workspace/jasmine/test/bootstrap.js (line 807)'), - 'First test should have shown some exception string, got ' + runner.suites[0].specs[0].expectationResults[0].message); + reporter.test((typeof runner.suites[0].specs[0].expectationResults[0].message.search(/fakeObject/) !== -1), + 'First test should have contained /fakeObject/, got ' + runner.suites[0].specs[0].expectationResults[0].message); reporter.test((runner.suites[0].specs[1].expectationResults[0].passed === false), 'Second test should have a failing first result, got passed'); - reporter.test((runner.suites[0].specs[1].expectationResults[0].message === 'ReferenceError: fakeObject2 is not defined in file:///Users/pivotal/workspace/jasmine/test/bootstrap.js (line 813)'), - 'Second test should have shown an exception message for the first result, got ' + runner.suites[0].specs[1].expectationResults[0].message); + reporter.test((typeof runner.suites[0].specs[1].expectationResults[0].message.search(/fakeObject2/) !== -1), + 'First test should have contained /fakeObject/, got ' + runner.suites[0].specs[1].expectationResults[0].message); reporter.test((runner.suites[0].specs[1].expectationResults[1].passed === true), - 'Second expectation in second test should have still passed'); + 'Second expectation in second test should have still passed'); reporter.test((runner.suites[0].specs[2].expectationResults[0].passed === true), 'Third test should have passed, got failed'); }, 2000); } + var testResultsAliasing = function () { jasmine = Jasmine.init(); var runner = Runner(); @@ -909,7 +961,7 @@ var testResultsAliasing = function () { reporter.test((runner.suites[0].specs[0].expectationResults == runner.results.results[0].results[0].results), 'runner.suites[0].specs[0].expectationResults should have been ' + Object.toJSON(runner.results.results[0].results[0].results) + ', but was ' + Object.toJSON(runner.suites[0].specs[0].expectationResults)); - + }, 250); } @@ -930,7 +982,8 @@ var runTests = function () { testNestedResults(); testResults(); // handle blank specs will work later. -// testHandlesBlankSpecs(); + // testHandlesBlankSpecs(); + testFormatsExceptionMessages(); testHandlesExceptions(); testResultsAliasing();