diff options
Diffstat (limited to 'src/scenario/SpecRunner.js')
| -rw-r--r-- | src/scenario/SpecRunner.js | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/scenario/SpecRunner.js b/src/scenario/SpecRunner.js new file mode 100644 index 00000000..8b6d4ef1 --- /dev/null +++ b/src/scenario/SpecRunner.js @@ -0,0 +1,78 @@ +/** + * This class is the "this" of the it/beforeEach/afterEach method. + * Responsibilities: + * - "this" for it/beforeEach/afterEach + * - keep state for single it/beforeEach/afterEach execution + * - keep track of all of the futures to execute + * - run single spec (execute each future) + */ +angular.scenario.SpecRunner = function() { + this.futures = []; +}; + +/** + * Executes a spec which is an it block with associated before/after functions + * based on the describe nesting. + * + * @param {Object} An angular.scenario.UI implementation + * @param {Object} A spec object + * @param {Object} An angular.scenario.Application instance + * @param {Function} Callback function that is called when the spec finshes. + */ +angular.scenario.SpecRunner.prototype.run = function(ui, spec, specDone) { + var specUI = ui.addSpec(spec); + + try { + spec.fn.call(this); + } catch (e) { + specUI.error(e); + specDone(); + return; + } + + asyncForEach( + this.futures, + function(future, futureDone) { + var stepUI = specUI.addStep(future.name); + try { + future.execute(function(error) { + stepUI.finish(error); + futureDone(error); + }); + } catch (e) { + stepUI.error(e); + rethrow(e); + } + }, + function(e) { + specUI.finish(e); + specDone(); + } + ); +}; + +/** + * Adds a new future action. + * + * @param {String} Name of the future + * @param {Function} Behavior of the future + */ +angular.scenario.SpecRunner.prototype.addFuture = function(name, behavior) { + var future = new angular.scenario.Future(name, angular.bind(this, behavior)); + this.futures.push(future); + return future; +}; + +/** + * Adds a new future action to be executed on the application window. + * + * @param {String} Name of the future + * @param {Function} Behavior of the future + */ +angular.scenario.SpecRunner.prototype.addFutureAction = function(name, behavior) { + return this.addFuture(name, function(done) { + this.application.executeAction(function() { + behavior.call(this, done); + }); + }); +}; |
