diff options
| -rw-r--r-- | example/calculator-bootstrap.html | 3 | ||||
| -rw-r--r-- | scenario/Runner.html | 10 | ||||
| -rw-r--r-- | scenario/datastore-scenarios.js | 19 | ||||
| -rw-r--r-- | scenario/datastore.html | 12 | ||||
| -rw-r--r-- | scenario/widgets-scenarios.js | 49 | ||||
| -rw-r--r-- | scenario/widgets.html | 58 | ||||
| -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.js | 6 | ||||
| -rw-r--r-- | src/scenario/bootstrap.js | 47 | ||||
| -rw-r--r-- | src/test/_namespace.js | 5 | ||||
| -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 |
