diff options
Diffstat (limited to 'src/scenario/SpecRunner.js')
| -rw-r--r-- | src/scenario/SpecRunner.js | 61 | 
1 files changed, 44 insertions, 17 deletions
| diff --git a/src/scenario/SpecRunner.js b/src/scenario/SpecRunner.js index 26fa9b91..98ce4b53 100644 --- a/src/scenario/SpecRunner.js +++ b/src/scenario/SpecRunner.js @@ -8,6 +8,7 @@   */  angular.scenario.SpecRunner = function() {    this.futures = []; +  this.afterIndex = 0;  };  /** @@ -20,32 +21,52 @@ angular.scenario.SpecRunner = function() {   * @param {Function} Callback function that is called when the  spec finshes.   */  angular.scenario.SpecRunner.prototype.run = function(ui, spec, specDone) { +  var self = this;    var specUI = ui.addSpec(spec);    try { -    spec.fn.call(this); +    spec.before.call(this); +    spec.body.call(this); +    this.afterIndex = this.futures.length; +    spec.after.call(this);    } catch (e) {      specUI.error(e);      specDone();      return;    } +  var handleError = function(error, done) { +    if (self.error) { +      return done(); +    } +    self.error = true; +    done(null, self.afterIndex); +  }; +   +  var spec = this;    asyncForEach(      this.futures,      function(future, futureDone) { -      var stepUI = specUI.addStep(future.name); +      var stepUI = specUI.addStep(future.name, future.line);        try {          future.execute(function(error) {            stepUI.finish(error); -          futureDone(error); +          if (error) { +            return handleError(error, futureDone); +          } +          spec.$window.setTimeout( function() { futureDone(); }, 0);          });        } catch (e) {          stepUI.error(e); -        throw e; +        handleError(e, futureDone);        }      },      function(e) { -      specUI.finish(e); +      if (e) { +        specUI.error(e); +      } else { +        specUI.finish(); +      }        specDone();      }    ); @@ -54,11 +75,14 @@ angular.scenario.SpecRunner.prototype.run = function(ui, spec, specDone) {  /**   * Adds a new future action.   * + * Note: Do not pass line manually. It happens automatically. + *   * @param {String} Name of the future   * @param {Function} Behavior of the future + * @param {Function} fn() that returns file/line number   */ -angular.scenario.SpecRunner.prototype.addFuture = function(name, behavior) { -  var future = new angular.scenario.Future(name, angular.bind(this, behavior)); +angular.scenario.SpecRunner.prototype.addFuture = function(name, behavior, line) { +  var future = new angular.scenario.Future(name, angular.bind(this, behavior), line);    this.futures.push(future);    return future;  }; @@ -66,17 +90,20 @@ angular.scenario.SpecRunner.prototype.addFuture = function(name, behavior) {  /**   * Adds a new future action to be executed on the application window.   * + * Note: Do not pass line manually. It happens automatically. + *   * @param {String} Name of the future   * @param {Function} Behavior of the future + * @param {Function} fn() that returns file/line number    */ -angular.scenario.SpecRunner.prototype.addFutureAction = function(name, behavior) { +angular.scenario.SpecRunner.prototype.addFutureAction = function(name, behavior, line) { +  var self = this;    return this.addFuture(name, function(done) { -    this.application.executeAction(angular.bind(this, function($window, $document) { - -      $document.elements = angular.bind(this, function(selector) { +    this.application.executeAction(function($window, $document) { +      $document.elements = function(selector) {          var args = Array.prototype.slice.call(arguments, 1); -        if (this.selector) { -          selector = this.selector + ' ' + (selector || ''); +        if (self.selector) { +          selector = self.selector + ' ' + (selector || '');          }          angular.foreach(args, function(value, index) {            selector = selector.replace('$' + (index + 1), value); @@ -90,10 +117,10 @@ angular.scenario.SpecRunner.prototype.addFutureAction = function(name, behavior)          }          return result; -      }); +      };        try { -        behavior.call(this, $window, $document, done); +        behavior.call(self, $window, $document, done);        } catch(e) {          if (e.type && e.type === 'selector') {            done(e.message); @@ -101,6 +128,6 @@ angular.scenario.SpecRunner.prototype.addFutureAction = function(name, behavior)            throw e;          }        } -    })); -  }); +    }); +  }, line);  }; | 
