diff options
| author | Misko Hevery | 2011-01-19 15:42:11 -0800 | 
|---|---|---|
| committer | Misko Hevery | 2011-01-24 14:23:51 -0800 | 
| commit | c2f2587a79aeb77aad66f081cf924a79348a698e (patch) | |
| tree | 8f5aa4cc6e7189befb834388b2102d1eda88a975 | |
| parent | 5d0d34ae72a9ca47f1b2dabda60711ad16ee9313 (diff) | |
| download | angular.js-c2f2587a79aeb77aad66f081cf924a79348a698e.tar.bz2 | |
fixed example rendering, add tests for it.
46 files changed, 512 insertions, 477 deletions
| diff --git a/docs/angular.formatter.ngdoc b/docs/angular.formatter.ngdoc index ba28471f..2f4433cf 100644 --- a/docs/angular.formatter.ngdoc +++ b/docs/angular.formatter.ngdoc @@ -8,13 +8,13 @@ The formatters are responsible for translating user readable text in an input wi  data model stored in an application.  # Writting your own Formatter -Writing your own formatter is easy. Just register a pair of JavaScript functions with  -`angular.formatter`. One function for parsing user input text to the stored form,  +Writing your own formatter is easy. Just register a pair of JavaScript functions with +`angular.formatter`. One function for parsing user input text to the stored form,  and one for formatting the stored data to user-visible text. -Here is an example of a "reverse" formatter: The data is stored in uppercase and in  -reverse, while it is displayed in lower case and non-reversed. User edits are  -automatically parsed into the internal form and data changes are automatically  +Here is an example of a "reverse" formatter: The data is stored in uppercase and in +reverse, while it is displayed in lower case and non-reversed. User edits are +automatically parsed into the internal form and data changes are automatically  formatted to the viewed form.  <pre> @@ -56,11 +56,11 @@ angular.formatter('reverse', {  });  </script> -Formatted:  +Formatted:  <input type="text" name="data" value="angular" ng:format="reverse"/>  <br/> -Stored:  +Stored:  <input type="text" name="data"/><br/>  <pre>{{data}}</pre> @@ -69,7 +69,7 @@ Stored:  it('should store reverse', function(){   expect(element('.doc-example input:first').val()).toEqual('angular');   expect(element('.doc-example input:last').val()).toEqual('RALUGNA'); -  +   this.addFutureAction('change to XYZ', function($window, $document, done){     $document.elements('.doc-example input:last').val('XYZ').trigger('change');     done(); diff --git a/docs/angular.service.ngdoc b/docs/angular.service.ngdoc index a34142bb..4e4810f9 100644 --- a/docs/angular.service.ngdoc +++ b/docs/angular.service.ngdoc @@ -76,7 +76,7 @@ window alert.           };         }, {$inject: ['$window']});  </pre> -  +  And here is a unit test for this service. We use Jasmine spy (mock) instead of real browser's alert.  <pre>  var mock, notify; @@ -85,7 +85,7 @@ beforeEach(function() {    mock = {alert: jasmine.createSpy()};    notify = angular.service('notify')(mock);  }); -  +  it('should not alert first two notifications', function() {    notify('one');    notify('two'); @@ -134,7 +134,7 @@ function myController($loc, $log) {    };  }  // which services to inject ? -myController.$inject = ['$location', '$log'];  +myController.$inject = ['$location', '$log'];  </pre>  @example @@ -149,13 +149,13 @@ myController.$inject = ['$location', '$log'];       }     };   }, {$inject: ['$window']}); -  +   function myController(notifyService) {     this.callNotify = function(msg) {       notifyService(msg);     };   } -  +   myController.$inject = ['notify'];  </script> diff --git a/docs/angular.validator.ngdoc b/docs/angular.validator.ngdoc index acd3caf2..fccdc5a0 100644 --- a/docs/angular.validator.ngdoc +++ b/docs/angular.validator.ngdoc @@ -4,7 +4,7 @@  @namespace Namespace for all filters.  @description  # Overview -Validators are a standard way to check the user input against a specific criteria. For  +Validators are a standard way to check the user input against a specific criteria. For  example, you might need to check that an input field contains a well-formed phone number.  # Syntax @@ -29,10 +29,10 @@ Attach a validator on user input widgets using the `ng:validate` attribute.  # Writing your own Validators -Writing your own validator is easy. To make a function available as a  -validator, just define the JavaScript function on the `angular.validator`  -object. <angular/> passes in the input to validate as the first argument  -to your function. Any additional validator arguments are passed in as  +Writing your own validator is easy. To make a function available as a +validator, just define the JavaScript function on the `angular.validator` +object. <angular/> passes in the input to validate as the first argument +to your function. Any additional validator arguments are passed in as  additional arguments to your function.  You can use these variables in the function: @@ -40,9 +40,9 @@ You can use these variables in the function:  * `this` — The current scope.  * `this.$element` — The DOM element containing the binding. This allows the filter to manipulate    the DOM in addition to transforming the input. -   -In this example we have written a upsTrackingNo validator.  -It marks the input text "valid" only when the user enters a well-formed  + +In this example we have written a upsTrackingNo validator. +It marks the input text "valid" only when the user enters a well-formed  UPS tracking number.  @css ng-validation-error @@ -57,7 +57,7 @@ UPS tracking number.   });  </script>  <input type="text" name="trackNo" size="40" -      ng:validate="upsTrackingNo:'1Z 999 999 99 9999 999 9'"  +      ng:validate="upsTrackingNo:'1Z 999 999 99 9999 999 9'"        value="1Z 123 456 78 9012 345 6"/>  @scenario diff --git a/docs/angular.widget.ngdoc b/docs/angular.widget.ngdoc index 5f15398f..5942d933 100644 --- a/docs/angular.widget.ngdoc +++ b/docs/angular.widget.ngdoc @@ -4,19 +4,19 @@  @namespace Namespace for all widgets.  @description  # Overview -Widgets allow you to create DOM elements that the browser doesn't  -already understand. You create the widget in your namespace and  -assign it behavior. You can only bind one widget per DOM element  -(unlike directives, in which you can use any number per DOM  -element). Widgets are expected to manipulate the DOM tree by  +Widgets allow you to create DOM elements that the browser doesn't +already understand. You create the widget in your namespace and +assign it behavior. You can only bind one widget per DOM element +(unlike directives, in which you can use any number per DOM +element). Widgets are expected to manipulate the DOM tree by  adding new elements whereas directives are expected to only modify  element properties.  Widgets come in two flavors: element and attribute.  # Element Widget -Let's say we would like to create a new element type in the  -namespace `my` that can watch an expression and alert() the user  +Let's say we would like to create a new element type in the +namespace `my` that can watch an expression and alert() the user  with each new value.  <pre> @@ -38,7 +38,7 @@ angular.widget('my:watch', function(compileElement) {  </pre>  # Attribute Widget -Let's implement the same widget, but this time as an attribute  +Let's implement the same widget, but this time as an attribute  that can be added to any existing DOM element.  <pre>  <div my-watch="name">text</div> @@ -70,4 +70,4 @@ angular.widget('@my:watch', function(expression, compileElement) {    });  </script>  <my:time></my:time> -     
\ No newline at end of file + diff --git a/docs/service.template b/docs/service.template index c28bddc9..639990ed 100644 --- a/docs/service.template +++ b/docs/service.template @@ -54,4 +54,4 @@    </doc:source>    {{#scenario}}<doc:scenario>{{{scenario}}}</doc:scenario>{{/scenario}}  </doc:example> -{{/example}}
\ No newline at end of file +{{/example}} diff --git a/docs/spec/domSpec.js b/docs/spec/domSpec.js new file mode 100644 index 00000000..af1a8faa --- /dev/null +++ b/docs/spec/domSpec.js @@ -0,0 +1,24 @@ +var DOM = require('dom.js').DOM; + +describe('dom', function(){ +  describe('example', function(){ +    it('should render code, live, test', function(){ +      var dom = new DOM(); +      dom.example('desc', 'src', 'scenario'); +      expect(dom.toString()).toEqual('<h1>Example</h1>\ndesc<doc:example><doc:source>src</doc:source>\n<doc:scenario>scenario</doc:scenario>\n</doc:example>\n'); +    }); + +    it('should render non-live, test with description', function(){ +      var dom = new DOM(); +      dom.example('desc', 'src', false); +      expect(dom.toString()).toEqual('<h1>Example</h1>\ndesc<div ng:non-bindable=""><pre class="brush: js; html-script: true;">src</pre>\n</div>\n'); +    }); + +    it('should render non-live, test', function(){ +      var dom = new DOM(); +      dom.example('desc', 'src', false); +      expect(dom.toString()).toContain('<pre class="brush: js; html-script: true;">src</pre>'); +    }); + +  }); +}); diff --git a/docs/spec/ngdocSpec.js b/docs/spec/ngdocSpec.js index 7d024cb5..2bea6e9a 100644 --- a/docs/spec/ngdocSpec.js +++ b/docs/spec/ngdocSpec.js @@ -279,6 +279,16 @@ describe('ngdoc', function(){          doc.parse();          expect(doc.html()).toContain('<p>some\n text');        }); + +      it('should render description in related method', function(){ +        var doc = new Doc(); +        doc.ngdoc = 'service'; +        doc.methods = [new Doc('@ngdoc method\n@exampleDescription MDesc\n@example MExmp').parse()]; +        doc.properties = [new Doc('@ngdoc property\n@exampleDescription PDesc\n@example PExmp').parse()]; +        expect(doc.html()).toContain('<p>MDesc</p><div ng:non-bindable=""><pre class="brush: js; html-script: true;">MExmp</pre>'); +        expect(doc.html()).toContain('<p>PDesc</p><div ng:non-bindable=""><pre class="brush: js; html-script: true;">PExmp</pre>'); +      }); +      });      describe('@deprecated', function() { diff --git a/docs/spec/writerSpec.js b/docs/spec/writerSpec.js index 1a722ca6..8354ad5d 100644 --- a/docs/spec/writerSpec.js +++ b/docs/spec/writerSpec.js @@ -2,17 +2,17 @@ var writer = require('writer.js');  describe('writer', function(){    describe('toString', function(){      var toString = writer.toString; -     +      it('should merge string', function(){        expect(toString('abc')).toEqual('abc');      }); -     +      it('should merge obj', function(){        expect(toString({a:1})).toEqual('{"a":1}');      }); -     +      it('should merge array', function(){        expect(toString(['abc',{}])).toEqual('abc{}');      });    }); -});
\ No newline at end of file +}); diff --git a/docs/src/gen-docs.js b/docs/src/gen-docs.js index 0dee586b..1c03a0f1 100644 --- a/docs/src/gen-docs.js +++ b/docs/src/gen-docs.js @@ -38,7 +38,7 @@ var writes = callback.chain(function(){    writer.copy('jquery.min.js', writes.waitFor());  });  writes.onDone(function(){ -  console.log('DONE. Generated ' + docs.length + ' pages in ' +  +  console.log('DONE. Generated ' + docs.length + ' pages in ' +        (now()-start) + 'ms.' );  });  work.onDone(writes); diff --git a/docs/src/ngdoc.js b/docs/src/ngdoc.js index 8481f7dc..daa44fef 100644 --- a/docs/src/ngdoc.js +++ b/docs/src/ngdoc.js @@ -76,6 +76,7 @@ Doc.prototype = {      this.description = markdown(this.description);      this['this'] = markdown(this['this']);      this.exampleDescription = markdown(this.exampleDescription || this.exampleDesc); +    return this;      function flush(){        if (atName) { @@ -144,13 +145,13 @@ Doc.prototype = {          dom.h(method.shortName + '(' + signature.join(', ') + ')', method, function(){            dom.html(method.description);            method.html_usage_parameters(dom); -          dom.example(method.example, false); +          dom.example(method.exampleDescription, method.example, false);          });        });        dom.h('Properties', self.properties, function(property){          dom.h(property.name, function(){           dom.text(property.description); -         dom.example(property.example, false); +         dom.example(property.exampleDescription, property.example, false);          });        }); diff --git a/docs/src/reader.js b/docs/src/reader.js index 8f9f22c3..5a653cd6 100644 --- a/docs/src/reader.js +++ b/docs/src/reader.js @@ -88,4 +88,4 @@ function findNgDocInJsFile(file, callback) { -exports.collect = collect;
\ No newline at end of file +exports.collect = collect; diff --git a/docs/src/templates/doc_widgets.css b/docs/src/templates/doc_widgets.css index 8361f105..9f007f0e 100644 --- a/docs/src/templates/doc_widgets.css +++ b/docs/src/templates/doc_widgets.css @@ -32,4 +32,4 @@ li.doc-example-live {  div.syntaxhighlighter {    padding-bottom: 1px !important; /* fix to remove unnecessary scrollbars http://is.gd/gSMgC */ -}
\ No newline at end of file +} diff --git a/docs/src/templates/doc_widgets.js b/docs/src/templates/doc_widgets.js index 18aeeacb..2d1ab8c6 100644 --- a/docs/src/templates/doc_widgets.js +++ b/docs/src/templates/doc_widgets.js @@ -1,5 +1,5 @@  (function(){ -   +    var angularJsUrl;    var scripts = document.getElementsByTagName("script");    var filename = /(.*\/)angular([^\/]*)/; @@ -10,7 +10,7 @@      }    } -   +    var HTML_TEMPLATE =    '<!doctype html>\n' +    '<html xmlns:ng="http://angularjs.org">\n' + @@ -32,15 +32,15 @@      var tabs = angular.element(          '<ul class="doc-example">' +            '<li class="doc-example-heading"><h3>Source</h3></li>' + -          '<li class="doc-example-source" ng:non-bindable>' +  -            '<pre class="brush: js; html-script: true; highlight: [' +  +          '<li class="doc-example-source" ng:non-bindable>' + +            '<pre class="brush: js; html-script: true; highlight: [' +              code.hilite + ']; toolbar: false;"></pre></li>' +            '<li class="doc-example-heading"><h3>Live Preview</h3></li>' +            '<li class="doc-example-live">' + exampleSrc +'</li>' +            '<li class="doc-example-heading"><h3>Scenario Test</h3></li>' +            '<li class="doc-example-scenario"><pre class="brush: js">' + scenario.text() + '</pre></li>' +          '</ul>'); -     +      tabs.find('li.doc-example-source > pre').text(HTML_TEMPLATE.replace('_HTML_SOURCE_', code.html));      element.html(''); @@ -54,7 +54,7 @@        alert(e);      }    }); -   +    function indent(text) {      var lines = text.split(/\n/);      var lineNo = []; @@ -66,5 +66,5 @@      }      return {html: lines.join('\n'), hilite: lineNo.join(',') };    }; -   -})();
\ No newline at end of file + +})(); diff --git a/docs/src/templates/docs-scenario.html b/docs/src/templates/docs-scenario.html index c75155c5..bc244d5d 100644 --- a/docs/src/templates/docs-scenario.html +++ b/docs/src/templates/docs-scenario.html @@ -7,4 +7,4 @@  </head>  <body>  </body> -</html>
\ No newline at end of file +</html> diff --git a/docs/src/templates/docs.js b/docs/src/templates/docs.js index 6bf86ed3..f1cfc3e7 100644 --- a/docs/src/templates/docs.js +++ b/docs/src/templates/docs.js @@ -2,7 +2,7 @@ DocsController.$inject = ['$location', '$browser', '$window'];  function DocsController($location, $browser, $window) {    this.pages = NG_PAGES;    window.$root = this.$root; -   +    this.getUrl = function(page){      return '#!' + page.name;    }; @@ -10,7 +10,7 @@ function DocsController($location, $browser, $window) {    this.getCurrentPartial = function(){      return './' + this.getTitle() + '.html';    }; -   +    this.getTitle = function(){      var hashPath = $location.hashPath || '!angular';      if (hashPath.match(/^!angular/)) { @@ -18,7 +18,7 @@ function DocsController($location, $browser, $window) {      }      return this.partialTitle;    }; -   +    this.getClass = function(page) {      var depth = page.name.split(/\./).length - 1,          cssClass = 'level-' + depth + (page.name == this.getTitle() ? ' selected' : ''); @@ -37,7 +37,7 @@ function DocsController($location, $browser, $window) {             "subject=" + escape("Feedback on " + $location.href) + "&" +             "body=" + escape("Hi there,\n\nI read " + $location.href + " and wanted to ask ....");    }; -   +  }  angular.filter('short', function(name){ diff --git a/docs/src/templates/syntaxhighlighter/shBrushJScript.js b/docs/src/templates/syntaxhighlighter/shBrushJScript.js index ff98daba..d52a77b2 100644 --- a/docs/src/templates/syntaxhighlighter/shBrushJScript.js +++ b/docs/src/templates/syntaxhighlighter/shBrushJScript.js @@ -7,7 +7,7 @@   *   * @version   * 3.0.83 (July 02 2010) - *  + *   * @copyright   * Copyright (C) 2004-2010 Alex Gorbatchev.   * @@ -29,7 +29,7 @@  						;  		var r = SyntaxHighlighter.regexLib; -		 +  		this.regexList = [  			{ regex: r.multiLineDoubleQuotedString,					css: 'string' },			// double quoted strings  			{ regex: r.multiLineSingleQuotedString,					css: 'string' },			// single quoted strings @@ -38,7 +38,7 @@  			{ regex: /\s*#.*/gm,									css: 'preprocessor' },		// preprocessor tags like #region and #endregion  			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),	css: 'keyword' }			// keywords  			]; -	 +  		this.forHtmlScript(r.scriptScriptTags);  	}; diff --git a/docs/src/templates/syntaxhighlighter/shBrushXml.js b/docs/src/templates/syntaxhighlighter/shBrushXml.js index 69d9fd0b..ac879949 100644 --- a/docs/src/templates/syntaxhighlighter/shBrushXml.js +++ b/docs/src/templates/syntaxhighlighter/shBrushXml.js @@ -7,7 +7,7 @@   *   * @version   * 3.0.83 (July 02 2010) - *  + *   * @copyright   * Copyright (C) 2004-2010 Alex Gorbatchev.   * @@ -28,8 +28,8 @@  				tag = new XRegExp('(<|<)[\\s\\/\\?]*(?<name>[:\\w-\\.]+)', 'xg').exec(code),  				result = []  				; -		 -			if (match.attributes != null)  + +			if (match.attributes != null)  			{  				var attributes,  					regex = new XRegExp('(?<name> [\\w:\\-\\.]+)' + @@ -37,7 +37,7 @@  										'(?<value> ".*?"|\'.*?\'|\\w+)',  										'xg'); -				while ((attributes = regex.exec(code)) != null)  +				while ((attributes = regex.exec(code)) != null)  				{  					result.push(new constructor(attributes.name, match.index + attributes.index, 'color1'));  					result.push(new constructor(attributes.value, match.index + attributes.index + attributes[0].indexOf(attributes.value), 'string')); @@ -51,7 +51,7 @@  			return result;  		} -	 +  		this.regexList = [  			{ regex: new XRegExp('(\\<|<)\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\](\\>|>)', 'gm'),			css: 'color2' },	// <![ ... [ ... ]]>  			{ regex: SyntaxHighlighter.regexLib.xmlComments,												css: 'comments' },	// <!-- ... --> diff --git a/docs/src/templates/syntaxhighlighter/shCore.css b/docs/src/templates/syntaxhighlighter/shCore.css index 34f6864a..4f0021e2 100644 --- a/docs/src/templates/syntaxhighlighter/shCore.css +++ b/docs/src/templates/syntaxhighlighter/shCore.css @@ -7,7 +7,7 @@   *   * @version   * 3.0.83 (July 02 2010) - *  + *   * @copyright   * Copyright (C) 2004-2010 Alex Gorbatchev.   * diff --git a/docs/src/templates/syntaxhighlighter/shCore.js b/docs/src/templates/syntaxhighlighter/shCore.js index b47b6454..effcf59d 100644 --- a/docs/src/templates/syntaxhighlighter/shCore.js +++ b/docs/src/templates/syntaxhighlighter/shCore.js @@ -7,7 +7,7 @@   *   * @version   * 3.0.83 (July 02 2010) - *  + *   * @copyright   * Copyright (C) 2004-2010 Alex Gorbatchev.   * diff --git a/docs/src/templates/syntaxhighlighter/shThemeDefault.css b/docs/src/templates/syntaxhighlighter/shThemeDefault.css index 13654117..8a870e4e 100644 --- a/docs/src/templates/syntaxhighlighter/shThemeDefault.css +++ b/docs/src/templates/syntaxhighlighter/shThemeDefault.css @@ -7,7 +7,7 @@   *   * @version   * 3.0.83 (July 02 2010) - *  + *   * @copyright   * Copyright (C) 2004-2010 Alex Gorbatchev.   * diff --git a/docs/src/writer.js b/docs/src/writer.js index eb1b190f..c72a54a4 100644 --- a/docs/src/writer.js +++ b/docs/src/writer.js @@ -13,17 +13,17 @@ function output(docs, content, callback){  exports.output = function(file, content, callback){    //console.log('writing', OUTPUT_DIR + file, '...');    fs.writeFile( -      OUTPUT_DIR + file,  -      exports.toString(content),  +      OUTPUT_DIR + file, +      exports.toString(content),        callback);  };  exports.toString = function toString(obj){    switch (typeof obj) { -  case 'string':  +  case 'string':      return obj; -  case 'object':  +  case 'object':      if (obj instanceof Array) {        obj.forEach(function (value, key){          obj[key] = toString(value); @@ -54,8 +54,8 @@ exports.copy = function(filename, callback){    fs.readFile('docs/src/templates/' + filename, function(err, content){      if (err) return callback.error(err);      fs.writeFile( -        OUTPUT_DIR + filename,  -        content,  +        OUTPUT_DIR + filename, +        content,          callback);    });  }; diff --git a/src/AngularPublic.js b/src/AngularPublic.js index ec41d0d9..4654acb1 100644 --- a/src/AngularPublic.js +++ b/src/AngularPublic.js @@ -4,7 +4,7 @@ var browserSingleton;   * @ngdoc service   * @name angular.service.$browser   * @requires $log - *  + *   * @description   * Represents the browser.   */ diff --git a/src/Browser.js b/src/Browser.js index 671ec1cc..c67608cd 100644 --- a/src/Browser.js +++ b/src/Browser.js @@ -67,12 +67,12 @@ function Browser(window, document, body, XHR, $log) {     * @ngdoc method     * @name angular.service.$browser#xhr     * @methodOf angular.service.$browser -   *  +   *     * @param {string} method Requested method (get|post|put|delete|head|json)     * @param {string} url Requested url -   * @param {string=} post Post data to send  +   * @param {string=} post Post data to send     * @param {function(number, string)} callback Function that will be called on response -   *  +   *     * @description     * Send ajax request     */ @@ -113,7 +113,7 @@ function Browser(window, document, body, XHR, $log) {     * @ngdoc method     * @name angular.service.$browser#notifyWhenNoOutstandingRequests     * @methodOf angular.service.$browser -   *  +   *     * @param {function()} callback Function that will be called when no outstanding request     */    self.notifyWhenNoOutstandingRequests = function(callback) { @@ -144,12 +144,12 @@ function Browser(window, document, body, XHR, $log) {     * @ngdoc method     * @name angular.service.$browser#addPollFn     * @methodOf angular.service.$browser -   *  +   *     * @param {function()} fn Poll function to add -   *  +   *     * @description     * Adds a function to the list of functions that poller periodically executes -   *  +   *     * @returns {function()} the added function     */    self.addPollFn = function(fn) { @@ -162,10 +162,10 @@ function Browser(window, document, body, XHR, $log) {     * @ngdoc method     * @name angular.service.$browser#startPoller     * @methodOf angular.service.$browser -   *  +   *     * @param {number} interval How often should browser call poll functions (ms)     * @param {function()} setTimeout Reference to a real or fake `setTimeout` function. -   *  +   *     * @description     * Configures the poller to run in the specified intervals, using the specified     * setTimeout fn and kicks it off. @@ -180,15 +180,15 @@ function Browser(window, document, body, XHR, $log) {    //////////////////////////////////////////////////////////////    // URL API    ////////////////////////////////////////////////////////////// -   +    /**     * @workInProgress     * @ngdoc method     * @name angular.service.$browser#setUrl     * @methodOf angular.service.$browser -   *  +   *     * @param {string} url New url -   *  +   *     * @description     * Sets browser's url     */ @@ -204,10 +204,10 @@ function Browser(window, document, body, XHR, $log) {     * @ngdoc method     * @name angular.service.$browser#getUrl     * @methodOf angular.service.$browser -   *  +   *     * @description     * Get current browser's url -   *  +   *     * @returns {string} Browser's url     */    self.getUrl = function() { @@ -261,10 +261,10 @@ function Browser(window, document, body, XHR, $log) {     * @ngdoc method     * @name angular.service.$browser#cookies     * @methodOf angular.service.$browser -   *  +   *     * @param {string=} name Cookie name     * @param {string=} value Cokkie value -   *  +   *     * @description     * The cookies method provides a 'private' low level access to browser cookies.     * It is not meant to be used directly, use the $cookie service instead. @@ -275,7 +275,7 @@ function Browser(window, document, body, XHR, $log) {     *   <li>cookies(name, value) -> set name to value, if value is undefined delete the cookie</li>     *   <li>cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that way)</li>     * </ul> -   *  +   *     * @returns {Object} Hash of all cookies (if called without any parameter)     */    self.cookies = function (name, value) { @@ -342,7 +342,7 @@ function Browser(window, document, body, XHR, $log) {    // Misc API    //////////////////////////////////////////////////////////////    var hoverListener = noop; -   +    /**     * @workInProgress     * @ngdoc method @@ -356,13 +356,13 @@ function Browser(window, document, body, XHR, $log) {     *    occurs.     */    self.hover = function(listener) { hoverListener = listener; }; -   +    /**     * @workInProgress     * @ngdoc method     * @name angular.service.$browser#bind     * @methodOf angular.service.$browser -   *  +   *     * @description     * Register hover function to real browser     */ @@ -383,7 +383,7 @@ function Browser(window, document, body, XHR, $log) {     * @ngdoc method     * @name angular.service.$browser#addCss     * @methodOf angular.service.$browser -   *  +   *     * @param {string} url Url to css file     * @description     * Adds a stylesheet tag to the head. @@ -402,10 +402,10 @@ function Browser(window, document, body, XHR, $log) {     * @ngdoc method     * @name angular.service.$browser#addJs     * @methodOf angular.service.$browser -   *  +   *     * @param {string} url Url to js file -   * @param {string=} dom_id Optional id for the script tag  -   *  +   * @param {string=} dom_id Optional id for the script tag +   *     * @description     * Adds a script tag to the head.     */ diff --git a/src/Compiler.js b/src/Compiler.js index 58a7a47b..c2c56650 100644 --- a/src/Compiler.js +++ b/src/Compiler.js @@ -123,19 +123,19 @@ Compiler.prototype = {      };    }, -   +    /**     * @workInProgress     * @ngdoc directive     * @name angular.directive.ng:eval-order     *     * @description -   * Normally the view is updated from top to bottom. This usually is  -   * not a problem, but under some circumstances the values for data  -   * is not available until after the full view is computed. If such  -   * values are needed before they are computed the order of  +   * Normally the view is updated from top to bottom. This usually is +   * not a problem, but under some circumstances the values for data +   * is not available until after the full view is computed. If such +   * values are needed before they are computed the order of     * evaluation can be change using ng:eval-order -   *  +   *     * @element ANY     * @param {integer|string=} [priority=0] priority integer, or FIRST, LAST constant     * @@ -164,7 +164,7 @@ Compiler.prototype = {            <td>{{ items.$sum('total') | currency }}</td>          </tr>        </table> -   *  +   *     * @scenario       it('should check ng:format', function(){         expect(using('.doc-example-live div:first').binding("items.$sum('total')")).toBe('$9.99'); diff --git a/src/Injector.js b/src/Injector.js index cd9438e7..c7ee6f82 100644 --- a/src/Injector.js +++ b/src/Injector.js @@ -31,7 +31,7 @@ function createInjector(providerScope, providers, cache) {     *   array of keys: returns an array of instances.     *   function: look at $inject property of function to determine instances     *             and then call the function with instances and `scope`. Any -   *             additional arguments (`args`) are appended to the function  +   *             additional arguments (`args`) are appended to the function     *             arguments.     *   object: initialize eager providers and publish them the ones with publish here.     *   none:   same as object but use providerScope as place to publish. diff --git a/src/markups.js b/src/markups.js index 16ca9ba8..21dab128 100644 --- a/src/markups.js +++ b/src/markups.js @@ -74,18 +74,18 @@ angularTextMarkup('OPTION', function(text, textNode, parentElement){   * @name angular.directive.ng:href   *   * @description - * Using <angular/> markup like {{hash}} in an href attribute makes  - * the page open to a wrong URL, ff the user clicks that link before  - * angular has a chance to replace the {{hash}} with actual URL, the  - * link will be broken and will most likely return a 404 error.  - * The `ng:href` solves this problem by placing the `href` in the  + * Using <angular/> markup like {{hash}} in an href attribute makes + * the page open to a wrong URL, ff the user clicks that link before + * angular has a chance to replace the {{hash}} with actual URL, the + * link will be broken and will most likely return a 404 error. + * The `ng:href` solves this problem by placing the `href` in the   * `ng:` namespace.   *   * The buggy way to write it:   * <pre>   * <a href="http://www.gravatar.com/avatar/{{hash}}"/>   * </pre> - *  + *   * The correct way to write it:   * <pre>   * <a ng:href="http://www.gravatar.com/avatar/{{hash}}"/> @@ -101,8 +101,8 @@ angularTextMarkup('OPTION', function(text, textNode, parentElement){   * @name angular.directive.ng:src   *   * @description - * Using <angular/> markup like `{{hash}}` in a `src` attribute doesn't  - * work right: The browser will fetch from the URL with the literal  + * Using <angular/> markup like `{{hash}}` in a `src` attribute doesn't + * work right: The browser will fetch from the URL with the literal   * text `{{hash}}` until <angular/> replaces the expression inside   * `{{hash}}`. The `ng:src` attribute solves this problem by placing   *  the `src` attribute in the `ng:` namespace. @@ -111,7 +111,7 @@ angularTextMarkup('OPTION', function(text, textNode, parentElement){   * <pre>   * <img src="http://www.gravatar.com/avatar/{{hash}}"/>   * </pre> - *  + *   * The correct way to write it:   * <pre>   * <img ng:src="http://www.gravatar.com/avatar/{{hash}}"/> diff --git a/src/parser.js b/src/parser.js index ac62fb97..f2ca7a80 100644 --- a/src/parser.js +++ b/src/parser.js @@ -49,8 +49,8 @@ function lex(text, parseStringsForObjects){        }      } else if (is('(){}[].,;:')) {        tokens.push({ -        index:index,  -        text:ch,  +        index:index, +        text:ch,          json:(was(':[,') && is('{[')) || is('}]:,')        });        if (is('{[')) json.unshift(ch); @@ -108,8 +108,8 @@ function lex(text, parseStringsForObjects){      end = end || index;      throw Error("Lexer Error: " + error + " at column" +          (isDefined(start) ? -            "s " + start +  "-" + index + " [" + text.substring(start, end) + "]" :  -            " " + end) +  +            "s " + start +  "-" + index + " [" + text.substring(start, end) + "]" : +            " " + end) +          " in expression [" + text + "].");    } @@ -157,8 +157,8 @@ function lex(text, parseStringsForObjects){      }      fn = OPERATORS[ident];      tokens.push({ -      index:start,  -      text:ident,  +      index:start, +      text:ident,        json: fn,        fn:fn||extend(getterFn(ident), {          assign:function(self, value){ @@ -167,7 +167,7 @@ function lex(text, parseStringsForObjects){        })      });    } -   +    function readString(quote) {      var start = index;      index++; @@ -217,25 +217,25 @@ function lex(text, parseStringsForObjects){  function parser(text, json){    var ZERO = valueFn(0),        tokens = lex(text, json), -      assignment = _assignment,  +      assignment = _assignment,        assignable = logicalOR, -      functionCall = _functionCall,  -      fieldAccess = _fieldAccess,  -      objectIndex = _objectIndex,  -      filterChain = _filterChain,  -      functionIdent = _functionIdent,  +      functionCall = _functionCall, +      fieldAccess = _fieldAccess, +      objectIndex = _objectIndex, +      filterChain = _filterChain, +      functionIdent = _functionIdent,        pipeFunction = _pipeFunction;    if(json){ -    // The extra level of aliasing is here, just in case the lexer misses something, so that  +    // The extra level of aliasing is here, just in case the lexer misses something, so that      // we prevent any accidental execution in JSON.      assignment = logicalOR; -    functionCall =  -      fieldAccess =  -      objectIndex =  +    functionCall = +      fieldAccess = +      objectIndex =        assignable = -      filterChain =  -      functionIdent =  -      pipeFunction =  +      filterChain = +      functionIdent = +      pipeFunction =          function (){ throwError("is not valid json", {text:text, index:0}); };    }    return { @@ -368,7 +368,7 @@ function parser(text, json){          argFns.push(expression());        } else {          return valueFn({ -          format:invokeFn(formatter.format),  +          format:invokeFn(formatter.format),            parse:invokeFn(formatter.parse)          });        } diff --git a/src/sanitizer.js b/src/sanitizer.js index 5e99ec71..c8a7b9f1 100644 --- a/src/sanitizer.js +++ b/src/sanitizer.js @@ -214,7 +214,7 @@ function decodeEntities(value) {  }  /** - * Escapes all potentially dangerous characters, so that the  + * Escapes all potentially dangerous characters, so that the   * resulting string can be safely inserted into attribute or   * element text.   * @param value diff --git a/src/scenario/output/Json.js b/src/scenario/output/Json.js index 94212301..2c852496 100644 --- a/src/scenario/output/Json.js +++ b/src/scenario/output/Json.js @@ -3,7 +3,7 @@   */  angular.scenario.output('json', function(context, runner) {    var model = new angular.scenario.ObjectModel(runner); -   +    runner.on('RunnerEnd', function() {      context.text(angular.toJson(model.value));    }); diff --git a/src/services.js b/src/services.js index 1a7b91ac..aa4a2090 100644 --- a/src/services.js +++ b/src/services.js @@ -11,16 +11,16 @@ function angularServiceInject(name, fn, inject, eager) {   * @workInProgress   * @ngdoc service   * @name angular.service.$window - *  + *   * @description   * Is reference to the browser's <b>window</b> object. While <b>window</b>   * is globally available in JavaScript, it causes testability problems, because   * it is a global variable. In <b><angular/></b> we always refer to it through the   * $window service, so it may be overriden, removed or mocked for testing. - *  + *   * All expressions are evaluated with respect to current scope so they don't   * suffer from window globality. - *  + *   * @example     <input ng:init="greeting='Hello World!'" type="text" name="greeting" />     <button ng:click="$window.alert(greeting)">ALERT</button> @@ -32,7 +32,7 @@ angularServiceInject("$window", bind(window, identity, window), [], EAGER);   * @ngdoc service   * @name angular.service.$document   * @requires $window - *  + *   * @description   * Reference to the browser window.document, but wrapped into angular.element().   */ @@ -45,7 +45,7 @@ angularServiceInject("$document", function(window){   * @ngdoc service   * @name angular.service.$location   * @requires $browser - *  + *   * @property {string} href   * @property {string} protocol   * @property {string} host @@ -55,15 +55,15 @@ angularServiceInject("$document", function(window){   * @property {string} hash   * @property {string} hashPath   * @property {Object.<string|boolean>} hashSearch - *  + *   * @description   * Parses the browser location url and makes it available to your application.   * Any changes to the url are reflected into $location service and changes to   * $location are reflected to url.   * Notice that using browser's forward/back buttons changes the $location. - *  + *   * @example -   <a href="#">clear hash</a> |  +   <a href="#">clear hash</a> |     <a href="#myPath?name=misko">test hash</a><br/>     <input type='text' name="$location.hash"/>     <pre>$location = {{$location}}</pre> @@ -91,7 +91,7 @@ angularServiceInject("$location", function($browser) {     * @ngdoc method     * @name angular.service.$location#update     * @methodOf angular.service.$location -   *  +   *     * @description     * Update location object     * Does not immediately update the browser @@ -127,7 +127,7 @@ angularServiceInject("$location", function($browser) {     * @ngdoc method     * @name angular.service.$location#updateHash     * @methodOf angular.service.$location -   *  +   *     * @description     * Update location hash part     * @see update() @@ -288,13 +288,13 @@ angularServiceInject("$location", function($browser) {   * @ngdoc service   * @name angular.service.$log   * @requires $window - *  + *   * @description   * Is simple service for logging. Default implementation writes the message   * into the browser's console (if present). - *  + *   * This is useful for debugging. - *  + *   * @example     <p>Reload this page with open console, enter text and hit the log button...</p>     Message: @@ -311,46 +311,46 @@ angularServiceInject("$log", function($window){       * @ngdoc method       * @name angular.service.$log#log       * @methodOf angular.service.$log -     *  +     *       * @description       * Write a log message       */      log: consoleLog('log'), -     +      /**       * @workInProgress       * @ngdoc method       * @name angular.service.$log#warn       * @methodOf angular.service.$log -     *  +     *       * @description       * Write a warning message       */      warn: consoleLog('warn'), -     +      /**       * @workInProgress       * @ngdoc method       * @name angular.service.$log#info       * @methodOf angular.service.$log -     *  +     *       * @description       * Write an information message       */      info: consoleLog('info'), -     +      /**       * @workInProgress       * @ngdoc method       * @name angular.service.$log#error       * @methodOf angular.service.$log -     *  +     *       * @description       * Write an error message       */      error: consoleLog('error')    }; -   +    function consoleLog(type) {      var console = $window.console || {};      var logFn = console[type] || console.log || noop; @@ -374,17 +374,17 @@ angularServiceInject("$log", function($window){   * @ngdoc service   * @name angular.service.$exceptionHandler   * @requires $log - *  + *   * @description   * Any uncaught exception in <angular/> is delegated to this service.   * The default implementation simply delegates to $log.error which logs it into   * the browser console. - *  + *   * When unit testing it is useful to have uncaught exceptions propagate   * to the test so the test will fail rather than silently log the exception   * to the browser console. For this purpose you can override this service with - * a simple rethrow.  - *  + * a simple rethrow. + *   * @example   */  angularServiceInject('$exceptionHandler', function($log){ @@ -459,9 +459,9 @@ angularServiceInject('$updateView', serviceUpdateViewFactory, ['$browser']);   * @name angular.service.$hover   * @requires $browser   * @requires $document - *  + *   * @description - *  + *   * @example   */  angularServiceInject("$hover", function(browser, document) { @@ -514,11 +514,11 @@ angularServiceInject("$hover", function(browser, document) {   * @workInProgress   * @ngdoc service   * @name angular.service.$invalidWidgets - *  + *   * @description   * Keeps references to all invalid widgets found during validation.   * Can be queried to find whether there are any invalid widgets currently displayed. - *  + *   * @example   */  angularServiceInject("$invalidWidgets", function(){ @@ -608,45 +608,45 @@ function switchRouteMatcher(on, when, dstName) {   * @ngdoc service   * @name angular.service.$route   * @requires $location - *  + *   * @property {Object} current Name of the current route   * @property {Array.<Object>} routes List of configured routes - *  + *   * @description   * Watches $location.hashPath and tries to map the hash to an existing route   * definition. It is used for deep-linking URLs to controllers and views (HTML partials). - *  + *   * $route is typically used in conjunction with {@link angular.widget.ng:view ng:view} widget. - *  + *   * @example  <p> -	This example shows how changing the URL hash causes the <tt>$route</tt> -	to match a route against the URL, and the <tt>[[ng:include]]</tt> pulls in the partial. -	Try changing the URL in the input box to see changes. +  This example shows how changing the URL hash causes the <tt>$route</tt> +  to match a route against the URL, and the <tt>[[ng:include]]</tt> pulls in the partial. +  Try changing the URL in the input box to see changes.  </p> -    +  <script> -	angular.service('myApp', function($route) { -	  $route.when('/Book/:bookId', {template:'rsrc/book.html', controller:BookCntl}); -	  $route.when('/Book/:bookId/ch/:chapterId', {template:'rsrc/chapter.html', controller:ChapterCntl}); -	  $route.onChange(function() { -	    $route.current.scope.params = $route.current.params; -	  }); -	}, {$inject: ['$route']}); -	 -	function BookCntl() { -	  this.name = "BookCntl"; -	} -	 -	function ChapterCntl() { -	  this.name = "ChapterCntl"; -	} +  angular.service('myApp', function($route) { +    $route.when('/Book/:bookId', {template:'rsrc/book.html', controller:BookCntl}); +    $route.when('/Book/:bookId/ch/:chapterId', {template:'rsrc/chapter.html', controller:ChapterCntl}); +    $route.onChange(function() { +      $route.current.scope.params = $route.current.params; +    }); +  }, {$inject: ['$route']}); + +  function BookCntl() { +    this.name = "BookCntl"; +  } + +  function ChapterCntl() { +    this.name = "ChapterCntl"; +  }  </script> -Chose:  -<a href="#/Book/Moby">Moby</a> |  -<a href="#/Book/Moby/ch/1">Moby: Ch1</a> |  -<a href="#/Book/Gatsby">Gatsby</a> |  +Chose: +<a href="#/Book/Moby">Moby</a> | +<a href="#/Book/Moby/ch/1">Moby: Ch1</a> | +<a href="#/Book/Gatsby">Gatsby</a> |  <a href="#/Book/Gatsby/ch/4?key=value">Gatsby: Ch4</a><br/>  <input type="text" name="$location.hashPath" size="80" />  <pre>$location={{$location}}</pre> @@ -664,31 +664,31 @@ angularServiceInject('$route', function(location) {        dirty = 0,        $route = {          routes: routes, -         +          /**           * @workInProgress           * @ngdoc method           * @name angular.service.$route#onChange           * @methodOf angular.service.$route -         *  +         *           * @param {function()} fn Function that will be called on route change -         *  +         *           * @description           * Register a handler function that will be called when route changes           */          onChange: bind(onChange, onChange.push), -         +          /**           * @workInProgress           * @ngdoc method           * @name angular.service.$route#when           * @methodOf angular.service.$route -         *  +         *           * @param {string} path Route path (matched against $location.hash)           * @param {Object} params Mapping information to be assigned to `$route.current` on route           *    match.           * @returns {Object} route object -         *  +         *           * @description           * Add new route           */ @@ -732,9 +732,9 @@ angularServiceInject('$route', function(location) {   * @requires $browser   * @requires $xhr.error   * @requires $log - *  + *   * @description - *  + *   * @example   */  angularServiceInject('$xhr', function($browser, $error, $log){ @@ -773,9 +773,9 @@ angularServiceInject('$xhr', function($browser, $error, $log){   * @ngdoc service   * @name angular.service.$xhr.error   * @requires $log - *  + *   * @description - *  + *   * @example   */  angularServiceInject('$xhr.error', function($log){ @@ -791,9 +791,9 @@ angularServiceInject('$xhr.error', function($log){   * @requires $xhr   * @requires $xhr.error   * @requires $log - *  + *   * @description - *  + *   * @example   */  angularServiceInject('$xhr.bulk', function($xhr, $error, $log){ @@ -885,9 +885,9 @@ angularServiceInject('$defer', function($browser, $exceptionHandler, $updateView   * @ngdoc service   * @name angular.service.$xhr.cache   * @requires $xhr - *  + *   * @description - *  + *   * @example   */  angularServiceInject('$xhr.cache', function($xhr, $defer, $log){ @@ -942,7 +942,7 @@ angularServiceInject('$xhr.cache', function($xhr, $defer, $log){   * @requires $xhr   *   * @description - * Is a factory which creates a resource object which lets you interact with  + * Is a factory which creates a resource object which lets you interact with   * <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer" target="_blank">RESTful</a>   * server-side data sources.   * Resource object has action methods which provide high-level behaviors without @@ -1051,7 +1051,7 @@ angularServiceInject('$xhr.cache', function($xhr, $defer, $log){           {get:{method:'JSON', params:{visibility:'@self'}}, replies: {method:'JSON', params:{visibility:'@self', comments:'@comments'}}}         );       } -      +       BuzzController.prototype = {         fetch: function() {           this.activities = this.Activity.get({userId:this.userId}); @@ -1069,9 +1069,9 @@ angularServiceInject('$xhr.cache', function($xhr, $defer, $log){       <hr/>       <div ng:repeat="item in activities.data.items">         <h1 style="font-size: 15px;"> -	       <img src="{{item.actor.thumbnailUrl}}" style="max-height:30px;max-width:30px;"/> -	       <a href="{{item.actor.profileUrl}}">{{item.actor.name}}</a> -	       <a href ng:click="expandReplies(item)" style="float: right;">Expand replies: {{item.links.replies[0].count}}</a> +         <img src="{{item.actor.thumbnailUrl}}" style="max-height:30px;max-width:30px;"/> +         <a href="{{item.actor.profileUrl}}">{{item.actor.name}}</a> +         <a href ng:click="expandReplies(item)" style="float: right;">Expand replies: {{item.links.replies[0].count}}</a>         </h1>         {{item.object.content | html}}         <div ng:repeat="reply in item.replies.data.items" style="margin-left: 20px;"> @@ -1091,13 +1091,13 @@ angularServiceInject('$resource', function($xhr){   * @ngdoc service   * @name angular.service.$cookies   * @requires $browser - *  + *   * @description   * Provides read/write access to browser's cookies. - *  + *   * Only a simple Object is exposed and by adding or removing properties to/from   * this object, new cookies are created/deleted at the end of current $eval. - *  + *   * @example   */  angularServiceInject('$cookies', function($browser) { @@ -1181,7 +1181,7 @@ angularServiceInject('$cookies', function($browser) {   * @ngdoc service   * @name angular.service.$cookieStore   * @requires $cookies - *  + *   * @description   * Provides a key-value (string-object) storage, that is backed by session cookies.   * Objects put or retrieved from this storage are automatically serialized or @@ -1196,10 +1196,10 @@ angularServiceInject('$cookieStore', function($store) {       * @ngdoc method       * @name angular.service.$cookieStore#get       * @methodOf angular.service.$cookieStore -     *  +     *       * @description       * Returns the value of given cookie key -     *  +     *       * @param {string} key Id to use for lookup.       * @returns {Object} Deserialized cookie value.       */ @@ -1212,10 +1212,10 @@ angularServiceInject('$cookieStore', function($store) {       * @ngdoc method       * @name angular.service.$cookieStore#put       * @methodOf angular.service.$cookieStore -     *  +     *       * @description       * Sets a value for given cookie key -     *  +     *       * @param {string} key Id for the `value`.       * @param {Object} value Value to be stored.       */ @@ -1228,10 +1228,10 @@ angularServiceInject('$cookieStore', function($store) {       * @ngdoc method       * @name angular.service.$cookieStore#remove       * @methodOf angular.service.$cookieStore -     *  +     *       * @description       * Remove given cookie -     *  +     *       * @param {string} key Id of the key-value pair to delete.       */      remove: function(key) { diff --git a/src/validators.js b/src/validators.js index 7d115518..30936574 100644 --- a/src/validators.js +++ b/src/validators.js @@ -7,32 +7,32 @@ extend(angularValidator, {     * @name angular.validator.regexp     * @description     * Use regexp validator to restrict the input to any Regular Expression. -   *  +   *     * @param {string} value value to validate     * @param {string|regexp} expression regular expression.     * @param {string=} msg error message to display.     * @css ng-validation-error -   *  +   *     * @example     * <script> function Cntl(){ -   *   this.ssnRegExp = /^\d\d\d-\d\d-\d\d\d\d$/;  +   *   this.ssnRegExp = /^\d\d\d-\d\d-\d\d\d\d$/;     * }     * </script>     * Enter valid SSN:     * <div ng:controller="Cntl">     * <input name="ssn" value="123-45-6789" ng:validate="regexp:ssnRegExp" >     * </div> -   *  +   *     * @scenario     * it('should invalidate non ssn', function(){     *   var textBox = element('.doc-example :input');     *   expect(textBox.attr('className')).not().toMatch(/ng-validation-error/);     *   expect(textBox.val()).toEqual('123-45-6789'); -   *    +   *     *   input('ssn').enter('123-45-67890');     *   expect(textBox.attr('className')).toMatch(/ng-validation-error/);     * }); -   *  +   *     */    'regexp': function(value, regexp, msg) {      if (!value.match(regexp)) { @@ -48,38 +48,38 @@ extend(angularValidator, {     * @ngdoc validator     * @name angular.validator.number     * @description -   * Use number validator to restrict the input to numbers with an  +   * Use number validator to restrict the input to numbers with an     * optional range. (See integer for whole numbers validator). -   *  +   *     * @param {string} value value to validate     * @param {int=} [min=MIN_INT] minimum value.     * @param {int=} [max=MAX_INT] maximum value.     * @css ng-validation-error -   *  +   *     * @example     * Enter number: <input name="n1" ng:validate="number" > <br>     * Enter number greater than 10: <input name="n2" ng:validate="number:10" > <br>     * Enter number between 100 and 200: <input name="n3" ng:validate="number:100:200" > <br> -   *  +   *     * @scenario     * it('should invalidate number', function(){     *   var n1 = element('.doc-example :input[name=n1]');     *   expect(n1.attr('className')).not().toMatch(/ng-validation-error/);     *   input('n1').enter('1.x');     *   expect(n1.attr('className')).toMatch(/ng-validation-error/); -   *    +   *     *   var n2 = element('.doc-example :input[name=n2]');     *   expect(n2.attr('className')).not().toMatch(/ng-validation-error/);     *   input('n2').enter('9');     *   expect(n2.attr('className')).toMatch(/ng-validation-error/); -   *    +   *     *   var n3 = element('.doc-example :input[name=n3]');     *   expect(n3.attr('className')).not().toMatch(/ng-validation-error/);     *   input('n3').enter('201');     *   expect(n3.attr('className')).toMatch(/ng-validation-error/); -   *    +   *     * }); -   *  +   *     */    'number': function(value, min, max) {      var num = 1 * value; @@ -101,36 +101,36 @@ extend(angularValidator, {     * @ngdoc validator     * @name angular.validator.integer     * @description -   * Use number validator to restrict the input to integers with an  +   * Use number validator to restrict the input to integers with an     * optional range. (See integer for whole numbers validator). -   *  +   *     * @param {string} value value to validate     * @param {int=} [min=MIN_INT] minimum value.     * @param {int=} [max=MAX_INT] maximum value.     * @css ng-validation-error -   *  +   *     * @example     * Enter integer: <input name="n1" ng:validate="integer" > <br>     * Enter integer equal or greater than 10: <input name="n2" ng:validate="integer:10" > <br>     * Enter integer between 100 and 200 (inclusive): <input name="n3" ng:validate="integer:100:200" > <br> -   *  +   *     * @scenario     * it('should invalidate integer', function(){     *   var n1 = element('.doc-example :input[name=n1]');     *   expect(n1.attr('className')).not().toMatch(/ng-validation-error/);     *   input('n1').enter('1.1');     *   expect(n1.attr('className')).toMatch(/ng-validation-error/); -   *    +   *     *   var n2 = element('.doc-example :input[name=n2]');     *   expect(n2.attr('className')).not().toMatch(/ng-validation-error/);     *   input('n2').enter('10.1');     *   expect(n2.attr('className')).toMatch(/ng-validation-error/); -   *    +   *     *   var n3 = element('.doc-example :input[name=n3]');     *   expect(n3.attr('className')).not().toMatch(/ng-validation-error/);     *   input('n3').enter('100.1');     *   expect(n3.attr('className')).toMatch(/ng-validation-error/); -   *    +   *     * });     */    'integer': function(value, min, max) { @@ -149,14 +149,14 @@ extend(angularValidator, {     * @description     * Use date validator to restrict the user input to a valid date     * in format in format MM/DD/YYYY. -   *  +   *     * @param {string} value value to validate     * @css ng-validation-error -   *  +   *     * @example     * Enter valid date:     * <input name="text" value="1/1/2009" ng:validate="date" > -   *  +   *     * @scenario     * it('should invalidate date', function(){     *   var n1 = element('.doc-example :input'); @@ -164,7 +164,7 @@ extend(angularValidator, {     *   input('text').enter('123/123/123');     *   expect(n1.attr('className')).toMatch(/ng-validation-error/);     * }); -   *  +   *     */    'date': function(value) {      var fields = /^(\d\d?)\/(\d\d?)\/(\d\d\d\d)$/.exec(value); @@ -182,14 +182,14 @@ extend(angularValidator, {     * @name angular.validator.email     * @description     * Use email validator if you wist to restrict the user input to a valid email. -   *  +   *     * @param {string} value value to validate     * @css ng-validation-error -   *  +   *     * @example     * Enter valid email:     * <input name="text" ng:validate="email" value="me@example.com"> -   *  +   *     * @scenario     * it('should invalidate email', function(){     *   var n1 = element('.doc-example :input'); @@ -197,7 +197,7 @@ extend(angularValidator, {     *   input('text').enter('a@b.c');     *   expect(n1.attr('className')).toMatch(/ng-validation-error/);     * }); -   *  +   *     */    'email': function(value) {      if (value.match(/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/)) { @@ -212,14 +212,14 @@ extend(angularValidator, {     * @name angular.validator.phone     * @description     * Use phone validator to restrict the input phone numbers. -   *  +   *     * @param {string} value value to validate     * @css ng-validation-error -   *  +   *     * @example     * Enter valid phone number:     * <input name="text" value="1(234)567-8901" ng:validate="phone" > -   *  +   *     * @scenario     * it('should invalidate phone', function(){     *   var n1 = element('.doc-example :input'); @@ -227,7 +227,7 @@ extend(angularValidator, {     *   input('text').enter('+12345678');     *   expect(n1.attr('className')).toMatch(/ng-validation-error/);     * }); -   *  +   *     */    'phone': function(value) {      if (value.match(/^1\(\d\d\d\)\d\d\d-\d\d\d\d$/)) { @@ -245,14 +245,14 @@ extend(angularValidator, {     * @name angular.validator.url     * @description     * Use phone validator to restrict the input URLs. -   *  +   *     * @param {string} value value to validate     * @css ng-validation-error -   *  +   *     * @example     * Enter valid phone number:     * <input name="text" value="http://example.com/abc.html" size="40" ng:validate="url" > -   *  +   *     * @scenario     * it('should invalidate url', function(){     *   var n1 = element('.doc-example :input'); @@ -260,7 +260,7 @@ extend(angularValidator, {     *   input('text').enter('abc://server/path');     *   expect(n1.attr('className')).toMatch(/ng-validation-error/);     * }); -   *  +   *     */    'url': function(value) {      if (value.match(/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/)) { @@ -275,15 +275,15 @@ extend(angularValidator, {     * @name angular.validator.json     * @description     * Use json validator if you wish to restrict the user input to a valid JSON. -   *  +   *     * @param {string} value value to validate     * @css ng-validation-error -   *  +   *     * @example     * <textarea name="json" cols="60" rows="5" ng:validate="json">     * {name:'abc'}     * </textarea> -   *  +   *     * @scenario     * it('should invalidate json', function(){     *   var n1 = element('.doc-example :input'); @@ -291,7 +291,7 @@ extend(angularValidator, {     *   input('json').enter('{name}');     *   expect(n1.attr('className')).toMatch(/ng-validation-error/);     * }); -   *  +   *     */    'json': function(value) {      try { @@ -307,36 +307,36 @@ extend(angularValidator, {     * @ngdoc validator     * @name angular.validator.asynchronous     * @description -   * Use asynchronous validator if the validation can not be computed  -   * immediately, but is provided through a callback. The widget  -   * automatically shows a spinning indicator while the validity of  +   * Use asynchronous validator if the validation can not be computed +   * immediately, but is provided through a callback. The widget +   * automatically shows a spinning indicator while the validity of     * the widget is computed. This validator caches the result. -   *  +   *     * @param {string} value value to validate     * @param {function(inputToValidate,validationDone)} validate function to call to validate the state     *         of the input. -   * @param {function(data)=} [update=noop] function to call when state of the  +   * @param {function(data)=} [update=noop] function to call when state of the     *    validator changes -   *     +   *     * @paramDescription -   * The `validate` function (specified by you) is called as  +   * The `validate` function (specified by you) is called as     * `validate(inputToValidate, validationDone)`: -   *  +   *     *    * `inputToValidate`: value of the input box.     *    * `validationDone`: `function(error, data){...}`     *       * `error`: error text to display if validation fails     *       * `data`: data object to pass to update function -   *        +   *     * The `update` function is optionally specified by you and is -   * called by <angular/> on input change. Since the  -   * asynchronous validator caches the results, the update  -   * function can be called without a call to `validate`  +   * called by <angular/> on input change. Since the +   * asynchronous validator caches the results, the update +   * function can be called without a call to `validate`     * function. The function is called as `update(data)`: -   *  +   *     *    * `data`: data object as passed from validate function -   *  +   *     * @css ng-input-indicator-wait, ng-validation-error -   *  +   *     * @example     * <script>     * function MyCntl(){ @@ -351,23 +351,23 @@ extend(angularValidator, {     *  <div ng:controller="MyCntl">     *    <input name="text" ng:validate="asynchronous:myValidator">     *  </div> -   *  +   *     * @scenario     * it('should change color in delayed way', function(){     *   var textBox = element('.doc-example :input');     *   expect(textBox.attr('className')).not().toMatch(/ng-input-indicator-wait/);     *   expect(textBox.attr('className')).not().toMatch(/ng-validation-error/); -   *    +   *     *   input('text').enter('X');     *   expect(textBox.attr('className')).toMatch(/ng-input-indicator-wait/); -   *    +   *     *   pause(.6); -   *    +   *     *   expect(textBox.attr('className')).not().toMatch(/ng-input-indicator-wait/);     *   expect(textBox.attr('className')).toMatch(/ng-validation-error/); -   *    +   *     * }); -   *  +   *     */    /*     * cache is attached to the element diff --git a/test/AngularSpec.js b/test/AngularSpec.js index 0e6b2bfa..010dce7c 100644 --- a/test/AngularSpec.js +++ b/test/AngularSpec.js @@ -312,24 +312,24 @@ describe('angular service', function() {      var scope = createScope();      angular.service('fake', function() { return 'old'; });      angular.service('fake', function() { return 'new'; }); -     +      expect(scope.$service('fake')).toEqual('new');    }); -   +    it('should not preserve properties on override', function() {      angular.service('fake', {$one: true}, {$two: true}, {three: true});      var result = angular.service('fake', {$four: true}); -     +      expect(result.$one).toBeUndefined();      expect(result.$two).toBeUndefined();      expect(result.three).toBeUndefined();      expect(result.$four).toBe(true);    }); -   +    it('should not preserve non-angular properties on override', function() {      angular.service('fake', {one: true}, {two: true});      var result = angular.service('fake', {third: true}); -     +      expect(result.one).not.toBeDefined();      expect(result.two).not.toBeDefined();      expect(result.third).toBeTruthy(); diff --git a/test/BinderSpec.js b/test/BinderSpec.js index 33bcb091..f12c1a74 100644 --- a/test/BinderSpec.js +++ b/test/BinderSpec.js @@ -1,16 +1,16 @@  describe('Binder', function(){ -   +    beforeEach(function(){      var self = this; -   +      this.compile = function(html, initialScope, parent) {        var compiler = new Compiler(angularTextMarkup, angularAttrMarkup, angularDirective, angularWidget);        if (self.element) dealoc(self.element);        var element = self.element = jqLite(html);        var scope = compiler.compile(element)(element); -   +        if (parent) parent.append(element); -   +        extend(scope, initialScope);        scope.$init();        return {node:element, scope:scope}; @@ -19,48 +19,48 @@ describe('Binder', function(){        return sortedHtml(this.compile(content).node);      };    }); -   +    afterEach(function(){      if (this.element && this.element.dealoc) {        this.element.dealoc();      }    }); -   -   + +    it('ChangingTextfieldUpdatesModel', function(){      var state = this.compile('<input type="text" name="model.price" value="abc">', {model:{}});      state.scope.$eval();      assertEquals('abc', state.scope.model.price);    }); -   +    it('ChangingTextareaUpdatesModel', function(){      var c = this.compile('<textarea name="model.note">abc</textarea>');      c.scope.$eval();      assertEquals(c.scope.model.note, 'abc');    }); -   +    it('ChangingRadioUpdatesModel', function(){      var c = this.compile('<input type="radio" name="model.price" value="A" checked>' +            '<input type="radio" name="model.price" value="B">');      c.scope.$eval();      assertEquals(c.scope.model.price, 'A');    }); -   +    it('ChangingCheckboxUpdatesModel', function(){      var form = this.compile('<input type="checkbox" name="model.price" value="true" checked ng:format="boolean"/>');      assertEquals(true, form.scope.model.price);    }); -   +    it('BindUpdate', function(){      var c = this.compile('<div ng:eval="a=123"/>');      assertEquals(123, c.scope.$get('a'));    }); -   +    it('ChangingSelectNonSelectedUpdatesModel', function(){      var form = this.compile('<select name="model.price"><option value="A">A</option><option value="B">B</option></select>');      assertEquals('A', form.scope.model.price);    }); -   +    it('ChangingMultiselectUpdatesModel', function(){      var form = this.compile('<select name="Invoice.options" multiple="multiple">' +              '<option value="A" selected>Gift wrap</option>' + @@ -69,35 +69,35 @@ describe('Binder', function(){              '</select>');      assertJsonEquals(["A", "B"], form.scope.$get('Invoice').options);    }); -   +    it('ChangingSelectSelectedUpdatesModel', function(){      var form = this.compile('<select name="model.price"><option>A</option><option selected value="b">B</option></select>');      assertEquals(form.scope.model.price, 'b');    }); -   +    it('ExecuteInitialization', function(){      var c = this.compile('<div ng:init="a=123">');      assertEquals(c.scope.$get('a'), 123);    }); -   +    it('ExecuteInitializationStatements', function(){      var c = this.compile('<div ng:init="a=123;b=345">');      assertEquals(c.scope.$get('a'), 123);      assertEquals(c.scope.$get('b'), 345);    }); -   +    it('ApplyTextBindings', function(){      var form = this.compile('<div ng:bind="model.a">x</div>');      form.scope.$set('model', {a:123});      form.scope.$eval();      assertEquals('123', form.node.text());    }); -   +    it('ReplaceBindingInTextWithSpan', function(){      assertEquals(this.compileToHtml("<b>a{{b}}c</b>"), '<b>a<span ng:bind="b"></span>c</b>');      assertEquals(this.compileToHtml("<b>{{b}}</b>"), '<b><span ng:bind="b"></span></b>');    }); -   +    it('BindingSpaceConfusesIE', function(){      if (!msie) return;      var span = document.createElement("span"); @@ -110,7 +110,7 @@ describe('Binder', function(){          '<b><span ng:bind="A"></span><span>'+nbsp+'x </span><span ng:bind="B"></span><span>'+nbsp+'(</span><span ng:bind="C"></span>)</b>',          this.compileToHtml("<b>{{A}} x {{B}} ({{C}})</b>"));    }); -   +    it('BindingOfAttributes', function(){      var c = this.compile("<a href='http://s/a{{b}}c' foo='x'></a>");      var attrbinding = c.node.attr("ng:bind-attr"); @@ -118,7 +118,7 @@ describe('Binder', function(){      assertEquals("http://s/a{{b}}c", decodeURI(bindings.href));      assertTrue(!bindings.foo);    }); -   +    it('MarkMultipleAttributes', function(){      var c = this.compile('<a href="http://s/a{{b}}c" foo="{{d}}"></a>');      var attrbinding = c.node.attr("ng:bind-attr"); @@ -126,20 +126,20 @@ describe('Binder', function(){      assertEquals(bindings.foo, "{{d}}");      assertEquals(decodeURI(bindings.href), "http://s/a{{b}}c");    }); -   +    it('AttributesNoneBound', function(){      var c = this.compile("<a href='abc' foo='def'></a>");      var a = c.node;      assertEquals(a[0].nodeName, "A");      assertTrue(!a.attr("ng:bind-attr"));    }); -   +    it('ExistingAttrbindingIsAppended', function(){      var c = this.compile("<a href='http://s/{{abc}}' ng:bind-attr='{\"b\":\"{{def}}\"}'></a>");      var a = c.node;      assertEquals('{"b":"{{def}}","href":"http://s/{{abc}}"}', a.attr('ng:bind-attr'));    }); -   +    it('AttributesAreEvaluated', function(){      var c = this.compile('<a ng:bind-attr=\'{"a":"a", "b":"a+b={{a+b}}"}\'></a>');      var binder = c.binder, form = c.node; @@ -149,7 +149,7 @@ describe('Binder', function(){      assertEquals(a.attr('a'), 'a');      assertEquals(a.attr('b'), 'a+b=3');    }); -   +    it('InputTypeButtonActionExecutesInScope', function(){      var savedCalled = false;      var c = this.compile('<input type="button" ng:click="person.save()" value="Apply">'); @@ -159,7 +159,7 @@ describe('Binder', function(){      browserTrigger(c.node, 'click');      assertTrue(savedCalled);    }); -   +    it('InputTypeButtonActionExecutesInScope2', function(){      var log = "";      var c = this.compile('<input type="image" ng:click="action()">'); @@ -170,7 +170,7 @@ describe('Binder', function(){      browserTrigger(c.node, 'click');      expect(log).toEqual('click;');    }); -   +    it('ButtonElementActionExecutesInScope', function(){      var savedCalled = false;      var c = this.compile('<button ng:click="person.save()">Apply</button>'); @@ -180,20 +180,20 @@ describe('Binder', function(){      browserTrigger(c.node, 'click');      assertTrue(savedCalled);    }); -   +    it('RepeaterUpdateBindings', function(){      var a = this.compile('<ul><LI ng:repeat="item in model.items" ng:bind="item.a"/></ul>');      var form = a.node;      var items = [{a:"A"}, {a:"B"}];      a.scope.$set('model', {items:items}); -   +      a.scope.$eval();      assertEquals('<ul>' +            '<#comment></#comment>' +            '<li ng:bind="item.a" ng:repeat-index="0">A</li>' +            '<li ng:bind="item.a" ng:repeat-index="1">B</li>' +            '</ul>', sortedHtml(form)); -   +      items.unshift({a:'C'});      a.scope.$eval();      assertEquals('<ul>' + @@ -202,7 +202,7 @@ describe('Binder', function(){            '<li ng:bind="item.a" ng:repeat-index="1">A</li>' +            '<li ng:bind="item.a" ng:repeat-index="2">B</li>' +            '</ul>', sortedHtml(form)); -   +      items.shift();      a.scope.$eval();      assertEquals('<ul>' + @@ -210,12 +210,12 @@ describe('Binder', function(){            '<li ng:bind="item.a" ng:repeat-index="0">A</li>' +            '<li ng:bind="item.a" ng:repeat-index="1">B</li>' +            '</ul>', sortedHtml(form)); -   +      items.shift();      items.shift();      a.scope.$eval();    }); -   +    it('RepeaterContentDoesNotBind', function(){      var a = this.compile('<ul><LI ng:repeat="item in model.items"><span ng:bind="item.a"></span></li></ul>');      a.scope.$set('model', {items:[{a:"A"}]}); @@ -225,18 +225,18 @@ describe('Binder', function(){            '<li ng:repeat-index="0"><span ng:bind="item.a">A</span></li>' +            '</ul>', sortedHtml(a.node));    }); -   +    it('ExpandEntityTag', function(){      assertEquals(          '<div ng-entity="Person" ng:watch="$anchor.a:1"></div>',          this.compileToHtml('<div ng-entity="Person" ng:watch="$anchor.a:1"/>'));    }); -   +    it('DoNotOverwriteCustomAction', function(){      var html = this.compileToHtml('<input type="submit" value="Save" action="foo();">');      assertTrue(html.indexOf('action="foo();"') > 0 );    }); -   +    it('RepeaterAdd', function(){      var c = this.compile('<div><input type="text" name="item.x" ng:repeat="item in items"></div>');      var doc = c.node; @@ -246,81 +246,81 @@ describe('Binder', function(){      var second = childNode(c.node, 2);      assertEquals('a', first.val());      assertEquals('b', second.val()); -   +      first.val('ABC');      browserTrigger(first, 'keydown');      c.scope.$service('$browser').defer.flush();      assertEquals(c.scope.items[0].x, 'ABC');    }); -   +    it('ItShouldRemoveExtraChildrenWhenIteratingOverHash', function(){      var c = this.compile('<div><div ng:repeat="i in items">{{i}}</div></div>');      var items = {};      c.scope.$set("items", items); -   +      c.scope.$eval();      expect(c.node[0].childNodes.length - 1).toEqual(0); -   +      items.name = "misko";      c.scope.$eval();      expect(c.node[0].childNodes.length - 1).toEqual(1); -   +      delete items.name;      c.scope.$eval();      expect(c.node[0].childNodes.length - 1).toEqual(0);    }); -   +    it('IfTextBindingThrowsErrorDecorateTheSpan', function(){      var a = this.compile('<div>{{error.throw()}}</div>');      var doc = a.node; -   +      a.scope.$set('error.throw', function(){throw "ErrorMsg1";});      a.scope.$eval();      var span = childNode(doc, 0);      assertTrue(span.hasClass('ng-exception'));      assertTrue(!!span.text().match(/ErrorMsg1/));      assertTrue(!!span.attr('ng-exception').match(/ErrorMsg1/)); -   +      a.scope.$set('error.throw', function(){throw "MyError";});      a.scope.$eval();      span = childNode(doc, 0);      assertTrue(span.hasClass('ng-exception'));      assertTrue(span.text(), span.text().match('MyError') !== null);      assertEquals('MyError', span.attr('ng-exception')); -   +      a.scope.$set('error.throw', function(){return "ok";});      a.scope.$eval();      assertFalse(span.hasClass('ng-exception'));      assertEquals('ok', span.text());      assertEquals(null, span.attr('ng-exception'));    }); -   +    it('IfAttrBindingThrowsErrorDecorateTheAttribute', function(){      var a = this.compile('<div attr="before {{error.throw()}} after"></div>');      var doc = a.node; -   +      a.scope.$set('error.throw', function(){throw "ErrorMsg";});      a.scope.$eval();      assertTrue('ng-exception', doc.hasClass('ng-exception'));      assertEquals('"ErrorMsg"', doc.attr('ng-exception'));      assertEquals('before "ErrorMsg" after', doc.attr('attr')); -   +      a.scope.$set('error.throw', function(){ return 'X';});      a.scope.$eval();      assertFalse('!ng-exception', doc.hasClass('ng-exception'));      assertEquals('before X after', doc.attr('attr'));      assertEquals(null, doc.attr('ng-exception')); -   +    }); -   +    it('NestedRepeater', function(){      var a = this.compile('<div><div ng:repeat="m in model" name="{{m.name}}">' +                       '<ul name="{{i}}" ng:repeat="i in m.item"></ul>' +                     '</div></div>'); -   +      a.scope.$set('model', [{name:'a', item:['a1', 'a2']}, {name:'b', item:['b1', 'b2']}]);      a.scope.$eval(); -   +      assertEquals('<div>'+          '<#comment></#comment>'+          '<div name="a" ng:bind-attr="{"name":"{{m.name}}"}" ng:repeat-index="0">'+ @@ -334,82 +334,82 @@ describe('Binder', function(){            '<ul name="b2" ng:bind-attr="{"name":"{{i}}"}" ng:repeat-index="1"></ul>'+          '</div></div>', sortedHtml(a.node));    }); -   +    it('HideBindingExpression', function(){      var a = this.compile('<div ng:hide="hidden == 3"/>'); -   +      a.scope.$set('hidden', 3);      a.scope.$eval(); -   +      assertHidden(a.node); -   +      a.scope.$set('hidden', 2);      a.scope.$eval(); -   +      assertVisible(a.node);    }); -   +    it('HideBinding', function(){      var c = this.compile('<div ng:hide="hidden"/>'); -   +      c.scope.$set('hidden', 'true');      c.scope.$eval(); -   +      assertHidden(c.node); -   +      c.scope.$set('hidden', 'false');      c.scope.$eval(); -   +      assertVisible(c.node); -   +      c.scope.$set('hidden', '');      c.scope.$eval(); -   +      assertVisible(c.node);    }); -   +    it('ShowBinding', function(){      var c = this.compile('<div ng:show="show"/>'); -   +      c.scope.$set('show', 'true');      c.scope.$eval(); -   +      assertVisible(c.node); -   +      c.scope.$set('show', 'false');      c.scope.$eval(); -   +      assertHidden(c.node); -   +      c.scope.$set('show', '');      c.scope.$eval(); -   +      assertHidden(c.node);    }); -   +    it('BindClassUndefined', function(){      var doc = this.compile('<div ng:class="undefined"/>');      doc.scope.$eval(); -   +      assertEquals(          '<div class="undefined" ng:class="undefined"></div>',          sortedHtml(doc.node));    }); -   +    it('BindClass', function(){      var c = this.compile('<div ng:class="class"/>'); -   +      c.scope.$set('class', 'testClass');      c.scope.$eval(); -   +      assertEquals('<div class="testClass" ng:class="class"></div>', sortedHtml(c.node)); -   +      c.scope.$set('class', ['a', 'b']);      c.scope.$eval(); -   +      assertEquals('<div class="a b" ng:class="class"></div>', sortedHtml(c.node));    }); -   +    it('BindClassEvenOdd', function(){      var x = this.compile('<div><div ng:repeat="i in [0,1]" ng:class-even="\'e\'" ng:class-odd="\'o\'"/></div>');      x.scope.$eval(); @@ -423,19 +423,19 @@ describe('Binder', function(){          '<div class="e" ng:class-even="\'e\'" ng:class-odd="\'o\'" ng:repeat-index="1"></div></div>',          sortedHtml(x.node));    }); -   +    it('BindStyle', function(){      var c = this.compile('<div ng:style="style"/>'); -   +      c.scope.$eval('style={color:"red"}');      c.scope.$eval(); -   +      assertEquals("red", c.node.css('color')); -   +      c.scope.$eval('style={}');      c.scope.$eval();    }); -   +    it('ActionOnAHrefThrowsError', function(){      var model = {books:[]};      var c = this.compile('<a ng:click="action()">Add Phone</a>', model); @@ -447,14 +447,14 @@ describe('Binder', function(){      var error = input.attr('ng-exception');      assertTrue(!!error.match(/MyError/));      assertTrue("should have an error class", input.hasClass('ng-exception')); -   +      // TODO: I think that exception should never get cleared so this portion of test makes no sense      //c.scope.action = noop;      //browserTrigger(input, 'click');      //dump(input.attr('ng-error'));      //assertFalse('error class should be cleared', input.hasClass('ng-exception'));    }); -   +    it('ShoulIgnoreVbNonBindable', function(){      var c = this.compile("<div>{{a}}" +          "<div ng:non-bindable>{{a}}</div>" + @@ -464,31 +464,31 @@ describe('Binder', function(){      c.scope.$eval();      assertEquals('123{{a}}{{b}}{{c}}', c.node.text());    }); -   +    it('OptionShouldUpdateParentToGetProperBinding', function(){      var c = this.compile('<select name="s"><option ng:repeat="i in [0,1]" value="{{i}}" ng:bind="i"></option></select>');      c.scope.$set('s', 1);      c.scope.$eval();      assertEquals(1, c.node[0].selectedIndex);    }); -   +    it('RepeaterShouldBindInputsDefaults', function () {      var c = this.compile('<div><input value="123" name="item.name" ng:repeat="item in items"></div>');      c.scope.$set('items', [{}, {name:'misko'}]);      c.scope.$eval(); -   +      assertEquals("123", c.scope.$eval('items[0].name'));      assertEquals("misko", c.scope.$eval('items[1].name'));    }); -   +    it('ShouldTemplateBindPreElements', function () {      var c = this.compile('<pre>Hello {{name}}!</pre>');      c.scope.$set("name", "World");      c.scope.$eval(); -   +      assertEquals('<pre ng:bind-template="Hello {{name}}!">Hello World!</pre>', sortedHtml(c.node));    }); -   +    it('FillInOptionValueWhenMissing', function(){      var c = this.compile(          '<select><option selected="true">{{a}}</option><option value="">{{b}}</option><option>C</option></select>'); @@ -498,17 +498,17 @@ describe('Binder', function(){      var optionA = childNode(c.node, 0);      var optionB = childNode(c.node, 1);      var optionC = childNode(c.node, 2); -   +      expect(optionA.attr('value')).toEqual('A');      expect(optionA.text()).toEqual('A'); -   +      expect(optionB.attr('value')).toEqual('');      expect(optionB.text()).toEqual('B'); -   +      expect(optionC.attr('value')).toEqual('C');      expect(optionC.text()).toEqual('C');    }); -   +    it('ValidateForm', function(){      var c = this.compile('<div><input name="name" ng:required>' +              '<div ng:repeat="item in items"><input name="item.name" ng:required/></div></div>', @@ -517,39 +517,39 @@ describe('Binder', function(){      c.scope.$set("items", items);      c.scope.$eval();      assertEquals(3, c.scope.$service('$invalidWidgets').length); -   +      c.scope.$set('name', '');      c.scope.$eval();      assertEquals(3, c.scope.$service('$invalidWidgets').length); -   +      c.scope.$set('name', ' ');      c.scope.$eval();      assertEquals(3, c.scope.$service('$invalidWidgets').length); -   +      c.scope.$set('name', 'abc');      c.scope.$eval();      assertEquals(2, c.scope.$service('$invalidWidgets').length); -   +      items[0].name = 'abc';      c.scope.$eval();      assertEquals(1, c.scope.$service('$invalidWidgets').length); -   +      items[1].name = 'abc';      c.scope.$eval();      assertEquals(0, c.scope.$service('$invalidWidgets').length);    }); -   +    it('ValidateOnlyVisibleItems', function(){      var c = this.compile('<div><input name="name" ng:required><input ng:show="show" name="name" ng:required></div>', undefined, jqLite(document.body));      c.scope.$set("show", true);      c.scope.$eval();      assertEquals(2, c.scope.$service('$invalidWidgets').length); -   +      c.scope.$set("show", false);      c.scope.$eval();      assertEquals(1, c.scope.$service('$invalidWidgets').visible());    }); -   +    it('DeleteAttributeIfEvaluatesFalse', function(){      var c = this.compile('<div>' +          '<input name="a0" ng:bind-attr="{disabled:\'{{true}}\'}"><input name="a1" ng:bind-attr="{disabled:\'{{false}}\'}">' + @@ -560,7 +560,7 @@ describe('Binder', function(){        var child = childNode(c.node, index);        assertEquals(sortedHtml(child), disabled, !!child.attr('disabled'));      } -   +      assertChild(0, true);      assertChild(1, false);      assertChild(2, true); @@ -568,41 +568,41 @@ describe('Binder', function(){      assertChild(4, true);      assertChild(5, false);    }); -   +    it('ItShouldDisplayErrorWhenActionIsSyntacticlyIncorect', function(){      var c = this.compile('<div>' +          '<input type="button" ng:click="greeting=\'ABC\'"/>' +          '<input type="button" ng:click=":garbage:"/></div>');      var first = jqLite(c.node[0].childNodes[0]);      var second = jqLite(c.node[0].childNodes[1]); -   +      browserTrigger(first, 'click');      assertEquals("ABC", c.scope.greeting); -   +      browserTrigger(second, 'click');      assertTrue(second.hasClass("ng-exception"));    }); -   +    it('ItShouldSelectTheCorrectRadioBox', function(){      var c = this.compile('<div>' +          '<input type="radio" name="sex" value="female"/>' +          '<input type="radio" name="sex" value="male"/></div>');      var female = jqLite(c.node[0].childNodes[0]);      var male = jqLite(c.node[0].childNodes[1]); -   +      browserTrigger(female);      assertEquals("female", c.scope.sex);      assertEquals(true, female[0].checked);      assertEquals(false, male[0].checked);      assertEquals("female", female.val()); -   +      browserTrigger(male);      assertEquals("male", c.scope.sex);      assertEquals(false, female[0].checked);      assertEquals(true, male[0].checked);      assertEquals("male", male.val());    }); -   +    it('ItShouldListenOnRightScope', function(){      var c = this.compile(          '<ul ng:init="counter=0; gCounter=0" ng:watch="w:counter=counter+1">' + @@ -610,13 +610,13 @@ describe('Binder', function(){      c.scope.$eval();      assertEquals(1, c.scope.$get("counter"));      assertEquals(7, c.scope.$get("gCounter")); -   +      c.scope.$set("w", "something");      c.scope.$eval();      assertEquals(2, c.scope.$get("counter"));      assertEquals(14, c.scope.$get("gCounter"));    }); -   +    it('ItShouldRepeatOnHashes', function(){      var x = this.compile('<ul><li ng:repeat="(k,v) in {a:0,b:1}" ng:bind=\"k + v\"></li></ul>');      x.scope.$eval(); @@ -627,7 +627,7 @@ describe('Binder', function(){          '</ul>',          sortedHtml(x.node));    }); -   +    it('ItShouldFireChangeListenersBeforeUpdate', function(){      var x = this.compile('<div ng:bind="name"></div>');      x.scope.$set("name", ""); @@ -639,19 +639,19 @@ describe('Binder', function(){          '<div ng:bind="name">123</div>',          sortedHtml(x.node));    }); -   +    it('ItShouldHandleMultilineBindings', function(){      var x = this.compile('<div>{{\n 1 \n + \n 2 \n}}</div>');      x.scope.$eval();      assertEquals("3", x.node.text());    }); -   +    it('ItBindHiddenInputFields', function(){      var x = this.compile('<input type="hidden" name="myName" value="abc" />');      x.scope.$eval();      assertEquals("abc", x.scope.$get("myName"));    }); -     +    it('ItShouldUseFormaterForText', function(){      var x = this.compile('<input name="a" ng:format="list" value="a,b">');      x.scope.$eval(); @@ -665,4 +665,4 @@ describe('Binder', function(){      assertEquals('1, 2, 3', input[0].value);    }); -});
\ No newline at end of file +}); diff --git a/test/CompilerSpec.js b/test/CompilerSpec.js index 76d3d1ca..498ee060 100644 --- a/test/CompilerSpec.js +++ b/test/CompilerSpec.js @@ -32,7 +32,7 @@ describe('compiler', function(){        return scope;      };    }); -   +    afterEach(function(){      dealoc(scope);    }); diff --git a/test/FiltersSpec.js b/test/FiltersSpec.js index 7e824e0d..092f9b7b 100644 --- a/test/FiltersSpec.js +++ b/test/FiltersSpec.js @@ -1,17 +1,17 @@  describe('filter', function() {    var filter = angular.filter; -   +    it('should called the filter when evaluating expression', function() {      var scope = createScope();      filter.fakeFilter = function(){};      spyOn(filter, 'fakeFilter'); -     +      scope.$eval('10|fakeFilter');      expect(filter.fakeFilter).toHaveBeenCalledWith(10);      delete filter['fakeFilter'];    }); -   +    it('should call filter on scope context', function() {      var scope = createScope();      scope.name = 'misko'; @@ -19,7 +19,7 @@ describe('filter', function() {        expect(this.name).toEqual('misko');      };      spyOn(filter, 'fakeFilter').andCallThrough(); -     +      scope.$eval('10|fakeFilter');      expect(filter.fakeFilter).toHaveBeenCalled();      delete filter['fakeFilter']; @@ -39,7 +39,7 @@ describe('filter', function() {        expect(html.hasClass('ng-format-negative')).toBeFalsy();      });    }); -   +    describe('number', function() {      it('should do basic filter', function() {        var context = {jqElement:jqLite('<span/>')}; diff --git a/test/FormattersSpec.js b/test/FormattersSpec.js index 1ebd8e22..234a81d6 100644 --- a/test/FormattersSpec.js +++ b/test/FormattersSpec.js @@ -33,13 +33,13 @@ describe("formatter", function(){      assertEquals('a', angular.formatter.trim.format(" a "));      assertEquals('a', angular.formatter.trim.parse(' a '));    }); -   +    describe('json', function(){      it('should treat empty string as null', function(){        expect(angular.formatter.json.parse('')).toEqual(null);      });    }); -   +    describe('index', function(){      it('should parse an object from array', function(){        expect(angular.formatter.index.parse('1', ['A', 'B', 'C'])).toEqual('B'); diff --git a/test/ParserSpec.js b/test/ParserSpec.js index 4d0e14dc..62d6731a 100644 --- a/test/ParserSpec.js +++ b/test/ParserSpec.js @@ -58,7 +58,7 @@ describe('parser', function() {        expect(tokens[i].text).toEqual('undefined');        expect(undefined).toEqual(tokens[i].fn());      }); -     +      it('should tokenize quoted string', function() {        var str = "['\\'', \"\\\"\"]";        var tokens = lex(str); @@ -134,7 +134,7 @@ describe('parser', function() {        expect(function() {          lex("0.5E-");        }).toThrow(new Error('Lexer Error: Invalid exponent at column 4 in expression [0.5E-].')); -       +        expect(function() {          lex("0.5E-A");        }).toThrow(new Error('Lexer Error: Invalid exponent at column 4 in expression [0.5E-A].')); @@ -151,7 +151,7 @@ describe('parser', function() {        }).toThrow(new Error("Lexer Error: Invalid unicode escape [\\u1''b] at column 2 in expression ['\\u1''bla']."));      });    }); -   +    var scope;    beforeEach(function () {      scope = createScope(); @@ -201,7 +201,7 @@ describe('parser', function() {      expect(function() {        scope.$eval("1|nonExistant");      }).toThrow(new Error("Parse Error: Token 'nonExistant' should be a function at column 3 of expression [1|nonExistant] starting at [nonExistant].")); -     +      scope.$set('offset', 3);      expect(scope.$eval("'abcd'|upper._case")).toEqual("ABCD");      expect(scope.$eval("'abcd'|substring:1:offset")).toEqual("bc"); @@ -298,7 +298,7 @@ describe('parser', function() {      scope.$set("obj", new C());      expect(scope.$eval("obj.getA()")).toEqual(123);    }); -   +    it('should evaluate methods in correct context (this) in argument', function() {      var C = function () {        this.a = 123; @@ -388,7 +388,7 @@ describe('parser', function() {      expect(scope.$eval("a=undefined")).not.toBeDefined();      expect(scope.$get("a")).not.toBeDefined();    }); -   +    it('should allow assignment after array dereference', function(){      scope = angular.scope();      scope.obj = [{}]; @@ -396,21 +396,21 @@ describe('parser', function() {      expect(scope.obj.name).toBeUndefined();      expect(scope.obj[0].name).toEqual(1);    }); -   +    describe('formatter', function(){      it('should return no argument function', function() {        var noop = parser('noop').formatter()();        expect(noop.format(null, 'abc')).toEqual('abc');        expect(noop.parse(null, '123')).toEqual('123');      }); -     +      it('should delegate arguments', function(){        var index = parser('index:objs').formatter()();        expect(index.format({objs:['A','B']}, 'B')).toEqual('1');        expect(index.parse({objs:['A','B']}, '1')).toEqual('B');      });    }); -   +    describe('assignable', function(){      it('should expose assignment function', function(){        var fn = parser('a').assignable(); @@ -420,5 +420,5 @@ describe('parser', function() {        expect(scope).toEqual({a:123});      });    }); -   +  }); diff --git a/test/ScenarioSpec.js b/test/ScenarioSpec.js index 30a3d72a..50b5e51c 100644 --- a/test/ScenarioSpec.js +++ b/test/ScenarioSpec.js @@ -1,14 +1,14 @@  describe("ScenarioSpec: Compilation", function(){    var scope; -   +    beforeEach(function(){      scope = null;    }); -   +    afterEach(function(){      dealoc(scope);    }); -   +    describe('compilation', function(){      it("should compile dom node and return scope", function(){        var node = jqLite('<div ng:init="a=1">{{b=a+1}}</div>')[0]; @@ -17,18 +17,18 @@ describe("ScenarioSpec: Compilation", function(){        expect(scope.a).toEqual(1);        expect(scope.b).toEqual(2);      }); -     +      it("should compile jQuery node and return scope", function(){        scope = compile(jqLite('<div>{{a=123}}</div>')).$init();        expect(jqLite(scope.$element).text()).toEqual('123');      }); -     +      it("should compile text node and return scope", function(){        scope = compile('<div>{{a=123}}</div>').$init();        expect(jqLite(scope.$element).text()).toEqual('123');      });    }); -   +    describe('scope', function(){      it("should have set, get, eval, $init, updateView methods", function(){        scope = compile('<div>{{a}}</div>').$init(); @@ -39,7 +39,7 @@ describe("ScenarioSpec: Compilation", function(){        scope.$eval();        expect(jqLite(scope.$element).text()).toEqual('3');      }); -     +      it("should have $ objects", function(){        scope = compile('<div></div>', {$config: {a:"b"}});        expect(scope.$service('$location')).toBeDefined(); @@ -48,7 +48,7 @@ describe("ScenarioSpec: Compilation", function(){        expect(scope.$get('$config.a')).toEqual("b");      });    }); -   +    describe("configuration", function(){      it("should take location object", function(){        var url = "http://server/#?book=moby"; @@ -61,4 +61,4 @@ describe("ScenarioSpec: Compilation", function(){        expect($location.hashSearch.book).toEqual('moby');      });    }); -});
\ No newline at end of file +}); diff --git a/test/ScopeSpec.js b/test/ScopeSpec.js index 354ddc72..ee7c1c47 100644 --- a/test/ScopeSpec.js +++ b/test/ScopeSpec.js @@ -52,7 +52,7 @@ describe('scope/model', function(){        model.$eval('name="works"');        expect(model.name).toEqual('works');      }); -     +      it('should not bind regexps', function(){        model.exp = /abc/;        expect(model.$eval('exp')).toEqual(model.exp); @@ -158,7 +158,7 @@ describe('scope/model', function(){        var element = jqLite('<div></div>');        var scope = createScope();        scope.$tryEval(function(){throw "myError";}, element); -      expect(element.attr('ng-exception')).toEqual('myError');  +      expect(element.attr('ng-exception')).toEqual('myError');        expect(element.hasClass('ng-exception')).toBeTruthy();      }); diff --git a/test/ValidatorsSpec.js b/test/ValidatorsSpec.js index ffd65c5b..60d20418 100644 --- a/test/ValidatorsSpec.js +++ b/test/ValidatorsSpec.js @@ -1,5 +1,5 @@  describe('ValidatorTest', function(){ -   +    it('ShouldHaveThisSet', function() {      var validator = {};      angular.validator.myValidator = function(first, last){ @@ -16,7 +16,7 @@ describe('ValidatorTest', function(){      delete angular.validator.myValidator;      scope.$element.remove();    }); -   +    it('Regexp', function() {      assertEquals(angular.validator.regexp("abc", /x/, "E1"), "E1");      assertEquals(angular.validator.regexp("abc", '/x/'), @@ -24,7 +24,7 @@ describe('ValidatorTest', function(){      assertEquals(angular.validator.regexp("ab", '^ab$'), null);      assertEquals(angular.validator.regexp("ab", '^axb$', "E3"), "E3");    }); -   +    it('Number', function() {      assertEquals(angular.validator.number("ab"), "Not a number");      assertEquals(angular.validator.number("-0.1",0), "Value can not be less than 0."); @@ -32,7 +32,7 @@ describe('ValidatorTest', function(){      assertEquals(angular.validator.number("1.2"), null);      assertEquals(angular.validator.number(" 1 ", 1, 1), null);    }); -   +    it('Integer', function() {      assertEquals(angular.validator.integer("ab"), "Not a number");      assertEquals(angular.validator.integer("1.1"), "Not a whole number"); @@ -43,7 +43,7 @@ describe('ValidatorTest', function(){      assertEquals(angular.validator.integer("1"), null);      assertEquals(angular.validator.integer(" 1 ", 1, 1), null);    }); -   +    it('Date', function() {      var error = "Value is not a date. (Expecting format: 12/31/2009).";      expect(angular.validator.date("ab")).toEqual(error); @@ -60,7 +60,7 @@ describe('ValidatorTest', function(){      expect(angular.validator.date("1/32/2010")).toEqual(error);      expect(angular.validator.date("001/031/2009")).toEqual(error);    }); -   +    it('Phone', function() {      var error = "Phone number needs to be in 1(987)654-3210 format in North America or +999 (123) 45678 906 internationaly.";      assertEquals(angular.validator.phone("ab"), error); @@ -68,30 +68,30 @@ describe('ValidatorTest', function(){      assertEquals(null, angular.validator.phone("+421 (0905) 933 297"));      assertEquals(null, angular.validator.phone("+421 0905 933 297"));    }); -   +    it('URL', function() {      var error = "URL needs to be in http://server[:port]/path format.";      assertEquals(angular.validator.url("ab"), error);      assertEquals(angular.validator.url("http://server:123/path"), null);    }); -   +    it('Email', function() {      var error = "Email needs to be in username@host.com format.";      assertEquals(error, angular.validator.email("ab"));      assertEquals(null, angular.validator.email("misko@hevery.com"));    }); -   +    it('Json', function() {      assertNotNull(angular.validator.json("'"));      assertNotNull(angular.validator.json("''X"));      assertNull(angular.validator.json("{}"));    }); -   +    describe('asynchronous', function(){      var asynchronous = angular.validator.asynchronous;      var self;      var value, fn; -   +      beforeEach(function(){        value = null;        fn = null; @@ -101,11 +101,11 @@ describe('ValidatorTest', function(){        self.$root = self;        self.$init();      }); -   +      afterEach(function(){        if (self.$element) self.$element.remove();      }); -   +      it('should make a request and show spinner', function(){        var value, fn;        var scope = compile('<input type="text" name="name" ng:validate="asynchronous:asyncFn"/>'); @@ -124,32 +124,32 @@ describe('ValidatorTest', function(){        expect(input.attr(NG_VALIDATION_ERROR)).toEqual("myError");        scope.$element.remove();      }); -   +      it("should not make second request to same value", function(){        asynchronous.call(self, "kai", function(v,f){value=v; fn=f;});        expect(value).toEqual('kai');        expect(self.$service('$invalidWidgets')[0]).toEqual(self.$element); -   +        var spy = jasmine.createSpy();        asynchronous.call(self, "kai", spy);        expect(spy).wasNotCalled(); -   +        asynchronous.call(self, "misko", spy);        expect(spy).wasCalled();      }); -   +      it("should ignore old callbacks, and not remove spinner", function(){        var firstCb, secondCb;        asynchronous.call(self, "first", function(v,f){value=v; firstCb=f;});        asynchronous.call(self, "second", function(v,f){value=v; secondCb=f;}); -   +        firstCb();        expect(self.$element.hasClass('ng-input-indicator-wait')).toBeTruthy(); -   +        secondCb();        expect(self.$element.hasClass('ng-input-indicator-wait')).toBeFalsy();      }); -   +      it("should handle update function", function(){        var scope = angular.compile('<input name="name" ng:validate="asynchronous:asyncFn:updateFn"/>');        scope.asyncFn = jasmine.createSpy(); @@ -165,6 +165,6 @@ describe('ValidatorTest', function(){        expect(scope.updateFn.mostRecentCall.args[0]).toEqual({id: 1234, data:'data'});        scope.$element.remove();      }); -   +    });  }); diff --git a/test/jquery_alias.js b/test/jquery_alias.js index 4b3fad00..0d884a39 100644 --- a/test/jquery_alias.js +++ b/test/jquery_alias.js @@ -1 +1 @@ -var _jQuery = jQuery;
\ No newline at end of file +var _jQuery = jQuery; diff --git a/test/jquery_remove.js b/test/jquery_remove.js index 5283c340..9e717240 100644 --- a/test/jquery_remove.js +++ b/test/jquery_remove.js @@ -1 +1 @@ -var _jQuery = jQuery.noConflict(true);
\ No newline at end of file +var _jQuery = jQuery.noConflict(true); diff --git a/test/markupSpec.js b/test/markupSpec.js index 3234bf2f..f78112d7 100644 --- a/test/markupSpec.js +++ b/test/markupSpec.js @@ -147,6 +147,6 @@ describe("markups", function(){      assertTrue(!hasBindings(parseBindings("a")));      assertTrue(hasBindings(parseBindings("{{b}}x{{c}}")));    }); -   +  }); diff --git a/test/sanitizerSpec.js b/test/sanitizerSpec.js index 3ad6c1c9..57eedec9 100644 --- a/test/sanitizerSpec.js +++ b/test/sanitizerSpec.js @@ -50,11 +50,11 @@ describe('HTML', function(){    });    it('should handle entities', function(){ -    var everything = '<div rel="!@#$%^&*()_+-={}[]:";\'<>?,./`~ ħ">' +  +    var everything = '<div rel="!@#$%^&*()_+-={}[]:";\'<>?,./`~ ħ">' +      '!@#$%^&*()_+-={}[]:";\'<>?,./`~ ħ</div>';      expectHTML(everything).toEqual(everything);    }); -   +    it('should handle improper html', function(){      expectHTML('< div rel="</div>" alt=abc dir=\'"\' >text< /div>').        toEqual('<div rel="</div>" alt="abc" dir=""">text</div>'); @@ -64,19 +64,19 @@ describe('HTML', function(){      expectHTML('< div rel="</div>" / >').        toEqual('<div rel="</div>"/>');    }); -   +    it('should ignore back slash as escape', function(){      expectHTML('<img alt="xxx\\" title="><script>....">').        toEqual('<img alt="xxx\\" title="><script>...."/>');    }); -   +    it('should ignore object attributes', function(){      expectHTML('<a constructor="hola">:)</a>').        toEqual('<a>:)</a>');      expectHTML('<constructor constructor="hola">:)</constructor>').        toEqual('');    }); -   +    describe('htmlSanitizerWriter', function(){      var writer, html;      beforeEach(function(){ @@ -118,13 +118,13 @@ describe('HTML', function(){        writer.start('div', {unknown:""});        expect(html).toEqual('<div>');      }); -     +      describe('explicitly dissallow', function(){        it('should not allow attributes', function(){          writer.start('div', {id:'a', name:'a', style:'a'});          expect(html).toEqual('<div>');        }); -       +        it('should not allow tags', function(){          function tag(name) {            writer.start(name, {}); @@ -149,13 +149,13 @@ describe('HTML', function(){          expect(html).toEqual('');        });      }); -     +      describe('isUri', function(){ -       +        function isUri(value) {          return value.match(URI_REGEXP);        } -       +        it('should be URI', function(){          expect(isUri('http://abc')).toBeTruthy();          expect(isUri('https://abc')).toBeTruthy(); @@ -163,7 +163,7 @@ describe('HTML', function(){          expect(isUri('mailto:me@example.com')).toBeTruthy();          expect(isUri('#anchor')).toBeTruthy();        }); -       +        it('should not be UIR', function(){          expect(isUri('')).toBeFalsy();          expect(isUri('javascript:alert')).toBeFalsy(); diff --git a/test/scenario/mocks.js b/test/scenario/mocks.js index 616e5d63..e023b6b0 100644 --- a/test/scenario/mocks.js +++ b/test/scenario/mocks.js @@ -32,7 +32,7 @@ angular.scenario.testing.MockRunner.prototype.on = function(eventName, fn) {    this.listeners[eventName] = this.listeners[eventName] || [];    this.listeners[eventName].push(fn);  }; -   +  angular.scenario.testing.MockRunner.prototype.emit = function(eventName) {    var args = Array.prototype.slice.call(arguments, 1);    angular.forEach(this.listeners[eventName] || [], function(fn) { diff --git a/test/servicesSpec.js b/test/servicesSpec.js index 0569c54a..e9b16621 100644 --- a/test/servicesSpec.js +++ b/test/servicesSpec.js @@ -60,7 +60,7 @@ describe("service", function(){        $log.info();        $log.error();      }); -     +      describe('Error', function(){        var e, $log, $console, errorArgs;        beforeEach(function(){ @@ -69,12 +69,12 @@ describe("service", function(){          e.sourceURL = undefined;          e.line = undefined;          e.stack = undefined; -         +          $console = angular.service('$log')({console:{error:function(){            errorArgs = arguments;          }}});        }); -       +        it('should pass error if does not have trace', function(){          $console.error('abc', e);          expect(errorArgs).toEqual(['abc', e]); @@ -93,9 +93,9 @@ describe("service", function(){          $console.error('abc', e);          expect(errorArgs).toEqual(['abc', 'message\nsourceURL:123']);        }); -       +      }); -     +    });    describe("$exceptionHandler", function(){ | 
