2 * @fileoverview Jasmine JsTestDriver Adapter.
3 * @author misko@hevery.com (Misko Hevery)
6 var rootDescribes = new Describes(window);
8 rootDescribes.collectMode();
10 var jasmineTest = TestCase('Jasmine Adapter Tests', null, 'jasmine test case');
14 runTestConfiguration: function(testRunConfiguration, onTestDone, onTestRunConfigurationComplete){
15 if (testRunConfiguration.testCaseInfo_.template_ !== jasmineTest) return;
17 var jasmineEnv = jasmine.currentEnv_ = new jasmine.Env();
18 rootDescribes.playback();
19 var specLog = jstestdriver.console.log_ = [];
21 jasmineEnv.specFilter = function(spec) {
22 return rootDescribes.isExclusive(spec);
24 jasmineEnv.reporter = {
29 reportRunnerStarting: function(runner) { },
31 reportSpecStarting: function(spec) {
32 specLog = jstestdriver.console.log_ = [];
33 start = new Date().getTime();
36 reportSpecResults: function(spec) {
37 var suite = spec.suite;
38 var results = spec.results();
39 if (results.skipped) return;
40 var end = new Date().getTime();
42 var resultItems = results.getItems();
44 for ( var i = 0; i < resultItems.length; i++) {
45 if (!resultItems[i].passed()) {
46 state = resultItems[i].message.match(/AssertionError:/) ? 'error' : 'failed';
48 message: resultItems[i].toString(),
49 name: resultItems[i].trace.name,
50 stack: formatStack(resultItems[i].trace.stack)
55 new jstestdriver.TestResult(
59 jstestdriver.angular.toJson(messages),
64 reportSuiteResults: function(suite) {},
66 reportRunnerResults: function(runner) {
67 onTestRunConfigurationComplete();
73 onTestsFinish: function(){
74 jasmine.currentEnv_ = null;
75 rootDescribes.collectMode();
78 jstestdriver.pluginRegistrar.register(jasminePlugin);
80 function formatStack(stack) {
81 var lines = (stack||'').split(/\r?\n/);
83 for (i = 0; i < lines.length; i++) {
84 if (!lines[i].match(/\/jasmine[\.-]/)) {
85 frames.push(lines[i].replace(/https?:\/\/\w+(:\d+)?\/test\//, '').replace(/^\s*/, ' '));
88 return frames.join('\n');
92 function Describes(window){
97 var collectMode = true;
98 intercept('describe', describes);
99 intercept('xdescribe', describes);
100 intercept('beforeEach', beforeEachs);
101 intercept('afterEach', afterEachs);
103 function intercept(functionName, collection){
104 window[functionName] = function(desc, fn){
106 collection[desc] = function(){
107 jasmine.getEnv()[functionName](desc, fn);
110 jasmine.getEnv()[functionName](desc, fn);
114 window.ddescribe = function(name, fn){
116 console.log('ddescribe', name);
117 window.describe(name, function(){
118 var oldIt = window.it;
119 window.it = window.iit;
127 window.iit = function(name, fn){
128 exclusive = fn.exclusive = true;
130 jasmine.getEnv().it(name, fn);
134 this.collectMode = function() {
138 this.playback = function(){
140 playback(beforeEachs);
141 playback(afterEachs);
144 function playback(set) {
145 for ( var name in set) {
151 this.isExclusive = function(spec) {
153 var blocks = spec.queue.blocks;
154 for ( var i = 0; i < blocks.length; i++) {
155 if (blocks[i].func.exclusive) {
167 // Patch Jasmine for proper stack traces
168 jasmine.Spec.prototype.fail = function (e) {
169 var expectationResult = new jasmine.ExpectationResult({
171 message: e ? jasmine.util.formatException(e) : 'Exception'
175 expectationResult.trace = e;
177 this.results_.addResult(expectationResult);