aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Abrons2010-03-15 17:02:54 -0700
committerAdam Abrons2010-03-15 17:02:54 -0700
commit39c6c5975bedf6e1610f7328a088acda9ab3406a (patch)
treec49a499733b7a3ec3547c64ff4d3ba5f9381dfa7
parent79b743e52feb2c57ba0ae42d6d2742bc2189b22f (diff)
downloadangular.js-39c6c5975bedf6e1610f7328a088acda9ab3406a.tar.bz2
get scenarios running again - open Runner.html in a browser to run them
-rw-r--r--example/calculator-bootstrap.html3
-rw-r--r--scenario/Runner.html10
-rw-r--r--scenario/datastore-scenarios.js19
-rw-r--r--scenario/datastore.html12
-rw-r--r--scenario/widgets-scenarios.js49
-rw-r--r--scenario/widgets.html58
-rw-r--r--src/scenario/Runner.js (renamed from src/test/Runner.js)51
-rw-r--r--src/scenario/Steps.js (renamed from src/test/Steps.js)6
-rw-r--r--src/scenario/_namespace.js6
-rw-r--r--src/scenario/bootstrap.js47
-rw-r--r--src/test/_namespace.js5
-rw-r--r--test/scenario/StepsTest.js (renamed from test/test/StepsTest.js)0
12 files changed, 236 insertions, 30 deletions
diff --git a/example/calculator-bootstrap.html b/example/calculator-bootstrap.html
index e37fe02d..c72837dc 100644
--- a/example/calculator-bootstrap.html
+++ b/example/calculator-bootstrap.html
@@ -10,7 +10,8 @@
scope.set('a', 3);
scope.updateView();
});
- </script> </head>
+ </script>
+ </head>
<body>
Quantity: <input type="text" name="a" value="2">
*
diff --git a/scenario/Runner.html b/scenario/Runner.html
new file mode 100644
index 00000000..fb4b0f8f
--- /dev/null
+++ b/scenario/Runner.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <script type="text/javascript" src="../src/scenario/bootstrap.js"></script>
+ <script type="text/javascript" src="widgets-scenarios.js"></script>
+ <!--<script type="text/javascript" src="datastore-scenarios.js"></script>-->
+ </head>
+ <body>
+ </body>
+</html>
diff --git a/scenario/datastore-scenarios.js b/scenario/datastore-scenarios.js
new file mode 100644
index 00000000..6038070b
--- /dev/null
+++ b/scenario/datastore-scenarios.js
@@ -0,0 +1,19 @@
+angular.scenarioDef.datastore = {
+ $before:[
+ {Given:"dataset",
+ dataset:{
+ Book:[{$id:'moby', name:"Moby Dick"},
+ {$id:'gadsby', name:'Great Gadsby'}]
+ }
+ },
+ {Given:"browser", at:"datastore.html#book=moby"},
+ ],
+ checkLoadBook:[
+ {Then:"drainRequestQueue"},
+
+ {Then:"text", at:"{{book.$id}}", should_be:"moby"},
+ {Then:"text", at:"li[$index=0] {{book.name}}", should_be:"Great Gahdsby"},
+ {Then:"text", at:"li[$index=0] {{book.name}}", should_be:"Moby Dick"},
+
+ ]
+};
diff --git a/scenario/datastore.html b/scenario/datastore.html
new file mode 100644
index 00000000..355d151c
--- /dev/null
+++ b/scenario/datastore.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <script type="text/javascript" src="../angular-bootstrap.js#database=$MEMORY"></script>
+ </head>
+ <body ng-entity="book=Book" ng-init="books=Book.all()">
+ <p>{{book.$id}}</p>
+ <li ng-repeat="book in books.$orderBy('name')">
+ <li>{{book.name}}</li>
+ </li>
+ </body>
+ </html>
diff --git a/scenario/widgets-scenarios.js b/scenario/widgets-scenarios.js
new file mode 100644
index 00000000..663b06da
--- /dev/null
+++ b/scenario/widgets-scenarios.js
@@ -0,0 +1,49 @@
+angular.scenarioDef.widgets = {
+ $before:[
+ {Given:"browser", at:"widgets.html"}
+ ],
+ checkWidgetBinding:[
+ {Then:"text", at:"{{name}}", should_be:""},
+ {When:"enter", text:"John", at:":input[name=name]"},
+ {Then:"text", at:"{{name}}", should_be:"John"},
+
+ {Then:"text", at:"{{gender}}", should_be:""},
+ {When:"click", at:"input:radio[value=male]"},
+ {Then:"text", at:"{{gender}}", should_be:"male"},
+
+ {Then:"text", at:"{{tea}}", should_be:"on"},
+ {When:"click", at:"input[name=tea]"},
+ {Then:"text", at:"{{tea}}", should_be:""},
+
+ {Then:"text", at:"{{coffee}}", should_be:""},
+ {When:"click", at:"input[name=coffee]"},
+ {Then:"text", at:"{{coffee}}", should_be:"on"},
+
+ {Then:"text", at:"{{count}}", should_be:0},
+ {When:"click", at:"form :button"},
+ {When:"click", at:"form :submit"},
+ {When:"click", at:"form :image"},
+ {Then:"text", at:"{{count}}", should_be:3},
+
+ {Then:"text", at:"{{select}}", should_be:"A"},
+ {When:"select", at:"select[name=select]", option:"B"},
+ {Then:"text", at:"{{select}}", should_be:"B"},
+
+ {Then:"text", at:"{{multiple}}", should_be:"[]"},
+ {When:"select", at:"select[name=multiple]", option:"A"},
+ {Then:"text", at:"{{multiple}}", should_be:["A"]},
+ {When:"select", at:"select[name=multiple]", option:"B"},
+ {Then:"text", at:"{{multiple}}", should_be:["A", "B"]},
+ {When:"select", at:"select[name=multiple]", option:"A"},
+ {Then:"text", at:"{{multiple}}", should_be:["B"]},
+
+ {Then:"text", at:"{{hidden}}", should_be:"hiddenValue"},
+
+ {Then:"text", at:"{{password}}", should_be:"passwordValue"},
+ {When:"enter", text:"reset", at:":input[name=password]"},
+ {Then:"text", at:"{{password}}", should_be:"reset"},
+ ],
+ checkNewWidgetEmpty:[
+ {Then:"text", at:"{{name}}", should_be:""},
+ ]
+};
diff --git a/scenario/widgets.html b/scenario/widgets.html
new file mode 100644
index 00000000..cb28e78c
--- /dev/null
+++ b/scenario/widgets.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <script type="text/javascript" src="../lib/underscore/underscore.js"></script>
+ <script type="text/javascript" src="../lib/jquery/jquery-1.3.2.js"></script>
+ <script type="text/javascript" src="../src/angular-bootstrap.js"></script>
+ <script type="text/javascript">
+ $(document).ready(function(){angular.compile(document).init();});
+ </script>
+ </head>
+ <body>
+ <p>
+ name: <input type="text" name="name" /> name={{name}} <br/>
+ </p>
+ <p>
+ <input type="radio" name="gender" value="female"/> Female
+ <input type="radio" name="gender" value="male"/> Male
+ gender={{gender}}
+ </p>
+ <p>
+ <input type="checkbox" name="tea" checked value="on"/> tea={{tea}} <br/>
+ <input type="checkbox" name="coffee" value="on"/> coffee={{coffee}} <br/>
+ </p>
+ <p ng-init="count = 0">
+ <form>
+ <input type="button" value="button" ng-action="count = count + 1"/>
+ <input type="submit" value="submit" ng-action="count = count + 1"/>
+ <input type="image" src="" ng-action="count = count + 1"/>
+ <a href="#ERROR" ng-action="count=count+1">action</a>
+ count={{count}}
+ </form>
+ </p>
+ <p>
+ <select name="select">
+ <option>A</option>
+ <option>B</option>
+ <option>C</option>
+ </select>
+ select={{select}}
+ </p>
+ <p>
+ <select name="multiple" multiple>
+ <option>A</option>
+ <option>B</option>
+ <option>C</option>
+ </select>
+ multiple={{multiple}}
+ </p>
+ <p>
+ <input type="hidden" name="hidden" value="hiddenValue" />
+ Hidden field = {{hidden}}
+ </p>
+ <p>
+ <input type="password" name="password" value="passwordValue" />
+ Password field = {{password}}
+ </p>
+ </body>
+ </html>
diff --git a/src/test/Runner.js b/src/scenario/Runner.js
index c6684951..7caddc98 100644
--- a/src/test/Runner.js
+++ b/src/scenario/Runner.js
@@ -1,15 +1,16 @@
-if (typeof test == 'undefined') test = {};
-
-test.ScenarioRunner = function(scenarios, body) {
+var scenario = angular.scenario;
+scenario.SuiteRunner = function(scenarios, body) {
this.scenarios = scenarios;
this.body = body;
};
-test.ScenarioRunner.prototype = {
+scenario.SuiteRunner.prototype = {
run:function(){
this.setUpUI();
this.runScenarios();
},
+
+
setUpUI:function(){
this.body.html(
'<div id="runner">' +
@@ -24,23 +25,25 @@ test.ScenarioRunner.prototype = {
jQuery(this).parent().find('.log').toggle();
});
},
+
+
runScenarios:function(){
- var runner = new test.Runner(this.console, this.testFrame);
- _.stepper(this.scenarios, function(next, scenario, name){
- new test.Scenario(name, scenario).run(runner, next);
+ var runner = new scenario.Runner(this.console, this.testFrame);
+ _.stepper(this.scenarios, function(next, scenarioObj, name){
+ new scenario.Scenario(name, scenarioObj).run(runner, next);
}, function(){
}
);
}
};
-test.Runner = function(console, frame){
+scenario.Runner = function(console, frame){
this.console = console;
this.current = null;
this.tests = [];
this.frame = frame;
};
-test.Runner.prototype = {
+scenario.Runner.prototype = {
start:function(name){
var current = this.current = {
name:name,
@@ -86,11 +89,11 @@ test.Runner.prototype = {
}
};
-test.Scenario = function(name, scenario){
+scenario.Scenario = function(name, scenario){
this.name = name;
this.scenario = scenario;
};
-test.Scenario.prototype = {
+scenario.Scenario.prototype = {
run:function(runner, callback) {
var self = this;
_.stepper(this.scenario, function(next, steps, name){
@@ -108,16 +111,20 @@ test.Scenario.prototype = {
}
}, callback);
},
+
+
verb:function(step){
var fn = null;
- if (!step) fn = function (){ throw "Step is null!"; };
- else if (step.Given) fn = angular.test.GIVEN[step.Given];
- else if (step.When) fn = angular.test.WHEN[step.When];
- else if (step.Then) fn = angular.test.THEN[step.Then];
- return fn || function (){
- throw "ERROR: Need Given/When/Then got: " + toJson(step);
- };
+ if (!step) fn = function (){ throw "Step is null!"; };
+ else if (step.Given) fn = scenario.GIVEN[step.Given];
+ else if (step.When) fn = scenario.WHEN[step.When];
+ else if (step.Then) fn = scenario.THEN[step.Then];
+ return fn || function (){
+ throw "ERROR: Need Given/When/Then got: " + toJson(step);
+ };
},
+
+
context: function(runner) {
var frame = runner.frame;
var window = frame[0].contentWindow;
@@ -144,11 +151,13 @@ test.Scenario.prototype = {
};
return context;
},
+
+
executeStep:function(runner, step, callback) {
if (!step) {
- callback();
- return;
- }
+ callback();
+ return;
+ }
runner.log("info", toJson(step));
var fn = this.verb(step);
var context = this.context(runner);
diff --git a/src/test/Steps.js b/src/scenario/Steps.js
index cc9ff549..f8ac173f 100644
--- a/src/test/Steps.js
+++ b/src/scenario/Steps.js
@@ -1,4 +1,4 @@
-angular.test.GIVEN = {
+angular.scenario.GIVEN = {
browser:function(){
var self = this;
if (jQuery.browser.safari && this.frame.attr('src') == this.at) {
@@ -17,7 +17,7 @@ angular.test.GIVEN = {
this.frame.name="$DATASET:" + toJson({dataset:this.dataset});
}
};
-angular.test.WHEN = {
+angular.scenario.WHEN = {
enter:function(){
var element = this.element(this.at);
element.attr('value', this.text);
@@ -40,7 +40,7 @@ angular.test.WHEN = {
element.change();
}
};
-angular.test.THEN = {
+angular.scenario.THEN = {
text:function(){
var element = this.element(this.at);
if (typeof this.should_be != undefined ) {
diff --git a/src/scenario/_namespace.js b/src/scenario/_namespace.js
new file mode 100644
index 00000000..7da3a5d8
--- /dev/null
+++ b/src/scenario/_namespace.js
@@ -0,0 +1,6 @@
+if (!angular) var angular = window['angular'] = {};
+if (!angular['scenario']) var angularScenario = angular['scenario'] = {};
+if (!angular['scenarioDef']) var scenarioDef = angular['scenarioDef'] = {};
+if (!angular['scenario']['GIVEN']) angularScenario['GIVEN'] = {};
+if (!angular['scenario']['WHEN']) angularScenario['WHEN'] = {};
+if (!angular['scenario']['THEN']) angularScenario['THEN'] = {};
diff --git a/src/scenario/bootstrap.js b/src/scenario/bootstrap.js
new file mode 100644
index 00000000..1d40b9d0
--- /dev/null
+++ b/src/scenario/bootstrap.js
@@ -0,0 +1,47 @@
+(function(onLoadDelegate){
+ var prefix = (function(){
+ var filename = /(.*\/)bootstrap.js(#(.*))?/;
+ var scripts = document.getElementsByTagName("script");
+ for(var j = 0; j < scripts.length; j++) {
+ var src = scripts[j].src;
+ if (src && src.match(filename)) {
+ var parts = src.match(filename);
+ return parts[1];
+ }
+ }
+ })();
+ function addScript(path) {
+ document.write('<script type="text/javascript" src="' + prefix + path + '"></script>');
+ };
+ function addCSS(path) {
+ document.write('<link rel="stylesheet" type="text/css" href="' + prefix + path + '"/>');
+ };
+ window.onload = function(){
+ if (!_.stepper) {
+ _.stepper = function(collection, iterator, done){
+ var keys = _.keys(collection);
+ function next() {
+ if (keys.length) {
+ var key = keys.shift();
+ iterator(next, collection[key], key);
+ } else {
+ (done||_.identity)();
+ }
+ }
+ next();
+ };
+ }
+ _.defer(function(){
+ new angular.scenario.SuiteRunner(angular.scenarioDef, jQuery(document.body)).run();
+ });
+ (onLoadDelegate||function(){})();
+ };
+ addCSS("../../css/angular-scenario.css");
+ addScript("../../lib/underscore/underscore.js");
+ addScript("../../lib/jquery/jquery-1.3.2.js");
+ addScript("../angular-bootstrap.js");
+ addScript("_namespace.js");
+ addScript("Steps.js");
+ addScript("Runner.js");
+})(window.onload);
+
diff --git a/src/test/_namespace.js b/src/test/_namespace.js
deleted file mode 100644
index e29ae72a..00000000
--- a/src/test/_namespace.js
+++ /dev/null
@@ -1,5 +0,0 @@
-if (!angular) var angular = window['angular'] = {};
-if (!angular['test']) var angularTest = angular['test'] = {};
-if (!angular['test']['GIVEN']) angularTest['GIVEN'] = {};
-if (!angular['test']['WHEN']) angularTest['WHEN'] = {};
-if (!angular['test']['THEN']) angularTest['THEN'] = {};
diff --git a/test/test/StepsTest.js b/test/scenario/StepsTest.js
index 9d64d0a9..9d64d0a9 100644
--- a/test/test/StepsTest.js
+++ b/test/scenario/StepsTest.js