aboutsummaryrefslogtreecommitdiffstats
path: root/src/scenario/Runner.js
diff options
context:
space:
mode:
authorElliott Sprehn2010-10-18 14:02:18 -0700
committerElliott Sprehn2010-10-19 00:45:38 -0700
commite7e894a2e36e042be6d62af56b0f3126f4e4fc77 (patch)
tree5b9c8b94bf3e3935a3acd6a3c0ecb142c82f4b17 /src/scenario/Runner.js
parenta1fa23397f12e0b52838530a993f14491ad50869 (diff)
downloadangular.js-e7e894a2e36e042be6d62af56b0f3126f4e4fc77.tar.bz2
Significantly clean up the way the scenario DSL works and implement many more DSL statements.
- "this" always means the current chain scope inside a DSL - addFutureAction callbacks now take ($window, $document, done) - $document has a special method elements() that uses the currently selected nodes in the document as defined by using() statements. - $document.elements() allows placeholder insertion into selectors to make them more readable. ex. $document.elements('input[name="$1"]', myVar) will substitute the value of myVar for $1 in the selector. Subsequent arguments are $2 and so on. - $document.elements() results have a special method trigger(event) which should be used to events. This method implements some hacks to make sure browser UI controls update and the correct angular events fire. - futures now allow custom formatting. By default any chain that results in a future can use toJson() or fromJson() to convert the future value to and from json. A custom parser can be provided with parsedWith(fn) where fn is a callback(value) that must return the parsed result. Note: The entire widgets.html UI is now able to be controlled and asserted through DSL statements!!! Victory! :)
Diffstat (limited to 'src/scenario/Runner.js')
-rw-r--r--src/scenario/Runner.js34
1 files changed, 28 insertions, 6 deletions
diff --git a/src/scenario/Runner.js b/src/scenario/Runner.js
index ff20d1d1..55360592 100644
--- a/src/scenario/Runner.js
+++ b/src/scenario/Runner.js
@@ -82,14 +82,36 @@ angular.scenario.Runner.prototype.run = function(ui, application, specRunnerClas
$root.setTimeout = function() {
return self.$window.setTimeout.apply(self.$window, arguments);
};
- asyncForEach(specs, angular.bind(this, function(spec, specDone) {
+ asyncForEach(specs, function(spec, specDone) {
+ var dslCache = {};
var runner = angular.scope($root);
runner.$become(specRunnerClass);
- angular.foreach(angular.scenario.dsl, angular.bind(this, function(fn, key) {
- this.$window[key] = function() {
- return fn.call($root).apply(angular.scope(runner), arguments);
+ angular.foreach(angular.scenario.dsl, function(fn, key) {
+ dslCache[key] = fn.call($root);
+ });
+ angular.foreach(angular.scenario.dsl, function(fn, key) {
+ self.$window[key] = function() {
+ var scope = angular.scope(runner);
+
+ // Make the dsl accessible on the current chain
+ scope.dsl = {};
+ angular.foreach(dslCache, function(fn, key) {
+ scope.dsl[key] = function() {
+ return dslCache[key].apply(scope, arguments);
+ };
+ });
+
+ // Make these methods work on the current chain
+ scope.addFuture = function() {
+ return angular.scenario.SpecRunner.prototype.addFuture.apply(scope, arguments);
+ };
+ scope.addFutureAction = function() {
+ return angular.scenario.SpecRunner.prototype.addFutureAction.apply(scope, arguments);
+ };
+
+ return scope.dsl[key].apply(scope, arguments);
};
- }));
+ });
runner.run(ui, spec, specDone);
- }), specsDone || angular.noop);
+ }, specsDone || angular.noop);
};