diff options
Diffstat (limited to 'test/BinderTest.js')
| -rw-r--r-- | test/BinderTest.js | 134 |
1 files changed, 77 insertions, 57 deletions
diff --git a/test/BinderTest.js b/test/BinderTest.js index c21420af..e6c8147a 100644 --- a/test/BinderTest.js +++ b/test/BinderTest.js @@ -16,7 +16,7 @@ BinderTest.prototype.setUp = function(){ }; BinderTest.prototype.tearDown = function(){ - if (this.element) this.element.remove(); + if (this.element && this.element.dealoc) this.element.dealoc(); }; BinderTest.prototype.testChangingTextfieldUpdatesModel = function(){ @@ -543,22 +543,26 @@ BinderTest.prototype.testBindStyle = function() { BinderTest.prototype.testActionOnAHrefThrowsError = function(){ var model = {books:[]}; - var state = this.compile('<a ng-action="throw {a:\'abc\', b:2};">Add Phone</a>', model); - var input = state.node.find('a'); + var c = this.compile('<a ng-action="action()">Add Phone</a>', model); + c.scope.action = function(){ + throw {a:'abc', b:2}; + }; + var input = c.node; input.click(); - assertEquals('abc', fromJson(input.attr('ng-error')).a); + assertEquals({a:"abc", b:2}, fromJson(input.attr('ng-error'))); assertTrue("should have an error class", input.hasClass('ng-exception')); - input.attr('ng-action', '0'); + 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(){ - var c = this.compile("{{a}}" + + var c = this.compile("<div>{{a}}" + "<div ng-non-bindable>{{a}}</div>" + "<div ng-non-bindable=''>{{b}}</div>" + - "<div ng-non-bindable='true'>{{c}}</div>"); + "<div ng-non-bindable='true'>{{c}}</div></div>"); c.scope.$set('a', 123); c.scope.$eval(); assertEquals('123{{a}}{{b}}{{c}}', c.node.text()); @@ -568,16 +572,16 @@ BinderTest.prototype.testOptionShouldUpdateParentToGetProperBinding = 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.find('select')[0].selectedIndex); + assertEquals(1, c.node[0].selectedIndex); }; BinderTest.prototype.testRepeaterShouldBindInputsDefaults = function () { - var c = this.compile('<input value="123" name="item.name" ng-repeat="item in items">'); + 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')); + assertEquals("123", c.scope.$eval('items[0].name')); + assertEquals("misko", c.scope.$eval('items[1].name')); }; BinderTest.prototype.testRepeaterShouldCreateArray = function () { @@ -595,7 +599,7 @@ BinderTest.prototype.testShouldTemplateBindPreElements = function () { assertEquals('<pre ng-bind-template="Hello {{name}}!">Hello World!</pre>', sortedHtml(c.node)); }; -BinderTest.prototype.testDissableAutoSubmit = function() { +BinderTest.prototype.XtestDissableAutoSubmit = function() { var c = this.compile('<input type="submit" value="S"/>', null, {autoSubmit:true}); assertEquals( '<input ng-action="$save()" ng-bind-attr="{"disabled":"{{$invalidWidgets}}"}" type="submit" value="S"></input>', @@ -607,7 +611,7 @@ BinderTest.prototype.testDissableAutoSubmit = function() { sortedHtml(c.node)); }; -BinderTest.prototype.testSettingAnchorToNullOrUndefinedRemovesTheAnchorFromURL = function() { +BinderTest.prototype.XtestSettingAnchorToNullOrUndefinedRemovesTheAnchorFromURL = function() { var c = this.compile(''); c.binder.location.set("http://server/#a=1&b=2"); c.binder.parseAnchor(); @@ -626,18 +630,21 @@ BinderTest.prototype.testFillInOptionValueWhenMissing = function() { c.scope.$set('a', 'A'); c.scope.$set('b', 'B'); c.scope.$eval(); + var optionA = childNode(c.node, 0); + var optionB = childNode(c.node, 1); + var optionC = childNode(c.node, 2); - expect(c.node.find("option:first").attr('value')).toEqual('A'); - expect(c.node.find("option:first").text()).toEqual('A'); + expect(optionA.attr('value')).toEqual('A'); + expect(optionA.text()).toEqual('A'); - expect(c.node.find("option:nth-child(2)").attr('value')).toEqual(''); - expect(c.node.find("option:nth-child(2)").text()).toEqual('B'); + expect(optionB.attr('value')).toEqual(''); + expect(optionB.text()).toEqual('B'); - expect(c.node.find("option:last").attr('value')).toEqual('C'); - expect(c.node.find("option:last").text()).toEqual('C'); + expect(optionC.attr('value')).toEqual('C'); + expect(optionC.text()).toEqual('C'); }; -BinderTest.prototype.testValidateForm = function() { +BinderTest.prototype.XtestValidateForm = function() { var c = this.compile('<input name="name" ng-required>' + '<div ng-repeat="item in items"><input name="item.name" ng-required/></div>'); var items = [{}, {}]; @@ -666,7 +673,7 @@ BinderTest.prototype.testValidateForm = function() { assertEquals(0, c.scope.$get("$invalidWidgets.length")); }; -BinderTest.prototype.testValidateOnlyVisibleItems = function(){ +BinderTest.prototype.XtestValidateOnlyVisibleItems = function(){ var c = this.compile('<input name="name" ng-required><input ng-show="show" name="name" ng-required>'); c.scope.$set("show", true); c.scope.$eval(); @@ -678,29 +685,32 @@ BinderTest.prototype.testValidateOnlyVisibleItems = function(){ }; BinderTest.prototype.testDeleteAttributeIfEvaluatesFalse = function() { - var c = this.compile( + var c = this.compile('<div>' + '<input name="a0" ng-bind-attr="{disabled:\'{{true}}\'}"><input name="a1" ng-bind-attr="{disabled:\'{{false}}\'}">' + '<input name="b0" ng-bind-attr="{disabled:\'{{1}}\'}"><input name="b1" ng-bind-attr="{disabled:\'{{0}}\'}">' + - '<input name="c0" ng-bind-attr="{disabled:\'{{[0]}}\'}"><input name="c1" ng-bind-attr="{disabled:\'{{[]}}\'}">'); + '<input name="c0" ng-bind-attr="{disabled:\'{{[0]}}\'}"><input name="c1" ng-bind-attr="{disabled:\'{{[]}}\'}"></div>'); c.scope.$eval(); - var html = c.node.html(); - assertEquals(html + 0, 1, c.node.find("input[name='a0']:disabled").size()); - assertEquals(html + 1, 1, c.node.find("input[name='b0']:disabled").size()); - assertEquals(html + 2, 1, c.node.find("input[name='c0']:disabled").size()); + function assertChild(index, disabled) { + var child = childNode(c.node, index); + assertEquals(sortedHtml(child), disabled, !!child.attr('disabled')); + } - assertEquals(html + 3, 0, c.node.find("input[name='a1']:disabled").size()); - assertEquals(html + 4, 0, c.node.find("input[name='b1']:disabled").size()); - assertEquals(html + 5, 0, c.node.find("input[name='c1']:disabled").size()); + assertChild(0, true); + assertChild(1, false); + assertChild(2, true); + assertChild(3, false); + assertChild(4, true); + assertChild(5, false); }; BinderTest.prototype.testRepeaterErrorShouldBePlacedOnInstanceNotOnTemplateComment = function () { var c = this.compile( '<input name="person.{{name}}" ng-repeat="name in [\'a\', \'b\']" />'); c.scope.$eval(); - assertTrue(c.node.find("input").hasClass("ng-exception")); + assertTrue(c.node.hasClass("ng-exception")); }; -BinderTest.prototype.testItShouldApplyAttirbutesBeforeTheWidgetsAreMaterialized = function() { +BinderTest.prototype.testItShouldApplyAttributesBeforeTheWidgetsAreMaterialized = function() { var c = this.compile( '<input name="person.{{name}}" ng-repeat="name in [\'a\', \'b\']" />'); c.scope.$set('person', {a:'misko', b:'adam'}); @@ -708,11 +718,11 @@ BinderTest.prototype.testItShouldApplyAttirbutesBeforeTheWidgetsAreMaterialized assertEquals("", c.node.html()); }; -BinderTest.prototype.testItShouldCallListenersWhenAnchorChanges = function() { +BinderTest.prototype.XtestItShouldCallListenersWhenAnchorChanges = function() { var log = ""; var c = this.compile('<div ng-watch="$anchor.counter:count = count+1">'); c.scope.$set("count", 0); - c.scope.addWatchListener("$anchor.counter", function(newValue, oldValue){ + c.scope.$watch("$anchor.counter", function(newValue, oldValue){ log += oldValue + "->" + newValue + ";"; }); assertEquals(0, c.scope.$get("count")); @@ -738,7 +748,7 @@ BinderTest.prototype.testItShouldCallListenersWhenAnchorChanges = function() { assertEquals(3, c.scope.$get("count")); }; -BinderTest.prototype.testParseQueryString = function(){ +BinderTest.prototype.XtestParseQueryString = function(){ var binder = new Binder(); assertJsonEquals({"a":"1"}, binder.parseQueryString("a=1")); assertJsonEquals({"a":"1", "b":"two"}, binder.parseQueryString("a=1&b=two")); @@ -751,49 +761,57 @@ BinderTest.prototype.testParseQueryString = function(){ }; -BinderTest.prototype.testSetBinderAnchorTriggersListeners = function(){ +BinderTest.prototype.XtestSetBinderAnchorTriggersListeners = function(){ expectAsserts(2); var doc = this.compile("<div/>"); - doc.scope.addWatchListener("$anchor.name", function(newVal, oldVal) { + doc.scope.$watch("$anchor.name", function(newVal, oldVal) { assertEquals("new", newVal); assertEquals(undefined, oldVal); }); - doc.binder.anchor.name = "new"; + doc.$anchor.name = "new"; doc.binder.onUrlChange("http://base#name=new"); }; BinderTest.prototype.testItShouldDisplayErrorWhenActionIsSyntacticlyIncorect = function(){ - var c = this.compile( + var c = this.compile('<div>' + '<input type="button" ng-action="greeting=\'ABC\'"/>' + - '<input type="button" ng-action=":garbage:"/>'); - c.node.find("input").click(); + '<input type="button" ng-action=":garbage:"/></div>'); + var first = jqLite(c.node[0].childNodes[0]); + var second = jqLite(c.node[0].childNodes[1]); + + first.click(); assertEquals("ABC", c.scope.$get('greeting')); - assertTrue(c.node.find(":input:last").hasClass("ng-exception")); + + second.click(); + assertTrue(second.hasClass("ng-exception")); }; BinderTest.prototype.testItShouldSelectTheCorrectRadioBox = function() { - var c = this.compile( + var c = this.compile('<div>' + '<input type="radio" name="sex" value="female"/>' + - '<input type="radio" name="sex" value="male"/>'); + '<input type="radio" name="sex" value="male"/></div>'); + var female = jqLite(c.node[0].childNodes[0]); + var male = jqLite(c.node[0].childNodes[1]); - c.node.find("input[value=female]").click(); + female.click(); assertEquals("female", c.scope.$get("sex")); - assertEquals(1, c.node.find("input:checked").size()); - assertEquals("female", c.node.find("input:checked").attr("value")); + assertEquals(true, female[0].checked); + assertEquals(false, male[0].checked); + assertEquals("female", female.val()); - c.node.find("input[value=male]").click(); + male.click(); assertEquals("male", c.scope.$get("sex")); - assertEquals(1, c.node.find("input:checked").size()); - assertEquals("male", c.node.find("input:checked").attr("value")); + assertEquals(false, female[0].checked); + assertEquals(true, male[0].checked); + assertEquals("male", male.val()); }; BinderTest.prototype.testItShouldListenOnRightScope = function() { var c = this.compile( - '<div ng-init="counter=0; gCounter=0" ng-watch="w:counter=counter+1">' + - '<div ng-repeat="n in [1,2,4]" ng-watch="w:counter=counter+1;w:$root.gCounter=$root.gCounter+n"/>'); - c.binder.executeInit(); + '<ul ng-init="counter=0; gCounter=0" ng-watch="w:counter=counter+1">' + + '<li ng-repeat="n in [1,2,4]" ng-watch="w:counter=counter+1;w:$root.gCounter=$root.gCounter+n"/></ul>'); c.scope.$eval(); assertEquals(0, c.scope.$get("counter")); assertEquals(0, c.scope.$get("gCounter")); @@ -805,11 +823,13 @@ BinderTest.prototype.testItShouldListenOnRightScope = function() { }; BinderTest.prototype.testItShouldRepeatOnHashes = function() { - var x = this.compile('<div ng-repeat="(k,v) in {a:0,b:1}" ng-bind=\"k + v\"></div>'); + var x = this.compile('<ul><li ng-repeat="(k,v) in {a:0,b:1}" ng-bind=\"k + v\"></li></ul>'); x.scope.$eval(); - assertEquals( - '<div ng-bind=\"k + v\" ng-repeat-index="0">a0</div>' + - '<div ng-bind=\"k + v\" ng-repeat-index="1">b1</div>', + assertEquals('<ul>' + + '<#comment></#comment>' + + '<li ng-bind=\"k + v\" ng-repeat-index="0">a0</li>' + + '<li ng-bind=\"k + v\" ng-repeat-index="1">b1</li>' + + '</ul>', sortedHtml(x.node)); }; |
