aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Angular.js2
-rw-r--r--src/Formatters.js2
-rw-r--r--src/JSON.js1
-rw-r--r--src/Scope.js2
-rw-r--r--src/Widgets.js3
-rw-r--r--src/directives.js29
-rw-r--r--src/jqLite.js2
-rw-r--r--test/BinderTest.js182
-rw-r--r--test/directivesSpec.js8
-rw-r--r--test/markupSpec.js8
-rw-r--r--test/moveToAngularCom/MiscTest.js35
-rw-r--r--test/testabilityPatch.js6
-rw-r--r--test/widgetsSpec.js18
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 = '&nbsp;';
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();
});