diff options
Diffstat (limited to 'src/scenario/DSL.js')
| -rw-r--r-- | src/scenario/DSL.js | 249 | 
1 files changed, 126 insertions, 123 deletions
| diff --git a/src/scenario/DSL.js b/src/scenario/DSL.js index dc85ea45..a7571afe 100644 --- a/src/scenario/DSL.js +++ b/src/scenario/DSL.js @@ -1,131 +1,134 @@ -angular.scenario.dsl.browser = { -  navigateTo: function(url){ -    var location = this.location; -    return $scenario.addFuture('Navigate to: ' + url, function(done){ -      var self = this; -      this.testFrame.load(function(){ -        self.testFrame.unbind(); -        self.testWindow = self.testFrame[0].contentWindow; -        self.testDocument = self.jQuery(self.testWindow.document); -        self.$browser = self.testWindow.angular.service.$browser(); -        self.notifyWhenNoOutstandingRequests = -          bind(self.$browser, self.$browser.notifyWhenNoOutstandingRequests); -        self.notifyWhenNoOutstandingRequests(done); -      }); -      if (this.testFrame.attr('src') == url) { -        this.testFrame[0].contentWindow.location.reload(); -      } else { -        this.testFrame.attr('src', url); -        location.setLocation(url); -      } -    }); -  }, -  location: { -    href: "", -    hash: "", -    toEqual: function(url) { -      return (this.hash === "" ? (url == this.href) : -        (url == (this.href + "/#/" + this.hash))); -    }, -    setLocation: function(url) { -      var urlParts = url.split("/#/"); -      this.href = urlParts[0] || ""; -      this.hash = urlParts[1] || ""; -    } -  } -}; - -angular.scenario.dsl.input = function(selector) { -  var namePrefix = "input '" + selector + "'"; -  return { -    enter: function(value) { -      return $scenario.addFuture(namePrefix + " enter '" + value + "'", function(done) { -        var input = this.testDocument.find('input[name=' + selector + ']'); -        input.val(value); -        this.testWindow.angular.element(input[0]).trigger('change'); -        done(); -      }); -    }, -    select: function(value) { -      return $scenario.addFuture(namePrefix + " select '" + value + "'", function(done) { -        var input = this.testDocument. -          find(':radio[name$=@' + selector + '][value=' + value + ']'); -        jqLiteWrap(input[0]).trigger('click'); -        input[0].checked = true; -        done(); -      }); -    } -  }; -}; +/** + * Shared DSL statements that are useful to all scenarios. + */ -angular.scenario.dsl.NG_BIND_PATTERN =/\{\{[^\}]+\}\}/; +/** +* Usage: +*    pause(seconds) pauses the test for specified number of seconds +*/ +angular.scenario.dsl('pause', function() { + return function(time) { +   return this.addFuture('pause for ' + time + ' seconds', function(done) { +     this.setTimeout(function() { done(null, time * 1000); }, time * 1000); +   }); + }; +}); -angular.scenario.dsl.repeater = function(selector) { -  var namePrefix = "repeater '" + selector + "'"; -  return { -    count: function() { -      return $scenario.addFuture(namePrefix + ' count', function(done) { -          done(this.testDocument.find(selector).size()); -      }); -    }, -    collect: function(collectSelector) { -      return $scenario.addFuture( -          namePrefix + " collect '" + collectSelector + "'", -          function(done) { -        var self = this; -        var doCollect = bind(this, function() { -          var repeaterArray = [], ngBindPattern; -          var startIndex = collectSelector.search( -              angular.scenario.dsl.NG_BIND_PATTERN); -          if (startIndex >= 0) { -            ngBindPattern = collectSelector.substring( -                startIndex + 2, collectSelector.length - 2); -            collectSelector = '*'; -             -          } -          this.testDocument.find(selector).each(function() { -            var element = self.jQuery(this); -            element.find(collectSelector). -              each(function() { -                var foundElem = self.jQuery(this); -                if (foundElem.attr('ng:bind') == ngBindPattern) { -                  repeaterArray.push(foundElem.text()); -                } -            }); -          }); -          return repeaterArray; -        }); -        done(doCollect()); -      }); -    } +/** + * Usage: + *    expect(future).{matcher} where matcher is one of the matchers defined + *    with angular.scenario.matcher + * + * ex. expect(binding("name")).toEqual("Elliott") + */ +angular.scenario.dsl('expect', function() { +  var chain = angular.extend({}, angular.scenario.matcher); +   +  chain.not = function() { +    this.inverse = true; +    return chain; +  }; +   +  return function(future) { +    this.future = future; +    return chain;    }; -}; +}); -angular.scenario.dsl.element = function(selector) { -  var namePrefix = "Element '" + selector + "'"; -  var futureJquery = {}; -  for (key in (jQuery || _jQuery).fn) { -    (function(){ -      var jqFnName = key; -      var jqFn = (jQuery || _jQuery).fn[key]; -      futureJquery[key] = function() { -        var jqArgs = arguments; -        return $scenario.addFuture(namePrefix + "." + jqFnName + "()", -                function(done) { -          var self = this, repeaterArray = [], ngBindPattern; -          var startIndex = selector.search(angular.scenario.dsl.NG_BIND_PATTERN); -          if (startIndex >= 0) { -            ngBindPattern = selector.substring(startIndex + 2, selector.length - 2); -            var element = this.testDocument.find('*').filter(function() { -              return self.jQuery(this).attr('ng:bind') == ngBindPattern; +/** + * Usage: + *    navigateTo(future|string) where url a string or future with a value  + *    of a  URL to navigate to + */ +angular.scenario.dsl('navigateTo', function() { +  return function(url) { +    var application = this.application; +    var name = url; +    if (url.name) { +      name = ' value of ' + url.name; +    } +    return this.addFuture('navigate to ' + name, function(done) { +      application.navigateTo(url.value || url, function() { +        application.executeAction(function() { +          if (this.angular) { +            var $browser = this.angular.service.$browser(); +            $browser.poll(); +            $browser.notifyWhenNoOutstandingRequests(function() { +              done(null, url.value || url);              }); -            done(jqFn.apply(element, jqArgs));            } else { -            done(jqFn.apply(this.testDocument.find(selector), jqArgs)); +            done(null, url.value || url);            }          }); -      }; -    })(); -  } -  return futureJquery; -}; +      }); +    }); +  }; +}); + +/** + * Usage: + *    input(name).enter(value) enters value in input with specified name + *    input(name).check() checks checkbox + *    input(name).select(value) selects the readio button with specified name/value + */ +angular.scenario.dsl('input', function() { +  var chain = {}; +   +  chain.enter = function(value) { +    var spec = this; +    return this.addFutureAction("input '" + this.name + "' enter '" + value + "'", function(done) { +      var input = _jQuery(this.document).find('input[name=' + spec.name + ']'); +      if (!input.length) +        return done("Input named '" + spec.name + "' does not exist."); +      input.val(value); +      this.angular.element(input[0]).trigger('change'); +      done(); +    }); +  }; +   +  chain.check = function() { +    var spec = this; +    return this.addFutureAction("checkbox '" + this.name + "' toggle", function(done) { +      var input = _jQuery(this.document). +        find('input:checkbox[name=' + spec.name + ']'); +      if (!input.length) +        return done("Input named '" + spec.name + "' does not exist."); +      this.angular.element(input[0]).trigger('click'); +      input.attr('checked', !input.attr('checked')); +      done(); +    }); +  }; +   +  chain.select = function(value) { +    var spec = this; +    return this.addFutureAction("radio button '" + this.name + "' toggle '" + value + "'", function(done) { +      var input = _jQuery(this.document). +        find('input:radio[name$="@' + spec.name + '"][value="' + value + '"]'); +      if (!input.length) +        return done("Input named '" + spec.name + "' does not exist."); +      this.angular.element(input[0]).trigger('click'); +      input.attr('checked', !input.attr('checked')); +      done(); +    }); +  }; +   +  return function(name) { +    this.name = name; +    return chain; +  }; +}); + +/** + * Usage: + *    binding(name) returns the value of a binding + */ +angular.scenario.dsl('binding', function() { +  return function(name) { +    return this.addFutureAction("select binding '" + name + "'", function(done) { +      var element = _jQuery(this.document).find('[ng\\:bind="' + name + '"]'); +      if (!element.length) +        return done("Binding named '" + name + "' does not exist."); +      done(null, element.text()); +    }); +  }; +}); | 
