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);  }; - | 
