diff options
| -rw-r--r-- | src/Angular.js | 2 | ||||
| -rw-r--r-- | src/Formatters.js | 2 | ||||
| -rw-r--r-- | src/JSON.js | 1 | ||||
| -rw-r--r-- | src/Scope.js | 2 | ||||
| -rw-r--r-- | src/Widgets.js | 3 | ||||
| -rw-r--r-- | src/directives.js | 29 | ||||
| -rw-r--r-- | src/jqLite.js | 2 | ||||
| -rw-r--r-- | test/BinderTest.js | 182 | ||||
| -rw-r--r-- | test/directivesSpec.js | 8 | ||||
| -rw-r--r-- | test/markupSpec.js | 8 | ||||
| -rw-r--r-- | test/moveToAngularCom/MiscTest.js | 35 | ||||
| -rw-r--r-- | test/testabilityPatch.js | 6 | ||||
| -rw-r--r-- | test/widgetsSpec.js | 18 |
13 files changed, 142 insertions, 156 deletions
diff --git a/src/Angular.js b/src/Angular.js index 27f463ac..db177082 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -6,9 +6,11 @@ if (!window['console']) window['console']={'log':noop, 'error':noop}; var consoleNode, NOOP = 'noop', NG_ERROR = 'ng-error', + NG_EXCEPTION = 'ng-exception', NG_VALIDATION_ERROR = 'ng-validation-error', jQuery = window['jQuery'] || window['$'], // weirdness to make IE happy _ = window['_'], + msie = !!/(msie) ([\w.]+)/.exec(lowercase(navigator.userAgent)), jqLite = jQuery || jqLiteWrap, slice = Array.prototype.slice, angular = window['angular'] || (window['angular'] = {}), diff --git a/src/Formatters.js b/src/Formatters.js index 402e8a2b..c1ff82c6 100644 --- a/src/Formatters.js +++ b/src/Formatters.js @@ -1,5 +1,5 @@ function formater(format, parse) {return {'format':format, 'parse':parse || format};} -function toString(obj) {return ""+obj;}; +function toString(obj) {return isDefined(obj) ? "" + obj : obj;}; extend(angularFormatter, { 'noop':formater(identity, identity), 'boolean':formater(toString, toBoolean), diff --git a/src/JSON.js b/src/JSON.js index baf3a2fa..69e1b4c0 100644 --- a/src/JSON.js +++ b/src/JSON.js @@ -11,6 +11,7 @@ function toPrettyJson(obj) { }; function fromJson(json) { + if (!json) return json; try { var parser = new Parser(json, true); var expression = parser.primary(); diff --git a/src/Scope.js b/src/Scope.js index 42e7d5e5..4144d456 100644 --- a/src/Scope.js +++ b/src/Scope.js @@ -81,7 +81,7 @@ function errorHandlerFor(element, error) { while (!isRenderableElement(element)) { element = element.parent() || jqLite(document.body); } - elementError(element, 'ng-exception', isDefined(error) ? toJson(error) : error); + elementError(element, NG_EXCEPTION, isDefined(error) ? toJson(error) : error); } function createScope(parent, Class) { diff --git a/src/Widgets.js b/src/Widgets.js index bc61f570..f172eae2 100644 --- a/src/Widgets.js +++ b/src/Widgets.js @@ -108,7 +108,7 @@ function inputWidget(events, modelAccessor, viewAccessor, initValue) { var scope = this, model = modelAccessor(scope, element), view = viewAccessor(scope, element), - action = element.attr('ng-action') || '', + action = element.attr('ng-change') || '', value = view.get() || copy(initValue); if (isUndefined(model.get()) && isDefined(value)) model.set(value); this.$eval(element.attr('ng-init')||''); @@ -120,6 +120,7 @@ function inputWidget(events, modelAccessor, viewAccessor, initValue) { // therefore we want to prevent default action return isDefined(initValue); }); + view.set(model.get()); scope.$watch(model.get, view.set); }; } diff --git a/src/directives.js b/src/directives.js index 291bea11..de68360e 100644 --- a/src/directives.js +++ b/src/directives.js @@ -15,7 +15,7 @@ angularDirective("ng-bind", function(expression){ return function(element) { var lastValue; this.$onEval(function() { - var value = templateFn.call(this); + var value = templateFn.call(this, element); if (value != lastValue) { element.text(value); lastValue = value; @@ -31,16 +31,20 @@ function compileBindTemplate(template){ var bindings = []; foreach(parseBindings(template), function(text){ var exp = binding(text); - bindings.push(exp ? function(){ - return this.$eval(exp); - } : function(){ + bindings.push(exp ? function(element){ + var error, value = this.$tryEval(exp, function(e){ + error = toJson(e); + }); + elementError(element, NG_EXCEPTION, error); + return error ? error : value; + } : function() { return text; }); }); - bindTemplateCache[template] = fn = function(){ + bindTemplateCache[template] = fn = function(element){ var parts = [], self = this; foreach(bindings, function(fn){ - var value = fn.call(self); + var value = fn.call(self, element); if (isObject(value)) value = toJson(value, true); parts.push(value); }); @@ -54,7 +58,7 @@ angularDirective("ng-bind-template", function(expression){ return function(element) { var lastValue; this.$onEval(function() { - var value = templateFn.call(this); + var value = templateFn.call(this, element); if (value != lastValue) { element.text(value); lastValue = value; @@ -67,7 +71,7 @@ angularDirective("ng-bind-attr", function(expression){ return function(element){ this.$onEval(function(){ foreach(this.$eval(expression), function(bindExp, key) { - var value = compileBindTemplate(bindExp).call(this); + var value = compileBindTemplate(bindExp).call(this, element); if (key == 'disabled' && !toBoolean(value)) { element.removeAttr('disabled'); } else { @@ -135,12 +139,13 @@ angularWidget("@ng-repeat", function(expression, element){ }; }); -angularDirective("ng-action", function(expression, element){ +angularDirective("ng-click", function(expression, element){ return function(element){ var self = this; element.click(function(){ self.$tryEval(expression, element); self.$eval(); + return false; }); }; }); @@ -167,7 +172,7 @@ function ngClass(selector) { var value = this.$eval(expression); if (selector(this.$index)) { if (isArray(value)) value = value.join(' '); - element[0].className = (existing + value).replace(/\s\s+/g, ' '); + element[0].className = trim(existing + value); } }, element); }; @@ -175,8 +180,8 @@ function ngClass(selector) { } angularDirective("ng-class", ngClass(function(){return true;})); -angularDirective("ng-class-odd", ngClass(function(i){return i % 2 == 1;})); -angularDirective("ng-class-even", ngClass(function(i){return i % 2 == 0;})); +angularDirective("ng-class-odd", ngClass(function(i){return i % 2 == 0;})); +angularDirective("ng-class-even", ngClass(function(i){return i % 2 == 1;})); angularDirective("ng-show", function(expression, element){ return function(element){ diff --git a/src/jqLite.js b/src/jqLite.js index 449854d5..3baafd51 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -136,7 +136,7 @@ JQLite.prototype = { addClass: function( selector ) { if (!this.hasClass(selector)) { - this[0].className += ' ' + selector; + this[0].className = trim(this[0].className + ' ' + selector); } }, diff --git a/test/BinderTest.js b/test/BinderTest.js index e99f37e2..4d996a8e 100644 --- a/test/BinderTest.js +++ b/test/BinderTest.js @@ -39,7 +39,7 @@ BinderTest.prototype.testChangingRadioUpdatesModel = function(){ }; BinderTest.prototype.testChangingCheckboxUpdatesModel = function(){ - var form = this.compile('<input type="checkbox" name="model.price" value="true" checked ng-format="boolean">'); + var form = this.compile('<input type="checkbox" name="model.price" value="true" checked ng-format="boolean"/>'); assertEquals(true, form.scope.model.price); }; @@ -91,7 +91,7 @@ BinderTest.prototype.testReplaceBindingInTextWithSpan = function() { }; BinderTest.prototype.testBindingSpaceConfusesIE = function() { - //if (!msie) return; + if (!msie) return; var span = document.createElement("span"); span.innerHTML = ' '; var nbsp = span.firstChild.nodeValue; @@ -144,7 +144,7 @@ BinderTest.prototype.testAttributesAreEvaluated = function(){ BinderTest.prototype.testInputTypeButtonActionExecutesInScope = function(){ var savedCalled = false; - var c = this.compile('<input type="button" ng-action="person.save()" value="Apply">'); + var c = this.compile('<input type="button" ng-click="person.save()" value="Apply">'); c.scope.$set("person.save", function(){ savedCalled = true; }); @@ -153,17 +153,19 @@ BinderTest.prototype.testInputTypeButtonActionExecutesInScope = function(){ }; BinderTest.prototype.testInputTypeButtonActionExecutesInScope2 = function(){ - expectAsserts(1); - var c = this.compile('<input type="image" ng-action="action()">'); + var log = ""; + var c = this.compile('<input type="image" ng-click="action()">'); c.scope.$set("action", function(){ - assertTrue(true); + log += 'click;'; }); + expect(log).toEqual(''); c.node.click(); + expect(log).toEqual('click;'); }; BinderTest.prototype.testButtonElementActionExecutesInScope = function(){ var savedCalled = false; - var c = this.compile('<button ng-action="person.save()">Apply</button>'); + var c = this.compile('<button ng-click="person.save()">Apply</button>'); c.scope.$set("person.save", function(){ savedCalled = true; }); @@ -171,7 +173,7 @@ BinderTest.prototype.testButtonElementActionExecutesInScope = function(){ assertTrue(savedCalled); }; -BinderTest.prototype.testParseEmptyAnchor = function(){ +BinderTest.prototype.XtestParseEmptyAnchor = function(){ var binder = this.compile("<div/>").binder; var location = binder.location; var anchor = binder.anchor; @@ -185,7 +187,7 @@ BinderTest.prototype.testParseEmptyAnchor = function(){ assertEquals('undefined', typeof (anchor[""])); }; -BinderTest.prototype.testParseAnchor = function(){ +BinderTest.prototype.XtestParseAnchor = function(){ var binder = this.compile("<div/>").binder; var location = binder.location; location.url = "a#x=1"; @@ -199,7 +201,7 @@ BinderTest.prototype.testParseAnchor = function(){ assertTrue(!binder.anchor.x); }; -BinderTest.prototype.testWriteAnchor = function(){ +BinderTest.prototype.XtestWriteAnchor = function(){ var binder = this.compile("<div/>").binder; binder.location.set('a'); binder.anchor.a = 'b'; @@ -209,7 +211,7 @@ BinderTest.prototype.testWriteAnchor = function(){ assertEquals(binder.location.get(), "a#a=b&c=%20&d"); }; -BinderTest.prototype.testWriteAnchorAsPartOfTheUpdateView = function(){ +BinderTest.prototype.XtestWriteAnchorAsPartOfTheUpdateView = function(){ var binder = this.compile("<div/>").binder; binder.location.set('a'); binder.anchor.a = 'b'; @@ -221,8 +223,6 @@ BinderTest.prototype.testRepeaterUpdateBindings = 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"}]; - var initialDataCount = _(jQuery.cache).size(); - assertTrue("" + initialDataCount, initialDataCount > 0); a.scope.$set('model', {items:items}); a.scope.$eval(); @@ -252,8 +252,6 @@ BinderTest.prototype.testRepeaterUpdateBindings = function(){ items.shift(); items.shift(); a.scope.$eval(); - var currentDataCount = _(jQuery.cache).size(); - assertEquals("I have leaked " + (currentDataCount - initialDataCount), initialDataCount, currentDataCount); }; BinderTest.prototype.testRepeaterContentDoesNotBind = function(){ @@ -266,118 +264,63 @@ BinderTest.prototype.testRepeaterContentDoesNotBind = function(){ '</ul>', sortedHtml(a.node)); }; -BinderTest.prototype.testShouldBindActionsOnRepeaterClone = function(){ - var c = this.compile('<a ng-repeat="item in items" href="#" ng-action="result.value = item">link</a>'); - jQuery(c).die(); - c.scope.$set('result.value', false); - c.scope.$set('items', ['abc', 'xyz']); - c.scope.$eval(); - assertEquals(2, c.node.find("a").size()); - c.node.find("a:last").click(); - assertEquals('xyz', c.scope.$get('result.value')); -}; - - - -BinderTest.prototype.testRepeaterInputContentDoesNotBind = function(){ - var c = compil('<ul><LI repeater="item in model.items">' + - '<input type="text" name="item.a" value="OLD"/></li></ul>'); - c.scope.items = [{a:"A"}]; - assertEquals(c.node.find(":input").attr("value"), "OLD"); -}; - BinderTest.prototype.testExpandEntityTag = function(){ assertEquals( '<div ng-entity="Person" ng-watch="$anchor.a:1"></div>', this.compileToHtml('<div ng-entity="Person" ng-watch="$anchor.a:1"/>')); }; -BinderTest.prototype.testExpandEntityTagWithDefaults = function(){ - assertEquals( - '<div ng-entity="Person:{a:\"a\"}" ng-watch=""></div>', - this.compileToHtml('<div ng-entity=\'Person:{a:"a"}\'/>')); -}; - -BinderTest.prototype.testExpandEntityTagWithName = function(){ - var c = this.compile('<div ng-entity="friend=Person"/>'); - assertEquals( - '<div ng-entity="friend=Person" ng-watch="$anchor.friend:{friend=Person.load($anchor.friend);friend.$$anchor=\"friend\";};"></div>', - sortedHtml(c.node)); - assertEquals("Person", c.scope.$get("friend.$entity")); - assertEquals("friend", c.scope.$get("friend.$$anchor")); -}; - -BinderTest.prototype.testExpandSubmitButtonToAction = function(){ - var html = this.compileToHtml('<input type="submit" value="Save">'); - assertTrue(html, html.indexOf('ng-action="$save()"') > 0 ); - assertTrue(html, html.indexOf('ng-bind-attr="{"disabled":"{{$invalidWidgets}}"}"') > 0 ); -}; - BinderTest.prototype.testDoNotOverwriteCustomAction = function(){ var html = this.compileToHtml('<input type="submit" value="Save" action="foo();">'); assertTrue(html.indexOf('action="foo();"') > 0 ); }; -BinderTest.prototype.testReplaceFileUploadWithSwf = function(){ - expectAsserts(1); - var form = jQuery("body").append('<div id="testTag"><input type="file"></div>'); - form.data('scope', new Scope()); - var factory = {}; - var binder = new Binder(form.get(0), factory, new MockLocation()); - factory.createController = function(node){ - assertEquals(node.attr('type'), 'file'); - return {updateModel:function(){}}; - }; - binder.compile(); - jQuery("#testTag").remove(); -}; - BinderTest.prototype.testRepeaterAdd = function(){ var c = this.compile('<div><input type="text" name="item.x" ng-repeat="item in items"></div>'); var doc = c.node; c.scope.$set('items', [{x:'a'}, {x:'b'}]); - c.binder.compile(); c.scope.$eval(); - assertEquals('a', doc.find(':input')[0].value); - assertEquals('b', doc.find(':input')[1].value); + var first = childNode(c.node, 1); + var second = childNode(c.node, 2); + assertEquals('a', first.val()); + assertEquals('b', second.val()); - var first = doc.find('[ng-repeat-index="0"]'); - first[0].value = 'ABC'; + first.val('ABC'); first.trigger('keyup'); - assertEquals(doc.scope().get('items')[0].x, 'ABC'); + assertEquals(c.scope.items[0].x, 'ABC'); }; BinderTest.prototype.testItShouldRemoveExtraChildrenWhenIteratingOverHash = function(){ - var c = this.compile('<div ng-repeat="i in items">{{i}}</div>'); + 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.find("div").size()).toEqual(0); + expect(c.node[0].childNodes.length - 1).toEqual(0); items.name = "misko"; c.scope.$eval(); - expect(c.node.find("div").size()).toEqual(1); + expect(c.node[0].childNodes.length - 1).toEqual(1); delete items.name; c.scope.$eval(); - expect(c.node.find("div").size()).toEqual(0); + expect(c.node[0].childNodes.length - 1).toEqual(0); }; BinderTest.prototype.testIfTextBindingThrowsErrorDecorateTheSpan = function(){ var a = this.compile('<div>{{error.throw()}}</div>'); - var doc = a.node.find('div'); + var doc = a.node; a.scope.$set('error.throw', function(){throw "ErrorMsg1";}); a.scope.$eval(); - var span = doc.find('span'); + var span = childNode(doc, 0); assertTrue(span.hasClass('ng-exception')); assertEquals('ErrorMsg1', fromJson(span.text())); assertEquals('"ErrorMsg1"', span.attr('ng-error')); a.scope.$set('error.throw', function(){throw "MyError";}); a.scope.$eval(); - span = doc.find('span'); + span = childNode(doc, 0); assertTrue(span.hasClass('ng-exception')); assertTrue(span.text(), span.text().match('MyError') !== null); assertEquals('"MyError"', span.attr('ng-error')); @@ -389,15 +332,15 @@ BinderTest.prototype.testIfTextBindingThrowsErrorDecorateTheSpan = function(){ assertEquals(null, span.attr('ng-error')); }; -BinderTest.prototype.testIfAttrBindingThrowsErrorDecorateTheSpan = function(){ +BinderTest.prototype.testIfAttrBindingThrowsErrorDecorateTheAttribute = function(){ var a = this.compile('<div attr="before {{error.throw()}} after"></div>'); - var doc = a.node.find("div"); + var doc = a.node; a.scope.$set('error.throw', function(){throw "ErrorMsg";}); a.scope.$eval(); assertTrue('ng-exception', doc.hasClass('ng-exception')); - assertEquals('before ["ErrorMsg"] after', doc.attr('attr')); assertEquals('"ErrorMsg"', doc.attr('ng-error')); + assertEquals('before "ErrorMsg" after', doc.attr('attr')); a.scope.$set('error.throw', function(){ return 'X';}); a.scope.$eval(); @@ -408,15 +351,15 @@ BinderTest.prototype.testIfAttrBindingThrowsErrorDecorateTheSpan = function(){ }; BinderTest.prototype.testNestedRepeater = function() { - var a = this.compile('<div ng-repeat="m in model" name="{{m.name}}">' + + 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></div>'); a.scope.$set('model', [{name:'a', item:['a1', 'a2']}, {name:'b', item:['b1', 'b2']}]); a.scope.$eval(); - assertEquals( - //'<#comment></#comment>'+ + assertEquals('<div>'+ + '<#comment></#comment>'+ '<div name="a" ng-bind-attr="{"name":"{{m.name}}"}" ng-repeat-index="0">'+ '<#comment></#comment>'+ '<ul name="a1" ng-bind-attr="{"name":"{{i}}"}" ng-repeat-index="0"></ul>'+ @@ -426,18 +369,18 @@ BinderTest.prototype.testNestedRepeater = function() { '<#comment></#comment>'+ '<ul name="b1" ng-bind-attr="{"name":"{{i}}"}" ng-repeat-index="0"></ul>'+ '<ul name="b2" ng-bind-attr="{"name":"{{i}}"}" ng-repeat-index="1"></ul>'+ - '</div>', sortedHtml(a.node)); + '</div></div>', sortedHtml(a.node)); }; -BinderTest.prototype.testRadioButtonGetsPrefixed = function () { - var a = this.compile('<input ng-repeat="m in model" type="radio" name="m.a" value="on"/>'); +BinderTest.prototype.XtestRadioButtonGetsPrefixed = function () { + var a = this.compile('<div><input ng-repeat="m in model" type="radio" name="m.a" value="on"/></div>'); a.scope.$set('model', ['a1', 'a2']); a.scope.$eval(); - assertEquals( - //'<#comment></#comment>'+ + assertEquals('</div>' + + '<#comment></#comment>'+ '<input name="0:m.a" ng-repeat-index="0" type="radio" value="on"></input>'+ - '<input name="1:m.a" ng-repeat-index="1" type="radio" value="on"></input>', + '<input name="1:m.a" ng-repeat-index="1" type="radio" value="on"></input></div>', sortedHtml(a.node)); }; @@ -447,12 +390,12 @@ BinderTest.prototype.testHideBindingExpression = function() { a.scope.$set('hidden', 3); a.scope.$eval(); - assertHidden(a.node.children()); + assertHidden(a.node); a.scope.$set('hidden', 2); a.scope.$eval(); - assertVisible(a.node.children()); + assertVisible(a.node); }; BinderTest.prototype.testHideBinding = function() { @@ -461,17 +404,17 @@ BinderTest.prototype.testHideBinding = function() { c.scope.$set('hidden', 'true'); c.scope.$eval(); - assertHidden(c.node.children()); + assertHidden(c.node); c.scope.$set('hidden', 'false'); c.scope.$eval(); - assertVisible(c.node.children()); + assertVisible(c.node); c.scope.$set('hidden', ''); c.scope.$eval(); - assertVisible(c.node.children()); + assertVisible(c.node); }; BinderTest.prototype.testShowBinding = function() { @@ -480,17 +423,17 @@ BinderTest.prototype.testShowBinding = function() { c.scope.$set('show', 'true'); c.scope.$eval(); - assertVisible(c.node.children()); + assertVisible(c.node); c.scope.$set('show', 'false'); c.scope.$eval(); - assertHidden(c.node.children()); + assertHidden(c.node); c.scope.$set('show', ''); c.scope.$eval(); - assertHidden(c.node.children()); + assertHidden(c.node); }; BinderTest.prototype.testBindClassUndefined = function() { @@ -498,7 +441,7 @@ BinderTest.prototype.testBindClassUndefined = function() { doc.scope.$eval(); assertEquals( - '<div ng-class="undefined"></div>', + '<div class="undefined" ng-class="undefined"></div>', sortedHtml(doc.node)); }; @@ -515,35 +458,34 @@ BinderTest.prototype.testBindClass = function() { c.scope.$eval(); assertEquals(sortedHtml(c.node), - '<div class="a,b" ng-class="class"></div>'); + '<div class="a b" ng-class="class"></div>'); }; BinderTest.prototype.testBindClassEvenOdd = function() { - var x = this.compile('<div ng-repeat="i in [0,1]" ng-class-even="\'e\'" ng-class-odd="\'o\'"/>'); + var x = this.compile('<div><div ng-repeat="i in [0,1]" ng-class-even="\'e\'" ng-class-odd="\'o\'"/></div>'); x.scope.$eval(); assertEquals( + '<div><#comment></#comment>' + '<div class="o" ng-class-even="\'e\'" ng-class-odd="\'o\'" ng-repeat-index="0"></div>' + - '<div class="e" ng-class-even="\'e\'" ng-class-odd="\'o\'" ng-repeat-index="1"></div>', + '<div class="e" ng-class-even="\'e\'" ng-class-odd="\'o\'" ng-repeat-index="1"></div></div>', sortedHtml(x.node)); }; BinderTest.prototype.testBindStyle = function() { var c = this.compile('<div ng-style="style"/>'); - c.scope.eval('style={color:"red"}'); + c.scope.$eval('style={color:"red"}'); c.scope.$eval(); - assertEquals("red", c.node.find('div').css('color')); + assertEquals("red", c.node.css('color')); - c.scope.eval('style={}'); + c.scope.$eval('style={}'); c.scope.$eval(); - - assertEquals(sortedHtml(c.node), '<div ng-style="style"></div>'); }; BinderTest.prototype.testActionOnAHrefThrowsError = function(){ var model = {books:[]}; - var c = this.compile('<a ng-action="action()">Add Phone</a>', model); + var c = this.compile('<a ng-click="action()">Add Phone</a>', model); c.scope.action = function(){ throw {a:'abc', b:2}; }; @@ -553,10 +495,10 @@ BinderTest.prototype.testActionOnAHrefThrowsError = function(){ 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; -// input.click(); -// dump(input.attr('ng-error')); -// assertFalse('error class should be cleared', input.hasClass('ng-exception')); + //c.scope.action = noop; + //input.click(); + //dump(input.attr('ng-error')); + //assertFalse('error class should be cleared', input.hasClass('ng-exception')); }; BinderTest.prototype.testShoulIgnoreVbNonBindable = function(){ @@ -777,8 +719,8 @@ BinderTest.prototype.XtestSetBinderAnchorTriggersListeners = function(){ BinderTest.prototype.testItShouldDisplayErrorWhenActionIsSyntacticlyIncorect = function(){ var c = this.compile('<div>' + - '<input type="button" ng-action="greeting=\'ABC\'"/>' + - '<input type="button" ng-action=":garbage:"/></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]); diff --git a/test/directivesSpec.js b/test/directivesSpec.js index 4eef1ac3..cfee86a0 100644 --- a/test/directivesSpec.js +++ b/test/directivesSpec.js @@ -105,8 +105,8 @@ describe("directives", function(){ expect(scope.$get('count')).toEqual(1); }); - it('should ng-action', function(){ - var scope = compile('<div ng-action="clicked = true"></div>'); + it('should ng-click', function(){ + var scope = compile('<div ng-click="clicked = true"></div>'); scope.$eval(); expect(scope.$get('clicked')).toBeFalsy(); @@ -128,9 +128,9 @@ describe("directives", function(){ var e1 = jqLite(element[0].childNodes[1]); var e2 = jqLite(element[0].childNodes[2]); expect(e1.hasClass('existing')).toBeTruthy(); - expect(e1.hasClass('even')).toBeTruthy(); + expect(e1.hasClass('odd')).toBeTruthy(); expect(e2.hasClass('existing')).toBeTruthy(); - expect(e2.hasClass('odd')).toBeTruthy(); + expect(e2.hasClass('even')).toBeTruthy(); }); it('should ng-style', function(){ diff --git a/test/markupSpec.js b/test/markupSpec.js index 2ddefe47..e416b8ea 100644 --- a/test/markupSpec.js +++ b/test/markupSpec.js @@ -20,18 +20,18 @@ describe("markups", function(){ it('should translate {{}} in text', function(){ compile('<div>hello {{name}}!</div>'); - expect(element.html()).toEqual('hello <span ng-bind="name"></span>!'); + expect(sortedHtml(element)).toEqual('<div>hello <span ng-bind="name"></span>!</div>'); scope.$set('name', 'Misko'); scope.$eval(); - expect(element.html()).toEqual('hello <span ng-bind="name">Misko</span>!'); + expect(sortedHtml(element)).toEqual('<div>hello <span ng-bind="name">Misko</span>!</div>'); }); it('should translate {{}} in terminal nodes', function(){ compile('<select name="x"><option value="">Greet {{name}}!</option></select>'); - expect(element.html()).toEqual('<option ng-bind-template="Greet {{name}}!" value="">Greet !</option>'); + expect(sortedHtml(element)).toEqual('<select name="x"><option ng-bind-template="Greet {{name}}!">Greet !</option></select>'); scope.$set('name', 'Misko'); scope.$eval(); - expect(element.html()).toEqual('<option ng-bind-template="Greet {{name}}!" value="">Greet Misko!</option>'); + expect(sortedHtml(element)).toEqual('<select name="x"><option ng-bind-template="Greet {{name}}!">Greet Misko!</option></select>'); }); it('should translate {{}} in attributes', function(){ diff --git a/test/moveToAngularCom/MiscTest.js b/test/moveToAngularCom/MiscTest.js new file mode 100644 index 00000000..db6e8563 --- /dev/null +++ b/test/moveToAngularCom/MiscTest.js @@ -0,0 +1,35 @@ +BinderTest.prototype.testExpandEntityTagWithName = function(){ + var c = this.compile('<div ng-entity="friend=Person"/>'); + assertEquals( + '<div ng-entity="friend=Person" ng-watch="$anchor.friend:{friend=Person.load($anchor.friend);friend.$$anchor=\"friend\";};"></div>', + sortedHtml(c.node)); + assertEquals("Person", c.scope.$get("friend.$entity")); + assertEquals("friend", c.scope.$get("friend.$$anchor")); +}; + +BinderTest.prototype.XtestExpandSubmitButtonToAction = function(){ + var html = this.compileToHtml('<input type="submit" value="Save">'); + assertTrue(html, html.indexOf('ng-action="$save()"') > 0 ); + assertTrue(html, html.indexOf('ng-bind-attr="{"disabled":"{{$invalidWidgets}}"}"') > 0 ); +}; + +BinderTest.prototype.XtestReplaceFileUploadWithSwf = function(){ + expectAsserts(1); + var form = jQuery("body").append('<div id="testTag"><input type="file"></div>'); + form.data('scope', new Scope()); + var factory = {}; + var binder = new Binder(form.get(0), factory, new MockLocation()); + factory.createController = function(node){ + assertEquals(node.attr('type'), 'file'); + return {updateModel:function(){}}; + }; + binder.compile(); + jQuery("#testTag").remove(); +}; + +BinderTest.prototype.testExpandEntityTagWithDefaults = function(){ + assertEquals( + '<div ng-entity="Person:{a:\"a\"}" ng-watch=""></div>', + this.compileToHtml('<div ng-entity=\'Person:{a:"a"}\'/>')); +}; + diff --git a/test/testabilityPatch.js b/test/testabilityPatch.js index 312b1e42..86d139cf 100644 --- a/test/testabilityPatch.js +++ b/test/testabilityPatch.js @@ -83,18 +83,18 @@ function sortedHtml(element) { }; function isVisible(node) { - var display = $(node).css('display'); + var display = node.css('display'); if (display == 'block') display = ""; return display != 'none'; } function assertHidden(node) { var display = node.css('display'); - assertFalse("Node should be hidden but vas visible: " + node.sortedHtml(), isVisible(node)); + assertFalse("Node should be hidden but vas visible: " + sortedHtml(node), isVisible(node)); } function assertVisible(node) { - assertTrue("Node should be visible but vas hidden: " + node.sortedHtml(), isVisible(node)); + assertTrue("Node should be visible but vas hidden: " + sortedHtml(node), isVisible(node)); } function assertJsonEquals(expected, actual) { diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js index d041220b..6123e229 100644 --- a/test/widgetsSpec.js +++ b/test/widgetsSpec.js @@ -19,7 +19,7 @@ describe("input widget", function(){ }); it('should input-text auto init and handle keyup/change events', function(){ - compile('<input type="Text" name="name" value="Misko" ng-action="count = count + 1" ng-init="count=0"/>'); + compile('<input type="Text" name="name" value="Misko" ng-change="count = count + 1" ng-init="count=0"/>'); expect(scope.$get('name')).toEqual("Misko"); expect(scope.$get('count')).toEqual(0); @@ -100,20 +100,20 @@ describe("input widget", function(){ expect(scope.$get('name')).toEqual('Kai'); }); - it('should call ng-action on button click', function(){ - compile('<input type="button" value="Click Me" ng-action="clicked = true"/>'); + it('should call ng-change on button click', function(){ + compile('<input type="button" value="Click Me" ng-change="clicked = true"/>'); element.click(); expect(scope.$get('clicked')).toEqual(true); }); it('should support button alias', function(){ - compile('<button ng-action="clicked = true">Click Me</button>'); + compile('<button ng-change="clicked = true">Click Me</button>'); element.click(); expect(scope.$get('clicked')).toEqual(true); }); it('should type="checkbox"', function(){ - compile('<input type="checkbox" name="checkbox" checked ng-action="action = true"/>'); + compile('<input type="checkbox" name="checkbox" checked ng-change="action = true"/>'); expect(scope.$get('checkbox')).toEqual(true); element.click(); expect(scope.$get('checkbox')).toEqual(false); @@ -124,8 +124,8 @@ describe("input widget", function(){ it('should type="radio"', function(){ compile('<div>' + - '<input type="radio" name="chose" value="A" ng-action="clicked = 1"/>' + - '<input type="radio" name="chose" value="B" checked ng-action="clicked = 2"/>' + + '<input type="radio" name="chose" value="A" ng-change="clicked = 1"/>' + + '<input type="radio" name="chose" value="B" checked ng-change="clicked = 2"/>' + '</div>'); var a = element[0].childNodes[0]; var b = element[0].childNodes[1]; @@ -181,8 +181,8 @@ describe("input widget", function(){ expect(element.hasClass('ng-exception')).toBeTruthy(); }); - it('should report error on ng-action exception', function(){ - compile('<button ng-action="a-2=x">click</button>'); + it('should report error on ng-change exception', function(){ + compile('<button ng-change="a-2=x">click</button>'); element.click(); expect(element.hasClass('ng-exception')).toBeTruthy(); }); |
