From 62c0e5c46091d8b98a20c31ab26e715bad574bae Mon Sep 17 00:00:00 2001
From: Misko Hevery
Date: Tue, 26 Oct 2010 22:02:24 -0700
Subject: Fix failing tests for ie, and mark elements as ng-widget,
ng-directive, and ng-binding
---
.gitignore | 3 ++-
docs/filter:currency.html | 21 +++++++++++++++++++++
docs/filter:currency.md | 20 ++++++++++++++++++++
src/Compiler.js | 13 +++++++++++--
src/directives.js | 6 ++++--
src/scenario/dsl.js | 20 ++++++++++++--------
test/CompilerSpec.js | 6 +++++-
test/directivesSpec.js | 2 ++
test/scenario/dslSpec.js | 6 ++----
test/testabilityPatch.js | 12 +++++++++---
10 files changed, 88 insertions(+), 21 deletions(-)
create mode 100644 docs/filter:currency.html
create mode 100644 docs/filter:currency.md
diff --git a/.gitignore b/.gitignore
index 7ea01649..5c142f90 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
build/
angularjs.netrc
jstd.log
-.DS_Store
\ No newline at end of file
+.DS_Store
+regression/temp.html
diff --git a/docs/filter:currency.html b/docs/filter:currency.html
new file mode 100644
index 00000000..bd277bb8
--- /dev/null
+++ b/docs/filter:currency.html
@@ -0,0 +1,21 @@
+
filter:currency
+
+formats a number as a currency (ie $1,234.56)
+
+@format expression | currency
+
+
+
+{{amount | currency}}
+
+
+
+ it('should init with 1234.56', function(){
+ expect(bind('amount')).toEqual('$1,234.56');
+ });
+ it('should update', function(){
+ element(':input[name=amount]').value('-1234');
+ expect(bind('amount')).toEqual('-$1,234.00');
+ expect(bind('amount')).toHaveColor('red');
+ });
+
diff --git a/docs/filter:currency.md b/docs/filter:currency.md
new file mode 100644
index 00000000..44687a91
--- /dev/null
+++ b/docs/filter:currency.md
@@ -0,0 +1,20 @@
+# filter:currency
+formats a number as a currency (ie $1,234.56)
+
+@format _expression_ | currency
+
+
+
+{{amount | currency}}
+
+
+
+ it('should init with 1234.56', function(){
+ expect(bind('amount')).toEqual('$1,234.56');
+ });
+ it('should update', function(){
+ element(':input[name=amount]').value('-1234');
+ expect(bind('amount')).toEqual('-$1,234.00');
+ expect(bind('amount')).toHaveColor('red');
+ });
+
\ No newline at end of file
diff --git a/src/Compiler.js b/src/Compiler.js
index 9263dc02..b0210247 100644
--- a/src/Compiler.js
+++ b/src/Compiler.js
@@ -112,9 +112,11 @@ Compiler.prototype = {
templatize: function(element, elementIndex, priority){
var self = this,
widget,
+ fn,
directiveFns = self.directives,
descend = true,
directives = true,
+ elementName = nodeName(element),
template,
selfApi = {
compile: bind(self, self.compile),
@@ -138,12 +140,15 @@ Compiler.prototype = {
eachAttribute(element, function(value, name){
if (!widget) {
if (widget = self.widgets('@' + name)) {
+ element.addClass('ng-attr-widget');
widget = bind(selfApi, widget, value, element);
}
}
});
if (!widget) {
- if (widget = self.widgets(nodeName(element))) {
+ if (widget = self.widgets(elementName)) {
+ if (elementName.indexOf(':') > 0)
+ element.addClass('ng-widget');
widget = bind(selfApi, widget, element);
}
}
@@ -179,7 +184,11 @@ Compiler.prototype = {
});
});
eachAttribute(element, function(value, name){
- template.addInit((directiveFns[name]||noop).call(selfApi, value, element));
+ fn = directiveFns[name];
+ if (fn) {
+ element.addClass('ng-directive');
+ template.addInit((directiveFns[name]).call(selfApi, value, element));
+ }
});
}
// Process non text child nodes
diff --git a/src/directives.js b/src/directives.js
index a1fa4740..e21dca89 100644
--- a/src/directives.js
+++ b/src/directives.js
@@ -22,7 +22,8 @@ angularDirective("ng:eval", function(expression){
};
});
-angularDirective("ng:bind", function(expression){
+angularDirective("ng:bind", function(expression, element){
+ element.addClass('ng-binding');
return function(element) {
var lastValue = noop, lastError = noop;
this.$onEval(function() {
@@ -97,7 +98,8 @@ function compileBindTemplate(template){
return fn;
}
-angularDirective("ng:bind-template", function(expression){
+angularDirective("ng:bind-template", function(expression, element){
+ element.addClass('ng-binding');
var templateFn = compileBindTemplate(expression);
return function(element) {
var lastValue;
diff --git a/src/scenario/dsl.js b/src/scenario/dsl.js
index 1ae26db8..47ec68c8 100644
--- a/src/scenario/dsl.js
+++ b/src/scenario/dsl.js
@@ -86,17 +86,21 @@ angular.scenario.dsl('using', function() {
* binding(name) returns the value of a binding
*/
angular.scenario.dsl('binding', function() {
+ function contains(text, value) {
+ return text && text.indexOf(value) >=0;
+ }
return function(name) {
return this.addFutureAction("select binding '" + name + "'", function($window, $document, done) {
- var element;
- try {
- element = $document.elements('[ng\\:bind-template*="{{$1}}"]', name);
- } catch(e) {
- if (e.type !== 'selector')
- throw e;
- element = $document.elements('[ng\\:bind="$1"]', name);
+ var elements = $document.elements('.ng-binding');
+ for ( var i = 0; i < elements.length; i++) {
+ var element = new elements.init(elements[i]);
+ if (contains(element.attr('ng:bind'), name) >= 0 ||
+ contains(element.attr('ng:bind-template'), name) >= 0) {
+ done(null, element.text());
+ return;
+ }
}
- done(null, element.text());
+ throw "Could not find binding: " + name;
});
};
});
diff --git a/test/CompilerSpec.js b/test/CompilerSpec.js
index 59c365e4..780fd7cb 100644
--- a/test/CompilerSpec.js
+++ b/test/CompilerSpec.js
@@ -46,6 +46,7 @@ describe('compiler', function(){
var init = template(e).$init;
expect(log).toEqual("found");
init();
+ expect(e.hasClass('ng-directive')).toEqual(true);
expect(log).toEqual("found:init");
});
@@ -102,12 +103,13 @@ describe('compiler', function(){
}
});
var scope = compile('beforemiddleafter');
- expect(lowercase(scope.$element[0].innerHTML)).toEqual('beforereplacedafter');
+ expect(sortedHtml(scope.$element[0], true)).toEqual('beforereplacedafter
');
expect(log).toEqual("hello middle");
});
it('should replace widgets', function(){
widgets['NG:BUTTON'] = function(element) {
+ expect(element.hasClass('ng-widget')).toEqual(true);
element.replaceWith('button
');
return function(element) {
log += 'init';
@@ -120,6 +122,8 @@ describe('compiler', function(){
it('should use the replaced element after calling widget', function(){
widgets['H1'] = function(element) {
+ // HTML elements which are augmented by acting as widgets, should not be marked as so
+ expect(element.hasClass('ng-widget')).toEqual(false);
var span = angular.element('{{1+2}}');
element.replaceWith(span);
this.descend(true);
diff --git a/test/directivesSpec.js b/test/directivesSpec.js
index fa2abd46..2e5aa2a0 100644
--- a/test/directivesSpec.js
+++ b/test/directivesSpec.js
@@ -35,6 +35,7 @@ describe("directives", function(){
expect(element.text()).toEqual('');
scope.a = 'misko';
scope.$eval();
+ expect(element.hasClass('ng-binding')).toEqual(true);
expect(element.text()).toEqual('misko');
});
@@ -87,6 +88,7 @@ describe("directives", function(){
var scope = compile('');
scope.$set('name', 'Misko');
scope.$eval();
+ expect(element.hasClass('ng-binding')).toEqual(true);
expect(element.text()).toEqual('Hello Misko!');
});
diff --git a/test/scenario/dslSpec.js b/test/scenario/dslSpec.js
index efedeeb5..3d68925f 100644
--- a/test/scenario/dslSpec.js
+++ b/test/scenario/dslSpec.js
@@ -260,15 +260,13 @@ describe("angular.scenario.dsl", function() {
describe('Binding', function() {
it('should select binding by name', function() {
- if (msie) return; // TODO reenable!
- doc.append('some value');
+ doc.append('some value');
$root.dsl.binding('foo.bar');
expect($root.futureResult).toEqual('some value');
});
it('should select binding in template by name', function() {
- if (msie) return; // TODO reenable!
- doc.append('foo some baz
');
+ doc.append('foo some baz
');
$root.dsl.binding('bar');
expect($root.futureResult).toEqual('foo some baz');
});
diff --git a/test/testabilityPatch.js b/test/testabilityPatch.js
index 5c6eaf4d..e8041ac7 100644
--- a/test/testabilityPatch.js
+++ b/test/testabilityPatch.js
@@ -81,7 +81,7 @@ extend(angular, {
});
-function sortedHtml(element) {
+function sortedHtml(element, showNgClass) {
var html = "";
foreach(jqLite(element), function toString(node) {
if (node.nodeName == "#text") {
@@ -93,8 +93,14 @@ function sortedHtml(element) {
html += '<' + node.nodeName.toLowerCase();
var attributes = node.attributes || [];
var attrs = [];
- if (node.className)
- attrs.push(' class="' + node.className + '"');
+ var className = node.className || '';
+ if (!showNgClass) {
+ className = className.replace(/ng-[\w-]+\s*/g, '');
+ }
+ className = trim(className);
+ if (className) {
+ attrs.push(' class="' + className + '"');
+ }
for(var i=0; i