diff options
Diffstat (limited to 'lib/jasmine-jstd-adapter/JasmineAdapter.js')
| -rw-r--r-- | lib/jasmine-jstd-adapter/JasmineAdapter.js | 359 |
1 files changed, 181 insertions, 178 deletions
diff --git a/lib/jasmine-jstd-adapter/JasmineAdapter.js b/lib/jasmine-jstd-adapter/JasmineAdapter.js index ba33bb9d..370de8b7 100644 --- a/lib/jasmine-jstd-adapter/JasmineAdapter.js +++ b/lib/jasmine-jstd-adapter/JasmineAdapter.js @@ -1,186 +1,189 @@ /** * @fileoverview Jasmine JsTestDriver Adapter. * @author misko@hevery.com (Misko Hevery) + * @author olmo.maldonado@gmail.com (Olmo Maldonado) */ -(function(window) { - var rootDescribes = new Describes(window); - var describePath = []; - rootDescribes.collectMode(); - - var jasmineTest = TestCase('Jasmine Adapter Tests', null, 'jasmine test case'); - - var jasminePlugin = { - name:'jasmine', - runTestConfiguration: function(testRunConfiguration, onTestDone, onTestRunConfigurationComplete){ - if (testRunConfiguration.testCaseInfo_.template_ !== jasmineTest) return; - - var jasmineEnv = jasmine.currentEnv_ = new jasmine.Env(); - rootDescribes.playback(); - var specLog = jstestdriver.console.log_ = []; - var start; - jasmineEnv.specFilter = function(spec) { - return rootDescribes.isExclusive(spec); - }; - jasmineEnv.reporter = { - log: function(str){ - specLog.push(str); - }, - - reportRunnerStarting: function(runner) { }, - - reportSpecStarting: function(spec) { - specLog = jstestdriver.console.log_ = []; - start = new Date().getTime(); - }, - - reportSpecResults: function(spec) { - var suite = spec.suite; - var results = spec.results(); - if (results.skipped) return; - var end = new Date().getTime(); - var messages = []; - var resultItems = results.getItems(); - var state = 'passed'; - for ( var i = 0; i < resultItems.length; i++) { - if (!resultItems[i].passed()) { - state = resultItems[i].message.match(/AssertionError:/) ? 'error' : 'failed'; - messages.push({ - message: resultItems[i].toString(), - name: resultItems[i].trace.name, - stack: formatStack(resultItems[i].trace.stack) - }); - } - } - onTestDone( - new jstestdriver.TestResult( - suite.getFullName(), - spec.description, - state, - jstestdriver.angular.toJson(messages), - specLog.join('\n'), - end - start)); - }, - - reportSuiteResults: function(suite) {}, - - reportRunnerResults: function(runner) { - onTestRunConfigurationComplete(); - } - }; - jasmineEnv.execute(); - return true; - }, - onTestsFinish: function(){ - jasmine.currentEnv_ = null; - rootDescribes.collectMode(); - } - }; - jstestdriver.pluginRegistrar.register(jasminePlugin); - - function formatStack(stack) { - var lines = (stack||'').split(/\r?\n/); - var frames = []; - for (i = 0; i < lines.length; i++) { - if (!lines[i].match(/\/jasmine[\.-]/)) { - frames.push(lines[i].replace(/https?:\/\/\w+(:\d+)?\/test\//, '').replace(/^\s*/, ' ')); - } - } - return frames.join('\n'); - } - - function noop(){} - function Describes(window){ - var describes = {}; - var beforeEachs = {}; - var afterEachs = {}; - // Here we store: - // 0: everyone runs - // 1: run everything under ddescribe - // 2: run only iits (ignore ddescribe) - var exclusive = 0; - var collectMode = true; - intercept('describe', describes); - intercept('xdescribe', describes); - intercept('beforeEach', beforeEachs); - intercept('afterEach', afterEachs); - - function intercept(functionName, collection){ - window[functionName] = function(desc, fn){ - if (collectMode) { - collection[desc] = function(){ - jasmine.getEnv()[functionName](desc, fn); - }; - } else { - jasmine.getEnv()[functionName](desc, fn); - } - }; - } - window.ddescribe = function(name, fn){ - if (exclusive < 1) { - exclusive = 1; // run ddescribe only - } - window.describe(name, function(){ - var oldIt = window.it; - window.it = function(name, fn){ - fn.exclusive = 1; // run anything under ddescribe - jasmine.getEnv().it(name, fn); - }; - try { - fn.call(this); - } finally { - window.it = oldIt; - }; - }); - }; - window.iit = function(name, fn){ - exclusive = fn.exclusive = 2; // run only iits - jasmine.getEnv().it(name, fn); - }; - - - this.collectMode = function() { - collectMode = true; - exclusive = 0; // run everything - }; - this.playback = function(){ - collectMode = false; - playback(beforeEachs); - playback(afterEachs); - playback(describes); - - function playback(set) { - for ( var name in set) { - set[name](); - } - } - }; - - this.isExclusive = function(spec) { - if (exclusive) { - var blocks = spec.queue.blocks; - for ( var i = 0; i < blocks.length; i++) { - if (blocks[i].func.exclusive >= exclusive) { - return true; - } - } - return false; - } - return true; - }; - } - -})(window); +(function(){ + + +var Env = function(onTestDone, onComplete){ + jasmine.Env.call(this); + + this.specFilter = function(spec){ + if (!this.exclusive) return true; + var blocks = spec.queue.blocks, l = blocks.length; + for (var i = 0; i < l; i++) if (blocks[i].func.exclusive >= this.exclusive) return true; + return false; + }; + + this.reporter = new Reporter(onTestDone, onComplete); +}; +jasmine.util.inherit(Env, jasmine.Env); + +// Here we store: +// 0: everyone runs +// 1: run everything under ddescribe +// 2: run only iits (ignore ddescribe) +Env.prototype.exclusive = 0; + + +Env.prototype.execute = function(){ + collectMode = false; + playback(); + jasmine.Env.prototype.execute.call(this); +}; + + +var Reporter = function(onTestDone, onComplete){ + this.onTestDone = onTestDone; + this.onComplete = onComplete; + this.reset(); +}; +jasmine.util.inherit(Reporter, jasmine.Reporter); + + +Reporter.formatStack = function(stack) { + var line, lines = (stack || '').split(/\r?\n/), l = lines.length, frames = []; + for (var i = 0; i < l; i++){ + line = lines[i]; + if (line.match(/\/jasmine[\.-]/)) continue; + frames.push(line.replace(/https?:\/\/\w+(:\d+)?\/test\//, '').replace(/^\s*/, ' ')); + } + return frames.join('\n'); +}; + + +Reporter.prototype.reset = function(){ + this.specLog = jstestdriver.console.log_ = []; +}; + + +Reporter.prototype.log = function(str){ + this.specLog.push(str); +}; + + +Reporter.prototype.reportSpecStarting = function(){ + this.reset(); + this.start = +new Date(); +}; + + +Reporter.prototype.reportSpecResults = function(spec){ + var elapsed = +new Date() - this.start, results = spec.results(); + + if (results.skipped) return; + + var item, state = 'passed', items = results.getItems(), l = items.length, messages = []; + for (var i = 0; i < l; i++){ + item = items[i]; + if (item.passed()) continue; + state = (item.message.indexOf('AssertionError:') != -1) ? 'error' : 'failed'; + messages.push({ + message: item + '', + name: item.trace.name, + stack: Reporter.formatStack(item.trace.stack) + }); + } + + this.onTestDone(new jstestdriver.TestResult( + spec.suite.getFullName(), + spec.description, + state, + jstestdriver.angular.toJson(messages), + this.specLog.join('\n'), + elapsed + )); +}; + + +Reporter.prototype.reportRunnerResults = function(){ + this.onComplete(); +}; + + +var collectMode = true, intercepted = {}; + +describe = intercept('describe'); +beforeEach = intercept('beforeEach'); +afterEach = intercept('afterEach'); + +var JASMINE_TYPE = 'jasmine test case'; +TestCase('Jasmine Adapter Tests', null, JASMINE_TYPE); + +jstestdriver.pluginRegistrar.register({ + + name: 'jasmine', + + getTestRunsConfigurationFor: function(testCaseInfos, expressions, testRunsConfiguration) { + for (var i = 0; i < testCaseInfos.length; i++) { + if (testCaseInfos[i].getType() == JASMINE_TYPE) { + testRunsConfiguration.push(new jstestdriver.TestRunConfiguration(testCaseInfos[i], [])); + } + } + return false; // allow other TestCases to be collected. + }, + + runTestConfiguration: function(config, onTestDone, onComplete){ + if (config.getTestCaseInfo().getType() != JASMINE_TYPE) return false; + (jasmine.currentEnv_ = new Env(onTestDone, onComplete)).execute(); + return true; + }, + + onTestsFinish: function(){ + jasmine.currentEnv_ = null; + collectMode = true; + } + +}); + +function intercept(method){ + var bucket = intercepted[method] = [], method = window[method]; + return function(desc, fn){ + if (collectMode) bucket.push(function(){ method(desc, fn); }); + else method(desc, fn); + }; +} + +function playback(){ + for (var method in intercepted){ + var bucket = intercepted[method]; + for (var i = 0, l = bucket.length; i < l; i++) bucket[i](); + } +} + +})(); + +var ddescribe = function(name, fn){ + var env = jasmine.getEnv(); + if (!env.exclusive) env.exclusive = 1; // run ddescribe only + describe(name, function(){ + var oldIt = it; + it = function(name, fn){ + fn.exclusive = 1; // run anything under ddescribe + env.it(name, fn); + }; + + try { + fn.call(this); + } finally { + it = oldIt; + }; + }); +}; + +var iit = function(name, fn){ + var env = jasmine.getEnv(); + env.exclusive = fn.exclusive = 2; // run only iits + env.it(name, fn); +}; // Patch Jasmine for proper stack traces jasmine.Spec.prototype.fail = function (e) { - var expectationResult = new jasmine.ExpectationResult({ - passed: false, - message: e ? jasmine.util.formatException(e) : 'Exception' - }); - // PATCH - if (e) { - expectationResult.trace = e; - } - this.results_.addResult(expectationResult); + var result = new jasmine.ExpectationResult({ + passed: false, + message: e ? jasmine.util.formatException(e) : 'Exception' + }); + if(e) result.trace = e; + this.results_.addResult(result); }; - |
